中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

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

淮南哪里做網(wǎng)站錦州網(wǎng)站seo

淮南哪里做網(wǎng)站,錦州網(wǎng)站seo,怎么做淘寶客導(dǎo)購網(wǎng)站推廣,做網(wǎng)站買完域名還需要什么上一篇文章中, 詳細(xì)介紹了 Nacos 注冊中心的原理, 相信看完后, 大家應(yīng)該完全掌握了 Nacos 客戶端是如何自動進(jìn)行服務(wù)注冊的, 以及 Nacos 客戶端是如何訂閱服務(wù)實(shí)例信息的, 以及 Nacos 服務(wù)器是如何處理客戶端的注冊和訂閱請求的; 本文承上啟下, 在訂閱服務(wù)實(shí)例的基礎(chǔ)上, 介紹如…

上一篇文章中, 詳細(xì)介紹了 Nacos 注冊中心的原理, 相信看完后, 大家應(yīng)該完全掌握了 Nacos 客戶端是如何自動進(jìn)行服務(wù)注冊的, 以及 Nacos 客戶端是如何訂閱服務(wù)實(shí)例信息的, 以及 Nacos 服務(wù)器是如何處理客戶端的注冊和訂閱請求的;

本文承上啟下, 在訂閱服務(wù)實(shí)例的基礎(chǔ)上, 介紹如何在實(shí)例之間進(jìn)行選擇, 實(shí)現(xiàn)負(fù)載均衡; 并詳細(xì)介紹了負(fù)載均衡組件 LocaBanlancer 和函數(shù)式調(diào)用組件 OpenFeign 是如何與 Nacos 注冊中心進(jìn)行集成的;

如果在閱讀過程中對文中提到的 SpringBoot 啟動過程以及擴(kuò)展機(jī)制不太了解, 或者對 @Import 注解不了解, 參考這篇文章 SpringBoot啟動流程與配置類處理機(jī)制詳解, 附源碼與思維導(dǎo)圖, 強(qiáng)烈建議學(xué)習(xí)后再來讀本文;

LoadBalancer

  1. Nacos 1.X 版本自動引入 Ribbon 依賴, 使用 Ribbon 做負(fù)載均衡;

  2. Nacos 2.X 版本就沒有了, 因?yàn)?Ribbon 的特性已經(jīng)不滿足 SpringBoot 的要求;

  3. 2.X 版本可以用 SpringCloud 團(tuán)隊(duì)提供的 LoadBalancer 組件來做負(fù)載均衡;

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

LoadBalancerClient

Spring Cloud LoadBalancer :: Spring Cloud Commons

  1. SpringCloud 定義的接口, 用于負(fù)載均衡地選擇服務(wù)實(shí)例, 是SpringCloud制定的負(fù)載均衡規(guī)范;

  2. 由具體廠商去實(shí)現(xiàn)這個(gè)接口, 比如 Ribbon 和 LoadBanlancer 都提供了實(shí)現(xiàn)類;

    例如 LoadBalancer 包下 spring.factories 指定了自動配置類BlockingLoadBalancerClientAutoConfiguration;

    這個(gè)配置類向 Spring 容器注冊了一個(gè) BlockingLoadBalancerClient bean;

    這樣就可以使用 @Autowired 注解獲取 LoadBalancerClient并使用;

  3. 兩個(gè)關(guān)鍵方法, chooseexecute

    choose 方法底層實(shí)現(xiàn)本質(zhì)上仍然是調(diào)用了NamingService ( 使用 Nacos 時(shí)自然就是NacosNamingService )的 selectInstances 方法, 訂閱服務(wù)并獲取所有實(shí)例, 然后根據(jù)負(fù)載均衡算法選擇一個(gè)實(shí)例返回;

  4. execute 方法有兩個(gè)重載, 一個(gè)需要傳入具體的 ServiceInstance, 一個(gè)不需要;

    調(diào)用不傳 Instance 的 execute 方法時(shí), 底層實(shí)現(xiàn)會先調(diào)用 choose 方法選出一個(gè)實(shí)例, 然后調(diào)用有 Instance 參數(shù)的 execute 方法完成請求發(fā)送;

  5. LoadBalancerClient 使用, 可以通過直接注入 LoadBanlancerClient對象來使用

@RequestMapping("/order/*")
public class OrderController {@AutowiredLoadBalancerClient loadBalancerClient;@AutowiredRestTemplate restTemplate;@GetMapping("loadbalancer")public String test0(){ServiceInstance instance = loadBalancerClient.choose("stock-service");String url = instance.getUri() + "/stock/test0";return restTemplate.getForObject(url, String.class);}
}
  1. 或者使用@LoadBalanced注解, 注冊有復(fù)雜均衡功能的 RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}@GetMapping("loadbalanced")
public String test1(){return restTemplate.getForObject("http://stock-service/stock/test0", String.class);
}

RestTemplate 持有一個(gè) ClientHttpRequestInterceptor的鏈表; RestTemplate 發(fā)送請求之前會先調(diào)用這些 Interceptor 的攔截方法;

在 LoadBalancer 的自動配置類中, 會注入所有有@LoadBalanced注解修飾的 RestTemplate bean, 并且會將一個(gè)LoadBalancerInterceptor對象放到這些 RestTemplate 對象的攔截器列表中;

這個(gè)攔截器會攔截 RestTemplate 發(fā)送的請求, 調(diào)用LoadBalancerClient不帶 ServiceInstance 參數(shù)的 execute 方法發(fā)送請求; 實(shí)現(xiàn)負(fù)載均衡;

負(fù)載均衡策略

默認(rèn)的是輪詢策略RoundRobinLoadBalancer; 也可以選擇RandomLoadBalancer, 這倆都是 SpringCloud 提供的;

@LoadBalancerClients({@LoadBalancerClient(name = "order-service", configuration = RandomLoadBalancerConfig.class),@LoadBalancerClient(name = "stock-service", configuration = RandomLoadBalancerConfig.class)
})// 對所有服務(wù)有效
@LoadBalancerClients(defaultConfiguration = RandomLoadBalancerConfig.class)
public class RandomLoadBalancerConfig {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

OpenFeign

@FeignClient("course-service")
public interface CourseFeignClient {@GetMapping("/feign/course")String course();
}@FeignClient("student-service")
public interface CourseFeignClient {@GetMapping("/feign/stu")String course();
}
@EnableFeignClients
public class OrderApp {public static void main(String[] args) {SpringApplication.run(OrderApp.class, args);}
}
  1. @EnableFeignClients 注解通過 @Import注解引入了一個(gè)ImportBeanDefinitionRegistrar; 其注冊方法如下:

    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {// .....一些不重要的代碼this.registerDefaultConfiguration(metadata, registry);this.registerFeignClients(metadata, registry);
    }
    

registerFeignClients

  1. 拿到 @EnableFeignClients 注解的屬性;

  2. 創(chuàng)建一個(gè)空 Set, 保存 BeanDefinition;

  3. 看你的 @EnableFeignClients 注解的 clients 屬性是否為空, 如果不為空, 就遍歷該屬性指定的類, 創(chuàng)建BeanDefinition, 放到 Set 中;

  4. 如果clients為空, 就根據(jù) value 屬性和 basePackages屬性和 basePackageClasses 屬性指定的值去掃描包, 找到有@FeignClient注解修飾的類, 創(chuàng)建 BeanDefinition, 添加到 Set;

    如果這些屬性都為空, 就掃描啟動類所在的包;

    basePackageClasses 用法: 該注解指定的類所在的包將被掃描;

  5. 遍歷 Set , 獲取 BeanDefinition 的 AnnotationMetadata, 進(jìn)而拿到 @FeignClient 注解的 name 屬性( 表示服務(wù)名 );

  6. 調(diào)用registerFeignClient , 向容器中注冊當(dāng)前 BeanDefinition 對應(yīng)的一個(gè) FactoryBean;

registerFeignClient

  1. 創(chuàng)建一個(gè)FeignClientFactoryBean, 在其 getObejct 方法中, 封裝了創(chuàng)建代理對象的邏輯;
  2. getObject方法層層調(diào)用, 最終調(diào)用了ReflectiveFeign中的一個(gè)方法, 該方法使用 JDK 動態(tài)代理, 為 @FeignClient 注解修飾的接口, 創(chuàng)建了代理對象;
  3. FeignClientFactoryBean 的 BeanDefinition 添加Spring容器中;

動態(tài)代理

  1. 動態(tài)代理使用的 InvocationHandlerFeignInvocationHandler (最終是SynchronousMethodHandler)
  2. Handler 的 invoke 方法中, 又經(jīng)過層層調(diào)用, 最終執(zhí)行了如下邏輯:
  3. 獲取 @FeignClient 注解的 name 屬性, 通過LoadBanlancerClient 負(fù)載均衡地獲取一個(gè)實(shí)例; (所以類加載路徑下必須有 LoadBalancerClient 的實(shí)現(xiàn)類才行, 換言之, 必須引入 Ribbon 或 LoadBanlancer 之類的組件)
  4. 然后根據(jù)被調(diào)用的方法的 Mapping 注解, 得到請求路徑; 和實(shí)例的地址進(jìn)行拼接, 得到最終的請求地址;
  5. 然后通過 HTTP 工具發(fā)送請求;
http://www.risenshineclean.com/news/58112.html

相關(guān)文章:

  • 網(wǎng)站開發(fā)的設(shè)計(jì)與實(shí)現(xiàn)服務(wù)營銷的七個(gè)要素
  • 2016做網(wǎng)站還賺錢嗎房地產(chǎn)銷售怎么找客戶
  • 經(jīng)營性網(wǎng)站備案需要哪些東西成人職業(yè)技能培訓(xùn)學(xué)校
  • 小程序線上商城成都網(wǎng)站優(yōu)化
  • 建設(shè)銀行網(wǎng)站怎么預(yù)約紀(jì)念幣百度推廣步驟
  • 做麻將網(wǎng)站珠海seo推廣
  • 什么是網(wǎng)站功能需求外鏈屏蔽逐步解除
  • 湖北省建設(shè)工程網(wǎng)站東莞做網(wǎng)站哪個(gè)公司好
  • 做網(wǎng)站上傳電子書最新的新聞 今天
  • 做啥網(wǎng)站長春網(wǎng)站優(yōu)化頁面
  • wordpress自定義提醒用法百度搜索怎么優(yōu)化
  • 醫(yī)院網(wǎng)站開發(fā)違法嗎小程序免費(fèi)制作平臺
  • php手機(jī)網(wǎng)站開發(fā)龍崗seo網(wǎng)絡(luò)推廣
  • 九江疫情最新情況seo關(guān)鍵詞優(yōu)化系統(tǒng)
  • 手機(jī)端訪問 php網(wǎng)站成都專業(yè)的整站優(yōu)化
  • 深圳一百訊網(wǎng)站建設(shè)山東百度推廣總代理
  • 洞口網(wǎng)站開發(fā)公司系統(tǒng)優(yōu)化大師官方下載
  • java開源代碼網(wǎng)站seo優(yōu)
  • 做商城類的網(wǎng)站需要做些什么線下推廣渠道有哪些方式
  • 萊蕪在線論壇萊蕪話題王作泉抖音seo關(guān)鍵詞優(yōu)化
  • 網(wǎng)站開發(fā)api和微端互聯(lián)網(wǎng)營銷師培訓(xùn)教程
  • 主題營銷活動創(chuàng)意網(wǎng)站收錄優(yōu)化
  • 電子商務(wù)網(wǎng)站建設(shè)也管理高端網(wǎng)站建設(shè)企業(yè)
  • 云南網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣合作協(xié)議范本
  • 國內(nèi)做的較好的網(wǎng)站制作網(wǎng)站公司
  • 西安專業(yè)做網(wǎng)站大概需要多少錢
  • 企健網(wǎng)網(wǎng)址搜索引擎優(yōu)化的簡稱
  • 長沙營銷型網(wǎng)站建設(shè)如何營銷推廣
  • 梅河口城鄉(xiāng)建設(shè)網(wǎng)站seo蜘蛛屯
  • 專業(yè)網(wǎng)站開發(fā)服務(wù)線上推廣宣傳方式有哪些