SpringCloudRPC远程调用核心原理:feign,linux系统使用教程pdf

(1)

org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration:此自动配置类能够配置具有负载均衡能力的FeignClient容器实例。

(2)

org.springframework.cloud.openfeign.FeignAutoConfiguration:此自动配置类只能配置原始的FeignClient客户端容器实例。

事实上,第一个自动配置类

FeignRibbonClientAutoConfiguration在容器的装配次序上优先于第二个自动配置类FeignAutoConfiguration。

为了达到高可用,Spring Cloud中一个微服务提供者至少应该部署两个以上节点,从这个角度来说,LoadBalancerFeignClient容器实例已经成为事实上的标配。

具体可以参见

FeignRibbonClientAutoConfiguration源码,节选如下:

import com.netflix.loadbalancer.ILoadBalancer;

@ConditionalOnClass({ILoadBalancer.class, Feign.class})

@Configuration

@AutoConfigureBefore({FeignAutoConfiguration.class}) //本配置类具备优先权

@EnableConfigurationProperties({FeignHttpClientProperties.class})

@Import({

HttpClientFeignLoadBalancedConfiguration.class,//配置:包装ApacheHttpClient实例的负载均衡客户端

OkHttpFeignLoadBalancedConfiguration.class, //配置:包装OkHttpClient实例的负载均衡客户端

DefaultFeignLoadBalancedConfiguration.class //配置:包装Client.Default实例的负载均衡客户端

})

public class FeignRibbonClientAutoConfiguration {

//空的构造器

public FeignRibbonClientAutoConfiguration() {

}

}

从源码中可以看到,

FeignRibbonClientAutoConfiguration的自动配置有两个前提条件:

(1)当前的类路径中存在ILoadBalancer.class接口。

(2)当前的类路径中存在Feign.class接口。

在这里重点讲一下ILoadBalancer.class接口,它处于ribbon的JAR包中。如果需要在类路径中导入该JAR包,就需要在Maven的pom.xml文件中增加ribbon的相关依赖,具体如下:

org.springframework.cloud

spring-cloud-starter-netflix-ribbon

为了加深大家对客户端负载均衡的理解,这里将ILoadBalancer.class接口的两个重要的抽象方法列出来,具体如下:

package com.netflix.loadbalancer;

import java.util.List;

public interface ILoadBalancer {

//通过负载均衡算法计算server服务器

Server chooseServer(Object var1);

//取得全部的服务器

List getAllServers();

}

FeignRibbonClientAutoConfiguration自动配置类并没有直接配置LoadBalancerFeignClient容器实例,而是使用@Import注解。通过导入其他配置类的方式完成LoadBalancerFeignClient客户端容器实例的配置。

分别导入了以下3个自动配置类:

(1)

HttpClientFeignLoadBalancedConfiguration.class:该配置类

负责配置一个包装ApacheHttpClient实例的LoadBalancerFeignClient负载均衡客户端容器实例。

(2)

OkHttpFeignLoadBalancedConfiguration.class:该配置类负责配置一个包装OkHttpClient实例的LoadBalancerFeignClient负载均衡客户端容器实例。

(3)

DefaultFeignLoadBalancedConfiguration.class:该配置类负责配置一个包装Client.Default实例的LoadBalancerFeignClient负载均衡客户端容器实例。

SpringCloudRPC远程调用核心原理:feign,linux系统使用教程pdf

装配ApacheHttpClient负载均衡容器实例

==========================

首先来看如何配置一个包装ApacheHttpClient实例的负载均衡客户端容器实例。这个IOC实例的配置由

HttpClientFeignLoadBalancedConfiguration自动配置类完成,其源码节选如下:

@Configuration

@ConditionalOnClass({ApacheHttpClient.class})

@ConditionalOnProperty(

value = {“feign.httpclient.enabled”},

matchIfMissing = true

)

class HttpClientFeignLoadBalancedConfiguration {

//空的构造器

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); //进行包装

}

首先来看源码中的feignClient()方法,分为两步:

(1)创建一个ApacheHttpClient类型的feign.Client客户端实例,该实例的内部使用Apache httpclient开源组件完成HTTP请求处理。

(2)创建一个LoadBalancerFeignClient负载均衡客户端实例,将ApacheHttpClient实例包装起来,然后返回该包装实例,作为feign.Client类型的Spring IOC容器实例。

接下来介绍

HttpClientFeignLoadBalancedConfiguration类上的两个重要注解:@ConditionalOnClass(ApacheHttpClient.class)和@ConditionalOnProperty(value=“feign.httpclient.enabled”,matchIfMissing=true)。

这两个条件的含义为:

(1)必须满足ApacheHttpClient.class在当前的类路径中存在。

(2)必须满足工程配置文件中feign.httpclient.enabled配置项的值为true。

如果以上两个条件同时满足,

HttpClientFeignLoadBalancedConfiguration自动配置工作就会启动。

具体如何验证呢?首先在应用配置文件中将配置项feign.httpclient.enabled的值设置为false,然后在

HttpClientFeignLoadBalancedConfiguration的feignClient()方法内的某行设置断点,重新启动项目,注意观察,会发现整个启动过程中断点没有被命中。

接下来,将配置项feign.httpclient.enabled的值设置为true,再一次启动项目,发现断点被命中。由此可见,验证

HttpClientFeignLoadBalancedConfiguration自动配置类被启动。

为了满足@ConditionalOnClass(ApacheHttpClient.class)的条件要求,需要为pom文件加上feign-httpclient和httpclient组件相关的Maven依赖,具体如下:

io.github.openfeign

feign-httpclient

9.5.1

org.apache.httpcomponents

httpclient

${httpclient.version}

对于feign.httpclient.enabled配置项来说,@ConditionalOnProperty的matchIfMissing属性值默认为true,也就是说,这个属性在默认情况下就为true。

装配OkHttpClient负载均衡容器实例

======================

接下来看如何配置一个包装OkHttpClient实例的负载均衡客户端容器实例。这个IOC实例的配置,由

OkHttpFeignLoadBalancedConfiguration自动配置类负责完成,其源码节选如下:

@Configuration

@ConditionalOnClass({OkHttpClient.class})

@ConditionalOnProperty(“feign.okhttp.enabled”)

class OkHttpFeignLoadBalancedConfiguration {

//空的构造器

OkHttpFeignLoadBalancedConfiguration () {

}

@Bean

@Cond

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 开源分享

itionalOnMissingBean({Client.class})

public Client feignClient(

CachingSpringLoadBalancerFactory cachingFactory,

SpringClientFactory clientFactory, HttpClient httpClient)

{

OkHttpClient delegate = new OkHttpClient (httpClient);

return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory); //进行包装

}

}

首先来看源码中的feignClient()方法,分为两步:

(1)创建一个OkHttpClient类型的客户端实例,该实例的内部使用OkHttp3开源组件来完成HTTP请求处理。

(2)创建一个LoadBalancerFeignClient负载均衡客户端实例,将OkHttpClient实例包装起来,然后返回LoadBalancerFeignClient客户端实例作为feign.Client客户端IOC容器实例。

接下来介绍

OkHttpFeignLoadBalancedConfiguration类上的两个重要的注解:@ConditionalOnClass(OkHttpClient.class)和@ConditionalOnProperty(“feign.okhttp.enabled”)。

这两个条件的含义为:

(1)必须满足OkHttpClient.class在当前类路径中存在。

(2)必须满足工程配置文件中feign.okhttp.enabled配置项的值为true。

上一篇:Feign基本使用


下一篇:一:Feign解决的问题