文章目录

一、RestTemplate方式调用存在的问题

编辑

二、Feign的介绍

三、定义和使用Feign客户端

四、自定义Feign的配置

 修改日志级别:

 五、Feign的性能优化

 六、Feign的最佳实践

 七、网关作用

 八、搭建网关

 九、路由断言工厂Route Predicate Gsvtory

 十、路由过滤器GatewayFilter

 案例:

十一、全局过滤器GlobalFilter

 十二、过滤器链执行顺序

十三、跨域问题处理


一、RestTemplate方式调用存在的问题

  • 代码可读性差,编程体验不统一
  • 参数复杂URL难以维护

二、Feign的介绍

        Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决RestTemplate的问题

三、定义和使用Feign客户端

1、引入依赖

gateway作用和nginx_开发语言

2、 在启动类上添加注解开启Feign的功能

gateway作用和nginx_开发语言_02

 3、编写Feign客户端:

gateway作用和nginx_开发语言_03

 

只要是基于SpringMVC的注解来声明远程调用的信息,比如:

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

四、自定义Feign的配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

gateway作用和nginx_开发语言_04

 修改日志级别:

方式一:配置文件方式

        1、全局生效

        

gateway作用和nginx_连接池_05

        2、局部生效

        

gateway作用和nginx_开发语言_06

 方式二:java代码方式,需要先声明一个Bean

        

gateway作用和nginx_连接池_07

 

        1、而后如果是全局配置,则把它放到@EnableFeignClients这个注解中

        

gateway作用和nginx_客户端_08

        2、如果是局部配置,则把它放到@FeignClient这个注解中

  

gateway作用和nginx_客户端_09

 五、Feign的性能优化

Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache Httpclient:支持连接池
  • OKHttp:支持连接池

因此优化Feign的性能主要包括:

  1. 使用连接池代替默认的URLConnection
  2. 日志级别,最好使用basic或none

Feign的性能优化-连接池配置

Feign添加HttpClient的支持:

引入依赖:

gateway作用和nginx_gateway_10

配置连接池:

gateway作用和nginx_gateway作用和nginx_11

 六、Feign的最佳实践

方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准                

gateway作用和nginx_gateway_12

 方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用

gateway作用和nginx_gateway作用和nginx_13

gateway作用和nginx_开发语言_14

 当定义的FeignClient不在SpringBootApplication的扫描包范围内,这些FeignClient无法使用。有两种方式解决:

方式一:指定FeignClient所在包

gateway作用和nginx_连接池_15

方式二:指定FeignClient字节码

gateway作用和nginx_gateway作用和nginx_16

 七、网关作用

gateway作用和nginx_开发语言_17

gateway作用和nginx_gateway作用和nginx_18

 八、搭建网关

1、创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖

 

gateway作用和nginx_连接池_19

 2、 编写路由配置及nacos地址

gateway作用和nginx_开发语言_20

gateway作用和nginx_开发语言_21

 九、路由断言工厂Route Predicate Gsvtory

网关路由可以配置的内容包括:

  • 路由id:路由唯一标识
  • uri:路由目的地,支持lb和http两种
  • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
  • filters:路由过滤器,处理请求和响应

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件

gateway作用和nginx_gateway_22

PredicateFactory的作用是什么?

读取用户定义的断言条件,对请求做出判断

Path=/user/**是什么含义?

路径是以/user开头的就认为是符合的

 十、路由过滤器GatewayFilter

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

gateway作用和nginx_gateway_23

 

gateway作用和nginx_开发语言_24

 案例:

给所有进入orderservice的请求都添加一个请求头:Truth=6666666

gateway作用和nginx_gateway_25

 默认过滤器

如果要对所有的路由都生效,则可以将过滤工厂写道default下。格式如下:

gateway作用和nginx_连接池_26

过滤器的作用是什么?

  1. 对路由的请求或响应做出加工处理,比如添加请求头
  2. 配置在路由下的过滤器支队当前路由的请求生效

defaultFilters的作用是什么?

  1. 对所有路由都生效的过滤器

十一、全局过滤器GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口。

案例:

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

  • 参数中是否有authorization
  • authorization参数值是否为admin

如果同时满足则放行,否则拦截

gateway作用和nginx_gateway_27

 十二、过滤器链执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链中,排序后一次执行每个过滤器

gateway作用和nginx_开发语言_28

 过滤器执行顺序

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,有我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter 的顺序执行

十三、跨域问题处理

跨域:域名不一致就是跨域,主要包括:

  • 域名不同:www.taobao.com 和 www.jd.com
  • 域名相同,端口不同:localhost:8080 和 localhost:8081

跨域问题:浏览器禁止请求的发起者与服务器端发生跨域ajax请求,请求被浏览器拦截的问题

解决方案:CORS 

网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:

gateway作用和nginx_连接池_29