Feign是Netflix开源的声明式HTTP客户端
GitHub
org.springframework.cloud
spring-cloud-starter-openfeign
在Springboot的启动类上加上注解 @EnableFeignClients
@FeignClient(name = "user-center")
public interface UserCenterFeignClient {
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
private final UserCenterFeignClient userCenterFeignClient;
public ShareDTO findById(Integer id) {
// 更改之后的调用HTTP
UserDTO userDTO = this.userCenterFeignClient.findById(userId);
return null;
}
/**
* 如果加了configuration注解,就把代码放到启动类之外的包
* 是由于 父子上下文,重复扫描的问题
*/
public class UserCenterFeignConfiguration {
@Bean
public Logger.Level level() {
// 让feign打印所有的细节
return Logger.Level.FULL;
}
}
@FeignClient(name = "user-center",configuration = UserCenterFeignConfiguration.class)
public interface UserCenterFeignClient {
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
logging:
level:
#把要打印日志的包全路径copy过来选择日志级别
com.itmuch.contentcenter.feignclient.UserCenterFeignClient: debug
// 去掉刚才的configuration
@FeignClient(name = "user-center")
public interface UserCenterFeignClient {
@GetMapping("/users/{id}")
UserDTO findById(@PathVariable Integer id);
}
feign:
client:
config:
# 想要调用的微服务名称
user-center:
loggerLevel: full
在启动类上的注解@EnableFeignClients进行配置
@EnableFeignClients(defaultConfiguration = UserCenterFeignConfiguration.class)
public class UserCenterFeignConfiguration {
@Bean
public Logger.Level level() {
return Logger.Level.FULL;
}
}
feign:
client:
config:
# 全局配置
default:
loggerLevel: full
优先级:
全局代码配置<全局属性<细粒度代码配置<细粒度属性配置
Feign的继承是将一些通用代码抽离出来成为一个单独的maven,然后可以在各微服务直接调用,比如在微服务A调用微服务B的时候有通用的调用的时候就可以抽离出来,比如返回一个User对象,这个对象理由有一个属性,如果采用了继承特性,那么在编写的时候一般就不会出现什么问题;如果没有采用继承特性,比如在微服务A中的User对象增加了一些属性,而在微服务B调用A的这个接口获取User对象的时候,B并没有增加那些属性,这就会导致JSON报错,因为跟结果对不上。
官方的建议是不采用这个特性,因为这会导致微服务的紧耦合,这就背离了微服务的初衷。
所以还是需要权衡利弊来使用这个继承特性。
user-center
@GetMapping("/q")
public User query(User user) {
return user;
}
content-center
@FeignClient(name = "user-center")
public interface TestUserCenterFeignClient {
@GetMapping("/q")
public UserDTO query(@SpringQueryMap UserDTO userDTO);
}
@Autowired
private TestUserCenterFeignClient testUserCenterFeignClient;
@GetMapping("test-get")
public UserDTO query(UserDTO userDTO) {
return testUserCenterFeignClient.query(userDTO);
}
// 名字可以随便取,但是一定要有
@FeignClient(name = "baidu", url = "http://www.baidu.com")
public interface TestBaiduFeignClient {
@GetMapping
String index();
}
@Autowired
private TestBaiduFeignClient testBaiduFeignClient;
@GetMapping("baidu")
public String baiduIndex() {
return this.testBaiduFeignClient.index();
}
个人看法:尽量使用Feign,杜绝使用RestTemplate;具体视情况合理使用。
使用apache的Httpclient
引入依赖
io.github.openfeign
feign-httpclient
feign:
httpclient:
#让feign使用apache httpclient做请求,而不是默认的urlconnection
enabled: true
# feign最大连接数
max-connections: 200
# fegin 单个路径的最大连接数
max-connections-per-route: 50
使用Okhttp
引入依赖
io.github.openfeign
feign-okhttp
10.2.0
feign:
okhttp:
enabled: true