阿里巴巴在2018年7月份發(fā)布Nacos, Nacos是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)供常、配置管理和服務(wù)管理平臺(tái)。Nacos 支持幾乎所有主流類型的服務(wù)的發(fā)現(xiàn)鸡捐、配置和管理:
- Kubernetes Service
- gRPC & Dubbo RPC Service
- Spring Cloud RESTful Service
Nacos有哪些功能栈暇?
- 服務(wù)發(fā)現(xiàn)和服務(wù)健康監(jiān)測(cè)
Nacos 支持基于 DNS 和基于 RPC 的服務(wù)發(fā)現(xiàn)。服務(wù)提供者使用 原生SDK箍镜、OpenAPI源祈、或一個(gè)獨(dú)立的Agent TODO注冊(cè) Service 后,服務(wù)消費(fèi)者可以使用DNS TODO 或HTTP&API TODO查找和發(fā)現(xiàn)服務(wù)色迂。
Nacos 提供實(shí)時(shí)健康檢查香缺,阻止服務(wù)向不健康的主機(jī)或服務(wù)實(shí)例發(fā)送請(qǐng)求。Nacos 支持傳輸層(PING 或 TCP)和應(yīng)用層(如 HTTP脚草、Redis赫悄、MySQL原献、用戶自定義)的健康檢查馏慨。 對(duì)于復(fù)雜的云環(huán)境和網(wǎng)絡(luò)拓?fù)洵h(huán)境中(如 VPC、邊緣服務(wù)等)服務(wù)的健康檢查姑隅,Nacos 提供了 agent 模式和服務(wù)端2種健康檢查模式写隶。Nacos 還提供統(tǒng)一的健康檢查儀表盤,幫助您管理服務(wù)可用性及流量讲仰。
- 動(dòng)態(tài)配置服務(wù)
動(dòng)態(tài)配置服務(wù)可以讓您以中心化慕趴、外部化和動(dòng)態(tài)化的方式管理所有環(huán)境的應(yīng)用配置和服務(wù)配置。
動(dòng)態(tài)配置消除了配置變更時(shí)重新部署應(yīng)用和服務(wù)的需要,讓配置變得更加高效和敏捷冕房。
配置中心化管理讓無(wú)狀態(tài)服務(wù)實(shí)現(xiàn)變得更簡(jiǎn)單躏啰,讓服務(wù)按需彈性擴(kuò)展變得更容易。
Nacos 提供了一個(gè) 簡(jiǎn)單易用的UI TODO 幫助您管理所有的服務(wù)和應(yīng)用的配置耙册。Nacos 還提供包括配置版本跟蹤给僵、金絲雀發(fā)布、回滾配置以及客戶進(jìn)程配置更新?tīng)顟B(tài)跟蹤在內(nèi)的一系列開(kāi)箱即用的配置管理特性详拙,幫助您更安全地管理配置變更和控制配置變更的風(fēng)險(xiǎn)帝际。
- 動(dòng)態(tài) DNS 服務(wù)
動(dòng)態(tài) DNS 服務(wù)支持權(quán)重路由,讓您更容易地實(shí)現(xiàn)中間層負(fù)載均衡饶辙、更靈活的路由策略蹲诀、流量控制以及數(shù)據(jù)中心內(nèi)網(wǎng)的簡(jiǎn)單DNS解析服務(wù)。動(dòng)態(tài)DNS服務(wù)還能讓您更容易地實(shí)現(xiàn)以DNS協(xié)議為基礎(chǔ)的服務(wù)發(fā)現(xiàn)弃揽,以消除耦合到廠商私有服務(wù)發(fā)現(xiàn)API上的風(fēng)險(xiǎn)脯爪。
Nacos 提供了一些簡(jiǎn)單的 DNS APIs TODO 幫助您管理服務(wù)的關(guān)聯(lián)域名和可用的 IP:PORT 列表.
- 服務(wù)及其元數(shù)據(jù)管理
Nacos 能讓您從微服務(wù)平臺(tái)建設(shè)的視角管理數(shù)據(jù)中心的所有服務(wù)及元數(shù)據(jù),包括管理服務(wù)的描述蹋宦、生命周期披粟、服務(wù)的靜態(tài)依賴分析、服務(wù)的健康狀態(tài)冷冗、服務(wù)的流量管理守屉、路由及安全策略、服務(wù)的 SLA 以及最首要的 Metrics 統(tǒng)計(jì)數(shù)據(jù)蒿辙。
Nacos安裝
前往 https://github.com/alibaba/nacos/releases 下載
unzip nacos-server-1.0.0.zip
或者
tar -xvf nacos-server-1.0.0.tar.gz
啟動(dòng)
#Linux/Unix/Mac 下
sh startup.sh -m standalone
#Windows 下
cmd startup.cmd
測(cè)試拇泛,打開(kāi) http://localhost:8848/nacos/#/login ,默認(rèn)賬號(hào)密碼都是nacos
Nacos 實(shí)現(xiàn)配置管理
1. 創(chuàng)建命名空間
2. 新建配置項(xiàng)
3. 代碼訪問(wèn)配置項(xiàng)
POM.xml
<?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>
<groupId>com.suoron</groupId>
<artifactId>SpringbootNacos</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 繼承父包 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<properties>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
<spring-cloud-alibaba.version>0.2.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos配置訪問(wèn)依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<!-- 導(dǎo)入Spring cloud相應(yīng)配置項(xiàng) -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
<!--maven的插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<!-- 鏡像名, 也可以使用${project.artifactId} -->
<repository>testspringboot</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
<!-- 配置java版本 不配置的話默認(rèn)父類配置的是1.6-->
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
bootstrap.properties
#對(duì)應(yīng)配置管理項(xiàng)Data,Id
spring.application.name=SpringBootNacos
#namespace填寫DEV對(duì)應(yīng)的ID
spring.cloud.nacos.config.namespace=cc654f1e-cce5-4b38-935d-3e95bbb712a7
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
application.yml
server:
port: 8080
tomcat:
uri-encoding: utf-8
MyApplication.java
package com.suoron.springboot.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "com.suoron.springboot")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
TestController.java
package com.suoron.springboot.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/config")
@RefreshScope //配置熱更新
public class TestController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@Value("${test:aa}")
private String test;
@RequestMapping("/get")
public boolean get() {
System.out.println(test);
return useLocalCache;
}
}
訪問(wèn)測(cè)試:
http://localhost:8080/config/get
附A: 注解的方式實(shí)現(xiàn)配置訪問(wèn)
@SpringBootApplication
@NacosPropertySource(dataId = "springcloud-nacos-hello", autoRefreshed = true)
@RestController
public class SpringcloudNacosHelloApplication {
public static void main(String[] args) {
SpringApplication.run( SpringcloudNacosHelloApplication.class, args );
}
@NacosValue(value = "${test.properties.useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
@GetMapping("/get")
public boolean get(){
return useLocalCache;
}
}
說(shuō)明:
在啟動(dòng)類思灌,加入 @NacosPropertySource 注解其中包含兩個(gè)屬性俺叭,如下:
-
dataId
:這個(gè)屬性是需要在Nacos中配置的Data Id。 -
autoRefreshed
:為true的話開(kāi)啟自動(dòng)更新泰偿。
@NacosValue
:在使用Nacos做配置中心后熄守,需要使用@NacosValue注解獲取配置,使用方式與@Value一樣耗跛,完整啟動(dòng)類代碼如下所示裕照。
附B: Nacos配置數(shù)據(jù)持久化
在添加了自定義配置后,我們打開(kāi)NACOS_PATH/data调塌,會(huì)發(fā)現(xiàn)里邊有個(gè)derby-data目錄晋南,Derby 是 Java 編寫的數(shù)據(jù)庫(kù),屬于 Apache 的一個(gè)開(kāi)源項(xiàng)目羔砾。我們的配置數(shù)據(jù)現(xiàn)在就存儲(chǔ)在這個(gè)庫(kù)中负间。