Nacos 是阿里开源的 RCP 服务注册发现、配置中心等功能的一个框架。
使用Nacos可以作为spring cloud 服务注册中心和配置中心,如果在生成环境使用,需要搭建集群,实现高可用,并且通过域名实现负载均衡。
官方参考文档: 集群部署
upstream nacos {
server 127.0.0.1:8848;
server 127.0.0.1:8849;
server 127.0.0.1:8850;
}
server {
listen 80;
server_name nacos.com;
location / {
proxy_pass http://nacos;
}
}
有两种方式,一种是使用spring cloud 的 jar 包; 另一种方式是引入阿里的jar 包。推荐使用阿里的,因为比较新;spring cloud 集成的nacos 相关jar 包不是最新的,只能实现最简单的服务注册发现,自定义group不生效,不支持权限功能。如果想使用权限功能,需要使用阿里最新的包。
方法一:
maven依赖:
org.springframework.cloud
spring-cloud-alibaba-dependencies
0.9.0.RELEASE
pom
import
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-config
方法二(推荐使用):
org.springframework.boot
spring-boot-starter-parent
2.2.5.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Hoxton.RELEASE
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.1.RELEASE
pom
import
com.alibaba.nacos
nacos-client
1.3.0
com.alibaba.nacos
nacos-client
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.nacos
nacos-client
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.nacos
nacos-client
如果使用权限,需要在nacos 服务端开启配置,该配置热生效。
nacos.core.auth.enabled=true
nacos.core.cacheing.enabled=true
项目配置:
1. bootstrap.properties
spring.application.name=demo-core
spring.profiles.active=dev
spring.cloud.nacos.config.server-addr=nacos.com:80
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
2. application.yml
server:
port: 9000
spring:
cloud:
nacos:
discovery:
server-addr: nacos.com:80
group: DEFAULT_GROUP
username: nacos
password: nacos
config:
group: DEFAULT_GROUP
file-extension: properties
3. bootstrap-dev.properties
通过profiles机制,实现环境切换。可以使用自定义命名空间来区分环境,命名空间namespace配置的是ID,不是名称
#nacos 命名空间
spring.cloud.nacos.discovery.namespace=8b4cd4e4-c018-42a7-a8e2-e3c724e6d80b
spring.cloud.nacos.config.namespace=8b4cd4e4-c018-42a7-a8e2-e3c724e6d80b
启动类
@SpringCloudApplication
@EnableDiscoveryClient
@EnableFeignClients
@Slf4j
public class CoreApplication {
public static void main(String[] args) {
SpringApplication.run(CoreApplication.class, args);
log.info("----------- CoreApplication Start Success ------------");
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
启动后,可以在Nacos控制台查看
服务列表
命名空间
配置列表
配置文件data id 文件名规则:${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为 spring.application.name
的值,也可以通过配置
1. server-addr= 域名+port,如果只配置server-addr=nacos.com,Nacos 代码生成的路径中,会在域名后加端口8848,访问路径不对。
2. Spring cloud 项目配置文件加载顺序,最先加载bootstrap.properties,项目中要有bootstrap.properties文件,并在bootstrap.properties中包含配置中心地址
3. 如果使用org.springframework.cloud的jar, 目前有个bug,服务注册时,group默认DEFAULT_GROUP,如果自定义group,注册后发现还是DEFAULT_GROUP,自定义的不生效。所以如果要使用group,用阿里提供的最新 版jar。
4. 使用Nacos作为配置中心时,有三种方式可以区分环境。
使用Data ID
与profiles
实现
使用Group
实现
使用Namespace
实现(推荐使用)
在使用Namespace区分环境时,如果是spring boot项目,配置文件使用b
ootstrap.properties、b
ootstrap-dev.properties、b
ootstrap-test.properties 来命名,如果使用application作为文件名前缀,自定义命名空间会无效,默认使用public。
5. 版本冲突问题
引入actuator做健康检查时,如果spring boot 版本不兼容,会报以下错误:
Error creating bean with name 'servletEndpointRegistrar' defined in class path resource
使用spring-boot-2.2.0.RELEASE 就会有以上问题,升级到2.2.5.RELEASE 问题解决。
还有就是需要注意 spring boot 和 spring cloud 的版本要兼容,否则也会在启动时报错。
6. 如果要启用Nacos权限功能,需要使用最新的版本,否则会有不少问题,目前最新版1.3.0的权限功能还有一些小问题,期待后续的更新完善。
参考issues: https://github.com/alibaba/nacos/issues/3080
https://github.com/alibaba/nacos/issues/3144