欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:云原生 Eureka注冊(cè)中心

柚子快報(bào)邀請(qǐng)碼778899分享:云原生 Eureka注冊(cè)中心

http://yzkb.51969.com/

Eureka

介紹1 Eureka注冊(cè)中心1.1.Eureka的結(jié)構(gòu)和作用1.2.搭建eureka-server1.3.服務(wù)注冊(cè)1.4.服務(wù)發(fā)現(xiàn)

2 Ribbon負(fù)載均衡2.1.負(fù)載均衡原理2.2.源碼跟蹤2.3.負(fù)載均衡策略2.4.饑餓加載

介紹

Eureka 是 Netflix 開(kāi)發(fā)的一款服務(wù)發(fā)現(xiàn)(Service Discovery)工具,它是 Spring Cloud Netflix 微服務(wù)套件的一部分。服務(wù)發(fā)現(xiàn)是微服務(wù)架構(gòu)中的關(guān)鍵組件之一,允許服務(wù)實(shí)例在啟動(dòng)時(shí)向 Eureka 服務(wù)器注冊(cè)自己的信息(如IP地址和端口),并定期發(fā)送心跳來(lái)更新?tīng)顟B(tài)。

1 Eureka注冊(cè)中心

假如我們的服務(wù)提供者user-service部署了多個(gè)實(shí)例,如圖: 大家思考幾個(gè)問(wèn)題:

order-service在發(fā)起遠(yuǎn)程調(diào)用的時(shí)候,該如何得知user-service實(shí)例的ip地址和端口?有多個(gè)user-service實(shí)例地址,order-service調(diào)用時(shí)該如何選擇?order-service如何得知某個(gè)user-service實(shí)例是否依然健康,是不是已經(jīng)宕機(jī)?

1.1.Eureka的結(jié)構(gòu)和作用

這些問(wèn)題都需要利用SpringCloud中的注冊(cè)中心來(lái)解決,其中最廣為人知的注冊(cè)中心就是Eureka,其結(jié)構(gòu)如下:

回答之前的各個(gè)問(wèn)題。

問(wèn)題1:order-service如何得知user-service實(shí)例地址?

獲取地址信息的流程如下:

user-service服務(wù)實(shí)例啟動(dòng)后,將自己的信息注冊(cè)到eureka-server(Eureka服務(wù)端)。這個(gè)叫服務(wù)注冊(cè)eureka-server保存服務(wù)名稱到服務(wù)實(shí)例地址列表的映射關(guān)系order-service根據(jù)服務(wù)名稱,拉取實(shí)例地址列表。這個(gè)叫服務(wù)發(fā)現(xiàn)或服務(wù)拉取

問(wèn)題2:order-service如何從多個(gè)user-service實(shí)例中選擇具體的實(shí)例?

order-service從實(shí)例列表中利用負(fù)載均衡算法選中一個(gè)實(shí)例地址向該實(shí)例地址發(fā)起遠(yuǎn)程調(diào)用

問(wèn)題3:order-service如何得知某個(gè)user-service實(shí)例是否依然健康,是不是已經(jīng)宕機(jī)?

user-service會(huì)每隔一段時(shí)間(默認(rèn)30秒)向eureka-server發(fā)起請(qǐng)求,報(bào)告自己狀態(tài),稱為心跳當(dāng)超過(guò)一定時(shí)間沒(méi)有發(fā)送心跳時(shí),eureka-server會(huì)認(rèn)為微服務(wù)實(shí)例故障,將該實(shí)例從服務(wù)列表中剔除order-service拉取服務(wù)時(shí),就能將故障實(shí)例排除了

注意:一個(gè)微服務(wù),既可以是服務(wù)提供者,又可以是服務(wù)消費(fèi)者,因此eureka將服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)等功能統(tǒng)一封裝到了eureka-client端

因此,接下來(lái)我們動(dòng)手實(shí)踐的步驟包括:

1.2.搭建eureka-server

首先大家注冊(cè)中心服務(wù)端:eureka-server,這必須是一個(gè)獨(dú)立的微服務(wù)

1.創(chuàng)建eureka-server服務(wù)

在cloud-demo父工程下,創(chuàng)建一個(gè)子模塊:

2.引入eureka依賴

引入SpringCloud為eureka提供的starter依賴:

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

3.編寫(xiě)啟動(dòng)類

給eureka-server服務(wù)編寫(xiě)一個(gè)啟動(dòng)類,一定要添加一個(gè)@EnableEurekaServer注解,開(kāi)啟eureka的注冊(cè)中心功能:

package cn.shen.eureka;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer

public class EurekaApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaApplication.class, args);

}

}

4.編寫(xiě)配置文件

編寫(xiě)一個(gè)application.yml文件,內(nèi)容如下:

server:

port: 10086

spring:

application:

name: eureka-server

eureka:

client:

service-url:

defaultZone: http://127.0.0.1:10086/eureka

register-with-eureka: false # false表示不向注冊(cè)中心注冊(cè)自己。

fetch-registry: false # false表示自己端就是注冊(cè)中心,我的職責(zé)就是維護(hù)服務(wù)實(shí)例,并不需要去檢索服務(wù)

5.啟動(dòng)服務(wù)

啟動(dòng)微服務(wù),然后在瀏覽器訪問(wèn):http://127.0.0.1:10086

看到下面結(jié)果應(yīng)該是成功了:

1.3.服務(wù)注冊(cè)

下面,我們將user-service注冊(cè)到eureka-server中去。

1)引入依賴

在user-service的pom文件中,引入下面的eureka-client依賴:

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

2)配置文件

在user-service中,修改application.yml文件,添加服務(wù)名稱、eureka地址:

spring:

application:

name: userservice

eureka:

client:

service-url:

defaultZone: http://127.0.0.1:10086/eureka

3)啟動(dòng)多個(gè)user-service實(shí)例

為了演示一個(gè)服務(wù)有多個(gè)實(shí)例的場(chǎng)景,我們添加一個(gè)SpringBoot的啟動(dòng)配置,再啟動(dòng)一個(gè)user-service。

查看eureka-server管理頁(yè)面:

1.4.服務(wù)發(fā)現(xiàn)

下面,我們將order-service的邏輯修改:向eureka-server拉取user-service的信息,實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)。

1)引入依賴

之前說(shuō)過(guò),服務(wù)發(fā)現(xiàn)、服務(wù)注冊(cè)統(tǒng)一都封裝在eureka-client依賴,因此這一步與服務(wù)注冊(cè)時(shí)一致。

在order-service的pom文件中,引入下面的eureka-client依賴:

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

2)配置文件

服務(wù)發(fā)現(xiàn)也需要知道eureka地址,因此第二步與服務(wù)注冊(cè)一致,都是配置eureka信息:

在order-service中,修改application.yml文件,添加服務(wù)名稱、eureka地址:

spring:

application:

name: orderservice

eureka:

client:

service-url:

defaultZone: http://127.0.0.1:10086/eureka

3)服務(wù)拉取和負(fù)載均衡

最后,我們要去eureka-server中拉取user-service服務(wù)的實(shí)例列表,并且實(shí)現(xiàn)負(fù)載均衡。

不過(guò)這些動(dòng)作不用我們?nèi)プ?,只需要添加一些注解即可?/p>

在order-service的OrderApplication中,給RestTemplate這個(gè)Bean添加一個(gè)@LoadBalanced注解:

修改order-service服務(wù)中的cn.shen.order.service包下的OrderService類中的queryOrderById方法。修改訪問(wèn)的url路徑,用服務(wù)名代替ip、端口:

@RestController

@RequestMapping("order")

public class OrderController {

@Autowired

private OrderService orderService;

@Autowired

private RestTemplate restTemplate;

@GetMapping("{orderId}")

public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {

// 根據(jù)id查詢訂單并返回

Order order = orderService.queryOrderById(orderId);

// 根據(jù)訂單關(guān)聯(lián)的用戶id遠(yuǎn)程查詢用戶信息

Long userId = order.getUserId(); // 服務(wù)名稱

User user = restTemplate.getForObject("http://userservice/user/" + userId, User.class);

order.setUser(user);

return order;

}

}

spring會(huì)自動(dòng)幫助我們從eureka-server端,根據(jù)userservice這個(gè)服務(wù)名稱,獲取實(shí)例列表,而后完成負(fù)載均衡。

2 Ribbon負(fù)載均衡

上面示例中,我們添加了@LoadBalanced注解,即可實(shí)現(xiàn)負(fù)載均衡功能,這是什么原理呢?

2.1.負(fù)載均衡原理

SpringCloud底層其實(shí)是利用了一個(gè)名為 Ribbon 的組件(無(wú)需引入依賴,Euraka依賴內(nèi)部已經(jīng)內(nèi)嵌了),來(lái)實(shí)現(xiàn)負(fù)載均衡功能的。

那么我們發(fā)出的請(qǐng)求明明是 http://userservice/user/1,怎么變成了http://localhost:8081的呢?

2.2.源碼跟蹤

為什么我們只輸入了service名稱就可以訪問(wèn)了呢?之前還要獲取ip和端口。

顯然有人幫我們根據(jù)service名稱,獲取到了服務(wù)實(shí)例的ip和端口。它就是LoadBalancerInterceptor,這個(gè)類會(huì)在對(duì)RestTemplate的請(qǐng)求進(jìn)行攔截,然后從Eureka根據(jù)服務(wù)id獲取服務(wù)列表,隨后利用負(fù)載均衡算法得到真實(shí)的服務(wù)地址信息,替換服務(wù)id。

我們進(jìn)行源碼跟蹤:

1)LoadBalancerIntercepor

可以看到這里的intercept方法,攔截了用戶的HttpRequest請(qǐng)求,然后做了幾件事:

request.getURI():獲取請(qǐng)求uri,本例中就是 http://user-service/user/8originalUri.getHost():獲取uri路徑的主機(jī)名,其實(shí)就是服務(wù)id,user-servicethis.loadBalancer.execute():處理服務(wù)id,和用戶請(qǐng)求。

這里的this.loadBalancer是LoadBalancerClient類型,我們繼續(xù)跟入。

2)LoadBalancerClient

繼續(xù)跟入execute方法:

代碼是這樣的:

getLoadBalancer(serviceId):根據(jù)服務(wù)id獲取ILoadBalancer,而ILoadBalancer會(huì)拿著服務(wù)id去eureka中獲取服務(wù)列表并保存起來(lái)。getServer(loadBalancer):利用內(nèi)置的負(fù)載均衡算法,從服務(wù)列表中選擇一個(gè)。本例中,可以看到獲取了8082端口的服務(wù)

放行后,再次訪問(wèn)并跟蹤,發(fā)現(xiàn)獲取的是8081:

果然實(shí)現(xiàn)了負(fù)載均衡。

3)負(fù)載均衡策略IRule

在剛才的代碼中,可以看到獲取服務(wù)使通過(guò)一個(gè)getServer方法來(lái)做負(fù)載均衡:

我們繼續(xù)跟入:

繼續(xù)跟蹤源碼 chooseServer 方法,發(fā)現(xiàn)這么一段代碼:

我們看看這個(gè)rule是誰(shuí):

這里的rule默認(rèn)值是一個(gè)RoundRobinRule,看類的介紹:

這不就是輪詢的意思嘛。

到這里,整個(gè)負(fù)載均衡的流程我們就清楚了。

4)總結(jié)

SpringCloudRibbon的底層采用了一個(gè)攔截器,攔截了RestTemplate發(fā)出的請(qǐng)求,對(duì)地址做了修改。用一幅圖來(lái)總結(jié)一下:

基本流程如下:

攔截我們的 RestTemplate 請(qǐng)求http://userservice/user/1RibbonLoadBalancerClient 會(huì)從請(qǐng)求url中獲取服務(wù)名稱,也就是user-serviceDynamicServerListLoadBalancer 根據(jù) user-service 到 eureka 拉取服務(wù)列表eureka 返回列表,localhost:8081、localhost:8082IRule 利用內(nèi)置負(fù)載均衡規(guī)則,從列表中選擇一個(gè),例如 localhost:8081RibbonLoadBalancerClient 修改請(qǐng)求地址,用 localhost:8081 替代 userservice ,得到 http://localhost:8081/user/1,發(fā)起真實(shí)請(qǐng)求

2.3.負(fù)載均衡策略

負(fù)載均衡策略

負(fù)載均衡的規(guī)則都定義在IRule接口中,而IRule有很多不同的實(shí)現(xiàn)類:

不同規(guī)則的含義如下:

內(nèi)置負(fù)載均衡規(guī)則類規(guī)則描述RoundRobinRule簡(jiǎn)單輪詢服務(wù)列表來(lái)選擇服務(wù)器。AvailabilityFilteringRule對(duì)以下兩種服務(wù)器進(jìn)行忽略: (1)在默認(rèn)情況下,這臺(tái)服務(wù)器如果3次連接失敗,這臺(tái)服務(wù)器就會(huì)被設(shè)置為“短路”狀態(tài)。短路狀態(tài)將持續(xù)30秒,如果再次連接失敗,短路的持續(xù)時(shí)間就會(huì)幾何級(jí)地增加。 (2)并發(fā)數(shù)過(guò)高的服務(wù)器。如果一個(gè)服務(wù)器的并發(fā)連接數(shù)過(guò)高,配置了AvailabilityFilteringRule規(guī)則的客戶端也會(huì)將其忽略。并發(fā)連接數(shù)的上限,可以由客戶端的..ActiveConnectionsLimit屬性進(jìn)行配置。WeightedResponseTimeRule為每一個(gè)服務(wù)器賦予一個(gè)權(quán)重值。服務(wù)器響應(yīng)時(shí)間越長(zhǎng),這個(gè)服務(wù)器的權(quán)重就越小。這個(gè)規(guī)則會(huì)隨機(jī)選擇服務(wù)器,這個(gè)權(quán)重值會(huì)影響服務(wù)器的選擇。ZoneAvoidanceRule以區(qū)域可用的服務(wù)器為基礎(chǔ)進(jìn)行服務(wù)器的選擇。使用Zone對(duì)服務(wù)器進(jìn)行分類,這個(gè)Zone可以理解為一個(gè)機(jī)房、一個(gè)機(jī)架等。而后再對(duì)Zone內(nèi)的多個(gè)服務(wù)做輪詢。BestAvailableRule忽略那些短路的服務(wù)器,并選擇并發(fā)數(shù)較低的服務(wù)器。RandomRule隨機(jī)選擇一個(gè)可用的服務(wù)器。RetryRule重試機(jī)制的選擇邏輯

默認(rèn)的實(shí)現(xiàn)就是ZoneAvoidanceRule,是一種輪詢方案

自定義負(fù)載均衡策略

通過(guò)定義IRule實(shí)現(xiàn)可以修改負(fù)載均衡規(guī)則,有兩種方式:

代碼方式:在order-service中的OrderApplication類中,定義一個(gè)新的IRule:

@Bean

public IRule randomRule(){

return new RandomRule();

}

配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改規(guī)則:

userservice: # 給某個(gè)微服務(wù)配置負(fù)載均衡規(guī)則,這里是userservice服務(wù)

ribbon:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負(fù)載均衡規(guī)則

注意,一般用默認(rèn)的負(fù)載均衡規(guī)則,不做修改。

2.4.饑餓加載

Ribbon默認(rèn)是采用懶加載,即第一次訪問(wèn)時(shí)才會(huì)去創(chuàng)建LoadBalanceClient,請(qǐng)求時(shí)間會(huì)很長(zhǎng)。

而饑餓加載則會(huì)在項(xiàng)目啟動(dòng)時(shí)創(chuàng)建,降低第一次訪問(wèn)的耗時(shí),通過(guò)下面配置開(kāi)啟饑餓加載:

ribbon:

eager-load:

enabled: true #開(kāi)啟饑餓加載

clients: userservice # 指定被調(diào)用微服務(wù)饑渴加載,多個(gè)服務(wù)使用 - 的方式。

柚子快報(bào)邀請(qǐng)碼778899分享:云原生 Eureka注冊(cè)中心

http://yzkb.51969.com/

好文閱讀

評(píng)論可見(jiàn),查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19085739.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄