一、Feign(http客户端)
1.1 简介
之前不同的服务之间进行远程调用使用的是RestTemplate。
存在下面的问题:
(1)代码可读性差,编程体验不统一;
(2)参数复杂,URL难以维护。
Feign(发音“奋”)是一个声明式的http客户端,作用是帮助我们便捷地实现http请求地发送。
1.2 使用步骤
说明:
@FeignClient注解说明远程调用地服务名称。
例如:
(1)在order-service项目中添加feign客户端依赖并开启自动装配功能
(2)在order-service中新建接口声明
(3)在order-service中使用声明的接口发起远程调用
1.3 自定义配置
说明:
(1)日志级别
NONE-没有日志
BASIC-记录请求的开始和结束时间
HEADERS-记录请求的开始和结束时、请求头和响应头
FULL-记录请求的开始和结束时、请求头和响应头、请求体和响应体
1.3.1 修改日志文件的级别
例如:
在order-serivce配置,
注意:全局配置的注解写在Application类(例如order-service的OrderApplication类)上,局部配置的注解写在Feign的配置类上(例如order-service的UserClient类)。
例如,在order-service中进行配置,
声明一个Bean:
加全局有效注解:
1.4 性能优化
Feign底层的客户端实现(三种模式):
对Feign性能的优化,主要是对底层客户端的改变。
1.4.1 连接池配置
1.5 最佳实践
观察可以看出,order-service发请求的配置与user-service接收的配置一致。
order-service的配置如下:
user-service的配置如下:
1.5.1 给消费者的FeignClient和提供者的controller定义统一的父接口作为标准
但该方式不推荐,会导致紧耦合。
1.5.2 服务提供者将FeignClient封装成独立模块供消费者调用
而如果有十多个服务需要访问user-service,则UserClient需要书写十多遍,不太方便。
缺点:feign-api可能有多个接口,但服务消费者只需要某几个,这样就冗余了。
1.5.2.1 实现步骤
feignapi_66">1、新建module(feign-api)并引入依赖
2、编写内容
feignapi_73">3、消费者导入写好的feign-api并完成导包
feignapiFeignClientSpringApplication_75">4、解决导入的feign-api的声明接口FeignClient不在SpringApplication的扫描包范围
注意:这时可能会出现一个问题,即FeignClient不在SpringBootApplication的扫描包范围,导致@Autowire实际注入失败,这些FeignClient无法使用。
解决方法:
例如:
二、Gateway(统一网关)
2.1 简介
之前的微服务允许任何的访问,不安全,需要添加一个网关(功能包括身份认证和权限校验、服务路由、负载均衡、请求限流)。
2.2 搭建网关
说明:网关是一个独立的服务,也需要把自己注册到nacos或从nacos中拉取服务。
例如:
创建gateway服务,引入依赖
配置路由规则:
测试:
2.3 路由断言predicate
在2.2 中配置过路由断言:
路由断言(predicates)是一种判断规则,判断请求是否符合要求,符合则转发到路由目的地(由路由断言工厂route predicate factory实现)。路由断言工厂读取配置文件的断言规则并处理,转变成路由判断的条件。
2.4 路由过滤器GatewayFilter
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理(注意:不仅是请求,还有响应)。
spring的过滤器工厂:
例如:
例如:
在gateway服务中新增过滤器的内容,
在user-service的controller里获取增加的请求头:
执行结果如下:
补充:
还可以使用默认过滤器,可以对所有路由都生效,
2.5 全局过滤器GlobalFilter
例如:
代码实现如下:
增加两个注解:
过滤器顺序也可以通过实现接口设置:
2.6 过滤器的执行顺序
2.7 跨域问题处理
跨域是指域名不一样。主要包括,
(1)域名不同:www.taobao.com和www.taobao.org、www.jd.com和miaosha.jd.com。
(2)域名相同,端口不同:localhost:8080与localhost:8081。
注意,上面两种情况不都会产生跨域问题,跨域问题特指浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。
解决方案:CORS。
CORS方案是浏览器去问服务器(先到gateway)让不让请求跨域。
说明:
(1)add-to-simple-url-handler-mapping:true;是为了保证浏览器在是否拦截跨域请求前先问gateway。
(2)maxAge:是浏览器问过一次后,该设置时间内不再询问。
例如,一个前端页面:
使用前端工具启动上图的页面(端口问8090),可以看到报错:
对跨域问题进行解决,在gateway服务中增加以下内容:
解决如下:
访问正常,控制台也打印了信息。