文章目录
一、RestTemplate方式调用存在的问题
编辑
二、Feign的介绍
三、定义和使用Feign客户端
四、自定义Feign的配置
修改日志级别:
五、Feign的性能优化
六、Feign的最佳实践
七、网关作用
八、搭建网关
九、路由断言工厂Route Predicate Gsvtory
十、路由过滤器GatewayFilter
案例:
十一、全局过滤器GlobalFilter
十二、过滤器链执行顺序
十三、跨域问题处理
一、RestTemplate方式调用存在的问题
- 代码可读性差,编程体验不统一
- 参数复杂URL难以维护
二、Feign的介绍
Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送,解决RestTemplate的问题
三、定义和使用Feign客户端
1、引入依赖
2、 在启动类上添加注解开启Feign的功能
3、编写Feign客户端:
只要是基于SpringMVC的注解来声明远程调用的信息,比如:
- 服务名称:userservice
- 请求方式:GET
- 请求路径:/user/{id}
- 请求参数:Long id
- 返回值类型:String
四、自定义Feign的配置
Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
修改日志级别:
方式一:配置文件方式
1、全局生效
2、局部生效
方式二:java代码方式,需要先声明一个Bean
1、而后如果是全局配置,则把它放到@EnableFeignClients这个注解中
2、如果是局部配置,则把它放到@FeignClient这个注解中
五、Feign的性能优化
Feign底层的客户端实现:
- URLConnection:默认实现,不支持连接池
- Apache Httpclient:支持连接池
- OKHttp:支持连接池
因此优化Feign的性能主要包括:
- 使用连接池代替默认的URLConnection
- 日志级别,最好使用basic或none
Feign的性能优化-连接池配置
Feign添加HttpClient的支持:
引入依赖:
配置连接池:
六、Feign的最佳实践
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用
当定义的FeignClient不在SpringBootApplication的扫描包范围内,这些FeignClient无法使用。有两种方式解决:
方式一:指定FeignClient所在包
方式二:指定FeignClient字节码
七、网关作用
八、搭建网关
1、创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖
2、 编写路由配置及nacos地址
九、路由断言工厂Route Predicate Gsvtory
网关路由可以配置的内容包括:
- 路由id:路由唯一标识
- uri:路由目的地,支持lb和http两种
- predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
- filters:路由过滤器,处理请求和响应
我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
PredicateFactory的作用是什么?
读取用户定义的断言条件,对请求做出判断
Path=/user/**是什么含义?
路径是以/user开头的就认为是符合的
十、路由过滤器GatewayFilter
Gateway是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
案例:
给所有进入orderservice的请求都添加一个请求头:Truth=6666666
默认过滤器
如果要对所有的路由都生效,则可以将过滤工厂写道default下。格式如下:
过滤器的作用是什么?
- 对路由的请求或响应做出加工处理,比如添加请求头
- 配置在路由下的过滤器支队当前路由的请求生效
defaultFilters的作用是什么?
- 对所有路由都生效的过滤器
十一、全局过滤器GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口。
案例:
需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
- 参数中是否有authorization
- authorization参数值是否为admin
如果同时满足则放行,否则拦截
十二、过滤器链执行顺序
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链中,排序后一次执行每个过滤器
过滤器执行顺序
- 每一个过滤器都必须指定一个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方案,并且只需要简单配置即可实现: