天天看點

【微服務】Nacos注冊中心

目錄

1.服務間如何進行遠端調用

2.什麼是服務治理

3.常見注冊中心

4.Nacos 簡介

5.Nacos實戰入門

1.服務間如何進行遠端調用

        上篇文章搭建了訂單服務和商品服務 【微服務】-微服務環境搭建_MXin5的部落格-CSDN部落格 ,商品微服務已經提供了資料接⼝了,訂單微服務應該如何去調⽤呢?       

【微服務】Nacos注冊中心

          其實就是如何通過Java 代碼去調⽤⼀個 http 的接⼝位址,我們可以使⽤ RestTemplate 來進⾏調⽤。 1. 在啟動類上添加 RestTemplate 的 bean 配置

@SpringBootApplication
public class OrderServer {
 public static void main(String[] args) {
 SpringApplication.run(OrderServer.class,args);
 }
 @Bean
 public RestTemplate restTemplate(){
 return new RestTemplate();
 }
}
           

2. 在 OrderServiceImpl 中注⼊ RestTemplate 并實作遠端調⽤

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
 @Autowired
 private OrderDao orderDao;
 @Autowired
 private RestTemplate restTemplate;
 @Override
 public Order createOrder(Long productId,Long userId) {
 log.info("接收到{}号商品的下單請求,接下來調⽤商品微服務查詢此商品資訊",
productId);
 //遠端調⽤商品微服務,查詢商品資訊
 Product product = restTemplate.getForObject(
 "http://localhost:8081/product/"+productId,Product.class);
 log.info("查詢到{}号商品的資訊,内容是:{}", productId,
JSON.toJSONString(product));
 //建立訂單并儲存
 Order order = new Order();
 order.setUid(userId);
 order.setUsername("mxin5");
 order.setPid(productId);
 order.setPname(product.getPname());
 order.setPprice(product.getPprice());
 order.setNumber(1);
 orderDao.save(order);
 log.info("建立訂單成功,訂單資訊為{}", JSON.toJSONString(order));
 return order;
 }
}
           

雖然我們已經可以實作微服務之間的調⽤。但是我們把服務提供者的⽹絡位址( ip ,端⼝)等寫死到了代碼中,這種做法存在許多問題: ⼀旦服務提供者位址變化,就需要⼿⼯修改代碼 ⼀旦是多個服務提供者,⽆法實作負載均衡功能 ⼀旦服務變得越來越多,⼈⼯維護調⽤關系困難 那麼應該怎麼解決呢, 這時候就需要通過注冊中⼼動态的實作 服務治理,這時候就引入了Nacos進行實作服務治理。

2.什麼是服務治理

服務治理是微服務架構中最核⼼最基本的子產品。⽤于實作各個微服務的 ⾃動化注冊與發現 。 服務注冊: 在服務治理架構中,都會建構⼀個注冊中⼼,每個服務單元向注冊中⼼登記⾃⼰提供服 務的詳細資訊。并在注冊中⼼形成⼀張服務的清單,服務注冊中⼼需要以⼼跳的⽅式去監測清單中 的服務是否可⽤,如果不可⽤,需要在服務清單中剔除不可⽤的服務。 服務發現: 服務調⽤⽅向服務注冊中⼼咨詢服務,并擷取所有服務的執行個體清單,實作對具體服務實 例的通路。

【微服務】Nacos注冊中心

通過上⾯的調⽤圖會發現,除了微服務,還有⼀個元件是 服務注冊中⼼ ,它是微服務架構⾮常重要 的⼀個元件,在微服務架構⾥主要起到了協調者的⼀個作⽤。注冊中⼼⼀般包含如下⼏個功能: 1. 服務發現: 服務注冊:儲存服務提供者和服務調⽤者的資訊 服務訂閱:服務調⽤者訂閱服務提供者的資訊,注冊中⼼向訂閱者推送提供者的資訊 2. 服務健康檢測 檢測服務提供者的健康情況,如果發現異常,執⾏服務剔除。

3.常見注冊中心

Zookeeper Zookeeper 是⼀個分布式服務架構,是 Apache Hadoop 的⼀個⼦項⽬,它主要是⽤來解決分布式 應⽤中經常遇到的⼀些資料管理問題,如:統⼀命名服務、狀态同步服務、叢集管理、分布式應⽤ 配置項的管理等。 Eureka Eureka 是 Springcloud Netflflix 中的重要元件,主要作⽤就是做服務注冊和發現。但是現在已經閉 源 Consul Consul 是基于 GO 語⾔開發的開源⼯具,主要⾯向分布式,服務化的系統提供服務注冊、服務發現 和配置管理的功能。 Consul 的功能都很實⽤,其中包括:服務注冊 / 發現、健康檢查、 Key/Value 存儲、多資料中⼼和分布式⼀緻性保證等特性。 Consul 本身隻是⼀個⼆進制的可執⾏⽂件,是以 安裝和部署都⾮常簡單,隻需要從官⽹下載下傳後,在執⾏對應的啟動腳本即可。 Nacos Nacos 是⼀個更易于建構雲原⽣應⽤的動态服務發現、配置管理和服務管理平台。它是 Spring Cloud Alibaba 元件之⼀,負責服務注冊發現和服務配置。

4.Nacos 簡介

Nacos 緻⼒于幫助您發現、配置和管理微服務。 Nacos 提供了⼀組簡單易⽤的特性集,幫助您快速 實作動态服務發現、服務配置、服務中繼資料及流量管理。 從上⾯的介紹就可以看出, Nacos 的作⽤就是⼀個注冊中⼼,⽤來管理注冊上來的各個微服務。 核心功能點 : 服務注冊 : Nacos Client 會通過發送 REST 請求想 Nacos Server 注冊⾃⼰的服務,提供⾃身的元數 據,⽐如 IP 位址,端⼝等資訊。 Nacos Server 接收到注冊請求後,就會把這些中繼資料存儲到⼀個雙 層的記憶體 Map 中。 服務⼼跳 : 在服務注冊後, Nacos Client 會維護⼀個定時⼼跳來維持統治 Nacos Server, 說明服務⼀ 緻處于可⽤狀态,防⽌被剔除,預設 5s 發送⼀次⼼跳 服務同步 : Nacos Server 叢集之間會互相同步服務執行個體,⽤來保證服務資訊的⼀緻性。 服務發現 : 服務消費者 (Nacos Client) 在調⽤服務提供的服務時,會發送⼀個 REST 請求給 Nacos Server, 擷取上⾯注冊的服務清單,并且緩存在 Nacos Client 本地 , 同時會在 Nacos Client 本地開啟⼀ 個定時任務拉取服務最新的系統資料庫資訊更新到本地緩存。 服務健康檢查 : Nacos Server 會開啟⼀個定時任務來檢查注冊服務執行個體的健康情況,對于超過 15s 沒有收到用戶端⼼跳的執行個體會将他的 healthy 屬性設定為 false( 用戶端服務發現時不會發現 ) ,如果某 個執行個體超過 30s 沒有收到⼼跳,直接剔除該執行個體 ( 被剔除的執行個體如果恢複發送⼼跳則會重新注冊 )

5.Nacos實戰入門

接下來,我們就在現有的環境中加⼊ nacos ,并将我們的兩個微服務注冊上去。 1 搭建 Nacos 環境 1. 安裝 Nacos

下載下傳位址 : https://github.com/alibaba/nacos/releases 下載下傳 zip 格式的安裝包,然後進⾏解壓縮操作 , 上課使⽤的 Nacos Server 版本是 1.3.2

2. 啟動Nacos

# 切換⽬錄 cd nacos/bin # 指令啟動 startup.cmd -m standalone

3. 通路 Nacos

打開浏覽器輸⼊ http://localhost:8848/nacos ,即可通路服務, 預設密碼是 nacos/nacos
【微服務】Nacos注冊中心

2 将商品服務注冊到Nacos

接下來開始修改 shop-product-server 子產品的代碼, 将其注冊到 nacos 服務上 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 ProductServer { public static void main ( String [] args ) {         SpringApplication . run ( ProductServer . class , args );         } }

3. 在application.yml中添加Nacos服務的位址

spring :   cloud :    nacos :     discovery :      server-addr : localhost : 8848

4. 啟動服務, 觀察Nacos的控制⾯闆中是否有注冊上來的商品微服務

【微服務】Nacos注冊中心

3 将訂單服務注冊到Nacos

接下來開始修改 shop-order-server 子產品的代碼, 将其注冊到 nacos 服務上 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 OrderServer { public static void main ( String [] args ) {         SpringApplication . run ( OrderServer . class , args );         } }

3. 在application.yml中添加Nacos服務的位址

spring :  cloud :   nacos :    discovery :     server-addr : localhost : 8848

4. 啟動服務, 觀察Nacos的控制⾯闆中是否有注冊上來的訂單微服務

【微服務】Nacos注冊中心

5. 修改OrderServiceImpl, 實作微服務調⽤

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
 @Autowired
 private OrderDao orderDao;
 @Autowired
 private DiscoveryClient discoveryClient;
 @Autowired
 private RestTemplate restTemplate;
 @Override
 public Order createOrder(Long productId,Long userId) {
 log.info("接收到{}号商品的下單請求,接下來調⽤商品微服務查詢此商品資訊",
productId);
 //從nacos中擷取服務位址
 ServiceInstance instance = discoveryClient.getInstances("product-service").get(0);
 String url = instance.getHost()+":"+instance.getPort();
 //遠端調⽤商品微服務,查詢商品資訊
 Product product = restTemplate.getForObject("http://"+url+"/product/"+productId,Product.class);
 log.info("查詢到{}号商品的資訊,内容是:{}", productId,JSON.toJSONString(product));
 //建立訂單并儲存
 Order order = new Order();
 order.setUid(userId);
 order.setUsername("叩丁狼教育");
 order.setPid(productId);
 order.setPname(product.getPname());
 order.setPprice(product.getPprice());
 order.setNumber(1);
 orderDao.save(order);
 log.info("建立訂單成功,訂單資訊為{}", JSON.toJSONString(order));
 return order;
 }
}