1.什么是Feign?
Feign是一种声明式、模板化的HTTP客户端(仅在consumer中使用)。
2.什么是声明式,有什么作用,解决什么问题?
a.声明式调用就像调用本地方法一样调用远程方法;无感知远程http请求。
b.Spring Cloud的声明式调用, 可以做到使用 HTTP请求远程服务 时能就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。
c.它像Dubbo一样,consumer直接调用接口方法调用provider,而不需要通过常规的Http Client构造请求再解析返回数据。
d.它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
3、声明式服务调用的入门例子提要
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
利用facade设计模式 consumer和provider关联同一个子项目provider-api,provider实现api内的接口,consumer内的接口继承api的接口
consumer启动类标签:@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
接口标签:@FeignClient(name="provider的项目名")
provider启动类标签:@EnableEurekaClient
@SpringBootApplication
4.剖析:feign对复杂参数请求的处理
HttpURLConnection方式(默认):
一个参数:@RequestParam(name="id")Integer id
多个参数:@RequestParam(name="id") Integer id,@RequestParam(name="name") String name
httpclient方式:
consumer的pom文件:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>8.18.0</version>
</dependency>
consumer的配置文件:
#启用httpclient
feign.httpclient.enabled=true
一个参数:
eq:
api中的接口: @RequestMapping(value="getById",method=RequestMethod.GET)
public Product getById(@RequestParam(name="id") Integer id);
privider中的实现:
public Product getById( Integer id)
多个参数:
eq:
api中的接口:
@RequestMapping(value="get1",method=RequestMethod.GET,
consumes=MediaType.APPLICATION_JSON_VALUE)
public Product getProduct1(Product obj);
privider中的实现:
public Product getProduct1(@RequestBody Product obj)
5、性能优化
(1)加入基于GZip压缩算法,提升网络通信速度
********光是feign,调用过程中压缩
# 配置请求GZIP压缩
feign.compression.request.enabled=true
# 配置响应GZIP压缩
feign.compression.response.enabled=true
# 配置压缩支持的MIME TYPE
feign.compression.request.mime-types=text/xml,application/xml,application/json
# 配置压缩数据大小的下限
feign.compression.request.min-request-size=512
*********整个项目传输压缩(springboot)
server.compression.enabled=true
server.compression.mime- types=application/json,application/xml,text/html,text/xml,text/plain
(2)采用连接池,提升feign的并发吞吐量
默认的HttpURLConnection换成httpclient方式连接
consumer的pom文件:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>8.18.0</version>
</dependency>
consumer的配置文件:
#启用httpclient
feign.httpclient.enabled=true
6.如何在微服务的日志中记录每个接口URL、状态码和耗时信息?
consumer的启动类中:加入以下这个bean
@Bean
public Logger.Level feignLoggerLevel(){
// NONE, 不记录任何信息,默认值。
// BASIC, 记录请求方法、请求URL、状态码和用时。
// HEADERS, 在BASIC的基础上再记录一些常用信息。
// FULL: 记录请求和响应报文的全部内容。
return Logger.Level.FULL;
}
并且日志的配置文件中(我用的logback)
日志级别改成debug(之前是info,一直不显示调用信息)
7、对feign的负载均衡进行优化配置
#全局配置
# 请求连接的超时时间
ribbon.ConnectTimeout=5000
# 请求处理的超时时间
ribbon.ReadTimeout=5000
#局部配置
# 对所有操作请求都进行重试
e-book-product.ribbon.OkToRetryOnAllOperations=true
# 对当前实例的重试次数
e-book-product.ribbon.MaxAutoRetries=2
# 切换实例的重试次数
e-book-product.ribbon.MaxAutoRetriesNextServer=0
# 请求连接的超时时间
e-book-product.ribbon.ConnectTimeout=3000
# 请求处理的超时时间
e-book-product.ribbon.ReadTimeout=3000
# 指定具体的服务实例清单
#e-book-product.ribbon.listOfServers=