环境:SpringBoot2.7.12 + Spring Cloud2021.0.7
公司主营业务:成都网站设计、网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出河北免费做网站回馈大家。
Spring Cloud Openfeign是一种声明式、模板化的HTTP客户端,主要用于在Spring Cloud微服务架构中进行服务调用。
相比于传统的RestTemplate,Openfeign更加简洁,开发者只需通过编写一个接口并添加注解进行配置,即可实现对服务提供方接口的绑定,而无需手动构造请求和解析返回数据。
Openfeign的应用,让Spring Cloud微服务调用变得更加便捷。在服务消费者中,只需通过接口方法即可进行远程服务调用,就像调用本地方法一样简单。此外,Feign还集成了LoadBalancer,利用LoadBalancer维护服务提供方列表,实现轮询调用服务提供者。
使用Spring Cloud Openfeign,开发者可以更加专注于业务逻辑而不是底层的HTTP请求,提高了开发效率和代码可读性。同时,Openfeign还支持自定义配置和扩展,可以满足不同场景下的需求。总之,Spring Cloud Openfeign是Spring Cloud微服务架构中不可或缺的一部分,可以帮助开发者更加高效地进行服务调用。
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-loadbalancer
org.springframework.cloud
spring-cloud-starter-circuitbreaker-resilience4j
@SpringBootApplication
@EnableFeignClients
public class SpringCloudComprehensiveApplication {
}
@FeignClient(
url = "http://localhost:8088/demos",
name = "demoService"
)
public interface DemoFeign {
@GetMapping("/info/{id}")
public Object info(@PathVariable("id") Integer id) ;
}
以上DemoFeign就能被正确的使用了。接下来看看下面的那些知识点你是知道的
默认情况下feign调用超时时间如下:
/**
* 默认超时时间
*
* - Connect Timeout: 10 seconds
* - Read Timeout: 60 seconds
* - Follow all 3xx redirects
*
*/
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=3000
feign.client.config.default.read-timeout=3000
#具体服务定义
feign.client.config.demoService.connect-timeout=2000
feign.client.config.demoService.read-timeout=2000
feign的重试相信很多人都没有玩过对吧?
如果feign没有启用断路器功能(feign.circuitbreaker.enabled, 默认值为false),那么会开启retryer(重试)功能;默认情况openfeign提供了如下配置:
@Bean
@Scope("prototype")
@ConditionalOnMissingBean
public Feign.Builder feignBuilder(Retryer retryer) {
return Feign.builder().retryer(retryer);
}
// 默认还是个不支持重试的,所以我们需要自定义重试Bean
@Bean
@ConditionalOnMissingBean
public Retryer feignRetryer() {
return Retryer.NEVER_RETRY;
}
@Bean
public Retryer feignRetryer() {
Retryer.Default retryer = new Retryer.Default(100, SECONDS.toMillis(1), 2);
return retryer ;
}
这样如果当前环境没有cricuitbreaker,那么这里的重试就能生效了。
通常定义了feign客户端后,我们都会定义相应的降级服务,fallback或fallbackFactory,如果这两个都配置了那谁才会生效呢?源码如下:
class FeignCircuitBreakerTargeter implements Targeter {
public T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignContext context,
Target.HardCodedTarget 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);
}
}
在@FeignClient注解中有个primary属性,你知道这个属性有什么用吗?
默认每一个feign客户端都被注册为bean,并且每个bean都相当于使用了@Primary注解修饰一样,任何地方注入都是有限注入的该bean。它的用处还得从fallback属性说起。如果定义了feign客户端后对应的fallback是需要实现当前这个feign接口的,且还的注册为bean对象。那么如果把这里的primary设置为false后,容器中此时可是存在两个DemoFeign类型的bean的,这时候容器启动就会报错了。所以这里默认就吧feign客户端的primary设置为true就是解决这个问题的。示例如下:
@FeignClient(
url = "http://localhost:8088/demos",
name = "demoService",
fallback = DemoFeignFallback.class
primary = true // 默认即为true
)
public interface DemoFeign {}
@Component
public class DemoFeignFallback implements DemoFeign {
}
盲区1中已经提到了超时时间问题,那都是写静态配置,那能不能动态配置呢?可以,完全可以,你只需下面这样操作即可
#开启刷新配置
feign.client.refresh-enabled=true
实现的原理也比较简单就是:向容器中注册了一个OptionsFactoryBean类型的bean且该Bean的作用域范围是refresh。当我们调用/refresh endpoint后就会刷新该Bean的配置信息。
先就列出上面5个知识点吧,看看你知道几个?
完毕!!!
本文标题:SpringCloud远程调用OpenFeign这些知识点,能颠覆你的认知!
转载来源:http://www.shufengxianlan.com/qtweb/news24/243824.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联