SpringCloud实战四-Feign
什么是Feign
之前文章的本地调用使用的是SpringBoot的RestTemplate进行调用, 存在可读性差,不够“优雅”等缺点。
Feign是Netflix开源的声明式HTTP客户端,简化了HTTP Client的编写,下面简单的用代码解释一下什么是“声明式”。
引入依赖:
org.springframework.cloudspring-cloud-starter-openfeign
在启动类添加注解:
@EnableFeignClients
创建一个接口:
@FeignClient(name ="user-center")publicinterfaceUserCenterFeignClient{/** * http://user-center/users/{id}*@paramid*@return */@GetMapping("/users/{id}")UserDTO findById(@PathVariableInteger id);}
调用:
UserDTO userDTO =this.userCenterFeignClient.findById(userId);
此时我们已经完成Feign的调用。“声明式”即在接口上写上注解便可以达到本地调用的目的。
细粒度及全局配置
Feign的配置和Ribbon的配置很像,均支持Java Config配置和属性文件的配置,以日志级别(默认没有打印日志,NONE)配置为例
细粒度配置
Java Config配置
@FeignClient(name ="user-center", configuration = FeignConfiguration.class)publicinterfaceUserCenterFeignClient
publicclassFeignConfiguration{@BeanpublicLogger.Levellevel(){// 让feign打印所有请求的细节returnLogger.Level.FULL; }}
b.属性文件配置
feign:client:config:user-center: loggerLevel: full
2.全局配置
a.Java Config配置
启动文件加注解
@EnableFeignClients(defaultConfiguration = GlobalFeignConfiguration.class)publicclassContentCenterApplication
publicclassGlobalFeignConfiguration{@BeanpublicLogger.Levellevel(){// 让feign打印所有请求的细节returnLogger.Level.FULL; }}
b.属性文件
feign:client:config: # 全局配置default: loggerLevel: full
tips:Feign默认支持负载均衡
Feign优化
微服务的优化很多,这里只做一些小的优化:
1.配置连接池(支持httpClients和okHttp,默认是URLConnection)
2.修改日志级别(尽量不用FULL)
配置连接池apache httpClients
添加依赖:
io.github.openfeignfeign-httpclient
添加配置:
feign:httpclient: # 让feign使用apache httpclient做请求;而不是默认的urlconnectionenabled:true # feign的最大连接数max-connections:200 # feign单个路径的最大连接数max-connections-per-route:50
传参
Feign与SpringMvc的传参类似,支持@PathVariable,@RequestBody等注解,可以在maven中添加一个模块,在需要的模块中引入,让controller实现Feign模块中的接口,便于维护。
后续
目前看来,微服务的调用基本完成,后续将介绍服务容错-Sentinel、消息驱动Spring Cloud Alibaba RocketMQ以及API网关-Spring Cloud Gateway。