Nacos
Nacos简介
为什么叫Nacos
前四个字母分别为:Naming(服务注册) 和 Configuration(配置中心) 的前两个字母,后面的 s 是 Service
什么是Nacos
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos:Dynamic Naming and Configuration Server
Nacos就是注册中心 + 配置中心的组合 + 服务总线
等价于:Nacos = Eureka + Config + Bus
能干嘛
替代Eureka做服务注册中心
替代Config做服务配置中心
替代Bus做服务配置中心
下载
官网:https://github.com/alibaba/nacos
nacos文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
比较
Nacos在阿里巴巴内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验
安装并运行
本地需要 java8 + Maven环境
下载:https://github.com/alibaba/nacos/releases/tag/1.1.4
github经常抽风,可以使用:https://blog.csdn.net/buyaopa/article/details/104582141
解压后:运行bin目录下的:startup.cmd
访问http://localhost:8848/nacos结果页面
Nacos作为服务注册中心
服务提供者注册Nacos
1.New Module: cloudalibaba-provider-payment9001
2.pom
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--boot: web actuator-->
<!--通用配置-->
3.yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
4.启动类
5.业务类
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry, serverPort:" + serverPort +"\t id:" + id;
}
}
6.启动
nacos-payment-provider已经成功注册了
这个时候 nacos服务注册中心 + 服务提供者 9001 都OK了
7. New Module: cloudalibaba-provider-payment9002
除了传统的新建模块之外,通过IDEA的拷贝映射,也可以实现
端口映射
通过IDEA的拷贝映射,可以实现,以9003为例
添加-DServer.port=9003
最后能够看到两个实例
服务消费者注册到Nacos
Nacos天生集成了Ribbon,因此它就具备负载均衡的能力
1.New Module: cloudalibaba-consumer-nacos-order83
2.pom
同9001
3.yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置Nacos地址
# 消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
4.启动类
cloudalibaba-consumer-nacos-order83.java
同9001
5.配置类
package com.indi.springcloud.config;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
5.业务类
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry, serverPort:" + serverPort +"\t id:" + id;
}
}
6.启动
测试
启动9001、9002、83
测试地址:http://localhost:83/consumer/payment/nacos/13
只需要配置了nacos,就能轻松实现负载均衡
服务中心对比
之前我们提到的注册中心对比图
但是其实Nacos不仅支持AP,而且还支持CP,它的支持模式是可以切换的,我们首先看看Spring Cloud Alibaba的全景图,
Nacos和CAP
CAP:分别是一致性,可用性,分区容错性
我们从下图能够看到,nacos不仅能够和Dubbo整合,还能和K8s,也就是偏运维的方向
Nacos支持AP和CP切换
C是指所有的节点同一时间看到的数据是一致的,而A的定义是所有的请求都会收到响应
何时选择何种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud 和 Dubbo服务,都是适合AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
切换模式命令:curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
Nacos作为服务配置中心演示
我们将我们的配置写入Nacos,然后以Spring Cloud Config的方式获取配置
Nacos作为配置中心 - 基础配置
1.New Module: cloudalibaba-config-nacos-client3377
2.pom
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<!--boot: web actuator-->
<!--通用配置-->
3.yml
bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 服务注册中心地址
config:
server-addr: localhost:8848 # 配置中心地址
file-extension: yaml # 指定配置文件的格式
application.yml
spring:
profiles:
# active: test # 测试环境
active: dev # 开发环境
为什么要配置两个yml
Nacos同Spring Cloud Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常运行。
SpringBoot中配置文件的加载是存在优先级顺序的:bootstrap 优先级高于 application
4.main
NacosConfigClientMain3377.java
同9001
5.controller
package com.indi.springcloud.alibaba.controller;
@RefreshScope // Spring Cloud的原生注解实现自动更新配置
@RestController
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
6.在Nacos中添加配置信息
Nacos中Data Id
的组成格式与Spring Cloud中的配置是有关联的
组合起来就是nacos-config-client-dev.yaml
,我们在Nacos中添加配置时直接使用即可
# 配置内容
config:
info: "from nacos config center, nacos-config-client-dev.yaml, version=1"
7.测试
第一次读取配置,成功!
8.自带动态刷新
运行状态下修改Nacos中的yaml配置文件,将version改为2,保存之后,再次测试,发现已经生效了!
Nacos作为配置中心 - 分类配置
从上面的配置中心 + 动态刷新 , 就相当于 有了 Spring Cloud Config + Spring Cloud Bus的功能
作为后起之秀的Nacos,还具备分类配置的功能
问题
用于解决多环境多项目管理
在实际开发中,通常一个系统会准备
- dev:开发环境
- test:测试环境
- prod:生产环境
如何保证指定环境启动时,服务能正确读取到Nacos上相应环境的配置文件呢?
同时,一个大型分布式微服务系统会有很多微服务子项目,每个微服务子项目又都会有相应的开发环境,测试环境,预发环境,正式环境,那怎么对这些微服务配置进行管理呢?
Nacos图形化界面
配置管理:
命名空间:
Namespace + Group + DataID 三者关系
这种分类的设计思想,就类似于java里面的包名和类名,最外层的namespace是可以用于区分部署环境的,Group 和 DataID逻辑上区分两个目标对象
默认情况:
Namespace=public
,Group=DEFAULT_GROUP
,Cluster=DEFAULT
Nacos默认的Namespace(命名空间)是public,Namespace主要用来实现隔离
- 比如说我们现在有三个环境:开发,测试,生产环境,我们就可以建立三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP
- Group可以把不同微服务划分到同一个分组里面去
Service就是微服务,一个Service可以包含多个Cluster(集群)
- Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
- 比如说为了容灾,将Service微服务分别部署在了杭州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称,还可以尽量让同一个机房的微服务相互调用,以提升性能,最后Instance,就是微服务的实例。
三种方案加载配置
DataID方案
-
指定spring.profile.active 和 配置文件的DataID来使不同环境下读取不同的配置
-
默认空间 + 默认分组 + 新建dev 和 test两个DataID
-
Group方案
创建两个配置,添加分组信息,我们将这两个配置设置成Data ID
相同,Group
不同
再配置好yml
就可以获取指定分组下的配置文件了
Namespace方案
首先我们需要新建一个命名空间
新建完成后,能够看到命名空间ID
创建完成后,我们会在配置列表、服务列表中都能看到刚创建的几个命名空间
然后我们选择一个命名空间,在其下面创建几个配置
最后创建了三个不同组,但是名称一样的配置
通过修改yml的属性,即可获取不同配置
最后通过 namespace + group + DataID 形成了三级分类
Nacos集群和持久化配置
官网说明
用于部署生产中的集群模式
Nacos默认使用嵌入式数据库derby实现数据的存储,所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储,因此我们需要完成从derby到mysql切换。
Nacos支持三种部署模式
- 单机模式:用于测试和单机使用
- 集群模式:用于生产环境,确保高可用
- 多集群模式:用于多数据中心场景
单机模式支持mysql
在0.7版本之前,在单机模式下nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作流程如下:官网地址
-
安装mysql数据库,版本要求:5.6.5 +
-
初始化数据库,数据库初始化文件在
nacos\conf\nacos-mysql.sql
,执行之前加上建库的语句create database nacos_config; use nacos_config; # 再加上sql文件里的内容
-
修改conf\application.properties文件,末尾增加mysql数据源配置,添加mysql数据源的url,用户名和密码
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456
-
再次以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql中,可以看到是一个全新的空记录页面,这就说明成功了!
Linux版Nacos + Mysql生产环境配置
配置
预计需要:1个Nginx + 3个nacos注册中心 + 1个mysql
服务器收到请求之后,先由nginx进行处理
如果是虚拟机的话,建议先把内存设置成4G,否则到时候启动不了3个nacos服务
1.下载Linux版本Nacos
https://github.com/alibaba/nacos/releases/download/1.1.4/
选择nacos-server-1.1.4.tar.gz
2.安装Nacos
可以使用xftp将文件从windows拷到linux下
# 1) 解压
tar -xvf nacos-server-1.1.4.tar.gz
# 2) 拷贝到其它目录
cp -r nacos /usr/local/
3.Nacos切换数据库
-
首先找到SQL脚本
-
进入mysql环境,分开运行以下命令
# 1.创建数据库 create database nacos_config; # 2.切换到nacos_config数据库 use nacos_config; # 3.执行SQL文件 source /usr/local/nacos/conf/nacos-mysql.sql
能查出表来就说明数据库初始化成功了
-
修改
application.properties
# 先进入conf目录下 cd /usr/local/nacos/conf # 修改之前可以先备份一下 cp application.properties application.properties.init # 开始修改 vim application.properties
直接跳转到最后一行添加,配置内容跟windows的一样,直接用我上面配置的即可(数据库信息根据个人配置进行修改)
4.集群配置cluster.conf
梳理出3台nacos机器的不同服务端口号,这里使用:3333、4444、5555
# 先进入conf目录下,我就不写了
# 还是最好先备份一下
cp cluster.conf.example cluster.conf
# 我们修改cluster.conf
vim cluster.conf
内容,这个IP不能写127.0.0.1,必须是Linux命令hostname -i
能够识别的IP
192.168.2.190:3333
192.168.2.190:4444
192.168.2.190:5555
5.添加多个端口的启动配置
# 先进入bin目录下
cd /usr/local/nacos/bin
# 备份
cp startup.sh startup.sh.bk
# 修改
vim startup.sh
修改完成后,就能够使用下列命令启动集群了,建议等待Nginx配置完成之后一起启动
# 启动
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
# 关闭
./shutdown.sh -p 3333
./shutdown.sh -p 4444
./shutdown.sh -p 5555
6.Nginx配置
# 先进入/nginx/conf的配置目录
cd /usr/local/nginx/conf
# 配置完成之后,启动nginx
./nginx -c /usr/local/nginx/conf/nginx.conf
# 查看nginx命令是否启动
ps -ef|grep nginx
7.测试
- 启动nacos
- 访问:https://写你自己虚拟机的ip:1111/nacos/
- 新建配置测试
- 新建成功!
- 数据库中也可查到,这就意味着全部配置成功了!
- 微服务cloudalibaba-provider-payment9002注册进nacos集群
查看服务列表,发现已经注册进去了,成功!
总结
Nginx + 3个Nacos + mysql的集群化配置