一.为什么要使用feign
在之前发起微服务调用的时候,我们采用的都是RestTemplate提供的http请求进行调用。
发起http请求
其实,这样的一种调用方式会造成一个问题。当请求里面的URL参数过多的时候,我们一个个地去拼接字符串来发起请求,这样会显得代码十分的不美观。 但是我们用feign进行声明式调用的话:
这样的话代码是不是直观了许多,并且也不存在当参数过多时候要去把一大堆参数和变量拼接的情况。
二.Feign的使用
(一).引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(二).在启动类上加入注解 @EnableFeignClients
@SpringBootApplication
@EnableFeignClients //开启Feign
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class,args);
}
@Bean
@LoadBalanced //添加负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
(三).编写Feign客户端
(四).注入,发起请求
@Autowired
private RestTemplate restTemplate;
@Autowired
private ServiceB serviceB; //注入刚刚写的Feign客户端
@GetMapping("test")
public String ServiceATest(){
// String url = "http://ServiceB/serviceB/test";
// String forObject = restTemplate.getForObject(url, String.class);
//发起Feign请求
String result = serviceB.serviceB("666");
return "ServiceA Working and " + result;
}
ServiceA发起请求
public class ServiceBController {
@GetMapping("test/{pm}")
public String ServiceBTest(@PathVariable String pm){
log.info("B被调用了");
return "ServiceB Working and the parameter is" + pm;
}
}
ServiceB
到此,我们就可以基于feign声明式客户端的方法,发起http请求。但是,我们的负载均衡怎么办?
feign的依赖里面自带的有ribbon进行负载均衡的,只不过我这里的nacos里面也带了个ribbon所以这里的ribbon就自动忽略掉了
三.Feign的日志配置
在applicaiton.yml里加入:
feign:
client:
config:
//default代表全局生效
default:
logger-level: none //none表示没有,basic带请求耗时,header带请求头请求地址,full啥都带
//这里写服务名代表对某个服务生效
# ServiceB:
# logger-level: none
四.Feign使用连接池
Feign默认使用的是Apache的UrlConnection作为底层,UrlConnection不支持连接池。这样的话每次连接都会产生一次开启和关闭连接的流程,会极大消耗服务器资源的使用。因此可以引用Okhttp和httpclient来支持连接池。这里使用httpclient。
(一).引入依赖
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
(二).修改application.yml
feign:
client:
config:
default:
logger-level: none
httpclient:
enabled: true //启用httpclient
max-connections: 200 //最大连接数,根据实际情况配置
max-connections-per-route: 50 //每个路径最大连接数,根据实际情况配置
五.Feign的最佳实践
feign从使用上来说没有100%完美的使用方案,这里会给出两种较为主流的方案:
(一).将消费者的FeignClient与提供者的Controller抽取出来
- 优点:定义了统一的规范,实现简单
- 缺点:耦合度较高,且对Mvc无效
(二).将FeignClient及其涉及的POJO类,Feign的配置定义到一个Module中
注意,使用这种方法需要在@EnableFeignClients里指定Feignclient所在的包或者字节码文件,否则无法使用。
//指定FeignClient所在的包
@EnableFeignClients(basePackages ="com.xx.xxxxx")
//指定FeignClient所在的字节码文件
@EnableFeignClients(clients = {xxxxxxx.class})
推荐方式2,按需导入
- 优点:耦合度角度
- 缺点:容易引入大量无用的类
两种方案皆有优缺点,需要在开发时进行取舍。以上就是Feign的使用以及注意事项