成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

瀏覽:155日期:2023-02-17 16:49:25
目錄一、項(xiàng)目案例準(zhǔn)備1.Order服務(wù)2.User服務(wù)二、Ribbon原理分析1.RibbonAutoConfiguration2.LoadBalancerAutoConfiguration總結(jié)一、項(xiàng)目案例準(zhǔn)備

首先我們大家案例環(huán)境,通過【RestTemplate】來實(shí)現(xiàn)服務(wù)調(diào)用,通過【Ribbon】實(shí)現(xiàn)客戶端負(fù)載均衡操作。

手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

1.Order服務(wù)

我們的Order服務(wù)作為服務(wù)提供者。創(chuàng)建SpringBoot項(xiàng)目,并添加相關(guān)依賴

<?xml version='1.0' encoding='UTF-8'?><project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd'> <modelVersion>4.0.0</modelVersion> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.9</version><relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.bobo.springcloud</groupId> <artifactId>spring-cloud-order-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-order-server</name> <description>Demo project for Spring Boot</description> <properties><java.version>1.8</java.version> </properties> <dependencies><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency> </dependencies> <dependencyManagement><dependencies> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR10</version><type>pom</type><scope>import</scope> </dependency></dependencies> </dependencyManagement> <build><plugins> <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId> </plugin></plugins> </build></project>

然后在屬性文件中添加相關(guān)的配置

spring.application.name=spring-cloud-order-serviceserver.port=8081

然后創(chuàng)建自定義的Controller 提供對外的服務(wù)

@RestControllerpublic class OrderController { @Value('${server.port}') private int port; @GetMapping('/orders') public String orders(){System.out.println('Order 服務(wù)端口是:'+port);return 'Order Services ..... '; }}

然后我們可以分別啟動兩個Order服務(wù),端口分別設(shè)置為 8081和8082

2.User服務(wù)

User服務(wù)作為調(diào)用用Order服務(wù)的客戶端。也是我們要重點(diǎn)介紹【Ribbon】的服務(wù)。同樣創(chuàng)建一個SpringBoot項(xiàng)目,添加相關(guān)的依賴

<?xml version='1.0' encoding='UTF-8'?><project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd'> <modelVersion>4.0.0</modelVersion> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.bobo.springcloud</groupId> <artifactId>spring-cloud-user-service2</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-user-service2</name> <description>Demo project for Spring Boot</description> <properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR10</spring-cloud.version> </properties> <dependencies><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency> </dependencies> <dependencyManagement><dependencies> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope> </dependency></dependencies> </dependencyManagement> <build><plugins> <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId> </plugin></plugins> </build></project>

然后在屬性文件中配置相關(guān)信息

spring.application.name=spring-cloud-user-servicespring-cloud-order-service.ribbon.listOfServers=localhost:8081,localhost:8082

然后創(chuàng)建自定義的Controller來實(shí)現(xiàn)服務(wù)的調(diào)用

@RestControllerpublic class UserController { @Autowired public RestTemplate restTemplate; @Autowired LoadBalancerClient loadBalancerClient; @Bean @LoadBalanced public RestTemplate restTemplate(){return new RestTemplate(); } @GetMapping('/users') public String users(){ServiceInstance choose = loadBalancerClient.choose('spring-cloud-order-service');String url = String.format('http://%s:%s',choose.getHost(),choose.getPort()+'/orders');//return restTemplate.getForObject(url,String.class);return restTemplate.getForObject('http://spring-cloud-order-service/orders',String.class); }}

然后啟動User服務(wù)訪問,可以看到【Ribbon】默認(rèn)通過輪詢的方式來實(shí)現(xiàn)了服務(wù)的調(diào)用

手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

二、Ribbon原理分析

應(yīng)用比較簡單,我們主要是來分析下【Ribbon】的核心原理,先來看看自動裝配做了哪些事情。

1.RibbonAutoConfiguration

Ribbon在系統(tǒng)啟動的時候自動裝配完成的設(shè)置,我們先來看看對應(yīng)的spring.factories 中的配置信息吧

手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

emsp; 所以我們要繼續(xù)來看【RibbonAutoConfiguration】配置類,我們貼出【RibbonAutoConfiguration】的關(guān)鍵信息

@Configuration@Conditional({RibbonAutoConfiguration.RibbonClassesConditions.class})@RibbonClients@AutoConfigureAfter( name = {'org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration'})// RibbonAutoConfiguration配置類注入容器后會完成 LoadBalancerAutoConfiguration 和 AsyncLoadBalancerAutoConfiguration 的注入@AutoConfigureBefore({LoadBalancerAutoConfiguration.class, AsyncLoadBalancerAutoConfiguration.class})@EnableConfigurationProperties({RibbonEagerLoadProperties.class, ServerIntrospectorProperties.class})public class RibbonAutoConfiguration { /** * 如果IoC容器中不存在 LoadBalancerClient 類型的對象就注入一個 * 具體注入的類型為 RibbonLoadBalancerClient 對象 **/ @Bean @ConditionalOnMissingBean({LoadBalancerClient.class}) public LoadBalancerClient loadBalancerClient() {return new RibbonLoadBalancerClient(this.springClientFactory()); } // 省略其他代碼

通過源碼查看我們知道在SpringBoot項(xiàng)目啟動的時候完成了【LoadBalancerClient】對象的注入,且具體的類型為【RibbonLoadBalancerClient】,同時還會完成【LoadBalancerAutoConfiguration】這個配置類型的加載。在看【LoadBalancerAutoConfiguration】做了什么事情之前,我們先來搞清楚【@LoadBalanced】注解的作用

2.LoadBalancerAutoConfiguration

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Qualifierpublic @interface LoadBalanced {}

【@LoadBalanced】本質(zhì)上就是一個【@Qualifier】注解。作用就是標(biāo)記,我們通過案例來演示說明。

定義一個簡單的【User】類

public class User { String name; public User(String name) {this.name = name; } public String getName() {return name; } public void setName(String name) {this.name = name; } @Override public String toString() {return 'User{' +'name=’' + name + ’’’ +’}’; }}

然后定義一個Java配置類,有兩個添加了【@LoadBalanced】注解,有一個沒有加。

@Configurationpublic class JavaConfig { @LoadBalanced @Bean('user1') public User user1(){return new User('user1'); } @Bean('user2') public User user2(){return new User('user2'); } @LoadBalanced @Bean('user3') public User user3(){return new User('user3'); }}

然后創(chuàng)建我們的控制器,來測試使用

@RestControllerpublic class UsersController { @LoadBalanced @Autowired List<User> list = Collections.emptyList(); @GetMapping('/querys') public String query(){return list.toString(); }}

項(xiàng)目結(jié)構(gòu)

手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

啟動SpringBoot項(xiàng)目后我們看效果

手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

搞清楚了【@LoadBalanced】的作用后,我們再來看看【LoadBalancerAutoConfiguration】的配置加載做了什么事情

public class LoadBalancerAutoConfiguration { /** * 1. * 獲取IoC容器中所有的被【@LoadBalanced】注解修飾的RestTemplate對象 * 這些對象保存在了一個集合中 **/@LoadBalanced@Autowired(required = false)private List<RestTemplate> restTemplates = Collections.emptyList();@Autowired(required = false)private List<LoadBalancerRequestTransformer> transformers = Collections.emptyList(); /** * 4. * 向容器中注入了 SmartInitializingSingleton 對象,并且實(shí)現(xiàn)了 SmartInitializingSingleton 接口中聲明的 * afterSingletonsInstantiated 方法,在該方法中 通過3 中的 RestTemplateCustomizer中定義的 customize 方法 * 實(shí)現(xiàn)了 RestTemplate 對象攔截器的植入 **/@Beanpublic SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(final ObjectProvider<List<RestTemplateCustomizer>> restTemplateCustomizers) {return () -> restTemplateCustomizers.ifAvailable(customizers -> {for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {for (RestTemplateCustomizer customizer : customizers) {customizer.customize(restTemplate);}}});}@Bean@ConditionalOnMissingBeanpublic LoadBalancerRequestFactory loadBalancerRequestFactory(LoadBalancerClient loadBalancerClient) {return new LoadBalancerRequestFactory(loadBalancerClient, this.transformers);}@Configuration(proxyBeanMethods = false)@ConditionalOnMissingClass('org.springframework.retry.support.RetryTemplate')static class LoadBalancerInterceptorConfig {/*** 2. * 創(chuàng)建了一個 LoadBalancerInterceptor 并注入到了容器中**/@Beanpublic LoadBalancerInterceptor loadBalancerInterceptor(LoadBalancerClient loadBalancerClient,LoadBalancerRequestFactory requestFactory) {return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);}/*** 3. * 創(chuàng)建了一個 RestTemplateCustomizer 并注入到了容器中* 而且通過內(nèi)部類的方式定義定義了 RestTemplateCustomizer 接口中的 customize 方法的邏輯**/@Bean@ConditionalOnMissingBeanpublic RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {return restTemplate -> {// 獲取 RestTemplate 中原有的 攔截器List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());// 在原有的攔截器的基礎(chǔ)上 添加了一個 LoadBalancerInterceptorlist.add(loadBalancerInterceptor);// 然后將添加有新的 攔截器的集合 設(shè)置到了 RestTemplate 對象中restTemplate.setInterceptors(list);};}} // 省略其他代碼}

通過對應(yīng)的備注大家可以搞清楚該配置類的作用是實(shí)現(xiàn)了對【RestTemplate】對象(被@LoadBalanced修飾)植入【LoadBalancerInterceptor】攔截器的功能。

總結(jié)

Ribbon系統(tǒng)時的操作

手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注好吧啦網(wǎng)的更多內(nèi)容!

標(biāo)簽: Spring
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲国产欧美日韩| 精品国产污网站| 欧美日韩免费电影| 性久久久久久久久久久久| 国产综合久久| 国产精品色噜噜| 91在线云播放| 久久亚洲一级片| 99久久婷婷国产精品综合| 精品欧美久久久| 成人中文字幕合集| 日韩一级精品视频在线观看| 秋霞午夜鲁丝一区二区老狼| 久久亚洲美女| 日韩高清不卡一区二区| 色94色欧美sute亚洲线路二| 亚洲不卡一区二区三区| 米奇777在线欧美播放| 亚洲国产成人porn| 性伦欧美刺激片在线观看| 亚洲一区二区综合| 国产模特精品视频久久久久| 亚洲精品国产视频| 在线亚洲成人| 一个色妞综合视频在线观看| 亚洲福利久久| 国产精品乱码一区二三区小蝌蚪| 99久久精品国产毛片| 国产亚洲欧美在线| 欧美日韩国产精品一卡| 国产亚洲一区字幕| 欧美性事免费在线观看| 亚洲色图欧美激情| 国产精品欧美日韩一区| 天堂久久一区二区三区| 欧美中文字幕亚洲一区二区va在线| 久久精品国产亚洲高清剧情介绍| 777色狠狠一区二区三区| 成人禁用看黄a在线| 国产色一区二区| 在线观看日韩av电影| 亚洲一卡二卡三卡四卡五卡| 老司机免费视频久久| 久久99热国产| 精品国产1区二区| 欧美少妇一区| 亚洲制服丝袜av| 日本精品视频一区二区| 国产精品夜夜爽| 久久精品人人做人人综合| 亚洲黄色影片| 日韩精品成人一区二区在线| 欧美精品久久久久久久久老牛影院 | 亚洲不卡av一区二区三区| 可以看av的网站久久看| 国产精一区二区三区| 国产亚洲欧美日韩在线一区| 一区三区视频| 亚洲高清免费观看高清完整版在线观看| 久久精品道一区二区三区| 美腿丝袜亚洲一区| 日韩午夜精品视频| 欧美精品一区二区三区在线看午夜| 亚洲人成在线播放网站岛国| 久久精品综合一区| 国产精品白丝jk黑袜喷水| 久久久国产午夜精品| 国产精品一区二区三区四区五区| 日韩专区在线视频| 欧美一区二区在线观看| 欧美日韩一区二区视频在线观看| 亚洲成人精品在线观看| 91精品国产91久久久久久最新毛片| 欧美日韩a区| 日韩国产欧美在线播放| 日韩精品一区二区三区老鸭窝| 黄页网站一区| 麻豆精品视频在线观看视频| 精品成人一区二区| 亚洲一区免费| 粉嫩在线一区二区三区视频| 亚洲欧美日韩一区二区三区在线观看| 欧美午夜片在线观看| 欧美一区免费视频| 亚洲国产精品一区二区久久 | 夜夜嗨av一区二区三区中文字幕| 在线观看www91| 99riav久久精品riav| 亚洲成人动漫av| 日韩欧美成人午夜| 99精品免费| 国产精品456露脸| 亚洲欧美成人一区二区三区| 欧美日韩另类一区| 国产精品国产亚洲精品看不卡15 | 99久久久国产精品免费蜜臀| 亚洲国产精品一区二区www在线| 日韩欧美色电影| 99www免费人成精品| 国产成人在线网站| 亚洲乱码国产乱码精品精的特点 | 在线观看免费一区| 欧美激情亚洲| 青椒成人免费视频| 久久久蜜桃精品| 亚洲一区二区三区四区中文| 成人一区二区三区中文字幕| 亚洲综合一区在线| 日韩精品一区二区三区中文不卡 | 一区二区三区av| 国产成人小视频| 亚洲国产精品久久人人爱蜜臀| 2020国产精品久久精品美国| 久久久久久穴| 一色屋精品视频在线看| 国产一区二区三区免费看| 一区二区三区影院| 精品久久国产字幕高潮| 一本一本大道香蕉久在线精品 | 国产婷婷色一区二区三区| 91久久久免费一区二区| 亚洲网站视频| 不卡电影免费在线播放一区| 青青草精品视频| 亚洲欧美另类久久久精品| 日韩你懂的在线观看| 色欧美乱欧美15图片| 亚洲区欧美区| 99久久免费国产| 国产精品一区二区三区99| 亚洲高清三级视频| 国产精品久久久一本精品| 欧美成人精品高清在线播放| 欧美色中文字幕| 麻豆九一精品爱看视频在线观看免费| 欧美连裤袜在线视频| 成人激情小说网站| 国产一区二区三区在线观看免费视频| 丝袜亚洲另类欧美| 亚洲综合激情小说| 中文字幕中文字幕一区二区 | 色国产精品一区在线观看| 亚洲黄色影院| 欧美天天在线| 91污在线观看| 成人晚上爱看视频| 韩国精品主播一区二区在线观看 | 在线看日本不卡| 国产精品入口66mio| 亚洲特级毛片| 99久久99久久精品免费看蜜桃 | 国产蜜臀97一区二区三区| 日韩三级精品电影久久久 | 国产精品久久久久久久久免费樱桃| 精品少妇一区二区三区| 欧美日韩午夜在线视频| 久久婷婷av| 国产精品丝袜xxxxxxx| 亚洲国产一区二区三区在线播 | 国产日韩一区二区| 永久91嫩草亚洲精品人人| 欧美激情精品久久久六区热门| 粉嫩高潮美女一区二区三区| 国产一二精品视频| 国产一区二区三区免费看| 久久精品国产一区二区三| 蜜芽一区二区三区| 免费人成黄页网站在线一区二区| 亚洲国产精品久久人人爱蜜臀| 亚洲欧美日韩在线| 亚洲精选视频在线| 亚洲欧美色图小说| 最新国产精品久久精品| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚欧色一区w666天堂| 亚洲成人在线免费| 偷拍日韩校园综合在线| 婷婷六月综合亚洲| 免费人成网站在线观看欧美高清| 日本在线不卡一区| 美女被吸乳得到大胸91| 捆绑调教一区二区三区| 蜜桃免费网站一区二区三区| 亚洲国产成人高清精品| 亚洲精品一二三四区| 91精品免费在线观看| 国产精品乱子乱xxxx| 午夜影院日韩| 一本一本久久a久久精品综合麻豆| 久久夜色精品| 在线观看91视频| 久久久久久网| 91精品福利视频| 欧美精品一级二级| 91精品国产91综合久久蜜臀| 91精品国产综合久久久蜜臀粉嫩| 91麻豆精品91久久久久同性| 99久久er热在这里只有精品15| 一本到三区不卡视频| 国产精品99久久久|