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

目錄

柚子快報(bào)邀請(qǐng)碼778899分享:dubbo 微服務(wù)框架【筆記】

柚子快報(bào)邀請(qǐng)碼778899分享:dubbo 微服務(wù)框架【筆記】

http://yzkb.51969.com/

1.認(rèn)識(shí)微服務(wù)

1.1 微服務(wù)架構(gòu)演變

【1】單體架構(gòu): 將業(yè)務(wù)的所有功能集中在一個(gè)項(xiàng)目中開(kāi)發(fā),打包成一個(gè)包部署。優(yōu)點(diǎn): 架構(gòu)簡(jiǎn)單;部署成本低。缺點(diǎn):耦合度高。【2】分布式架構(gòu): 根據(jù)業(yè)務(wù)功能對(duì)系統(tǒng)進(jìn)行拆分,每個(gè)業(yè)務(wù)模塊作為獨(dú)立項(xiàng)目開(kāi)發(fā),稱為一個(gè)服務(wù)。優(yōu)點(diǎn):降低服務(wù)耦合;有利于服務(wù)升級(jí)拓展服務(wù)治理分布式架構(gòu)要考慮的問(wèn)題:服務(wù)拆分粒度如何?服務(wù)集群地址如何維護(hù)?服務(wù)之間如何實(shí)現(xiàn)遠(yuǎn)程調(diào)用?服務(wù)健康狀態(tài)如何感知?【3】微服務(wù):微服務(wù)是一種經(jīng)過(guò)良好架構(gòu)設(shè)計(jì)得到分布式架構(gòu)方案,微服務(wù)的架構(gòu)特征:?jiǎn)我宦氊?zé):微服務(wù)拆分力度更小,每一個(gè)服務(wù)都對(duì)應(yīng)唯一的業(yè)務(wù)能力,做到單一職責(zé),避免重復(fù)業(yè)務(wù)開(kāi)發(fā)。面向服務(wù):微服務(wù)對(duì)外暴露業(yè)務(wù)接口自治:團(tuán)隊(duì)獨(dú)立、技術(shù)獨(dú)立、數(shù)據(jù)獨(dú)立、部署獨(dú)立隔離性強(qiáng):服務(wù)調(diào)用做好隔離、容錯(cuò)、降級(jí)、避免出現(xiàn)級(jí)聯(lián)問(wèn)題高內(nèi)聚,低耦合

1.2 SpringCloud

在國(guó)內(nèi)最知名的微服務(wù)方案的實(shí)現(xiàn)就是SpringCloud和阿里巴巴的Dubbo。 微服務(wù)技術(shù)對(duì)比

DubbboSpringCloudSpringCloudAlibaba注冊(cè)中心zookeeper、RedisEureka、ConsulNacos、Eureka服務(wù)遠(yuǎn)程調(diào)用Dubbo協(xié)議Feign(http協(xié)議)Dubbo、Fegin配置中心無(wú)SpringCloudConfigSpringCloudConfig、Nacos服務(wù)網(wǎng)關(guān)無(wú)SpringCloudGateway、ZuulSpringCloudGateway、Zuul服務(wù)監(jiān)控和保護(hù)dubbo-admin,功能弱HystrixSentinel

Spring Cloud Spring Cloud 集成了各種微服務(wù)功能組件,并基于Spring Boot實(shí)現(xiàn)了這些組件的自動(dòng)裝配,從而提供了良好的開(kāi)箱即用的體驗(yàn):

服務(wù)注冊(cè)發(fā)現(xiàn)服務(wù)遠(yuǎn)程調(diào)用服務(wù)鏈路監(jiān)控統(tǒng)一配置管理統(tǒng)一網(wǎng)關(guān)路由流控、降級(jí)、保護(hù) SpringCloud與SpringBoot需要考慮版本兼容問(wèn)題,我這里會(huì)使用 Hoxton.SR10,因此SpringBoot版本就是2.3.x。

2.分布式服務(wù)架構(gòu)案例

2.1 服務(wù)拆分和遠(yuǎn)程調(diào)用

服務(wù)拆分注意事項(xiàng):

不同微服務(wù),不要重復(fù)開(kāi)發(fā)相同業(yè)務(wù)微服務(wù)數(shù)據(jù)獨(dú)立,不要訪問(wèn)其他微服務(wù)數(shù)據(jù)庫(kù)微服務(wù)可以將自己的業(yè)務(wù)暴露為接口,供其他微服務(wù)調(diào)用

2.2 導(dǎo)入服務(wù)拆分Demo

導(dǎo)入cloud-demo項(xiàng)目結(jié)構(gòu) cloud-demo |-------order-service(根據(jù)id查詢訂單) | |-------user-service (根據(jù)id查詢用戶) 啟動(dòng)兩個(gè)項(xiàng)目分別驗(yàn)證接口orderuser

總結(jié)

微服務(wù)需要根據(jù)業(yè)務(wù)模塊拆分,做到單一職責(zé),不要重復(fù)開(kāi)發(fā)相同業(yè)務(wù)微服務(wù)可以將業(yè)務(wù)暴露為接口,供其他服務(wù)使用 不同微服務(wù)都應(yīng)有自己獨(dú)立的數(shù)據(jù)庫(kù)

2.3 微服務(wù)遠(yuǎn)程調(diào)用-查詢訂單【基于RestTemplate發(fā)送http請(qǐng)求】

注冊(cè)RestTemplate

在order-service的OrderApplication中注冊(cè)RestTemplate

@MapperScan("cn.itcast.order.mapper")

@SpringBootApplication

public class OrderApplication {

public static void main(String[] args) {

SpringApplication.run(OrderApplication.class, args);

}

/**

* 創(chuàng)建RestTemplate并注入Spring容器

* @return

*/

@Bean

public RestTemplate restTemplate(){

return new RestTemplate();

}

}

@Service

public class OrderService {

@Autowired

private OrderMapper orderMapper;

@Autowired

private RestTemplate restTemplate;

public Order queryOrderById(Long orderId) {

// 1.查詢訂單

Order order = orderMapper.findById(orderId);

// 2.利用RestTemplate發(fā)送http請(qǐng)求,查詢用戶

// 2.1 url路徑

String url = "http://localhost:8081/user/"+order.getUserId();

// 2.2 發(fā)送http請(qǐng)求,實(shí)現(xiàn)遠(yuǎn)程調(diào)用

User user= restTemplate.getForObject(url,User.class);

// 3. 封裝user到Order

order.setUser(user);

// 4.返回

return order;

}

}

3.Eureka注冊(cè)中心

先來(lái)了解一下服務(wù)調(diào)用的關(guān)系:

服務(wù)提供者:暴露接口給其他微服務(wù)調(diào)用服務(wù)消費(fèi)者:調(diào)用其他微服務(wù)提供的接口提供者和消費(fèi)者角色是相對(duì)的

3.1 遠(yuǎn)程調(diào)用的問(wèn)題

服務(wù)消費(fèi)者該如何獲取服務(wù)提供者的地址信息?如果有多個(gè)服務(wù)提供者,消費(fèi)者該如何選擇?消費(fèi)者如何得知服務(wù)提供者的健康狀態(tài)?

3.2 eureka原理

服務(wù)消費(fèi)者該如何獲取服務(wù)提供者的地址信息?

服務(wù)提供者啟動(dòng)時(shí)向eureka注冊(cè)自己的信息eureka保存這些信息消費(fèi)者根據(jù)服務(wù)名稱向eureka拉取提供者信息

如果有多個(gè)服務(wù)提供者,消費(fèi)者該如何選擇?

服務(wù)消費(fèi)者利用 負(fù)載均衡 算法,從服務(wù)中挑選一個(gè)

消費(fèi)者如何得知服務(wù)提供者的健康狀態(tài)?

服務(wù)提供者會(huì)每隔30s向EurekaServe發(fā)送心跳請(qǐng)求,報(bào)告健康狀態(tài)eureka會(huì)更新記錄服務(wù)列表信息,心跳不正常會(huì)被剔除消費(fèi)者就可以拉取到最新的信息

總結(jié)

在Eureka架構(gòu)中,微服務(wù)角色有兩類:

EurekaServer:服務(wù)端,注冊(cè)中心

記錄服務(wù)信息

心跳監(jiān)控 EurekaClient:客戶端

Provider:服務(wù)提供者,例如案例中的 user-service

注冊(cè)自己的信息到EurekaServer

每隔30s向EurekaServer發(fā)送一次心跳

Consumer:服務(wù)消費(fèi)者,例如案例中的 order-service

根據(jù)服務(wù)名稱從EurekaServer拉取服務(wù)列表

基于服務(wù)列表做負(fù)載均衡,選中一個(gè)微服務(wù)后發(fā)起遠(yuǎn)程調(diào)用

3.3 搭建EurekaServer

3.3.1 搭建注冊(cè)中心

搭建EurekaServer服務(wù)步驟如下:

創(chuàng)建項(xiàng)目,引入依賴

org.springframework.cloud

spring-cloud-starter-netflix-eureka-server

編寫啟動(dòng)類,添加@EnableEurekaServer注解 添加application.yml文件,編寫下面的配置

server:

port: 10086

spring:

application:

name: eureka-server

eureka:

client:

service-url:

defaultZone: http://127.0.0.1:10086/eureka

啟動(dòng)服務(wù)驗(yàn)證

3.4 服務(wù)注冊(cè)

注冊(cè)u(píng)ser-service 將user-service服務(wù)注冊(cè)到EurekaServer步驟如下:

在user-service項(xiàng)目下引入依賴

org.springframework.cloud

spring-cloud-starter-netflix-eureka-client

在application.yml文件,編寫下面的配置

spring:

application:

name: userservice

eureka:

client:

service-url:

defaultZone: http://127.0.0.1:10086/eureka

整體配置文件

server:

port: 8081

spring:

datasource:

url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false

username: root

password: 111111

driver-class-name: com.mysql.jdbc.Driver

application:

name: userservice #user服務(wù)的服務(wù)名稱

mybatis:

type-aliases-package: cn.itcast.user.pojo

configuration:

map-underscore-to-camel-case: true

logging:

level:

cn.itcast: debug

pattern:

dateformat: MM-dd HH:mm:ss:SSS

eureka:

client:

service-url: # eureka的地址信息

defaultZone: http://127.0.0.1:10086/eureka

order步驟如上,總結(jié)一下服務(wù)注冊(cè)就是三步走:引入依賴、配置yml(服務(wù)名稱和eureka服務(wù)地址)、啟動(dòng)服務(wù) 在注冊(cè)服務(wù)得到時(shí)候,我們可以將user-service多次啟動(dòng),模擬多實(shí)例部署,但為了避免端口沖突,需要修改端口設(shè)置:

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

在order-service完成服務(wù)拉取 服務(wù)拉取是基于服務(wù)名稱獲取服務(wù)列表,然后再對(duì)列表做負(fù)載均衡

修改OrderService的代碼,修改訪問(wèn)的路徑,用服務(wù)名代替ip、端口

String url = "http://userservice/user/"+order.getUserId();

在order-service項(xiàng)目的啟動(dòng)類OrderApplication中的RestTemplate添加負(fù)載均衡注解:

/**

* 創(chuàng)建RestTemplate并注入Spring容器

* @return

*/

@Bean

@LoadBalanced //負(fù)載均衡注解

public RestTemplate restTemplate(){

return new RestTemplate();

}

啟動(dòng)order-service服務(wù),發(fā)送兩次請(qǐng)求 http://localhost:8080/order/101 http://localhost:8080/order/102 查看負(fù)載均衡后拉取哪個(gè)服務(wù)。

4.Ribbon負(fù)載均衡

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

4.1 負(fù)載均衡原理

SpringCloud底層其實(shí)是利用了一個(gè)名為Ribbon的組件,來(lái)實(shí)現(xiàn)負(fù)載均衡功能的。 那么我們發(fā)出的請(qǐng)求明明是http://userservice/user/1,怎么變成了http://localhost:8081的呢?

4.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,看類的介紹: 輪詢負(fù)載均衡規(guī)則

這不就是輪詢的意思嘛。

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

4.2 負(fù)載均衡策略

Ribbon的負(fù)載均衡規(guī)則是一個(gè)叫IRule的接口來(lái)定義的,每一個(gè)子接口都是一種規(guī)則: 不同規(guī)則的含義如下:

內(nèi)置負(fù)載均衡規(guī)則類規(guī)則描述RoundRobinRule簡(jiǎn)單輪詢服務(wù)列表來(lái)選擇服務(wù)器。它是Ribbon默認(rèn)的負(fù)載均衡規(guī)則。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,是一種輪詢方案

4.3.1 自定義負(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ī)則,不做修改。

4.3 懶加載

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

clients: userservice

下一篇我會(huì)學(xué)習(xí)總結(jié)Nacos注冊(cè)中心的相關(guān)知識(shí),感謝大家的支持!

柚子快報(bào)邀請(qǐng)碼778899分享:dubbo 微服務(wù)框架【筆記】

http://yzkb.51969.com/

文章來(lái)源

評(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/19600953.html

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

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

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

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

文章目錄