一.OpenFeign简介
OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
openfeign的实现原理:
基于@EnableFeignClients 将所有被@FeignClient注解的类 注册到容器中。当这些被@FeignClient注解的类被调用时会创建一个动态代理的对象为我们创建被调用类的实例,然后都会被统一转发给 Feign 框架所定义的一个 InvocationHandler , 由该 Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的工作。
二.使用
①导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
②主启动类标记注解 @EnableFeignClients (例子:消费者启动类上放)
③创建接口,使用注解 @FeignClient(微服务实例名)
例子:
@Component
@FeignClient("SERVICE-PROVIDER")
public interface ProductFeignService {
/**
* 编写技巧,直接把服务提供者那一端的控制器方法的两行拷贝过来,最后加一个分号就可以了,别的什么也不用动
*/
@RequestMapping("/provider/product/findAll")
public List<Product> findAll();
@RequestMapping("/provider/product/findByPid")
public String findByPid(@RequestParam("pid") Integer pid);
④调用接口
使用@Autowired注入上面注入的接口,进行使用
例子:
@RestController
public class ProductController {
@Autowired
private ProductFeignService productFeignService;
@RequestMapping("/consumer/product/findAll")
public List<Product> findAll() {
return productFeignService.findAll();
}
@RequestMapping("/consumer/product/findByPid")
public String findByPid(@RequestParam("pid") Integer pid) {
return productFeignService.findByPid(pid);
}
}
⑤设置超时时间
默认Feign客户端只等待一秒,如果服务端处理时间超过一秒,则报错。
设置超时时间可以通过yml修改
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000