微服务_入门2

embedded/2024/9/24 19:37:33/

文章目录

Feign_1">一、Feign远程调用

 
来看我们以前利用RestTemplate发起远程调用的代码:
 
在这里插入图片描述
存在下面的问题:

  • 代码可读性差,编程体验不统一(url需要自己在代码中拼写出来)
  • 参数复杂URL难以维护(有时候访问一个页面所携带的参数是非常多的)

Feign是一个声明式的http客户端。其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
 
通过导包和添加注解后,可以写出一个通用http请求用接口:

@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User

  这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。基于UserClient接口可以完成http请求,就像是调用另外一个方法一样,是不是看起来优雅多了:
在这里插入图片描述

二、Gateway服务网关

  Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

2.1、为什么需要网关

  Gateway网关是我们服务的守门神,所有微服务的统一入口。

在这里插入图片描述

  • 身份认证和权限校验网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
  • 服务路由、负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
  • 限流:当请求流量过高时,在网关中按照下游的微服务能够接受的速度来放行请求,避免服务压力过大。

在SpringCloud中网关的实现包括两种:gatewayzuul

  Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

gateway_46">2.2、gateway快速入门

在application.yml文件中,配置如下(演示路由的功能实现):

server:port: 10010 # 网关端口
spring:application:name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: # 网关路由配置- id: user-service # 路由id,自定义,只要唯一即可# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称predicates: # 路由断言,也就是判断请求是否符合路由规则的条件- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

我们将符合Path 规则的一切请求,都代理到 uri参数指定的地址。

本例中,我们将 /user/**开头的请求,代理到lb://userservice,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。

整个访问的流程如下:
在这里插入图片描述
路由配置包括:

  1. 路由id:路由的唯一标示

  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

  3. 路由断言(predicates):判断路由的规则

  4. 路由过滤器(filters):对请求或响应做处理

2.3、断言工厂

  我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory(断言工厂)读取并处理,转变为路由判断的条件。例如Path=/user/是按照路径匹配,这个规则是由:

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的,像这样的断言工厂在SpringCloudGateway还有十几个,我们不需要记忆,随用随查就好。

断言:是一种在程序设计中的一阶逻辑(例如:一个结果为真或假的逻辑判断表达式),目的是为了表示与验证软件开发者预期的结果。

2.4、过滤器

  GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

在这里插入图片描述
  Spring提供了31种不同的路由过滤器工厂,比如:添加请求头、添加请求参数等。也可以通过实现接口,自己写过滤逻辑。


http://www.ppmy.cn/embedded/116232.html

相关文章

52.拼接数组

//定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回。 //调用该方法,并在控制台输出结果 //例如:数组为int[] arr{1,2,3}; //执行方法后的输出结果为:[1,2,3] public class 拼接数组 {public static void main…

[网络][知识]TCP-IP各协议的RFC编号和RFC原始文档的获取地址

TCP/IP协议族包括很多个子协议,下面是TCP/IP 协议和支持服务所支持的 RFC。 RFC768 用户数据报协议 (UDP) RFC783 简单文件传输协议 (TFTP) RFC791 Internet 协议 (IP) RFC792 Internet 控制消息协议 (ICMP) RFC793 传输控制协议 (TCP) RFC816 故障隔离和恢复 RFC…

python概述

目录 python语言的特点 python语言的优点: python语言的缺点: 1.常用的python编辑器 PyCharm Jupyter Notebook VScode 模块的安装、导入与使用 安装 导入与使用 python语言的特点 1.简洁 2.语法优美 3.简单易学 4.开源:用户可自…

在idea里运行swing程序正常,但是在外部运行jar包却报错,可能是jdk版本问题

在idea里运行swing程序异常,报Caused by: java.awt.HeadlessException错误 System.setProperty("java.awt.headless","false");加上这句话

误删系统引导如何恢复?如何创建系统引导?

Default Boot Device Missing or Boot Fai led.Insert Recovery Media and Hit any keyThen Select “Boot Manager’ to choose a new Boot Device or to Boot Recovery Media 一、事出原因: 同事强迫症格式化所有系统引导盘后,重装系统后无法开机问题…

vue-router路由(重定向,嵌套,动态路由匹配,命名,高亮,守卫)

一、前端路由的概念与原理 路由router就是对应关系。分为前端路由和后端路由。 1后端路由 后端路由指的是:请求方式、请求地址与function处理函数之间的对应关系。在node.js中,express理由的基本用法如下: const express require(expres…

Linux 基础入门操作 第九章 进程之间通讯消息队列

9.5 消息队列 消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。2、同时通过发送消息还可以避免命名管道的同步和阻 塞问题,不需要由进程自己来提供同步方法。3、接收程序可以通过消息类型有选择地接收…

设计模式七大原则

设计模式的七大原则是指导软件设计和架构的基本准则,帮助开发者创建更灵活、可维护和可扩展的系统。以下是这七大原则的详细介绍: 1. 单一职责原则 (SRP: Single Responsibility Principle) 定义 一个类,应当只有一个引起它变化的原因&…