OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)

简介: 文章标题为“OpenFeign的Ribbon负载均衡详解”,是继OpenFeign十大可扩展组件讨论之后,深入探讨了Ribbon如何为OpenFeign提供负载均衡能力的详解。

前言

之前的文章 OpenFeign十大可扩展组件你知道哪些?有说过Openfeign有10大可扩展组件:

image.png

image.png 我们今天详细分析第一个 feign.Client,还有Spring默认提供的负载均衡能力的通信客户端org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient, client组件应属于feign框架中最核心的组件,因为它承担着rpc框架最关键的能力-发起远程通信

feign.Client默认实现

在feign的原生包里面,有一个默认的实现feign.Client.Default

image.png

默认使用的是Java原生的HttpURLConnection来发起通信,

image.png

这里是官方对HttpURLConnection的介绍,感兴趣的可以查看

Java官方提供的基于Socket的基础通信组件,api的使用比较麻烦,比如需要发起一个http请求,我们需要这样写:

//根据请求地址构造URL对象
URL url = new URL("http://www.baidu.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
   
    InputStream in = new BufferedInputStream(urlConnection.getInputStream());
    //需要自行操作流
    List<String> result = IOUtils.readLines(in);
    for (String r : result) {
   
        System.out.println(r);
    }
} finally {
   
    urlConnection.disconnect();
}

image.png

HttpURLConnection没有封装好的http网络库使用便捷。比okhttp,apache,httpcompent,我们的应用程序一般会使用到封装好的库进行通信。 下面是okhttp的写法:

@SneakyThrows
public static void main(String[] args) {
   
    OkHttpClient okHttpClient = new OkHttpClient();
    Request request = new Request.Builder().url("http://www.baidu.com").build();
    Response reponse = okHttpClient.newCall(request).execute();
    System.out.println(reponse.body().string());
}

image.png

相比okhttp,HttpURLConnection使用上更费劲,而okhttp提供了极好的便捷性和扩展性,从下方构造函数看,okhttp组件提供了很多扩展点,比如拦截器,缓存,代理等,同时如果想做负载均衡的话,是不支持的。

image.png

LoadBalancerFeignClient登场

于是LoadBalancerFeignClient出现了,LoadBalancerFeignClient是集成了负载均衡能力的客户端,同时它持有了抽象的通信client组件的引用。

image.png feign本身不提供负载均衡的能力,默认会使用ribbon负责负载均衡处理。

LoadBalancerFeignClient它是如何生效的呢?也就是说怎么替换feign里默认的通信feign.Client
DefaultFeignLoadBalancedConfiguration里面利用了自动装配机制进行覆盖

package org.springframework.cloud.openfeign.ribbon;

/**
 * @author Spencer Gibb
 */
@Configuration
class DefaultFeignLoadBalancedConfiguration {
   

   @Bean
   @ConditionalOnMissingBean
   public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
         SpringClientFactory clientFactory) {
   
      return new LoadBalancerFeignClient(new Client.Default(null, null), cachingFactory,
            clientFactory);
   }

}

openfeign如何替换默认的HttpUrlConnection

这种情况还是使用的httpUrlConnection通信组件,如果想使用okhttp或者apache-http-client怎么办呢?

Spring团队也早想到了,分别给我们提供了一个配置类

package org.springframework.cloud.openfeign.ribbon;

/**
 * @author Spencer Gibb
 */
@Configuration
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnProperty("feign.okhttp.enabled")
class OkHttpFeignLoadBalancedConfiguration {
   

   @Bean
   @ConditionalOnMissingBean(Client.class)
   public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
         SpringClientFactory clientFactory, okhttp3.OkHttpClient okHttpClient) {
   
      OkHttpClient delegate = new OkHttpClient(okHttpClient);
      return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
   }
}

你们项目中是否有使用过上方这个配置feign.okhttp.enabled呢?

下面是使用ApacheHttpClient替换默认通信组件

package org.springframework.cloud.openfeign.ribbon;

/**
 * @author Spencer Gibb
 */
@Configuration
@ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
class HttpClientFeignLoadBalancedConfiguration {
   

   @Bean
   @ConditionalOnMissingBean(Client.class)
   public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
         SpringClientFactory clientFactory, HttpClient httpClient) {
   
      ApacheHttpClient delegate = new ApacheHttpClient(httpClient);
      return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
   }
}

写到这里又想抱Spring团队大佬的大腿了,每个组件都能写的这么灵活。

image.png

总结篇

Client组件默认使用HttpURLConnection实现通信,而LoadBalancerFeignClient是将负责均衡和通信能力组合的。由于负载均衡能力是ribbon提供的,本文只分析到此,下文将分析ribbon是如何给openFeign增加负载均衡能力的。

image.png

相关文章
|
15天前
|
移动开发 数据可视化 小程序
可视化集成相当优秀ucharts图表组件
可视化集成相当优秀ucharts图表组件
37 3
|
1月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
2月前
|
存储 设计模式 缓存
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
该文章主要介绍了如何在OpenFeign中集成Ribbon以实现负载均衡,并详细分析了Ribbon中服务选择和服务过滤的核心实现过程。文章还涉及了Ribbon中负载均衡器(ILoadBalancer)和负载均衡策略(IRule)的初始化方式。
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
|
28天前
|
负载均衡 Java 开发者
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
26 0
|
2月前
|
负载均衡 Java Spring
Ribbon的超时配置会覆盖OpenFeign的超时配置吗
该文章详细分析了OpenFeign与Ribbon之间的超时配置关系,解释了Ribbon如何覆盖OpenFeign的默认超时配置,并探讨了OpenFeign超时配置的动态修改方案。
|
5月前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
118 0
|
4月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
112 2
|
3月前
|
负载均衡 算法 应用服务中间件
nginx自定义负载均衡及根据cpu运行自定义负载均衡
nginx自定义负载均衡及根据cpu运行自定义负载均衡
45 1
|
3月前
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
298 2
|
5月前
|
负载均衡 应用服务中间件 nginx
解决nginx配置负载均衡时invalid host in upstream报错
在Windows环境下,配置Nginx 1.11.5进行负载均衡时遇到问题,服务无法启动。错误日志显示“invalid host in upstream”。检查发现上游服务器列表中,192.168.29.128的主机地址无效。负载均衡配置中,两个服务器地址前误加了&quot;http://&quot;。修正方法是删除上游服务器列表和proxy_pass中的&quot;http://&quot;。问题解决后,Nginx服务应能正常启动。
421 4
解决nginx配置负载均衡时invalid host in upstream报错