一、使用Feign实现远程HTTP调用
之前的代码:
/**
* 1.代码不可读
* 2、复杂的url难以维护
* 3.难以响应需求的变化,变化很没有幸福感
* 4、编程体验不统一
*/
UserDTO userDTO = restTemplate.getForObject(
"http://user-center/users/{id}",
UserDTO.class,userid
);
改造代码:
<!-- Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类上加上@EnableFeignClients注解
package com.itmuch.contentcenter.feignclient;
import com.itmuch.contentcenter.domain.user.UserDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-center")
public interface UserCenterFeignClient {
@GetMapping("/user/{id}")
UserDTO findById(@PathVariable Integer id);
}
二、Feign的组成
三、细粒度配置自定义
-
Java代码方式
feign的日志级别是建立在feign的接口的日志级别是debug的基础上,如果为其他级别,则什么都不会打印
- 在接口@FeignClient中加上configuration属性,UserCenterFeignConfiguration为自定义的feign配置类
@FeignClient(name = "user-center",configuration = UserCenterFeignConfiguration.class)
public interface UserCenterFeignClient {
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
自定义的feign配置类代码(如果该类上有@Configuration,则需要把该类放到启动类所在的包之外
,参考Ribbon的细粒度配置时的额spring父子上下文问题):
package com.itmuch.contentcenter.configuration;
import feign.Logger;
import org.springframework.context.annotation.Bean;
public class UserCenterFeignConfiguration {
@Bean
public Logger.Level level(){
//让fegin打印所有请求的细节
return Logger.Level.FULL;
}
}
* 在配置文件中添加配置
logging:
level:
#springboot设置日志级别
com.itmuch: debug
# feign的日志级别是建立在feign的接口的日志级别是debug的基础上,如果为其他级别,则什么都不会打印
com.itmuch.contentcenter.configuration.UserCenterFeignConfiguration: debug
# 配置属性方式自定义feign的日志级别
feign:
client:
config:
# 想要调用的服务的名称
user-center:
loggerLevel: full
四、全局配置
# 配置属性方式指定全局feign的日志级别
feign:
client:
config:
# 全局设置为default
default:
loggerLevel: full
五、支持的配置项
六、配置最佳实践总结
优先级:全局代码配置<全局属性配置<细粒度代码配置<细粒度属性配置
七、Feign的继承
八、多参数请求构造
https://www.imooc.com/article/289000
九、Feign脱离Ribbon使用
十、RestTemplate VS Feign
十一、Feign性能优化
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
* 写配置
feign
# 配置feign连接池,使用Apache连接池的时候是httpclient,使用Okhttp时是okhttp
httpclient:
# 让feign使用Apache httpclient做请求;而不是默认的urlconnection
enabled: true
# feign 的最大连接数
max-connections: 200
# feign单个路径的最大连接数
max-connections-per-route: 50