概述
OpenFeign是一个
声明式
的WEB服务客户端,它使WEB服务客户端变得更加容易。具有可插拔
的注解支持,SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka,以及SpringCloud LoadBalance,以便在使用Feign时提供负载均衡的HTTP客户端Feign是一个远程调用
的组件集成了Ribbon,默认的负载均衡策略是轮询
OpenFeign使用案例
① 调用设计图:
② order-service
1. server: 2. port: 8080 3. spring: 4. application: 5. name: order-service 6. eureka: 7. client: 8. service-url: 9. defaultZone: http://localhost:8761/eureka 10. instance: 11. lease-renewal-interval-in-seconds: 5
提供API
1. @RestController 2. public class OrderController { 3. 4. @GetMapping("doOrder") 5. public String doOrder(){ 6. return "鱼香肉丝"; 7. } 8. }
③ user-service
作为消费者需要进行远程调用,加入OpenFeign依赖
1. <dependency> 2. <groupId>org.springframework.cloud</groupId> 3. <artifactId>spring-cloud-starter-openfeign</artifactId> 4. </dependency>
配置文件
1. server: 2. port: 8081 3. spring: 4. application: 5. name: user-service 6. eureka: 7. client: 8. service-url: 9. defaultZone: http://localhost:8761/eureka 10. instance: 11. lease-renewal-interval-in-seconds: 5
启动类中添加
@EnableOpenFeignClients
注解,开启OpenFeign客户端远程调用的功能
1. @SpringBootApplication 2. @EnableEurekaClient 3. @EnableFeignClients 4. public class UserServiceApplication { 5. 6. public static void main(String[] args) { 7. SpringApplication.run(UserServiceApplication.class, args); 8. } 9. }
定义一个接口,添加
@FeignClient
注解并指定提供者的服务名接口中的方法为提供者的API签名部分
1. /** 2. * @FeignClient:value=提供者的服务名 3. */ 4. @FeignClient("order-service") 5. public interface UserOrderFeign { 6. 7. /** 8. * 提供者的方法签名 9. * 除方法体之外的全部属性 10. */ 11. @GetMapping("doOrder") 12. String doOrder(); 13. }
创建Controlller注入该接口,提供API供浏览器进行请求
1. @RestController 2. public class UserController { 3. 4. @Autowired 5. private UserOrderFeign userOrderFeign; 6. 7. @GetMapping("userDoOder") 8. public String userDoOder(){ 9. return userOrderFeign.doOrder(); 10. } 11. }
④ 设置超时
默认超时时间为1s,修改Ribbon配置,查询DefaultClientConfigImpl
1. ribbon: 2. ReadTimeout: 3000 #调用超时时间 3s 3. ConnectTimeout: 3000 #连接超时时间 3s
底层核心原理
底层通过
JDK动态代理
获取到接口中的服务信息,使用Ribbon管理后的RestTemplate
进行调用
1. @SpringBootTest 2. class ApplicationTests { 3. 4. @Autowired 5. private RestTemplate restTemplate; 6. 7. @Test 8. void contextLoads() { 9. UserOrderFeign o = (UserOrderFeign) Proxy.newProxyInstance(UserOrderFeign.class.getClassLoader(), new Class[]{UserOrderFeign.class}, new InvocationHandler() { 10. @Override 11. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 12. // 获取目标方法上的注解 13. GetMapping MethodAnnotation = method.getAnnotation(GetMapping.class); 14. // 获取注解上的请求路径 15. String path = MethodAnnotation.value()[0]; 16. // 获取目标方法所在的类 17. Class<?> aClass = method.getDeclaringClass(); 18. // 获取类上面的注解 19. FeignClient classAnnotation = aClass.getAnnotation(FeignClient.class); 20. // 获取注解上的value值(服务名) 21. String applicationName = classAnnotation.value(); 22. // 拼接URL 23. String url = "http://"+applicationName+"/"+path; 24. // 使用Ribbon托管后的RestTemplate进行调用 25. return restTemplate.getForObject(url, String.class); 26. } 27. }); 28. String s = o.doOrder(); 29. System.out.println(s); 30. } 31. 32. }
日志
级别
- NONE:默认的,不记录日志
- BASE:记录请求方法、URL、响应状态码、执行时间
- HEADERS:在BASE上增加了请求和响应头信息
- FULL:在HEADERS上增加了请求和响应的正文、无数据
创建配置类
1. @Configuration 2. public class OpenFeignLevelConfig { 3. 4. @Bean 5. public Logger.Level level(){ 6. return Logger.Level.FULL; 7. } 8. }
修改配置文件
1. logging: 2. level: 3. com.jiuxiao.controller.feign.UserOrderFeign: debug
总结
1、openFeign是一个HTTP客户端,它融合了springmvc的注解,使之可以用REST风格的映射来请求转发。
2、可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射,亦或是作为service层处理逻辑,只不过这里,openFeign只是做一个请求转发的逻辑操作。
3、openFeign整合了hystrix做熔断处理,同时,可以和ribbon客户端负载均衡、Eureka注册中心配合使用,实现负载均衡的客户端。
4、openFeign有一个很重要的功能:fallback,其实它是hystrix的特性
面试相关
1、如何使用?
- 首先,调用以及被调用的微服务双方都应该被注册到注册中心。
- Spring Boot启动APP上标注
@EnableFeignClients
注解。- 编写远程调用接口并标注
@FeignClient
注解。(括号内添加所要调用的微服务名称)- 接口中的方法为实际想要调用的服务的方法签名,并使用
@PostMapping
注解映射为一个post类型的HTTP请求。Feign和openFeign有什么区别?
Feign | openFiegn |
Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务 | OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 |