微服务通信
4.1 Feign
4.1.1 Feign简介
Feign是Spring Cloud提供的⼀个声明式的伪Http客户端, 它使得调⽤远程服务就像调⽤本地服务⼀样简单, 只需要创建⼀个接⼝并添加
⼀个注解即可。 Nacos很好的兼容了Feign, Feign默认集了Ribbon, 所以在Nacos下使⽤Fegin默认就实现了负载均衡的效果
官⽅地址: https://github.com/OpenFeign/feign
4.1.2 基本使用
1.加⼊Fegin的依赖
<!--fegin组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在主类上添加Fegin的注解
@EnableFeignClients//开启Fegin
3.创建⼀个service, 并使⽤Fegin实现微服务调⽤
@FeignClient("service-product")//声明调⽤的提供者的name
public interface ProductService {
//指定调⽤提供者的哪个⽅法
//@FeignClient+@GetMapping 就是⼀个完整的请求路径 http://service- product/product/{pid}
@GetMapping(value = "/product/{pid}")
Product findByPid(@PathVariable("pid") Integer pid);
}
4.修改controller代码,并启动验证
5.重启order微服务,查看效果
4.1.3 自定义配置
Feign可以⽀持很多的⾃定义配置,⼀般情况下,默认值就能满⾜我们使⽤,如果要⾃定义时,只需要创建⾃定义的@Bean覆盖默认Bean即可.
配置⽂件⽅式
基于配置⽂件修改feign的⽇志级别可以针对单个服务:
feign:
client:
config:
service-product: # 针对某个微服务的配置
loggerLevel: FULL # ⽇志级别
也可以针对所有服务:
feign:
client:
config:
default: # 这⾥⽤default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # ⽇志级别
注意:需要把⽇志级别设置
logging:
level:
com.apesource: debug
⽇志的级别分为四种:
NONE:不记录任何⽇志信息,这是默认值。
BASIC:仅记录请求的⽅法, URL以及响应状态码和执⾏时间
HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
4.1.4 Feign使用优化
Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:
URLConnection:默认实现,不⽀持连接池
Apache HttpClient :⽀持连接池
OKHttp:⽀持连接池
因此提⾼Feign的性能主要⼿段就是使⽤连接池代替默认的URLConnection
这⾥我们⽤Apache的HttpClient来演示
1.引⼊依赖
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2.配置连接池
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # ⽇志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的⽀持
max-connections: 200 # 最⼤的连接数
max-connections-per-route: 50 # 每个路径的最⼤连接数
总结:
1.⽇志级别尽量⽤basic
2.使⽤HttpClient或OKHttp代替URLConnection
引⼊feign-httpClient依赖
配置⽂件开启httpClient功能,设置连接池参数
案例源码:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启Fegin
public class ShopOrderApplication {
public static void main(String[] args) {
SpringApplication.run(ShopOrderApplication.class, args);
}
}
&#