日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:210日期:2023-02-17 16:49:25
目錄一、項目案例準備1.Order服務2.User服務二、Ribbon原理分析1.RibbonAutoConfiguration2.LoadBalancerAutoConfiguration總結一、項目案例準備

首先我們大家案例環境,通過【RestTemplate】來實現服務調用,通過【Ribbon】實現客戶端負載均衡操作。

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

1.Order服務

我們的Order服務作為服務提供者。創建SpringBoot項目,并添加相關依賴

<?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>

然后在屬性文件中添加相關的配置

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

然后創建自定義的Controller 提供對外的服務

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

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

2.User服務

User服務作為調用用Order服務的客戶端。也是我們要重點介紹【Ribbon】的服務。同樣創建一個SpringBoot項目,添加相關的依賴

<?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>

然后在屬性文件中配置相關信息

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

然后創建自定義的Controller來實現服務的調用

@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服務訪問,可以看到【Ribbon】默認通過輪詢的方式來實現了服務的調用

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

二、Ribbon原理分析

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

1.RibbonAutoConfiguration

Ribbon在系統啟動的時候自動裝配完成的設置,我們先來看看對應的spring.factories 中的配置信息吧

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

emsp; 所以我們要繼續來看【RibbonAutoConfiguration】配置類,我們貼出【RibbonAutoConfiguration】的關鍵信息

@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項目啟動的時候完成了【LoadBalancerClient】對象的注入,且具體的類型為【RibbonLoadBalancerClient】,同時還會完成【LoadBalancerAutoConfiguration】這個配置類型的加載。在看【LoadBalancerAutoConfiguration】做了什么事情之前,我們先來搞清楚【@LoadBalanced】注解的作用

2.LoadBalancerAutoConfiguration

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

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

定義一個簡單的【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'); }}

然后創建我們的控制器,來測試使用

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

項目結構

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

啟動SpringBoot項目后我們看效果

手把手帶你分析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 對象,并且實現了 SmartInitializingSingleton 接口中聲明的 * afterSingletonsInstantiated 方法,在該方法中 通過3 中的 RestTemplateCustomizer中定義的 customize 方法 * 實現了 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. * 創建了一個 LoadBalancerInterceptor 并注入到了容器中**/@Beanpublic LoadBalancerInterceptor loadBalancerInterceptor(LoadBalancerClient loadBalancerClient,LoadBalancerRequestFactory requestFactory) {return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);}/*** 3. * 創建了一個 RestTemplateCustomizer 并注入到了容器中* 而且通過內部類的方式定義定義了 RestTemplateCustomizer 接口中的 customize 方法的邏輯**/@Bean@ConditionalOnMissingBeanpublic RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {return restTemplate -> {// 獲取 RestTemplate 中原有的 攔截器List<ClientHttpRequestInterceptor> list = new ArrayList<>(restTemplate.getInterceptors());// 在原有的攔截器的基礎上 添加了一個 LoadBalancerInterceptorlist.add(loadBalancerInterceptor);// 然后將添加有新的 攔截器的集合 設置到了 RestTemplate 對象中restTemplate.setInterceptors(list);};}} // 省略其他代碼}

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

總結

Ribbon系統時的操作

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

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注好吧啦網的更多內容!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲啊v在线| 极品日韩av| 日韩av中文字幕一区| 国产亚洲精品自拍| 亚洲激情久久| 狠狠久久婷婷| 免费欧美日韩| 蜜桃av一区二区三区电影| 久久电影一区| 亚洲欧洲免费| 欧美一级二级视频| 免费一级欧美在线观看视频 | 国产精品一线| 国产日产精品一区二区三区四区的观看方式| 日韩国产欧美三级| 国产欧美日本| 国产aⅴ精品一区二区四区| av在线资源| 亚洲一级高清| 亚洲一区二区三区四区五区午夜| 久久av一区| 日韩欧美在线精品| 国产激情综合| 欧美日韩免费观看视频| 婷婷激情图片久久| 黑丝一区二区| 日韩不卡在线观看日韩不卡视频| 国产精品九九| 日韩欧美另类一区二区| 国产伊人精品| 日韩在线观看一区二区| 日本在线视频一区二区| 久久伊人国产| 四虎成人av| 一区视频在线| 久久国产麻豆精品| 91亚洲一区| 国产一级久久| 欧美一区网站| 91日韩免费| 国产亚洲毛片在线| 国产欧美啪啪| 国产综合婷婷| 91精品国产自产在线丝袜啪| 91一区二区| 日本大胆欧美人术艺术动态| 久久国产精品免费一区二区三区| 国产精品久久久久久久久久10秀| 欧美日韩精品免费观看视频完整| 亚洲精品系列| 国产黄大片在线观看| 红桃视频国产精品| 欧美激情麻豆| 黄色av一区| 麻豆成人91精品二区三区| 久久精品亚洲人成影院 | 国产综合色产| 国产精品毛片aⅴ一区二区三区| 性感美女一区二区在线观看| 亚洲精品国产精品粉嫩| 国产一区国产二区国产三区| 亚洲经典在线| 麻豆国产欧美一区二区三区| 国产综合色产| 国产精品v亚洲精品v日韩精品| 日韩精品一卡| 国产日产一区| 亚洲免费激情| 国产精品二区影院| 欧美午夜精彩| 国产激情精品一区二区三区| 亚洲综合国产| 国产欧洲在线| 欧美一区不卡| 亚洲欧美日韩精品一区二区| 久久精品国产999大香线蕉| 99国产精品视频免费观看一公开 | 日韩中文字幕亚洲一区二区va在线| 麻豆精品视频在线观看免费| 亚洲激情国产| 欧美国产美女| 国产日韩免费| 日韩中文字幕av电影| 色吊丝一区二区| 国产精品www.| 亚洲另类视频| 欧美日韩少妇| 日韩av福利| 老司机精品在线| 日韩欧美四区| 亚洲一区中文| 激情久久久久久| 精品入口麻豆88视频| 日韩福利视频导航| 久久xxxx| 午夜国产精品视频免费体验区| 精品国产91| 国产亚洲一卡2卡3卡4卡新区| 一区福利视频| 91精品蜜臀一区二区三区在线 | 精品美女在线视频| 国产精品久久久久久久久久久久久久久 | 国产成年精品| 欧美日韩亚洲一区三区| 在线日韩成人| 中文国产一区| 亚洲一级网站| 亚洲午夜黄色| 婷婷成人综合| 99久久精品网| av一区在线| 韩国久久久久久| 久久精品国产网站| 国产精品三p一区二区| 日韩精品国产精品| 日韩欧美中文字幕一区二区三区| 在线午夜精品| 制服诱惑一区二区| 久久大逼视频| 免费观看在线综合色| 中文在线不卡| 亚洲综合精品| 免费日韩一区二区| 蜜臀va亚洲va欧美va天堂| 国产精品人人爽人人做我的可爱| 精品一区欧美| 午夜久久一区| 99视频+国产日韩欧美| 自拍日韩欧美| 国产视频欧美| 亚洲综合色婷婷在线观看| 美女黄网久久| 亚洲日韩视频| 日韩成人av影视| 麻豆中文一区二区| 超碰在线99| 国产亚洲一区二区手机在线观看| 亚洲电影有码| 欧美日中文字幕| 亚洲成人日韩| 久久亚洲不卡| 日韩av网站在线观看| 国产精品中文| 国产高潮在线| 欧美日韩国产在线一区| 六月丁香综合| 中文字幕亚洲影视| 国产精品密蕾丝视频下载| 精品久久网站| 三上悠亚国产精品一区二区三区| 国精品一区二区三区| 欧美专区一区二区三区| 91亚洲精品视频在线观看 | 国产一区二区三区探花| 久久九九99| 中文字幕一区二区三区日韩精品| 日本99精品| 福利一区二区| 午夜欧美理论片| 亚洲毛片视频| 欧美国产日本| 激情五月色综合国产精品| 国产精品女主播一区二区三区| 日韩精品国产欧美| 福利精品一区| 在线综合亚洲| 欧美aⅴ一区二区三区视频| 激情视频网站在线播放色| 欧洲激情综合| 日本成人在线不卡视频| 成人国产精选| 美女精品在线| 欧美国产另类| 国产一区日韩一区| 日韩一区二区三区在线看| 久久精品欧洲| 精品91久久久久| 国产精品久久久久久模特| 欧美日韩国产v| 婷婷久久免费视频| 日本午夜大片a在线观看| 香蕉久久久久久久av网站| 美女尤物国产一区| 亚洲激情偷拍| 国内揄拍国内精品久久| 午夜在线精品| 黄色网一区二区| 伊人久久大香伊蕉在人线观看热v| 精品网站999| 欧美特黄一区| 久久精品国内一区二区三区| 红桃视频国产精品| 精品视频一区二区三区四区五区 | 中文亚洲欧美| 精品国产欧美| 午夜久久av| 久久中文字幕二区| 国产精品毛片aⅴ一区二区三区| 不卡视频在线| 麻豆中文一区二区|