目录
nacos可以同时作为微服务的注册中心、配置中心。
搭建nacos-server单机版
下载地址:https://github.com/alibaba/nacos/releases
下载zip压缩包,解压。
conf/application.properties 是nacos-server项目的配置文件,可以根据需要
- 修改使用的端口(默认8848)、路径(默认nacos)
- 修改存储方式,默认使用embedded storage内置存储,可以换为mysql方式的外置存储external storage。mysql存储方式需要在mysql中新建数据库 nacos_config ,执行 conf/nacos-mysql.sql 初始化数据库。
进入bin目录,linux执行sh启动|停止,win执行cmd启动|停止。
#linux
sh startup.sh -m standalone
sh shutdown.sh
#win。关闭窗口也会终止nacos server运行。
startup.cmd -m standalone
shutdown.cmd
-m standalone是指定模式为单机模式、不集群。
访问 127.0.0.1:8848/nacos 进入控制台 ,账号、密码默认都是 nacos。
搭建nacos-server集群
阿里开源的组件,很牛逼,但通常bug较多。nacos-server集群模式目前bug较多,了解大体流程即可,慎用。
推荐使用 域名 + VIP(虚拟ip)模式的注册中心地址,可读性好、切换ip方便。
1、在每个nacos节点的conf下新建配置文件 cluster.conf
# ip:port,一行一个,配置3个或3个以上节点
192.168.1.2:8848
192.168.1.3:8848
192.168.1.4:8848
2、在mysql中新建数据库 nacos_config ,执行 conf/nacos-mysql.sql 初始化数据库
3、修改 conf/application.properties 中的数据库连接信息
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.0=root
db.password.0=abcd
超时、连接池等配置也可以根据需要进行修改。
生产环境建议数据库至少主备模式,或者采用高可用数据库。
3、分别启动各个节点
sh startup.sh
sh shutdown.sh
打印出 Nacos started successfully in cluster mode. use external storage 说明启动成功。
访问任意一个nacos server节点即可进入控制台,ip:port/nacos ,集群管理 -> 节点列表 中查看nacos-server集群节点。
4、实际项目中,建议为nacos-server绑定一个域名(域名解析 && 修改nginx配置的server_name),在nacos-client端使用域名作为nacos-server的地址,这样即使未来nacos-server需要迁移,也无需修改nacos-client端的配置。
服务添加nacos-discovery作为nacos-client
1、父项目的pom.xml统一管理springcloud、springcloud alibaba的版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
springcloud alibaba对springboot、springcloud版本有严格要求,版本对应关系参考:
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
2、服务
<!--nacos-client也内置了ribbon-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:
port: 7501
spring:
application:
name: user-server
cloud:
nacos:
discovery:
#nacos注册中心地址
server-addr: 127.0.0.1:8848
引导类加不加@EnableDiscoveryClient都行
nacos常见概念
服务发现的领域模型
- namespace:命名空间,用于隔离不同环境,默认public
- group:给服务划分分组,便于管理,默认DEFAULT_GROUP
- service:服务
- cluster:集群
- instance:服务实例(一个服务节点)
先在控制台创建namespace,再在yml中指定namespace。
一个namespace下的消费者,从注册中心获取提供者节点列表时,只能获取到相同的namespace下的提供者节点列表,即只能调用相同namespace下的提供者。开发、测试、生产环境分别使用不同的namespace,即可实现环境隔离。
控制台的节点下线只是把该节点从负载均衡节点列表中排除,该节点实际仍处于运行状态、仍是正常的。
nacos元数据
用于描述服务、配置相关信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label)。根据作用范围可划分为
- 服务级别的元信息
- 集群的元信息
- 实例的元信息
可以在直接控制台设置元数据,也可以在yml中设置,key=value的形式,不用加引号,一行一个。
元数据可以让服务调用更加灵活,eg. 可以在元数据中设置版本号 version=1.0 描述当前实例接口的版本,方便调用指定版本的接口。
权重
权重是实例级别的配置,0~1上的浮点数,权重越大,分配给该实例的流量越大,0表示不接受流量,不在负载均衡的节点列表中。
设置权重后,需要过一段时间才会生效(大概几十秒)。
健康检查
确认实例 (Instance) 是否能提供服务,对服务发起解析请求时,不健康的实例不会返回给客户端(消费者)。
健康保护阈值
为防止因过多实例不健康导致流量全部流向健康实例 ,继而造成流量压力把健康 健康实例压垮并形成雪崩效应。
健康保护阈值是0 到 1 之间的浮点数,当健康实例占总服务实例的比例小于该值时,无论实例是否健康,都会将这个实例返回给客户端。这样做虽然损失了一部分流量,但是保证了集群剩余的健康实例 能正常工作。
使用nacos统一管理配置
配置中心用于统一管理配置,快速切换各个环境的配置。
相比于springcloud config,nacos提供了可视化的控制台,操作更方便。
nacos-conf的使用
1、pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、bootstrap.yml
spring:
application:
name: user-server
profiles:
active: dev
cloud:
nacos:
#nacos可以同时作为注册中心、配置中心,但配置的key是分开的,就是说可以用注册中心、配置中心可以是不同的nacos集群,职责可单一
config:
#配置中心地址
server-addr: 127.0.0.1:8848
#配置文件拓展名,可以使用yaml、properties,默认properties
file-extension: yaml
配置读取优先级 bootstrap.yml > application.yml,需要将原来的application.yml改为bootstrap.yml作为服务的配置文件。
只需保留应用名称、使用环境、配置中心的3个配置,根据这3个配置就能在配置中心找到对应的配置文件,其余配置(包括使用的端口)都可以移到配置中心。
3、在nacos控制台新建配置
data id的完整格式
${prefix}-${spring.profiles.active}.${file-extension}
#示例:user-server-dev.yaml
- prefix可以在bootstrap.yml中用spring.cloud.nacos.config.prefix指定,缺省时默认为使用spring.application.name的值
- 未指定spring.profiles.active时,-${spring.profiles.active}为空串,data id变成 ${prefix}.${file-extension}
动态刷新配置
在nacos控制台修改服务配置后,默认需要重启服务才能获取最新的配置,使用动态刷新配置后,无需重启,配置立即下发到服务中。
@RestController
@RefreshScope //@Value注入值的类上加@RefreshScope
public class TestController {
@Value("${user.name}")
public String name; //不要使用static修饰
@GetMapping("/name")
public String name(){
return name;
}
}
说明
- nacos-server要使用mysql方式的外置存储,才支持动态刷新配置。
- @RefreshScope是springcloud的注解,不是nacos的注解,就是说其它种类的配置中心也可以使用此注解。
通用配置
同一服务、不同环境的公共配置
可以提取到 ${prefix}.${file-extension} 中,eg. user-server.yaml 。不需要在bootstrap.yml中添加额外的配置。
不同服务的公共配置
可以提取到单独的配置中,比如dev环境所有服务的注册中心配置。需要在bootstrap.yml中添加额外配置
spring:
application:
name: user-server
profiles:
active: dev
cloud:
nacos:
config.:
server-addr: 127.0.0.1:8848
file-extension: yaml
#所有服务通用的配置,List<Config>,有多个时逗号分隔
shared-configs: common1.yaml,common2.yaml
nacos config部分源码
public static class Config {
/**
* the data id of extended configuration.
*/
private String dataId;
/**
* the group of extended configuration, the default value is DEFAULT_GROUP.
*/
private String group = "DEFAULT_GROUP";
/**
* whether to support dynamic refresh, the default does not support .
*/
private boolean refresh = false;
//......
}
所以上面的配置存在一个问题:公共配置的group只能是默认的DEFAULT_GROUP,不能动态刷新公共配置。
可以修改如下
#所有服务通用的配置
#shared-configs: common1.yaml,common2.yaml
shared-configs:
#List,一个 - 表示一个子元素,不一定要指定全部3个属性,未指定的属性自动取默认值
- dataId: common1.yaml
refresh: true
- dataId: common2.yaml
refresh: true
- shared-configs 可以换成 extension-configs ,使用方式、效果相同。
- 尽量不要利用优先级覆盖其它配置文件中的同名配置项,后续不好维护。
nacos还提供了历史配置回滚的功能,十分方便。