關于Nacos
Nacos是阿里巴巴最新開源的項目怔匣,核心定位是“一個更易于幫助構建云原生應用的動態(tài)服務發(fā)現(xiàn)、配置和服務管理平臺”
為什么叫Nacos
前四個字母分別為Naming和Configuration的前兩個字母苔严,最后的s為Service定枷。
Nacos能做什么
Nacos核心提供兩個功能:服務注冊與發(fā)現(xiàn)孤澎,動態(tài)配置管理。
-
服務注冊與發(fā)現(xiàn)
? Nacos提供基于DNS和基于RPC的服務發(fā)現(xiàn)欠窒,即能被用來支持https/http的服務注冊與發(fā)現(xiàn)覆旭,也支持RPC如dubbo的服務注冊與發(fā)現(xiàn)。
? 與Dubbo使用的zookeeper相比而言岖妄,兩者差異還是比較大的型将,zookeeper是一種分布式的協(xié)調服務,它天生是作為分布式數(shù)據(jù)一致性場景下的解決方案荐虐,所以zookeeper是CP的七兜,它犧牲了可用性來保證一致性,在極端情況下(master選舉期間)服務會對外停止福扬,對于服務可用性要求比較高的系統(tǒng)是難以接受的腕铸。Nacos是一種去中心化的架構,屬于CAP理論里的AP架構铛碑,支持最終一致性狠裹,在分布式服務發(fā)現(xiàn)與注冊場景下具有很不錯的性能。目前dubbo官方也支持使用Nacos代替zookeeper汽烦。
-
動態(tài)配置服務
與SpringCloud config 和 SpringCloud Bus類似涛菠,Nacos的動態(tài)配置服務更加靈活與簡便,不需要重啟服務可以做到配置實時生效,非常適合“配置優(yōu)先”的服務開發(fā)俗冻。
Nacos就是注冊中心+配置中心的組合
Nacos 生態(tài)
Nacos 無縫支持一些主流的開源生態(tài)礁叔,如下圖:
使用 Nacos 簡化服務發(fā)現(xiàn)、配置管理言疗、服務治理及管理的解決方案晴圾,讓微服務的發(fā)現(xiàn)、管理噪奄、共享死姚、組合更加容易,它能很方便的和SpringCloud勤篮、K8S都毒、Dubbo、gRPC碰缔、lstio一起使用账劲。
安裝Nacos
官方地址
安裝方法
Nacos 支持三種部署模式:單機模式、集群模式和多集群模式金抡,Nacos默認將數(shù)據(jù)存儲在自帶的嵌入式數(shù)據(jù)庫
derby
里面瀑焦,支持mysql
數(shù)據(jù)庫,如果部署集群的話必須要使用mysql
來保存數(shù)據(jù)梗肝,以保證統(tǒng)一的數(shù)據(jù)源榛瓮。因為主要為了測試Nacos的注冊中心和配置中心的功能,我這邊部署單機模式并使用derby數(shù)據(jù)庫巫击。
前提環(huán)境
Nacos 依賴 Java 環(huán)境來運行禀晓。如果您是從代碼開始構建并運行Nacos,還需要為此配置 Maven環(huán)境坝锰,請確保是在以下版本環(huán)境中安裝使用:
- 64 bit OS粹懒,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac顷级。
- 64 bit JDK 1.8+凫乖;下載 & 配置。
- Maven 3.2.x+弓颈;下載 & 配置帽芽。
方式一 源碼安裝
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
方式二 發(fā)行包安裝
官方倉庫提供了發(fā)行包下載,可以從 版本庫中下載nacos-server-$version.zip
/nacos-server-$version.tar.gz
包恨豁,解壓后嚣镜,在包目錄下的bin文件夾中有可執(zhí)行腳本運行即可。
方式三 Docker安裝
除了以上兩種方式安裝docker以外橘蜜,還可以使用docker的方式安裝
docker run -tid --env MODE=standalone --name nacos -p 8848:8848 nacos/nacos-server
MODE
是指定運行模式菊匿,有cluster模式/standalone模式
安裝完成之后付呕,訪問http://localhost:8848/nacos/index.html即可打開nacos的web管理界面
Nacos作為注冊中心
根項目配置
使用SpringCloud alibaba 需要在
dependencyManagement
中添加相應配置,因為我這里是多模塊開發(fā)跌捆,所以將dependencyManagement
添加到根pom文件中徽职。
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringCloud Alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
服務生產者
依賴
...
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</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-actuator</artifactId>
</dependency>
...
配置文件
我們將項目端口配置為
9001
,并配置nacos注冊中心地址佩厚,以及暴露端點姆钉。
server:
port: 9001
spring:
application:
name: nacos-provide-userinfo
cloud:
# nacos 配置
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 配置nacos地址
#暴露端點
management:
endpoints:
web:
exposure:
include: '*'
測試接口
@RestController
public class EchoController {
@Value("${server.port}")
String serverPort;
@GetMapping("/echo")
public String echo(){
return "Hello serverPort : "+serverPort+" uuid :"+ UUID.randomUUID().toString();
}
}
啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProvideUserInfo9001 {
public static void main(String[] args) {
SpringApplication.run(NacosProvideUserInfo9001.class,args);
}
}
啟動后,再次打開nacos管理界面中
服務管理
下的服務列表
我們已經可以看到服務已經注冊成功了抄瓦。我們以上面這個服務為模板潮瓶,再建立一個端口為9002
的服務
服務消費者
依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</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-actuator</artifactId>
</dependency>
配置文件
server:
port: 9091
spring:
application:
name: nacos-consume-useradmin
cloud:
# nacos 配置
nacos:
discovery:
server-addr: 127.0.0.1:8848
RestTemplate注入
Nacos集成了Ribbon,RestTemplate需要添加
@LoadBalanced
開啟負載均衡功能钙姊。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced // 沒有加這個的話沒有辦法使用服務名來調用接口
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
測試接口
@RestController
@RequestMapping("/consume")
public class UserAdminController {
@Resource
RestTemplate restTemplate;
String URL_PREFIX = "http://nacos-provide-userinfo";
@GetMapping("/echo")
public String getUser(){
return restTemplate.getForObject(URL_PREFIX+"/echo", String.class);
}
}
啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumeUserAdmin9091 {
public static void main(String[] args) {
SpringApplication.run(NacosConsumeUserAdmin9091.class,args);
}
}
啟動后查看管理界面毯辅,可以看到消費者服務也已經注冊進入的注冊中心了。
請求消費者
/consume/echo
的時候煞额,消費者會去調用生產者的服務思恐,因為nacos集成了ribbon
,所以自帶負載均衡功能膊毁,會根據(jù)一定算法來選擇注冊中心上的服務實例胀莹。
作為配置中心
依賴
<!-- nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- nacos server -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</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-actuator</artifactId>
</dependency>
配置文件
注意,這里是創(chuàng)建
bootstrap.yml
,這個配置?件的作?是,先到配置中?加載配置,然后加載到application.yml
中婚温。
application.yml
是用戶級的資源配置項描焰。
bootstrap.yml
是系統(tǒng)級的,優(yōu)先級比application.yml
更高缭召。
-
Bootstrap.yml
server: port: 99 spring: application: name: nacos-config-client # 這個名稱涉及到遠程配置文件的名稱 cloud: # nacos 配置 nacos: discovery: server-addr: 127.0.0.1:8848 #注冊中心地址 config: server-addr: 127.0.0.1:8848 # nacos 作為配置中心地址 file-extension: yaml # 指定配置文件的格式
-
Application.yml
spring: profiles: active: dev # 表示開發(fā)環(huán)境
測試接口
@RestController
@RefreshScope
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return configInfo;
}
}
啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClient99 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClient99.class,args);
}
}
管理平臺配置
新建配置文件
打開Nacos管理界面栈顷,選擇 配置管理
-->配置列表
逆日,點擊列表右上角的 ?
的圖標
nacos規(guī)定了Data ID的設定規(guī)則嵌巷,讓服務能更加方便的去尋找自己的配置,默認的Data ID的規(guī)則是:
${prefix}-${spring.profile.active}.${file-extension}
- prefix
默認就是當前服務的服務名稱(spring.application.name)
也可以通過spring.cloud.necos.config.prefix
配置- spring.profile.active
就是我們在application.yml中指定的,當前是開發(fā)環(huán)境還是測試等環(huán)境
這個可以不配置,如果不配置,那么前?的 - 也會沒有- file-extension
就是當前?件的格式(后綴),?前只?持yml和propertie
上面我們配置的應用名稱是nacos-config-client
,環(huán)境配置的是dev
,文件格式是 yaml,所以Data ID是nacos-config-client-dev.yaml
室抽,注意是yaml
搪哪,而不是yml
。
添加完成之后我們可以看到配置文件已經創(chuàng)建成功了坪圾。
配置完成后晓折,我們啟動服務,服務如果啟動成功說明配置正確了兽泄,測試下:
? ~ curl http://localhost:99/getConfigInfo
Here is dev,version=1.0% ? ~
修改配置
我們測試下更新配置文件是否會馬上生效漓概,所以我們修改配置文件
配置文件可以查看 歷史版本 ,每次修改也會給出對比圖病梢。
不要重啟nacos-config-client 服務胃珍,再次測試接口
? ~ curl http://localhost:99/getConfigInfo
Here is dev,version=2.0% ? ~
我們發(fā)現(xiàn)更新配置無需手動動態(tài)刷新配置梁肿,相比較起springcloud config 和 bus的配合動態(tài)刷新來說,nacos更加的靈活觅彰、方便吩蔑。
數(shù)據(jù)隔離
Nacos作為配置中心的時候,我們看到了可以感覺服務的環(huán)境來選擇不同的配置文件填抬,在Nacos的設計中烛芬,我們也可以通過Namespace、Group來做數(shù)據(jù)的隔離飒责,這里不做贅述赘娄,總之,在微服務這些框架里面宏蛉,Nacos絕對是非常好用的擅憔。