国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

東莞手機(jī)網(wǎng)站建設(shè)網(wǎng)站怎么優(yōu)化關(guān)鍵詞

東莞手機(jī)網(wǎng)站建設(shè),網(wǎng)站怎么優(yōu)化關(guān)鍵詞,微信網(wǎng)站系統(tǒng),廣州手機(jī)網(wǎng)站背景 從SpringCloud 2020 版本之后,組件移除了除 Eureka 以外,所有 Netflix 的相關(guān),包括最常用的 Ribbon Hystrix 等,所以 SpringCloud 在 spring-cloud-commons 提供了Loadbalancer 用來替代 Ribbon。本系列就來介紹Loadbalance…

背景

從SpringCloud 2020 版本之后,組件移除了除 Eureka 以外,所有 Netflix 的相關(guān),包括最常用的 Ribbon Hystrix 等,所以 SpringCloud 在 spring-cloud-commons 提供了Loadbalancer 用來替代 Ribbon。本系列就來介紹Loadbalancer 的執(zhí)行流程

項(xiàng)目版本:

  • Spring-Boot2.6.13
  • Spring-Cloud 2021.0.5
  • spring-cloud-alibaba 2021.0.5.0
  • Loadbalancer 3.1.5

從項(xiàng)目中最常用的Feign來當(dāng)做入口,不了解Feign的原理也沒有關(guān)系,直接從Feign和Loadbalancer 的集成部分分析即可

分析

入口處

FeignBlockingLoadBalancerClient

public class FeignBlockingLoadBalancerClient implements Client {private static final Log LOG = LogFactory.getLog(FeignBlockingLoadBalancerClient.class);private final Client delegate;private final LoadBalancerClient loadBalancerClient;private final LoadBalancerClientFactory loadBalancerClientFactory;@Overridepublic Response execute(Request request, Request.Options options) throws IOException {//請求路徑final URI originalUri = URI.create(request.url());//獲取到要調(diào)用的服務(wù)idString serviceId = originalUri.getHost();DefaultRequest<RequestDataContext> lbRequest = new DefaultRequest<>(new RequestDataContext(buildRequestData(request), hint));	Set<LoadBalancerLifecycle> supportedLifecycleProcessors = LoadBalancerLifecycleValidator.getSupportedLifecycleProcessors(//在這步創(chuàng)建了每個(gè)服務(wù)的子容器	loadBalancerClientFactory.getInstances(serviceId, LoadBalancerLifecycle.class),RequestDataContext.class, ResponseData.class, ServiceInstance.class);supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStart(lbRequest));		//執(zhí)行l(wèi)oadBalancer的負(fù)載均衡策略,返回將過濾后的服務(wù),非常重要ServiceInstance instance = loadBalancerClient.choose(serviceId, lbRequest);org.springframework.cloud.client.loadbalancer.Response<ServiceInstance> lbResponse = new DefaultResponse(instance);//省略...//將ServiceInstance進(jìn)行解析后,轉(zhuǎn)換為真正的http方式進(jìn)行遠(yuǎn)程調(diào)用服務(wù)String reconstructedUrl = loadBalancerClient.reconstructURI(instance, originalUri).toString();Request newRequest = buildRequest(request, reconstructedUrl);LoadBalancerProperties loadBalancerProperties = loadBalancerClientFactory.getProperties(serviceId);return executeWithLoadBalancerLifecycleProcessing(delegate, options, newRequest, lbRequest, lbResponse,supportedLifecycleProcessors, loadBalancerProperties.isUseRawStatusCodeInResponseData());}protected Request buildRequest(Request request, String reconstructedUrl) {return Request.create(request.httpMethod(), reconstructedUrl, request.headers(), request.body(),request.charset(), request.requestTemplate());}private String getHint(String serviceId) {LoadBalancerProperties properties = loadBalancerClientFactory.getProperties(serviceId);String defaultHint = properties.getHint().getOrDefault("default", "default");String hintPropertyValue = properties.getHint().get(serviceId);return hintPropertyValue != null ? hintPropertyValue : defaultHint;}}

可以看到,在OpenFeign中調(diào)用了loadBalancerClient.choose(serviceId, lbRequest)來實(shí)現(xiàn)負(fù)載均衡策略,然后返回過濾后的服務(wù)ServiceInstance,也就是服務(wù)的對象。我們要重點(diǎn)分析此過程

首先分析loadBalancerClient是怎么注入進(jìn)來的呢,我們先看下其結(jié)構(gòu)

ServiceInstanceChooser

public interface ServiceInstanceChooser {ServiceInstance choose(String serviceId);<T> ServiceInstance choose(String serviceId, Request<T> request);}

LoadBalancerClient

public interface LoadBalancerClient extends ServiceInstanceChooser {<T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;<T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;URI reconstructURI(ServiceInstance instance, URI original);}

可以看到ServiceInstanceChooser定義了負(fù)載均衡的方法, LoadBalancerClient則繼承了ServiceInstanceChooser額外定義了execute執(zhí)行和reconstructURI構(gòu)建真正http請求的方法

那么LoadBalancerClient的實(shí)現(xiàn)是誰呢,剛才的疑問中又是怎么被注入的呢,其實(shí)LoadBalancerClient的實(shí)現(xiàn)是BlockingLoadBalancerClient,在配置類BlockingLoadBalancerClientAutoConfiguration中被注入

這里既然提到了自動(dòng)裝配配置類,那么我們就需要看下其結(jié)構(gòu),來了解各個(gè)作用

# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration,\
org.springframework.cloud.loadbalancer.config.BlockingLoadBalancerClientAutoConfiguration,\
org.springframework.cloud.loadbalancer.config.LoadBalancerCacheAutoConfiguration,\
org.springframework.cloud.loadbalancer.security.OAuth2LoadBalancerClientAutoConfiguration,\
org.springframework.cloud.loadbalancer.config.LoadBalancerStatsAutoConfiguration
  • LoadBalancerAutoConfiguration 是最核心最重要的配置,隨后會(huì)詳細(xì)的分析
  • BlockingLoadBalancerClientAutoConfiguration 上文中提高的LoadBalancerClient的實(shí)現(xiàn)類BlockingLoadBalancerClient就是在此裝配的

BlockingLoadBalancerClientAutoConfiguration

@Configuration(proxyBeanMethods = false)
@LoadBalancerClients
@AutoConfigureAfter(LoadBalancerAutoConfiguration.class)
@AutoConfigureBefore({ org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration.class,AsyncLoadBalancerAutoConfiguration.class })
@ConditionalOnClass(RestTemplate.class)
public class BlockingLoadBalancerClientAutoConfiguration {@Bean@ConditionalOnBean(LoadBalancerClientFactory.class)@ConditionalOnMissingBeanpublic LoadBalancerClient blockingLoadBalancerClient(LoadBalancerClientFactory loadBalancerClientFactory) {return new BlockingLoadBalancerClient(loadBalancerClientFactory);}//省略}

可以看到注入了LoadBalancerClient的實(shí)現(xiàn)類BlockingLoadBalancerClient。但此自動(dòng)配置類的裝配有很多的規(guī)則:

  1. @LoadBalancerClients 此注解非常重要,實(shí)現(xiàn)每個(gè)服務(wù)間的負(fù)載均衡配置隔離就是通過此注解,后面會(huì)詳細(xì)的分析
  2. @AutoConfigureAfter(LoadBalancerAutoConfiguration.class)LoadBalancerAutoConfiguration之后進(jìn)行裝配,LoadBalancerAutoConfiguration也很重要,后面也會(huì)詳細(xì)的分析
  3. @AutoConfigureBefore({ org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration.class, AsyncLoadBalancerAutoConfiguration.class })org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfigurationAsyncLoadBalancerAutoConfiguration之前進(jìn)行裝配。注意:2和3中的LoadBalancerAutoConfiguration不是一個(gè)對象,2中的是在spring-cloud-loadbalancer模塊中,3中的是在spring-cloud-commons模塊中,這也是有步驟2的原因,畢竟肯定是要先裝配本模塊下的
  4. @ConditionalOnClass(RestTemplate.class)這個(gè)不是重點(diǎn),可以略過
  5. @ConditionalOnBean(LoadBalancerClientFactory.class) 在注入時(shí)依賴了LoadBalancerClientFactoryLoadBalancerClientFactory也非常的重要,后面也會(huì)進(jìn)行詳細(xì)的分析

上面多次提到了LoadBalancerAutoConfiguration,自動(dòng)裝配中也有它,那么現(xiàn)在就來分析下其流程

LoadBalancerAutoConfiguration

@Configuration(proxyBeanMethods = false)
@LoadBalancerClients
@EnableConfigurationProperties(LoadBalancerClientsProperties.class)
@AutoConfigureBefore({ ReactorLoadBalancerClientAutoConfiguration.class,LoadBalancerBeanPostProcessorAutoConfiguration.class })
@ConditionalOnProperty(value = "spring.cloud.loadbalancer.enabled", havingValue = "true", matchIfMissing = true)
public class LoadBalancerAutoConfiguration {//依賴了LoadBalancerClientSpecification類型的對象集合private final ObjectProvider<List<LoadBalancerClientSpecification>> configurations;public LoadBalancerAutoConfiguration(ObjectProvider<List<LoadBalancerClientSpecification>> configurations) {this.configurations = configurations;}@Bean@ConditionalOnMissingBeanpublic LoadBalancerZoneConfig zoneConfig(Environment environment) {return new LoadBalancerZoneConfig(environment.getProperty("spring.cloud.loadbalancer.zone"));}@ConditionalOnMissingBean@Beanpublic LoadBalancerClientFactory loadBalancerClientFactory(LoadBalancerClientsProperties properties) {LoadBalancerClientFactory clientFactory = new LoadBalancerClientFactory(properties);//LoadBalancerClientSpecification類型的配置類集合對象注入到NamedContextFactory,實(shí)現(xiàn)個(gè)性化配置clientFactory.setConfigurations(this.configurations.getIfAvailable(Collections::emptyList));return clientFactory;}}

可以看到此配置類的裝配規(guī)則也比較復(fù)雜,但大部分都和本系列要分析的內(nèi)容關(guān)聯(lián)性不大,直接略過即可,我們只關(guān)心兩個(gè)地方

  • @LoadBalancerClients 這個(gè)注解出現(xiàn)多次,我們會(huì)做詳細(xì)的分析
  • 注入了loadBalancerClientFactory,這個(gè)也非常的重要,隨后會(huì)做詳細(xì)的分析

到這里我們要解決的三個(gè)重點(diǎn):

  • @LoadBalancerClients的作用
  • ObjectProvider<List<LoadBalancerClientSpecification>> configurations的作用
  • LoadBalancerClientFactory的作用,別忘了負(fù)載均衡的執(zhí)行對象BlockingLoadBalancerClient在生成時(shí),將此對象注入了進(jìn)去

下一篇文章我們進(jìn)行詳細(xì)分析

http://m.aloenet.com.cn/news/30695.html

相關(guān)文章:

  • 遵義做什么網(wǎng)站好seo門戶
  • 石家莊網(wǎng)站運(yùn)營公司最新新聞事件
  • 口碑好的常州做網(wǎng)站app開發(fā)用什么軟件
  • 可以充值的網(wǎng)站怎么做互聯(lián)網(wǎng)金融
  • 煙臺網(wǎng)站推廣排名競價(jià)推廣代運(yùn)營
  • 做一個(gè)類似京東的網(wǎng)站免費(fèi)發(fā)布推廣的平臺
  • 南京制作網(wǎng)站公司網(wǎng)站seo1視頻發(fā)布會(huì)
  • php動(dòng)態(tài)網(wǎng)站開發(fā)案例教程china東莞seo
  • 蘇州網(wǎng)站制作設(shè)計(jì)西安網(wǎng)絡(luò)seo公司
  • wordpress限制ip訪問次數(shù)網(wǎng)站seo報(bào)價(jià)
  • 網(wǎng)站開發(fā)大學(xué)是什么專業(yè)中國目前最好的搜索引擎
  • wordpress怎么掙錢常見的系統(tǒng)優(yōu)化軟件
  • 蘇州實(shí)力做網(wǎng)站公司人員優(yōu)化方案怎么寫
  • 做微商進(jìn)哪個(gè)網(wǎng)站安全蟻坊軟件輿情監(jiān)測系統(tǒng)
  • 網(wǎng)頁設(shè)計(jì)與制作教程西北工業(yè)大學(xué)廣州網(wǎng)站優(yōu)化步驟
  • 如何做高大上的網(wǎng)站 知乎企業(yè)營銷網(wǎng)站建設(shè)系統(tǒng)
  • 企業(yè)網(wǎng)站ppt怎么做百度搜索資源平臺官網(wǎng)
  • 如何做搜索引擎網(wǎng)站百度網(wǎng)站怎么提升排名
  • 什么是網(wǎng)站維護(hù)中營銷運(yùn)營主要做什么
  • 互聯(lián)網(wǎng)行業(yè)分為哪幾類排名優(yōu)化方法
  • 提交網(wǎng)站汕頭seo推廣
  • 微信公眾號平臺網(wǎng)站開發(fā)百度天眼查公司
  • 用ps怎樣做網(wǎng)站文字logo廣豐網(wǎng)站seo
  • 個(gè)人怎么做貸款網(wǎng)站求購買鏈接
  • 網(wǎng)站權(quán)重高+做別的關(guān)鍵詞百度應(yīng)用下載安裝
  • 學(xué)做效果圖網(wǎng)站有哪些軟件有哪些網(wǎng)站建站方式有哪些
  • 有沒有做數(shù)學(xué)題掙錢的網(wǎng)站艾滋病多久可以查出來
  • 網(wǎng)站建設(shè)網(wǎng)站軟件有哪些方面深圳網(wǎng)站建設(shè)公司
  • 湖南住房和城鄉(xiāng)建設(shè)廳網(wǎng)站首頁優(yōu)化網(wǎng)站怎么真實(shí)點(diǎn)擊
  • 男女做a視頻網(wǎng)站seo1搬到哪里去了