微服務(wù)注冊(cè)中心
注冊(cè)中心可以說(shuō)是微服務(wù)架構(gòu)中的”通訊錄“,它記錄了服務(wù)和服務(wù)地址的映射關(guān)系。在分布式架構(gòu)中,服務(wù)會(huì)注冊(cè)到這里,當(dāng)服務(wù)需要調(diào)用其它服務(wù)時(shí),就這里找到服務(wù)的地址,進(jìn)行調(diào)用。
微服務(wù)注冊(cè)中心
服務(wù)注冊(cè)中心(簡(jiǎn)稱注冊(cè)中心)是微服務(wù)框架的一個(gè)重要組件,在微服務(wù)架構(gòu)里主要起到了協(xié)調(diào)者的一個(gè)作用,注冊(cè)中心一般包括如下幾個(gè)功能:
- 注冊(cè)發(fā)現(xiàn):
- 服務(wù)注冊(cè)/反注冊(cè):保證服務(wù)提供者和服務(wù)調(diào)用者的信息
- 服務(wù)訂閱/取消訂閱:服務(wù)調(diào)用者訂閱服務(wù)提供者的信息,最好有實(shí)時(shí)推送的功能
- 服務(wù)路由(可選):具有篩選整合服務(wù)提供者的能力
- 服務(wù)配置:
- 配置訂閱:服務(wù)提供者和服務(wù)調(diào)用者訂閱微服務(wù)相關(guān)的配置
- 配置下發(fā):主動(dòng)將配置托送給服務(wù)提供者和服務(wù)調(diào)用者
- 服務(wù)監(jiān)控檢測(cè):
- 檢測(cè)服務(wù)提供者的健康情況
常見(jiàn)的注冊(cè)中心
-
Zookeeper
zookeeper它是一個(gè)分布式服務(wù)框架,是Apache Hadoop 的一個(gè)子項(xiàng)目,它主要是用來(lái)解決分布式應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問(wèn)題,如:統(tǒng)一命名服務(wù)、狀態(tài)同步、集群管理、分布式應(yīng)用配置項(xiàng)的管理等。簡(jiǎn)單來(lái)說(shuō)zookeeper=文件系統(tǒng)+監(jiān)聽(tīng)通知機(jī)制
-
Eureka
Eureka是Java語(yǔ)言上,基于Restful Api開(kāi)發(fā)的服務(wù)注冊(cè)與發(fā)現(xiàn)組件,SpringCloud Netflix 中的重要組件
-
Consul
Consul是由HashiCorp基于Go語(yǔ)言開(kāi)發(fā)的支持多數(shù)據(jù)中心分布式高可用的服務(wù)發(fā)布和注冊(cè)服務(wù)軟件,采用Raft算法保證服務(wù)的一致性,并且支持健康檢查
-
Nacos
Nacos是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn),配置管理和服務(wù)平臺(tái),簡(jiǎn)單來(lái)說(shuō)Nacos就是注冊(cè)中心+配置中心的組合,提供簡(jiǎn)單易用的特征集,幫助我們解決微服務(wù)開(kāi)發(fā)必會(huì)涉及到的服務(wù)注冊(cè)與發(fā)現(xiàn),服務(wù)配置,服務(wù)管理等問(wèn)題。Nacos還是Spring Cloud Alibaba 組件之一,負(fù)責(zé)服務(wù)注冊(cè)與發(fā)現(xiàn)
組件名 | 語(yǔ)言 | CAP | 一致性算法 | 服務(wù)健康檢查 | 對(duì)外暴露接口 |
---|---|---|---|---|---|
Eureka | Java | AP | 無(wú) | 可配支持 | HTTP |
Consul | Go | CP | Raft | 支持 | HTTP/DNS |
Zookeeper | Java | CP | Paxos | 支持 | 客戶端 |
Nacos | Java | AP | Raft | 支持 | HTTP |
Eureka閉源影響:
在Eureka的GitHub上,宣布Eureka 2.x閉源。意味著如果開(kāi)發(fā)者繼續(xù)使用作為2.x分支上現(xiàn)有的工作時(shí),自負(fù)風(fēng)險(xiǎn)
Nacos簡(jiǎn)介
Nacos致力于幫助您發(fā)現(xiàn),配置和管理微服務(wù)。Nacos提供了一組簡(jiǎn)單易用的特征集,幫助您快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn),服務(wù)配置,服務(wù)元數(shù)據(jù)及流量管理。Nacos的作用就是一個(gè)注冊(cè)中心,用來(lái)管理注冊(cè)上來(lái)的各個(gè)微服務(wù)
-
Nacos下載地址
https://github.com/alibaba/nacos/releases,下載zip格式的安裝包,解壓安裝
-
Nacos的啟動(dòng)
命令啟動(dòng):
# 切換目錄 cd nacos/bin # 命令啟動(dòng) startup.cmd -m standalone
雙擊啟動(dòng)startup.cmd 運(yùn)行
Nacos啟動(dòng)瀏覽器訪問(wèn)
http://localhost:8848/nacos
即可訪問(wèn)服務(wù),默認(rèn)的賬號(hào)密碼是nacos/nacos
項(xiàng)目中搭建Nacos
基于原來(lái)的項(xiàng)目搭建Nacos
- 將shop_product商品微服務(wù)注冊(cè)到Nacos
實(shí)現(xiàn)步驟:
-
pom文件中添加Nacos依賴
<!--nacos客戶端--> <!--服務(wù)注冊(cè)--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
在啟動(dòng)類上添加@EnableDiscoveryClient注解
@SpringBootApplication @EnableDiscoveryClient public class ShopOrderApplication { public static void main(String[] args) { SpringApplication.run(ShopOrderApplication.class, args); } }
-
在application.yaml中添加Nacos服務(wù)的地址
server: port: 8081 spring: application: name: service-product # 注冊(cè)到服務(wù)中心中的名字 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true username: root password: 123456 # 配置nacos cloud: nacos: discovery: server-addr: localhost:8848 #server-addr: nacos服務(wù)地址:端口號(hào)
-
啟動(dòng)服務(wù),觀察Nacos的控制面板中是否有注冊(cè)上來(lái)的商品微服務(wù)
刷新nacos,能看到注冊(cè)的微服務(wù)即注冊(cè)成功
- 將shop_order訂單微服務(wù)注冊(cè)到Nacos
實(shí)現(xiàn)步驟:
-
在pom文件添加nacos的依賴
<!--nacos客戶端--> <!--服務(wù)注冊(cè)--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
在啟動(dòng)類上添加@EnableDiscoveryClient注解
@SpringBootApplication @EnableDiscoveryClient public class ShopOrderApplication { public static void main(String[] args) { SpringApplication.run(ShopOrderApplication.class, args); } }
-
在application.yaml中添加nacos服務(wù)的地址
server: port: 8091 spring: application: name: service-order # 注冊(cè)到服務(wù)中心中的名字 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true username: root password: 123456 cloud: nacos: discovery: server-addr: 127.0.0.1:8848
-
啟動(dòng)服務(wù),觀察nacos的控制面板中是否有注冊(cè)上來(lái)的訂單微服務(wù),同shop_product
服務(wù)調(diào)用Ribbon入門
經(jīng)過(guò)以上的學(xué)習(xí),已經(jīng)實(shí)現(xiàn)了服務(wù)的注冊(cè)和服務(wù)發(fā)現(xiàn)。當(dāng)啟動(dòng)某個(gè)服務(wù)的時(shí)候,可以通過(guò)HTTP的形式將信息注冊(cè)到注冊(cè)中心,并且可以通過(guò)SpringCloud提供的工具獲取注冊(cè)中心的服務(wù)列表。但是服務(wù)之間的調(diào)用還存在很多的問(wèn)題,如何更加方便的調(diào)用微服務(wù),多個(gè)微服務(wù)的提供者如何選擇,如何負(fù)載均衡等
Ribbon的概述
是Netflixfa 發(fā)布的一個(gè)負(fù)載均衡器,有助于控制 HTTP 和 TCP客戶端行為。在 SpringCloud 中,Nacos一般配合Ribbon進(jìn)行使用,Ribbon提供了客戶端負(fù)載均衡的功能,Ribbon利用從Nacos中讀取到的服務(wù)信息,在調(diào)用服務(wù)節(jié)點(diǎn)提供的服務(wù)時(shí),會(huì)合理的進(jìn)行負(fù)載。
在SpringCloud中可以將注冊(cè)中心和Ribbon配合使用,Ribbon自動(dòng)的從注冊(cè)中心中獲取服務(wù)提供者的列表信息,并基于內(nèi)置的負(fù)載均衡算法,請(qǐng)求服務(wù)
Ribbon的主要作用
-
服務(wù)調(diào)用
基于Ribbon實(shí)現(xiàn)服務(wù)調(diào)用,是通過(guò)拉取到的所有服務(wù)列表組成(服務(wù)名-請(qǐng)求路徑的)映射關(guān)系。借助RestTemplate最終進(jìn)行調(diào)用
-
負(fù)載均衡
當(dāng)有多個(gè)服務(wù)提供者時(shí),Ribbon可以根據(jù)負(fù)載均衡的算法自動(dòng)的選擇需要調(diào)用的服務(wù)地址
基于Ribbon實(shí)現(xiàn)服務(wù)調(diào)用
需求:基于Ribbon實(shí)現(xiàn)訂單調(diào)用商品的服務(wù)
實(shí)現(xiàn)步驟:
-
坐標(biāo)依賴
在springcloud提供的服務(wù)發(fā)現(xiàn)的jar中已經(jīng)包含了Ribbon的依賴。所以在這不需要子啊導(dǎo)入任何額外的坐標(biāo)
-
工程改造
服務(wù)消費(fèi)者(服務(wù)的調(diào)用者)
在注入RestTemplate的方法上添加注解==@LoadBalanced==注解
@Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
通過(guò)服務(wù)名稱消費(fèi)使用
@RestController @RequestMapping("/order") public class OrderController { @Autowired(required = false) private IOrderService orderService; @Autowired(required = false) private RestTemplate restTemplate; // 模擬下訂單業(yè)務(wù) @RequestMapping("/save/{pid}") public Order order (@PathVariable("pid") int pid) { // 調(diào)用商品的微服務(wù) String url = "service-product"; Product product = restTemplate.getForObject("http://"+ url +"/product/" + pid, Product.class); // 創(chuàng)建訂單 Order order = new Order(); order.setUid(1); order.setUsername("測(cè)試用戶"); order.setPid(pid); order.setPname(product.getPname()); order.setPprice(product.getPprice()); order.setNumber(1); orderService.save(order); return order; } }
注意:restTemplate.getForObject(“http://商品服務(wù)名稱/product/1”+pid,Product.class)
這里的商品服務(wù)名稱是:注冊(cè)商品服務(wù)時(shí)的名稱,即shop_product的yaml配置文件中的application.name
路徑是根據(jù)shop_product中通過(guò)id查詢商品的路徑編寫
服務(wù)調(diào)用Ribbon高級(jí)
負(fù)載均衡概述
在搭建網(wǎng)對(duì)時(shí),如果單節(jié)點(diǎn)的 web服務(wù)性能和可靠性都法達(dá)到要求;或者是在使用外網(wǎng)服務(wù)時(shí),經(jīng)常擔(dān)心被人攻破,一不小就會(huì)有打開(kāi)外網(wǎng)端口的情況,通常這時(shí)加人負(fù)載有就能有效
決服務(wù)問(wèn)題。
負(fù)載均衡是一種基礎(chǔ)的網(wǎng)絡(luò)服務(wù),其原理是通過(guò)運(yùn)行在前面的負(fù)載均衡服務(wù),按照指定的負(fù)載均衡算法,將流量分雷到后端服務(wù)集群上,從而為系統(tǒng)提供并行擴(kuò)展的能力。
負(fù)載均衡的應(yīng)用場(chǎng)景包括流量包、轉(zhuǎn)發(fā)規(guī)則以及后端服務(wù),由于該服務(wù)有內(nèi)外網(wǎng)隔離,健康檢查功能,能夠有效提供系統(tǒng)的安全性和可用性。
負(fù)載均衡分類
-
客戶端負(fù)載均衡
先發(fā)送請(qǐng)求到負(fù)載均衡服務(wù)器或者軟件,然后通過(guò)負(fù)載均衡算法,在多個(gè)服務(wù)器之間選擇一個(gè)進(jìn)行訪問(wèn);即在服務(wù)器端再進(jìn)行負(fù)載均衡算法分配
-
服務(wù)端負(fù)載均衡
客戶端會(huì)有一個(gè)服務(wù)器地址列表,在發(fā)送請(qǐng)求前通過(guò)負(fù)載均衡算法選擇一個(gè)服務(wù)器,然后進(jìn)行訪問(wèn),這是客戶端負(fù)載均衡,即在客戶端就進(jìn)行負(fù)載均衡算法分配
基于Ribbon實(shí)現(xiàn)負(fù)載均衡
需求:實(shí)現(xiàn)訂單和商品之間的客戶端負(fù)載均衡
實(shí)現(xiàn)步驟:
-
先搭建多服務(wù)實(shí)例(即水平拓展)
訂單服務(wù)需要調(diào)商品服務(wù),所以需要再啟動(dòng)一個(gè)shop-product微服務(wù),設(shè)置端口號(hào)為8082
-
啟動(dòng)兩個(gè)shop_product和shop_order
發(fā)送多次請(qǐng)求,可以在調(diào)用的product服務(wù)中打印內(nèi)容,查看控制臺(tái)打印內(nèi)容,Ribbon默認(rèn)的負(fù)載均衡策略是輪詢的方式
負(fù)載均衡的策略
Ribbion內(nèi)置了多種負(fù)載均衡策略,內(nèi)部負(fù)責(zé)負(fù)載均衡的頂級(jí)接口為com.netflix.loadbalancer.IRule
- com.netflix.loadbalancer.RoundRobinRule:以輪詢的方式進(jìn)行負(fù)載均衡
- com.netflix.loadbalancer.RandomRule:隨機(jī)策略
- com.netflix.loadbalancer.RetryRule:重試策略
- com.netflix.loadbalancer.WeightedResponseTimeRule:權(quán)重策略。會(huì)計(jì)算每個(gè)服務(wù)的權(quán)重,越高的被調(diào)用的可能性越大
- com.netflix.loadbalancer.BestAvailableRule:最佳策略。遍歷所有的服務(wù)實(shí)例,過(guò)濾掉故障實(shí)例,并返回請(qǐng)求數(shù)最小的實(shí)力返回
- com.netflix.loadbalancer.AvailabilityFilteringRule:可用過(guò)濾策略。過(guò)濾掉故障和請(qǐng)求次數(shù)超過(guò)閾值的服務(wù)實(shí)例,再?gòu)氖O碌膶?shí)例中輪詢調(diào)用
- ZoneAvoidanceRule:以區(qū)域可用的服務(wù)器為基礎(chǔ)進(jìn)行服務(wù)器的選擇。使用Zone對(duì)服務(wù)器進(jìn)行分類,這個(gè)Zone可以理解為一個(gè)機(jī)房,一個(gè)機(jī)架等,而后再對(duì)Zone內(nèi)的多個(gè)服務(wù)做輪詢
自定義指定負(fù)載均衡策略
方式一,全局設(shè)置:
定義一個(gè)新的IRule:
@Bean
public IRule randomRule(){
return new RandomRule(); // 隨機(jī)策略
}
方式二,局部設(shè)置:
在yaml配置文件中配置:
在shop_order(客戶端配置文件中)的yaml文件中配置被調(diào)用的服務(wù),需要調(diào)用的服務(wù)器名稱和策略
server:
port: 8091
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: 123456
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 配置隨機(jī)策略
# 需要調(diào)用的服務(wù)器名稱
service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# 隨機(jī)策略完全路徑
Nacos配置管理
Nacos除了可做注冊(cè)中心,同樣可以做配置管理來(lái)使用
統(tǒng)一配置管理
當(dāng)微服務(wù)部署的實(shí)例越來(lái)越多,達(dá)到數(shù)十、數(shù)百時(shí),逐個(gè)修改微服務(wù)配置就會(huì)讓人抓狂,而且很容易出錯(cuò)我們需要一種統(tǒng)一配置管理方案,可以集中管理所有實(shí)例的配置。
Nacos一方面可以將配置集中管理,另一方面可以在配置變更時(shí),即使通知微服務(wù),實(shí)現(xiàn)配置的熱更新
在業(yè)界中常見(jiàn)的服務(wù)配置中心如下:
- **Apollo:**由攜程開(kāi)源的分布式配置中心。特點(diǎn)很多:配置更新之后可以實(shí)時(shí)生效,支持灰度發(fā)布功能,并且能對(duì)所有的配置進(jìn)行版本管理、操作審計(jì)等功能,提供開(kāi)放平臺(tái)API。并且
料也寫的很詳細(xì) - **Disconf:**由百度開(kāi)源的分布式配置中心。它是基于Zookeeper來(lái)實(shí)現(xiàn)配置變更后實(shí)時(shí)通知和生效的
- **SpringCloud Config:**Spring Cloud中帶的配置中心組件。它和Spring是無(wú)縫集成,使用起來(lái)非常方便,并且它的配置存儲(chǔ)支持Git,不過(guò)它沒(méi)有可視化的操作界面,配置的生效也不是實(shí)時(shí)的,需要重啟或去刷新
- **Nacos:**SpringCloud alibaba技術(shù)棧中的一個(gè)組件,前面我們已經(jīng)使用它做過(guò)服務(wù)注冊(cè)中心。其實(shí)它也繼承了服務(wù)配置的功能,我們可以直接使用它作為服務(wù)配置中心
在nacos中添加配置文件
nacos配置中心新建配置起名規(guī)范:
服務(wù)名稱-環(huán)境簡(jiǎn)稱.文件后綴:shop_order-dev.yaml
從微服務(wù)拉取配置
微服務(wù)要拉取nacos中管理的配置,并且與本地的application.yaml配置合并,才能完成項(xiàng)目啟動(dòng)
spring引入了一種新的配置文件:boostrap.yaml文件,會(huì)在application.yaml之前被讀取,流程:
配置實(shí)現(xiàn)步驟
-
引入nacos-config依賴
<!--統(tǒng)一配置--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
-
添加bootstrap.yaml
不能使用原來(lái)的application.yaml作為配置問(wèn)價(jià)你,新建一個(gè)bootstrap.yaml作為配置文件
server: port: 8091 spring: application: name: service-order cloud: nacos: config: server-addr: 127.0.0.1:8848 #nacos 中心地址 file-extension: yaml # 配置文件格式 profiles: active: dev #環(huán)境表示,開(kāi)發(fā)環(huán)境
配置文件優(yōu)先級(jí)(由高到低):
bootstrap.properties–>bootstrap.yaml–>application.properties–>application.yaml
-
在nacos中添加配置:service-order-dev
-
測(cè)試:
模擬下單業(yè)務(wù),正常下單即成功
配置熱更新
最終目的是修改nacos中的配置后,微服務(wù)中無(wú)需重啟即可讓配置文件生效,也就是配置熱更新。實(shí)現(xiàn)熱更新兩種方式:
在配置中心添加配置(隨便起的鍵值對(duì)為了看效果)
config:
env: test
-
方式一
只需要在需要?jiǎng)討B(tài)讀取配置的類上添加==@RefreshScope==注解就可以
@RestController @RequestMapping("/order") @RefreshScope // 動(dòng)態(tài)讀取配置 public class OrderController { @Value("${config.env}") private String appName; @GetMapping("/nacos-config-test") public String nacosConfigTest(){ return appName; } }
-
方式二
硬編碼方式
@Value(("${config.env}")) private String env; @Autowired private ConfigurableApplicationContext applicationContext; @GetMapping("nacos-config-test2") public String nacosConfigTest2(){ return applicationContext.getEnvironment().getProperty("config.env"); }
當(dāng)在配置中心中修改了config.env鍵值對(duì),服務(wù)不需要重新啟動(dòng),即可拿到修改后的值
配置共享
配置共享即抽取相同的配置
同服務(wù)內(nèi)配置共享
實(shí)現(xiàn)步驟:
-
新建一個(gè)以service-order命名的配置文件,然后將其所有環(huán)境的公共配置放在里面
-
新建一個(gè)名為service-order-test.yaml配置存放測(cè)試環(huán)境的配置
-
新建一個(gè)名為service-order-dev.yaml配置存放開(kāi)發(fā)環(huán)境的配置
-
在兩個(gè)環(huán)境文件中配置獨(dú)有信息
-
添加測(cè)試方法
修改bootstrap.yaml中的環(huán)境看字符串打印的內(nèi)容
profiles: active: dev #環(huán)境表示,開(kāi)發(fā)環(huán)境 #active:test
@Value(("${config.env}")) private String env; @GetMapping("/nacos-config-test3") public String nacosConfigTest3(){ return env; }
不同微服務(wù)共享配置
不同服務(wù)之間實(shí)現(xiàn)配置共享的原理類似于文件引入,就是定義一個(gè)公共配置,然后在當(dāng)前配置中引入
-
在nacos中定義一個(gè)DataID為all-service.yaml(隨便起)的配置,用于所有微服務(wù)共享
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true username: root password: 123456 cloud: nacos: discovery: server-addr: 127.0.0.1:8848
-
修改bootstrap.yaml
server: port: 8091 spring: application: name: service-order cloud: nacos: config: server-addr: 127.0.0.1:8848 #nacos 中心地址 file-extension: yaml # 配置文件格式 shared-dataids: all-service.yaml #配置要引入的配置 refreshable-dataids: all-service.yaml # 配置要實(shí)現(xiàn)動(dòng)態(tài)配置刷新的配置 profiles: active: dev #環(huán)境表示,開(kāi)發(fā)環(huán)境
-
啟動(dòng)商品微服務(wù)測(cè)試
配置共享的優(yōu)先級(jí)
當(dāng)nacos、服務(wù)本地同時(shí)出現(xiàn)相同屬性時(shí),優(yōu)先級(jí)有高低之分:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-835345.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-835345.html
到了這里,關(guān)于SpringCloud微服務(wù)注冊(cè)中心:Nacos介紹,微服務(wù)注冊(cè),Ribbon通信,Ribbon負(fù)載均衡,Nacos配置管理詳細(xì)介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!