HTTP客户端Feign
1.基于Feign的远程调用
-
Feign作用:让远程调用代码更优雅,更便于维护
-
在pom.xml文件中引入依赖
-
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
启动类上添加注解@EnableFeignClients
-
创建接口文件,编写接口用于远程调用
-
@FeignClient("userservice") public interface Userclient { @GetMapping("/user/{id}") User findByID(@PathVariable("id") Long id); }
-
在需要调用的地方引入接口并调用
-
@Autowired private Userclient userclient; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 用Feign远程调用 User user = userclient.findByID(order.getUserId()); order.setUser(user); // 4.返回 return order; }
2.自定义配置
-
配置Feign日志有两种方式
-
方式一:配置文件方式
-
在application.yml文件中添加配置信息
-
全局生效 feign: client: config: default: loggerLevel: FULL # 日志级别 局部生效 feign: client: config: userservice: loggerLevel: FULL # 日志级别
-
日志信息
-
方式二:java代码方式
-
先声明一个Bean
-
全局有效–>在启动类注解中添加
-
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
-
局部有效–>在接口文件注解中添加
-
@FeignClient(value = "userservice",configuration = FeignClientProperties.FeignClientConfiguration.class)
3.性能优化
-
在pom.xml文件中引入依赖
-
<!--引入HttpClient依赖--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
-
在application.yml文件中添加配置信息
-
feign: httpclient: enabled: true # 支持HttpClient的开关 max-connections: 200 # 最大连接数 max-connections-per-route: 50 # 单个路径的最大连接数
4.Feign的最佳实践
-
方式二实现
-
首先创建一个module,命名为feign-api,然后引入feign的starter依赖
-
将order-service中编写的1UserClient、User、DefaultConfiguration都复制到feign-api项目中
-
将order-service中引入feign-api的依赖
-
修改order-service中的所有与上述三个组件有关的import部分,改为导入feign-api的包
-
问题出现
-
在我们重启的时候,发现启动不成功,因为我们order-service扫描的包没有扫描到UserClient(因为注解@FeignClient)
-
解决方案有两种
-
方式一:指定FeignClient所在包
-
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
-
方式二:指定FeignClient的字节码
-
@EnableFeignClients(clients = Userclient.class)