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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 文章标题为“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

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
负载均衡 Java Nacos
Ribbon负载均衡
Ribbon负载均衡
31 1
Ribbon负载均衡
|
1月前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
80 5
|
16天前
|
负载均衡 Java Nacos
常见的Ribbon/Spring LoadBalancer的负载均衡策略
自SpringCloud 2020版起,Ribbon被弃用,转而使用Spring Cloud LoadBalancer。Ribbon支持轮询、随机、加权响应时间和重试等负载均衡策略;而Spring Cloud LoadBalancer则提供轮询、随机及Nacos负载均衡策略,基于Reactor实现,更高效灵活。
42 0
|
2月前
|
移动开发 数据可视化 小程序
可视化集成相当优秀ucharts图表组件
可视化集成相当优秀ucharts图表组件
49 3
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
4月前
|
存储 设计模式 缓存
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
该文章主要介绍了如何在OpenFeign中集成Ribbon以实现负载均衡,并详细分析了Ribbon中服务选择和服务过滤的核心实现过程。文章还涉及了Ribbon中负载均衡器(ILoadBalancer)和负载均衡策略(IRule)的初始化方式。
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
|
3月前
|
负载均衡 Java 开发者
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
42 0
|
2月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
23天前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
46 0
|
5月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
316 6