SpringCloud之OpenFeign介绍案例+相关面试题

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: OpenFeign是一个声明式的WEB服务客户端,它使WEB服务客户端变得更加容易。具有可插拔的注解支持,SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka,以及SpringCloud LoadBalance,以便在使用Feign时提供负载均衡的HTTP客户端Feign是一个远程调用的组件集成了Ribbon,默认的负载均衡策略是轮询

概述

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、如何使用?

  1. 首先,调用以及被调用的微服务双方都应该被注册到注册中心
  2. Spring Boot启动APP上标注 @EnableFeignClients注解。
  3. 编写远程调用接口并标注@FeignClient注解。(括号内添加所要调用的微服务名称)
  4. 接口中的方法为实际想要调用的服务的方法签名,并使用@PostMapping注解映射为一个post类型的HTTP请求。

Feign和openFeign有什么区别?

Feign openFiegn
Feign是SpringCloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务 OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign 的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
4月前
|
负载均衡 Java API
Spring Cloud 面试题及答案整理,最新面试题
Spring Cloud 面试题及答案整理,最新面试题
237 1
|
5天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
4月前
|
Java Nacos Sentinel
Spring Cloud Alibaba 面试题及答案整理,最新面试题
Spring Cloud Alibaba 面试题及答案整理,最新面试题
435 0
|
3月前
|
负载均衡 Java API
Java一分钟之-Spring Cloud OpenFeign:声明式服务调用
【6月更文挑战第9天】Spring Cloud OpenFeign是声明式服务调用库,简化了微服务间调用。通过动态代理,它允许开发者用Java接口调用HTTP服务,支持服务发现、负载均衡。本文介绍了OpenFeign的基本概念,展示了如何添加依赖、开启客户端和定义服务接口。还讨论了接口调用失败、超时重试和日志配置等问题及其解决方案,并提供了自定义Feign配置的代码示例。通过学习,读者可以更好地在微服务架构中使用OpenFeign进行服务通信。
230 4
|
3月前
springCloud之服务降级熔断Hystrix、OpenFeign
springCloud之服务降级熔断Hystrix、OpenFeign
167 0
|
1月前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
2月前
|
监控 Java 应用服务中间件
SpringCloud面试之流量控制组件Sentinel详解
SpringCloud面试之流量控制组件Sentinel详解
151 0
|
2月前
|
存储 算法 Java
Java面试之SpringCloud篇
Java面试之SpringCloud篇
71 1
|
3月前
|
负载均衡 Java 数据库连接
SpringCloud之OpenFeign简单使用
当远程服务调用失败时,会采用熔断降级策略,调用熔断降级的方法返回。
69 2
|
3月前
|
负载均衡 前端开发 Java
Spring Cloud 之 OpenFeign
Spring Cloud OpenFeign是Spring官方的声明式服务调用组件,简化了远程服务调用,使其如同调用本地方法。核心注解包括`@FeignClient`、`@EnableFeignClients`、`@GetMapping`和`@PostMapping`。实践中,通过在`pom.xml`添加依赖,创建Feign接口,配置`@FeignClient`,在启动类启用Feign,以及自定义超时设置来实现远程调用和负载均衡。