Feign是Spring Cloud提供的声明式、模板化的HTTP客户端, 它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@SpringBootApplication
@MapperScan("com.lhs.mapper")
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args){
SpringApplication.run(UserApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
package com.lhs.clients;
import com.lhs.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User fingById(@PathVariable("id") Long id);
}
@Service("orderService")
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
@Autowired
public RestTemplate restTemplate;
@Autowired
private UserClient userClient;
public Order getOrder(Long id){
Order order = getById(id);
User user = userClient.fingById(order.getUserId());
order.setUser(user);
return order;
}
}
feign:
client:
config:
default: #此处写的是服务名称,针对我们feign微服务的配置,如果是default就是全局配置
loggerLevel: full #配置Feign的日志级别,相当于代码配置方式中的Logger(推荐none或basic)
logging:
level:
com.lhs.clients.UserClient: debug # 客户端接口的全限定名
结果如下:
Feign默认使用HttpURLConnection去发送请求,每次请求都会建立、关闭连接,很消耗时间。但是Feign还支持使用Apache的httpclient 以及OKHTTP去发送请求,其中Apache的HTTPClient和OKHTTP都是支持连接池的。
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
feign:
client:
config:
default: #此处写的是服务名称,针对我们feign微服务的配置,如果是default就是全局配置
loggerLevel: full #配置Feign的日志级别,相当于代码配置方式中的Logger(推荐none或basic)
httpclient:
enabled: true # 开启对httpclient的支持
max-connections: 200 # 最大连接数
max-connections-per-route: 50 # 每个路径的最大连接数
给消费者的 FeignClient 和提供者的 controller 定义统一的父接口作为标准。(不推荐)
将 FeignClient 抽取为独立模块,并且把接口有关的 POJO 、默认的 Feign 配置都放在这个模块中,提供给消费者使用。