SpringCloud(三)
目录
1.http客户端Feign
1.1Feign替代RestTemplate
1.1.1Feign的介绍
1.1.2定义和使用Feign客户端
1.2自定义配置
配置Feign日志有两种方式:
1.3Feign使用优化
Feign的性能优化-连接池配置
1.4Feign的最佳实践
2.统一网关Gateway
2.1为什么需要网关
网关的技术实现
2.2gateway快速入门
搭建网关服务的步骤:
执行逻辑
总结:
2.3断言工厂
2.4过滤器工厂
默认过滤器
2.5全局过滤器GlobalFilter
总结
过滤器执行顺序
2.6跨域配置
1.http客户端Feign
1.1Feign替代RestTemplate
我们以前利用RestTemplate发起远程调用代码:
存在下面的问题:
- 代码可读性差,编程体验不统一
- 参数复杂url难以维护
1.1.1Feign的介绍
Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实习http请求的发送,解决上面提到的问题。
1.1.2定义和使用Feign客户端
1.引入依赖:
2.在order-service启动类添加注解开启Feign功能
3.编写Feign客户端
主要是基于SpringMVC的注解来声明远程调用的信息,比如:
- 服务名称:userservice
- 请求方式:GET
- 请求路径:/user/{id}
- 请求的参数:Long id
- 返回值类型:User
1.2自定义配置
Feign运行自定义配置来覆盖默认的配置,可以修改的配置如下:
一般我们需要配置的就是日志级别
配置Feign日志有两种方式:
方式一:而皮质文件方式
1.全局生效
2.局部生效
配置Feign日志的方式二:java代码方式,需要先声明一个bean:
1.如果全局配置,把它放到@EnableFeignClients这个注解中:
2.如果是局部配置,把它放到@Feignclient这个注解中:
1.3Feign使用优化
Feign是一个声明式客户端,最终发起请求还是会调用底层
Feign底层的客户端实现:
- URLConnection:默认实现,不支持连接池
- Apache HttpClient:支持连接池
- OKHttp:支持连接池
因此优化Feign的性能主要包括:
- 1.使用连接池代替默认的URLConnection
- 2.日志级别,最好用basic或none
Feign的性能优化-连接池配置
引入依赖:
配置连接池:
1.4Feign的最佳实践
- 方式一(继承):给消费者的FeignClient和提供的controller定义统一的符接口作为标准
但是Feign官方却说明不推荐共享接口方式,因为会造成紧耦合
- 方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的POJO,默认的Feign配置都放到这个模块中,提供给所有消费者使用
实现方式二的步骤如下:
- 1.首先创建一个module,命名为feign-api,然后引入feign的starter依赖
- 2.将order-service中编写的UserClient,User,DefaultFeignConfiguration都复制到feign-api项目中
- 3.在order-service中引入feign-api的依赖
- 4.修改order-service中的所有与上述三个组件相关的import部分,改查导入feign-api中的包
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种解决:
方式一:指定Feignclient所在包
方式二:指定FeignClient字节码
2.统一网关Gateway
2.1为什么需要网关
网关功能:其实就是对整个微服务的一种保护
- 身份认证和权限校验
- 服务路由,负载均衡
- 请求限流
网关的技术实现
在SpringCloud中网关的实现包括两种:
- gateway
- zuul
Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的webFlux,属于响应式编程的实现,具备更好的性能。
2.2gateway快速入门
搭建网关服务的步骤:
1.创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:
2.编写路由配置及nacos地址
执行逻辑
总结:
2.3断言工厂
我们在配置文件中写到断言规则只是字符串,这些字符串会被PredicateFactory读取并处理,转变为路由判断的条件
Spring提供了11种基本的Predicate工厂:
2.4过滤器工厂
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
Spring提供了31种不同的路由过滤器工厂
默认过滤器
如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:
2.5全局过滤器GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。
区别于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。
定义方式实现GlobalFilter接口。
总结
过滤器执行顺序
请求进入网关会碰到三类过滤器:当前路由过滤器,DefaultFilter,GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter,globalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器
2.6跨域配置
跨域:域名不一致就是跨域,主要包括:
网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现: