ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-11-15 13:31:35  阅读:140  来源: 互联网

标签:feign ApacheHttpClient SpringCloudRPC 配置 实例 linux class 客户端


(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.Client客户端容器实例

装配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,ApacheHttpClient,SpringCloudRPC,配置,实例,linux,class,客户端
来源: https://blog.csdn.net/m0_64205765/article/details/121332784

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有