在微服務架構中,服務注冊中心是一個舉足輕重的組件,它實作的目標是便捷于多服務之間的通信,服務的橫向擴展等,它能提供的服務有服務的注冊與發現、中心化配置、健康檢查和服務移除,市面上存在很多組件,包括
Consul、Zookeeper、Nacos、Eureka等等,這些組件具體的差異內容比較豐富,我們單獨開一篇文章講,這篇文章我們講一下在國內比較火的Nacos的快速入門,文章內容會涉及到Nacos的基礎知識、環境搭建、基于Springboot2工程實踐,
一、Nacos核心概念
Nacos技術團隊在在線檔案上已經介紹的很詳細的啦,見Nacos檔案,核心的要義如下,
Nacos (official site: nacos.io) is an easy-to-use platform designed for dynamic service discovery and configuration and service management. It helps you to build cloud native applications and microservices platform easily.
--來自Github官方檔案介紹
簡單地說,它自詡為一個易于使用的平臺,核心功能為用于動態服務發現、配置和服務管理,目標是幫助開發者輕松地構建云本地應用程式和微服務平臺,
還是不夠明白,再明白的講,Nacos是阿里開源的注冊中心,其完美支持基于 DNS和基于 RPC 的服務發現,在Spring Cloud中使用Nacos,只需要預先安裝配置好Nacos server,然后只需要對原有服務進行簡單的配置就可以完成服務的注冊發現,
其核心功能包括:
- 服務發現和服務健康監測
- 動態配置服務
- 動態 DNS 服務
- 服務及其元資料管理
服務的注冊和發現是作為一個服務注冊中心的基本素養,Nacos還支持動態配置服務,動態配置服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置,動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷,配置中心化管理讓實作無狀態服務變得更簡單,讓服務按需彈性擴展變得更容易,
動態 DNS 服務支持權重路由,讓您更容易地實作中間層負載均衡、更靈活的路由策略、流量控制以及資料中心內網的簡單DNS決議服務,
作為一個開發者,對于Nacos的細節我們可能關注的重要點包含:
- 在一致性協議(CAP)上支持CP/AP
- 支持負載均衡策略
- 有雪崩保護
- 支持自動注銷示例
- 支持監聽、多資料中心、跨注冊中心同步
- 支持
Spring Cloud、Dubbo、K8s集成
二、基于docker環境環境
眾所周知,Nacos在運行程序中需要存盤資料到Mysql,所以我們必須選擇安裝Mysql,因為博主的云主機很low,1核2G,所以我們選擇安裝Mysql5.7,集成的docker-compose.yml內容如下,NACOS_VERSION變數在env檔案中控制,
version: "2"
services:
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos-standalone-mysql
env_file:
- ./env/nacos-standlone-mysql.env
volumes:
- ./standalone-logs/:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8848:8848"
- "9848:9848"
- "9555:9555"
depends_on:
- mysql
restart: on-failure
environment:
- JVM_XMS=64m
- JVM_XMX=64m
- JVM_XMN=16m
- JVM_MS=8m
- JVM_MMS=8m
- NACOS_DEBUG=n
- TOMCAT_ACCESSLOG_ENABLED=false
mysql:
container_name: mysql
image: nacos/nacos-mysql:5.7
env_file:
- ./env/mysql.env
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
因為我的服務器很low,nacos默認對JVM的堆引數的配置相當高,所以我進行了簡單優化,
- JVM_XMS=64m
- JVM_XMX=64m
- JVM_XMN=16m
- JVM_MS=8m
- JVM_MMS=8m
我都這樣去摳記憶體了,那我更不可能去配置集群模式了,我們先以單機模式上手,
另外docker-compose.yml檔案中用到了兩個檔案,分別是nacos-standlone-mysql.env和mysql.env,內容如下,
mysql.env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=nacos_devtest
MYSQL_USER=nacos
MYSQL_PASSWORD=nacos
nacos-standlone-mysql.env
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos_devtest
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
具體填寫的引數可以根據實際開發情況進行更改,啟動起來,配置云服務器的安全組,訪問{ip}:{port}/nacos,網頁出現nacos的登錄頁面,默認賬號和密碼都是nacos,登錄后會出現以下的頁面,即Nacos-Console至此環境安裝成功,

三、實踐-獲取中心配置
在使用Spring Cloud集成Nacos之前,我們先使用Spring Boot,對于Nacos的版本,我使用的是0.2.4,是一個比較新的版本,
3.1 設定配置
設定配置我們可以使用Nacos的管理控制臺,如下圖所示,我們預先添加一個useLocalCache的配置引數,

配置填寫完成后,保存,添加配置完成,
3.2 開發實踐
動態獲取配置,需要先通過maven引入專案依賴,
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.4</version>
</dependency>
因為我這個專案部署的時候要成為一個Web-server,所以引入web依賴,對于我這樣一個Demo專案,用不上Tomcat這樣比較重的Web服務容器,我采用的是更加輕量一些的Jetty,先排除Tomcat依賴,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
再引入Jetty的依賴,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<version>${spring-boot.version}</version>
</dependency>
基本的依賴設定完成,
然后添加專案的組態檔application.properties,關鍵是配置Nacos Server的服務地址,
nacos:
config:
server-addr: {nacos-server-ip}:{nacos-server-port}
spring:
application:
name: springboot2-nacos-config
然后寫一個Controller埠,通過呼叫埠/config/get服務,獲取useLocalCache在Nacos服務上最新的值,并且設定autoRefreshed(自動重繪)為true,
@Controller
@RequestMapping("config")
public class ConfigController {
@NacosValue(value = "${useLocalCache:true}", autoRefreshed = true)
private boolean useLocalCache;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
啟動Web應用,然后呼叫 Get http://{ip}:45452/config/get,回傳的值是false,與預期一致,通過配置管理中心設定值為true,重繪呼叫介面,回傳的值為true,至此簡單的獲取配置完成,
四、實踐-服務注冊發現
注冊和發現是作為一個服務注冊中心最核心的功能,注冊是服務的Provider,發現是服務的Consumer,我們通過一個示例來使用,
4.1 服務注冊
為了使用注冊中心的功能,我們必須引入相關依賴nacos-discovery-spring-boot-starter,
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.4</version>
</dependency>
接下來,我們要注冊自身服務到服務中心,然后暴露介面以供外部查詢,
@RestController
@RequestMapping("/discovery")
@Slf4j
public class NacosDiscoveryController {
@NacosInjected
private NamingService namingService;
@Value("${spring.application.name}")
private String applicationName;
@Value("${server.port}")
private Integer serverPort;
@PostConstruct
public void registerInstance() throws NacosException {
log.debug("serverPort:{}",serverPort);
#填寫的ip和port很關鍵,用于服務中心進行健康檢查,
namingService.registerInstance(applicationName,"127.0.0.1",serverPort);
}
@SneakyThrows
@GetMapping(value = "/get")
public List<Instance> get(@RequestParam String serviceName){
log.debug("Nacos Discovery into get method...{}",serviceName);
return namingService.getAllInstances(serviceName);
}
}
方法registerInstance()在spring容器初始化時執行,向注冊中心注冊本服務,因為服務非集群模式,所以不用填集群服務名,方法get()暴露HTTP Get介面,提供查詢指定服務名的所有實體,
組態檔application.properties的內容如下,關鍵是配置Nacos Server的服務地址,
nacos:
config:
server-addr: {nacos-server-ip}:{nacos-server-port}
spring:
application:
name: nacos.discovery.client
啟動專案,我們可以觀察Nacos管理控制臺,有服務注冊成功,

訪問http://{ip}:{port}/discovery/get?serviceName=nacos.discovery.client,成功獲取到注冊服務的資訊,如下所示,展示了運行的健康狀態,實體資訊等,
{
"instanceId": "221.19.226.48#8080#DEFAULT#DEFAULT_GROUP@@nacos.discovery.client",
"ip": "221.19.226.48",
"port": 8080,
"weight": 1,
"healthy": true,
"enabled": true,
"ephemeral": true,
"clusterName": "DEFAULT",
"serviceName": "DEFAULT_GROUP@@nacos.discovery.client",
"metadata": { },
"instanceHeartBeatInterval": 5000,
"instanceIdGenerator": "simple",
"ipDeleteTimeout": 30000,
"instanceHeartBeatTimeOut": 15000
}
]
4.2 服務發現
服務發現也是相當的簡單,依賴同注冊的服務保持一致,配置資訊只需改變spring.application.name,然后呼叫服務,
@SneakyThrows
@PostConstruct
public void doConsume(){
namingService.selectOneHealthyInstance("nacos.discovery.client");
final RestTemplate restTemplate = new RestTemplate();
String url = String.format("http://221.19.226.48:45451/discovery/get?serviceName=nacos.discovery.client", "221.19.226.48", 45451);
String result = restTemplate.getForObject(url, String.class);
System.out.println(String.format("請求URL:%s,回應結果:%s", url, result));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299301.html
標籤:其他
上一篇:容器學習筆記
下一篇:開發中常見的快捷鍵與快捷方式
