Nacos
Nacos 是阿里的一个开源产品,针对微服务架构中的 服务发现
,配置管理
,服务治理
的综合性解决方案;
Nacos的四大特性:
- 服务发现与服务健康检查
- 动态配置管理
- 动态DNS服务
- 服务和元数据管理
1. Nacos 安装
Nacos 依赖 Java 环境运行,并且需要配置 Maven环境;
64bit JDK 1.8+
Maven 3.2.x+
step1:
安装Nacos
Nacos 安装的两种方式
- 通过源码安装
- 下载编译后压缩包方式
step2:
启动Nacos(Nacos默认端口为8848,启动成功后,通过 http://127.0.0.1:8848/nacos 可以成功查看到Nacos控制台页面;)默认用户名:nacos,默认密码:nacos;
1.1 Nacos 外部Mysql数据库支持
单机模式时,nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,需要进行以下步骤:
step1
:准备好mysql数据库,版本要求 5.6.5+,mysql 8以下;
step2
:新建数据库nacos_config,数据库初始化文件:${nacoshome}/conf/nacos-mysql.sql
(nacos安装路径下的conf
文件夹的nacos-mysql.sql
文件)
step3
:修改${nacoshome}/conf/application.properties
文件,添加mysql数据源的url、用户名和密码;
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncodeing=utf8connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
step4
:重启nacos;
2. Nacos 配置管理
配置管理页面:
2.1 一个简单的Java程序获取Nacos配置信息
step1:
引入nacos-client
的pom依赖
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
step2:
通过代码获取配置信息
public static void main(String[] args) throws NacosException {
//nacos地址
String serverAddr = "127.0.0.1:8848";
//DataId
String dataId = "nacos-simple-demo.yaml";
//Group
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put("serverAddr",serverAddr);
//当properties不指定namespace属性的值时,默认取nacos的public空间下的配置;
//properties.put("namespace属","namespaceId的值");
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置;
String content = configService.getConfig(dataId,group,5000);
System.out.println(content);
}
2.2 Nacos 配置管理模型
对于Nacos配置管理,通过Namespace、group、Data Id能够定位到一个具体的配置集
配置文件 == 配置集(Data Id);
配置项:配置集中包含的一个个配置内容就是配置项;通常以key=value的形式存在;
命名空间(Namespace):进行不同环境的配置隔离;(开发环境,测试环境,生成环境)
2.3 Nacos配置管理应用于分布式系统
step1:
创建一个微服务,引入pom依赖;
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
step2
:编写配置文件 bootstrap.yml
server:
port: 8888 启动端口
spring:
application:
name: wddongService
cloud:
nacos:
server-addr: 127.0.0.1:8848 #配置中心的地址
file-extension: yaml # dataid 的名称就是 application的name加file-extension;==》wddongService.yaml
namespace: c87d879c78-XXXXXXXXXX-c-0908dsdfsdf # 命名空间的Id
group: DEFAULT_GROUP # 默认组
step3
:通过@Value
等注解,就可以获取nacos配置文件中相关的配置了;
@Value("${common.name}")
private String name;
step4
:通过验证我们可以发现使用@Value
注解不能动态的获取nacos配置文件中最新的配置消息,在这种情况下,我们需要通过注入ConfigurableApplicationContext
来动态的获取最新的配置信息(配置的动态更新)
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping("/getConfig")
public String test(){
return applicationContext.getEnvironment().getProperty("common.name");
}
step5
:另外我们可以通过配置来关闭nacos的动态更新;
spring.cloud.nacos.config.refresh.enable=false
2.4 自定义扩展data Id 配置文件
我们知道,我们的项目中通常会不止只有一个配置文件,当有多个配置文件的情况下,我们该如何引用呢?
method1
:
server:
port: 8888 启动端口
spring:
application:
name: wddongService
cloud:
nacos:
server-addr: 127.0.0.1:8848 #配置中心的地址
file-extension: yaml # dataid 的名称就是 application的name加file-extension;==》wddongService.yaml
namespace: c87d879c78-XXXXXXXXXX-c-0908dsdfsdf # 命名空间的Id
group: DEFAULT_GROUP # 默认组
# 1. DataId 在默认组 DEFAULT_GROUP,不支持动态刷新
ext-config[0]:
data-id: ext-config-01.yml
# 2. DataId 不在默认组 DEFAULT_GROUP,不支持动态刷新
ext-config[1]:
data-id: ext-config-02.yml
group: GLOBALE_GROUP
# 3. DataId 不在默认组 DEFAULT_GROUP,支持动态刷新
ext-config[2]:
data-id: ext-config-03.yml
group: REFRESH_GROUP
refresh: true
method2
:
server:
port: 8888 启动端口
spring:
application:
name: wddongService
cloud:
nacos:
server-addr: 127.0.0.1:8848 #配置中心的地址
file-extension: yaml # dataid 的名称就是 application的name加file-extension;==》wddongService.yaml
namespace: c87d879c78-XXXXXXXXXX-c-0908dsdfsdf # 命名空间的Id
group: TEST_GROUP # 默认组
shared-dataids: ext-config-01.yml,ext-config-02.yml,ext-config-03.yml
refreshable-detaids: ext-config-01.yml # 支持动态刷新的配置文件
# 通过 shared-dataids这种方式引入的多配置文件,没有 method1 方式好。这种方式只有 配置文件在 DEFAUL_GROUP组下才会生效;
2.5 多配置文件的加载顺序
ext-config[0] > ext-config[1] > ext-config[2] > file-extension;
当 ext-config[0] 和 ext-config[2] 中都配置有一个name 属性;ext-config[0].name = ‘张三’,ext-config[2].name = ‘李四’; ext-config[0] 会先被加载,ext-config[2] 的name 属性会覆盖掉之前的,所以程序最终读取到的 name 属性为 李四;(而不是张三)
3. Nacos 集群部署
step1
:准备好多台nacos客户端;
step2
:配置集群配置文件;(nacos目录下,有文件 cluster.conf.example
,将其命名为 cluster.conf
,并将每行配置成 ip:port
)
# ip:port
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
step3
:修改nacos的conf
目录下 application.properties 中的ip地址(单台服务器不需修改,多服务器多ip需要修改)
nacos.inetutils.ip-address=127.0.0.1
step4
:nacos 启动时,采用集群的方式启动
startup -m cluster
step5
:微服务配置集群
spring:
application:
name: wddongService
cloud:
nacos:
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 #配置中心的地址
step6
:nacos 集群部署成功之后,通过页面可以观察到集群的情况;
4. 服务治理
4.1 服务治理应用于分布式系统
一个微服务项目,如何被nacos管理
step1:
引入相关依赖;
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
step2:
编写nacos相关的配置
spring:
application:
name: quickstart-provider
cloud:
nacos:
discovery: # 服务发现
server-addr: nacosIp:nacosPort #配置nacosIp和nacosPort
step3:
启动类上添加服务发现注解
@EnableDiscoveryClient
step4:
启动服务后,在nacos控制台即可看到成功被治理的微服务;
step5
:可以看到我们通过以上配置的方式,发布的服务是在 public
命名空间下的。当我们想切换到其他的命名空间,只需要通过修改配置文件即可;
spring:
application:
name: quickstart-provider
cloud:
nacos:
discovery: # 服务发现
server-addr: nacosIp:nacosPort #配置nacosIp和nacosPort
namespace: 'namespaceId' #配置命名空间的Id
cluster-name: '集群的名称(自定义)'
4.2 服务管理的基本功能
可以调整集群中服务的权重,和方便快捷的控制服务上下线;