第二篇:SpringCloud 構建微服務系統之服務註冊和發現(nacos)
上一篇我們學習了一下consul在soringcloud中的使用。今天要給大家介紹的阿里巴巴中介軟體團隊出品的Nacos來作為新一代的服務管理中介軟體。
首先學習Nacos之前,我們應該看看Nacos的官網,對它有一個初步的認識。
1. Nacos 官網 (https://nacos.io)
2 Nacos簡介
Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元資料及流量管理。
Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務正規化、雲原生正規化) 的服務基礎設施。
3.Nocos基本架構及概念
- 服務 (Service)
服務是指一個或一組軟體功能(例如特定資訊的檢索或一組操作的執行),其目的是不同的客戶端可以為不同的目的重用(例如通過跨程序的網路呼叫)。Nacos 支援主流的服務生態,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.
- 服務註冊中心 (Service Registry)
服務註冊中心,它是服務,其例項及元資料的資料庫。服務例項在啟動時註冊到服務登錄檔,並在關閉時登出。服務和路由器的客戶端查詢服務登錄檔以查詢服務的可用例項。服務註冊中心可能會呼叫服務例項的健康檢查 API 來驗證它是否能夠處理請求。
- 服務元資料 (Service Metadata)
服務元資料是指包括服務端點(endpoints)、服務標籤、服務版本號、服務例項權重、路由規則、安全策略等描述服務的資料
- 服務提供方 (Service Provider)
是指提供可複用和可呼叫服務的應用方
- 服務消費方 (Service Consumer)
是指會發起對某個服務呼叫的應用方
- 配置 (Configuration)
在系統開發過程中通常會將一些需要變更的引數、變數等從程式碼中分離出來獨立管理,以獨立的配置檔案的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理執行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成這個步驟。配置變更是調整系統執行時的行為的有效手段之一。
- 配置管理 (Configuration Management)
在資料中心中,系統中所有配置的編輯、儲存、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動統稱為配置管理。
- 名字服務 (Naming Service)
提供分散式系統中所有物件(Object)、實體(Entity)的“名字”到關聯的元資料之間的對映管理服務,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服務發現和 DNS 就是名字服務的2大場景。
- 配置服務 (Configuration Service)
在服務或者應用執行過程中,提供動態配置或者元資料以及配置管理的服務提供者
4. Nocos 安裝與啟動
4.1.預備環境準備
Nacos 依賴 Java 環境來執行。如果您是從程式碼開始構建並執行Nacos,還需要為此配置 Maven環境,請確保是在以下版本環境中安裝使用:
64 bit OS,支援 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。
64 bit JDK 1.8+;下載 & 配置。
Maven 3.2.x+;下載 & 配置。
4.2.下載原始碼或者安裝包
你可以通過原始碼和發行包兩種方式來獲取 Nacos。
從 Github 上下載原始碼方式
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
下載編譯後壓縮包方式
您可以從 最新穩定版本 下載 nacos-server-$version.zip 包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
4.3.啟動伺服器
Linux/Unix/Mac
啟動命令(standalone代表著單機模式執行,非叢集模式):
sh startup.sh -m standalone
Windows
啟動命令:
cmd startup.cmd
或者雙擊startup.cmd執行檔案。
啟動成功之後,在瀏覽器開啟 http://localhost:8848/nacos/
這樣的一個控制檯就啟動成功了。
注意:我們今天主要是要學習nacos作為服務註冊中心的案例。
5. 服務註冊與發現
5.1服務註冊
curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
5.2服務發現
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instances?serviceName=nacos.naming.serviceName'
6. Nacos 服務提供者
6.1建立一個專案:spring-cloud-nacos-provider
引入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lidong</groupId>
<artifactId>spring-cloud-nacos-producer</artifactId>
<version>1.0.0</version>
<name>spring-cloud-nacos-producer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
對配置檔案做一個簡單的介紹,我們使用的是最新版的springboot2.1.1,springcloud.Greenwich.RC2版本。
其中:
spring-boot-starter-actuator 健康檢查依賴於此包。
spring-cloud-starter-alibaba-nacos-discovery Spring Cloud nacos 的服務發現支援。
6.2 提供者新增配置(application.yml)
server:
port: 9005 #提供者的埠
spring:
application:
name: spring-cloud-nacos-producer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
include: '*'
nacos的地址和埠號預設是127.0.0.1:8848 ,如果沒有配置hosts,預設的地址localhost,nacos服務會佔用8848埠
server.port :9005 服務的提供者的埠
spring.application.name 是指註冊到 nacos 的服務名稱,後期客戶端會根據這個名稱來進行服務呼叫。
spring.application.cloud.nacos.discovery.server-addr: 127.0.0.1:8848
6.3 修改啟動類
新增 @EnableDiscoveryClient 註解,開啟服務發現支援。
package com.lidong.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 開啟服務發現
*/
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudLidongProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudLidongProviderApplication.class, args);
}
}
6.4新建服務
新建 NacosProducerController,提供 sayHello 介面, 返回一個hello—>字串。
package com.lidong.provider.service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 建立服務
*/
@RestController
public class NacosProducerController {
@Value("${server.port}")
private Integer port;
/**
* 服務介面
* @param name
* @return
*/
@RequestMapping("/hello")
public String sayHello(@RequestParam("name")String name) {
return "hello ---> "+name+" port -->"+port;
}
}
啟動專案:
Wed Dec 26 11:55:40 CST 2018 [email protected] JM.Log:INFO Init JM logger with Slf4jLoggerFactory success, [email protected]
Wed Dec 26 11:55:40 CST 2018 [email protected] JM.Log:INFO Log root path: C:\Users\vip\logs\
Wed Dec 26 11:55:40 CST 2018 [email protected] JM.Log:INFO Set nacos log path: C:\Users\vip\logs\nacos
2018-12-26 11:55:40.842 INFO 22252 --- [ main] o.s.c.a.n.registry.NacosServiceRegistry : nacos registry, spring-cloud-nacos-producer 192.168.10.116:9005 register finished
服務提供者釋出成功。
這時候,我們在控制檯會發現服務列表中有一個名字為spring-cloud-nacos-producer的服務
點選詳情會發現服務的詳細資訊
7. Nacos 服務消費者
7.1建立一個專案:spring-cloud-nacos-consumer
引入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lidong</groupId>
<artifactId>spring-cloud-nacos--consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-nacos--consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
7.2 消費者新增配置(application.yml)
server:
port: 9006 #提供者的埠
spring:
application:
name: spring-cloud-nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
include: '*'
nacos的地址和埠號預設是 127.0.0.1:8848 ,如果沒有配置hosts,預設的地址localhost,nacos服務會佔用8848介面
server.port :9006 服務的消費者的埠
spring.application.cloud.nacos.discovery.server-addr: 127.0.0.1:8848
7.3配置啟動類
package com.lidong.consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudNacosConsumerApplication {
@Autowired
private RestTemplateBuilder builder;
@Bean
@LoadBalanced // 新增負載均衡支援,很簡單,只需要在RestTemplate上新增@LoadBalanced註解,那麼RestTemplate即具有負載均衡的功能,如果不加@LoadBalanced註解的話,會報java.net.UnknownHostException:springboot-h2異常,此時無法通過註冊到Eureka Server上的服務名來呼叫服務,因為RestTemplate是無法從服務名對映到ip:port的,對映的功能是由LoadBalancerClient來實現的。
public RestTemplate restTemplate() {
return builder.build();
}
public static void main(String[] args) {
SpringApplication.run(SpringCloudNacosConsumerApplication.class, args);
}
}
7.4建立消費服務
package com.lidong.consumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* 建立服務的消費者
*/
@RestController
public class ConsumerController {
private static final String SERVICE_NAME = "service-producer";
@Autowired
private DiscoveryClient discoveryClient;
/**
* 獲取所有服務
*/
@RequestMapping("/services")
public Object services() {
return discoveryClient.getInstances(SERVICE_NAME);
}
/**
* 消費服務
*/
@RequestMapping("/callSayHello")
public String services(@RequestParam("name") String name) {
ServiceInstance serviceInstance = (ServiceInstance) discoveryClient.getInstances(SERVICE_NAME);
String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
System.out.println(callServiceResult);
return callServiceResult;
}
}
http://localhost:9006/services
獲取服務列表的結果
[{"serviceId":"spring-cloud-nacos-producer","host":"192.168.10.116","port":9005,"secure":false,"metadata":{"cluster":"DEFAULT","instanceId":"192.168.10.116#9005#DEFAULT#spring-cloud-nacos-producer","healthy":"true","weight":"1.0"},"uri":"http://192.168.10.116:9005","scheme":null,"instanceId":null}]
測試請求的url
http://localhost:9006/callSayHello?name=9006
消費的結果
hello ---> 9006 port -->9005
到這裡Nacos作為註冊中心來註冊服務和發現服務的流程就已經完成。這只是個簡單入門,深入學習請關照nacos官方資訊。
原始碼地址
https://download.csdn.net/download/u010046908/10877868