Nacos简介
Nacos(Dynamic Naming and Configuration Service)一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。
替代Eureka做服务注册中心
替代Config做服务配置中心
下载:https://github.com/alibaba/nacos/releases
官方文档
Nacos支持三种部署模式
- 单机模式 - 用于测试和单机试用。
- 集群模式 - 用于生产环境,确保高可用。
- 多集群模式 - 用于多数据中心场景。
注册中心对比
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | — | CP |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | — | Keep Alive |
负载均衡策略 | 权重/metadata/Selector | Ribbon | Fabio | RoundRobin | — |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8S集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
Nacos服务端
nacos下载
地址:https://github.com/alibaba/nacos/releases
nacos单机
1、环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit JDK 1.8+
- Maven 3.2.x+
2、下载源码或者安装包
# 下载稳定版
wget https://github.com/alibaba/nacos/releases/download/1.3.0/nacos-server-1.3.0.tar.gz
3、解压到指定目录
tar -xvf nacos-server-1.3.0.tar -C /root/deploy/
4、启动服务器
cd /root/deploy/nacos/bin
# 启动命令(standalone代表着单机模式运行,非集群模式)
sh startup.sh -m standalone
注意防火墙开放8848端口
# 查看已经开放的端口
firewall-cmd --list-ports
# 开启端口
firewall-cmd --zone=public --add-port=8848/tcp --permanent
# 重启防火墙
firewall-cmd --reload
运行成功后直接访问http://localhost:8848/nacos
账号:nacos
密码:nacos
5、关闭服务器
cd /root/deploy/nacos/bin
sh shutdown.sh
6、持久化配置
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力。
1、创建数据库
创建数据库:nacos_config
字符集: utf-8
排序规则: utf8_general_ci
2、初始化数据库
在nacos/conf目录下有个nacos-mysql.sql文件,将sql导入mysql中
3、修改配置文件
修改nacos/conf/application.properties配置文件,添加数据源mysql数据源配置(目前只支持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&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=nacos
db.password=nacos
4、配置mysql8.0数据库
1、在nacos目录下新建目录plugins/mysql
mkdir -p plugins/mysql
2、放入mysql8.0的驱动包,启动nacos
Nacos集群
默认Nacos使用嵌入式数据库derby实现数据存储,如果启动多个默认配置下的Nacos节点,数据存储存在一致性问题。为了解决这个问题,nacos采用集中式存储的方式支持集群化部署,目前只支持Mysql存储。
官方文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
官方架构图
1. 预备环境准备
- 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
- 64 bit JDK 1.8+。
- Maven 3.2.x+。
- 3个或3个以上Nacos节点才能构成集群。
2. 下载源码或者安装包
# 下载稳定版
wget https://github.com/alibaba/nacos/releases/download/1.3.0/nacos-server-1.3.0.tar.gz
tar -xvf nacos-server-1.3.0.tar.gz
cd nacos/bin
3. 配置集群配置文件
在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)
# ip:port
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848
4. 确定数据源
- 初始化 MySQL 数据库
在nacos/conf目录下有个nacos-mysql.sql文件,将sql导入mysql中
- 修改配置
修改nacos/conf/application.properties配置文件,添加数据源mysql数据源配置(目前只支持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&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=nacos
db.password=nacos
- 配置Nginx:
http {
upstream cluster {
server 200.8.9.16:8848;
server 200.8.9.17:8848;
server 200.8.9.18:8848;
}
server {
listen 80;
location / {
proxy_pass http://cluster;
}
}
}
- 启动Nacos:
sh startup.sh
-
启动nginx
-
测试
访问192.168.159.121:1111
如果可以进入nacos的web界面,就证明安装成功了
Nacos客户端
Nacos作为注册中心
- pom中添加依赖
<!-- spring cloud Alibaba 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- yaml中添加配置
spring:
cloud:
nacos:
discovery:
#nacos服务中心地址
server-addr: 192.168.0.103:8848
- 添加注解
在启动类上添加@EnableDiscoveryClient
注解,注册到Nacos中心。
在springcloud E版本的时候,对服务注册进行了优化,在依赖了spring-cloud-starter-alibaba-nacos-discovery之后,不用添加@EnableDiscoveryClient
注解,默认会将服务注册到注册中心。
- 查看服务
启动应用,打开nacos控制台,我们可以在服务列表中发现我们的服务。
- 服务的端点检查
spring-cloud-starter-alibaba-nacos-discovery 在实现的时候提供了一个 EndPoint, EndPoint 的访问地址为 http://ip:port/actuator/nacos-discovery。 EndPoint 的信息主要提供了两类:
1、subscribe: 显示了当前有哪些服务订阅者
2、NacosDiscoveryProperties: 显示了当前服务实例关于 Nacos 的基础配置
通过浏览器访问 http://localhost:8080/actuator/nacos-discovery 结果如下:
Nacos作为配置中心
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后才能保证项目的正常启动。
服务端配置
客户端读取按照命名规则的配置文件。
- Data Id的配置规则
${prefix}.${file-extension}
${prefix}-${spring.profiles.active}.${file-extension}
prefix 默认当前服务的服务名称
spring.profiles.active 环境配置
file-extension 就是当前文件的格式(后缀),目前只支持yaml和properties
- nacos配置和springboot配置对应关系
- NameSpace、Group、Data Id三者关系
类似包、类、方法之间的关系
Nacos默认命名空间是public,Namespace主要用来实现隔离
Group默认是DEFAULT_GROUP,Group可以将不同的配置进行分组。
Service就是微服务,一个service可以包含多个Cluster(集群),nacos默认Cluster是DEFAULT,cluster是对指定的微服务的一个虚拟划分。比方说为了容灾,将服务分别部署在广州机房和成都机房。这时广州机房所有的服务是一个集群,成都机房所有的服务是一个集群。
客户端配置
Spring Boot 配置文件的加载顺序,依次为 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml ,其中 bootstrap.properties 配置为最高优先级。
- pom中添加依赖
<!-- spring cloud Alibaba 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- yml中添加配置
将配置文件的名字改为bootstrap.yml,指定配置中心的地址
spring:
cloud:
nacos:
config:
#nacos配置中心地址
server-addr: 192.168.0.103:8848
#指定配置文件的格式为yaml
file-extension: yaml
#指定命名空间
namespace: fbf8c164-4646-454a-b58b-3131b939fbcc
#指定分组
group: DEV_GROUP
profiles:
active: dev
- 配置的动态更新
默认开启了动态更新,配置
spring.cloud.nacos.config.enabled = false来关闭动态刷新。
测试:
@RestController
public class TestController {
@Autowired
private ConfigurableApplicationContext applicationContext;
/**
* 配置的动态更新测试
* @return
*/
@GetMapping(value = "/test")
public String test() {
return "port:" +applicationContext.getEnvironment().getProperty("server.port");
}
}
打开浏览器,访问http://localhost:8080/test,可观察修改值前后的变化