Nacos?Discovery服務(wù)治理解決方案
前言
上一章中,我們利用用戶–訂單–商品,實現(xiàn)了三個簡單的微服務(wù),實現(xiàn)了微服務(wù)之間的調(diào)用。但不知道大家有沒有發(fā)現(xiàn),我們是通過硬編碼的方式,把服務(wù)者,消費者的服務(wù)Url,寫到了代碼中,這樣做肯定是不行的,存在著許多的問題,比如:
一旦服務(wù)提供者地址變化,就需要手工修改代碼一旦是多個服務(wù)提供者,無法實現(xiàn)負載均衡功能一旦服務(wù)變得越來越多,人工維護調(diào)用關(guān)系困難
那么應(yīng)該怎么解決呢, 這時候就需要通過注冊中心動態(tài)的實現(xiàn)服務(wù)治理。
服務(wù)治理
什么是服務(wù)治理?
服務(wù)治理是微服務(wù)架構(gòu)中最核心最基本的模塊。用于實現(xiàn)各個微服務(wù)的自動化注冊與發(fā)現(xiàn)。
- 服務(wù)注冊: 在服務(wù)治理框架中,都會構(gòu)建一個注冊中心,每個服務(wù)單元向注冊中心登記自己提供服務(wù)的詳細信息。并在注冊中心形成一張服務(wù)的清單,服務(wù)注冊中心需要以心跳的方式去監(jiān)測清單中的服務(wù)是否可用,如果不可用,需要在服務(wù)清單中剔除不可用的服務(wù)。
- 服務(wù)發(fā)現(xiàn): 服務(wù)調(diào)用方向服務(wù)注冊中心咨詢服務(wù),并獲取所有服務(wù)的實例清單,實現(xiàn)對具體服務(wù)實例的訪問。
常見的注冊中心
Zookeeper
zookeeper
是一個分布式服務(wù)框架,是Apache Hadoop 的一個子項目,它主要是用來解決分布式應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問題。
如:統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理、分布式應(yīng)用配置項的管理等。
Eureka
Eureka
是Springcloud Netflix中的重要組件,主要作用就是做服務(wù)注冊和發(fā)現(xiàn)。但是現(xiàn)在已經(jīng)閉源。如果是打算新建微服務(wù)到話,不推薦使用Eureka了。
Consul
Consul
是基于GO語言開發(fā)的開源工具,主要面向分布式,服務(wù)化的系統(tǒng)提供服務(wù)注冊、服務(wù)發(fā)現(xiàn) 和配置管理的功能。Consul的功能都很實用,其中包括:服務(wù)注冊/發(fā)現(xiàn)、健康檢查、Key/Value 存儲、多數(shù)據(jù)中心和分布式一致性保證等特性。
Consul本身只是一個二進制的可執(zhí)行文件,所以安裝和部署都非常簡單,只需要從官網(wǎng)下載后,在執(zhí)行對應(yīng)的啟動腳本即可。
Nacos
Nacos
是一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺。
它是SpringCloud Alibaba 組件之一,負責(zé)服務(wù)注冊發(fā)現(xiàn)和服務(wù)配置,可以這樣認為nacos=eureka+config
。
Nacos 入門
Nacos 官網(wǎng)介紹:
Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡單易用的特性集,幫助您快速實現(xiàn)動態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。
從上面的介紹就可以看出,nacos的作用就是一個注冊中心,用來管理注冊上來的各個微服務(wù)。
搭建nacos環(huán)境
第1步: 安裝nacos
下載地址: https://github.com/alibaba/nacos/releases
下載zip格式的安裝包,然后進行解壓縮操作。
第2步: 啟動nacos
#切換目錄 cd nacos/bin #命令啟動 startup.cmd -m standalone
第3步: 訪問nacos
打開瀏覽器輸入http://localhost:8848/nacos
即可訪問服務(wù), 默認密碼是nacos/nacos
將商品微服務(wù)注冊到nacos
接下來開始修改 shop-product 模塊的代碼, 將其注冊到nacos服務(wù)上 。
1、在pom.xml中添加nacos的依賴
<!--nacos客戶端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2、在主類上添加@EnableDiscoveryClient注解
@SpringBootApplication @EnableDiscoveryClient public class ProductApplication{ ...... }
3 在application.yml中添加nacos服務(wù)的地址
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848
4、啟動服務(wù), 觀察nacos的控制面板中是否有注冊上來的商品微服務(wù)
將訂單微服務(wù)注冊到nacos
接下來開始修改 shop_order 模塊的代碼, 將其注冊到nacos服務(wù)上。
1、在pom.xml中添加nacos的依賴
<!--nacos客戶端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2、在主類上添加@EnableDiscoveryClient注解
@SpringBootApplication @EnableDiscoveryClient public class OrderApplication{ ..... }
3、在application.yml中添加nacos服務(wù)的地址
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848
4、修改OrderController, 實現(xiàn)微服務(wù)調(diào)用
@RestController @Slf4j public class OrderController { @Autowired private RestTemplate restTemplate; @Autowired private OrderService orderService; @Autowired private DiscoveryClient discoveryClient; //準備買1件商品 @GetMapping("/order/prod/{pid}") public Order order(@PathVariable("pid") Integer pid) { log.info(">>客戶下單,這時候要調(diào)用商品微服務(wù)查詢商品信息"); //從nacos中獲取服務(wù)地址 ServiceInstance serviceInstance = discoveryClient.getInstances("service-product").get(0); String url = serviceInstance.getHost() + ":" +serviceInstance.getPort(); log.info(">>從nacos中獲取到的微服務(wù)地址為:" + url); //通過restTemplate調(diào)用商品微服務(wù) Product product = restTemplate.getForObject( "http://" + url + "/product/" + pid, Product.class); log.info(">>商品信息,查詢結(jié)果:" + JSON.toJSONString(product)); Order order = new Order(); order.setUid(1); order.setUsername("測試用戶"); order.setPid(product.getPid()); } }
DiscoveryClient是專門負責(zé)服務(wù)注冊和發(fā)現(xiàn)的,我們可以通過它獲取到注冊到注冊中心的所有服務(wù)。
5、啟動服務(wù), 觀察nacos的控制面板中是否有注冊上來的訂單微服務(wù),然后通過訪問消費者服務(wù)驗證調(diào) 用是否成功
總結(jié)
這篇文章我們簡單的實現(xiàn)了如何利用服務(wù)治理來管控微服務(wù)。那么對應(yīng)的又引發(fā)一個問題,如果集群中用戶訪問量在某一瞬間達到最高點,可能會造成服務(wù)的癱瘓,這怎么解決呢?相信大家都知道負載均衡技術(shù),也知道這里需要用到負載均衡,但在微服務(wù)中,如何實現(xiàn)服務(wù)調(diào)用的負載均衡呢?我們下篇文章再講。
相關(guān)文章
Mybatis中mapper.xml實現(xiàn)熱加載介紹
大家好,本篇文章主要講的是Mybatis中mapper.xml實現(xiàn)熱加載介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01java實現(xiàn)合并2個文件中的內(nèi)容到新文件中
這篇文章主要介紹了java實現(xiàn)合并2個文件中的內(nèi)容到新文件中,思路非常不錯,這里推薦給大家。2015-03-03一文搞明白Java?Spring?Boot分布式事務(wù)解決方案
這篇文章主要介紹了一文搞明白Java?Spring?Boot分布式事務(wù)解決方案,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07Java使用EasyExcel模版導(dǎo)出詳細操作教程
業(yè)務(wù)中經(jīng)常需要按照一個特定的模板導(dǎo)出特定內(nèi)容,有些單元格還要求特殊的格式,所以下面這篇文章主要給大家介紹了關(guān)于Java使用EasyExcel模版導(dǎo)出的相關(guān)資料,需要的朋友可以參考下2023-10-10編寫Spring MVC控制器的14個技巧(小結(jié))
這篇文章主要介紹了編寫Spring MVC控制器的14個技巧,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11