环境:SpringBoot2.7.12 + Spring Cloud2021.0.7
1. 概述Spring Cloud Openfeign是一种声明式、模板化的HTTP客户端 , 主要用于在Spring Cloud微服务架构中进行服务调用 。
【Spring Cloud 远程调用 OpenFeign 这些知识点,能颠覆你的认知!】相比于传统的RestTemplate,Openfeign更加简洁,开发者只需通过编写一个接口并添加注解进行配置,即可实现对服务提供方接口的绑定,而无需手动构造请求和解析返回数据 。
Openfeign的应用 , 让Spring Cloud微服务调用变得更加便捷 。在服务消费者中,只需通过接口方法即可进行远程服务调用,就像调用本地方法一样简单 。此外 , Feign还集成了LoadBalancer,利用LoadBalancer维护服务提供方列表,实现轮询调用服务提供者 。
使用Spring Cloud Openfeign , 开发者可以更加专注于业务逻辑而不是底层的HTTP请求,提高了开发效率和代码可读性 。同时 , Openfeign还支持自定义配置和扩展,可以满足不同场景下的需求 。总之 , Spring Cloud Openfeign是Spring Cloud微服务架构中不可或缺的一部分,可以帮助开发者更加高效地进行服务调用 。
2. 准备环境<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId></dependency>
开启openfeign功能@SpringBootApplication@EnableFeignClientspublic class SpringCloudComprehensiveApplication {}
feign客户端@FeignClient(url = "http://localhost:8088/demos",name = "demoService")public interface DemoFeign {@GetMapping("/info/{id}")public Object info(@PathVariable("id") Integer id) ;}
以上DemoFeign就能被正确的使用了 。接下来看看下面的那些知识点你是知道的
3. 知识盲区盲区1:超时时间默认情况下feign调用超时时间如下:
/** * 默认超时时间 * <ul> * <li>Connect Timeout: 10 seconds</li> * <li>Read Timeout: 60 seconds</li> * <li>Follow all 3xx redirects</li> * </ul> */public Options() {this(10, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true);}
定义public class FeignClientFactoryBean {// 读超时时间private int readTimeoutMillis = new Request.Options().readTimeoutMillis();// 连接超时时间private int connectTimeoutMillis = new Request.Options().connectTimeoutMillis();}
编程方式自定义:你只需要提供Request.Options类型的Bean即可 。
配置定义#全局定义feign.client.config.default.connect-timeout=3000feign.client.config.default.read-timeout=3000#具体服务定义feign.client.config.demoService.connect-timeout=2000feign.client.config.demoService.read-timeout=2000
盲区2:重试feign的重试相信很多人都没有玩过对吧?
如果feign没有启用断路器功能(feign.circuitbreaker.enabled, 默认值为false) , 那么会开启retryer(重试)功能;默认情况openfeign提供了如下配置:
@Bean@Scope("prototype")@ConditionalOnMissingBeanpublic Feign.Builder feignBuilder(Retryer retryer) {return Feign.builder().retryer(retryer);}// 默认还是个不支持重试的,所以我们需要自定义重试Bean@Bean@ConditionalOnMissingBeanpublic Retryer feignRetryer() {return Retryer.NEVER_RETRY;}
自定义重试bean@Beanpublic Retryer feignRetryer() {Retryer.Default retryer = new Retryer.Default(100, SECONDS.toMillis(1), 2);return retryer ;}
这样如果当前环境没有cricuitbreaker , 那么这里的重试就能生效了 。
盲区3:服务降级通常定义了feign客户端后,我们都会定义相应的降级服务,fallback或fallbackFactory , 如果这两个都配置了那谁才会生效呢?源码如下:
class FeignCircuitBreakerTargeter implements Targeter {public <T> T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignContext context,Target.HardCodedTarget<T> target) {// ...FeignCircuitBreaker.Builder builder = (FeignCircuitBreaker.Builder) feign;String name = !StringUtils.hasText(factory.getContextId()) ? factory.getName() : factory.getContextId();// 先判断了fallback属性,如果不是void , 那么直接返回了Class<?> fallback = factory.getFallback();if (fallback != void.class) {return targetWithFallback(name, context, target, builder, fallback);}Class<?> fallbackFactory = factory.getFallbackFactory();if (fallbackFactory != void.class) {return targetWithFallbackFactory(name, context, target, builder, fallbackFactory);}return builder(name, builder).target(target);}}
推荐阅读
- 解密SpringBoot线程池
- SpringBootCms
- Spring事务超时到底是怎么回事?
- Spring Cloud微服务架构:构建弹性和可伸缩的云原生应用
- Spring 如何解决循环依赖?
- 远程培训工作总结 远程培训学习总结范文
- 三个要点,掌握Spring Boot单元测试
- CORS 跨域资源共享在Spring Boot中的实现
- Java面试题之SpringBoot 框架
- SpringBoot中ApplicationEvent详解