1. 环境准备
springcloud版本需要与springboot版本兼容,否则无法运行;nacos是springcloud alibaba旗下的,版本对应与原生态的springcloud有所不同
本文所举的例子版本如下
- springcloud:Hoxton.SR9
- springcloud alibaba:2.2.3.RELEASE
- springboot:2.3.5.RELEASE
- nacos:2.2.3.RELEASE
在springcloud项目工程里引入以下依赖
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springCloud alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- nacos注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- bootstrap 集成配置中心需要用bootstrap 配置文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
2. bootstrap配置文件
springcloud整合nacos配置中心,需要从nacos中读取配置文件必须使用bootstrap配置文件,springboot读取bootstrap配置文件需要引入bootstrap依赖,上面已写道,bootstrap配置nacos配置中心如下:
#指定开发环境
spring.config.activate.on-profile=dev
#指定微服务名
spring.application.name=gateway-service
#服务器地址
spring.cloud.nacos.config.server-addr=localhost:8848,localhost:8850
#默认为Public命名空间,不需要写,如果加上的话会导致加载不到配置文件
spring.cloud.nacos.config.namespace=cb3f7a6e-ec92-4de0-b616-ef0d311ac4c3
#文件名 -- 如果没有配置则默认为 ${spring.appliction.name}
spring.cloud.nacos.config.prefix=item-service
#指定文件后缀
spring.cloud.nacos.config.file-extension=yaml
#指定分组信息
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 注册中心地址
spring.cloud.nacos.discovery.server-addr=localhost:8848,localhost:8850
#默认为Public命名空间,不需要写,如果加上的话会导致加载不到配置文件
spring.cloud.nacos.discovery.namespace=cb3f7a6e-ec92-4de0-b616-ef0d311ac4c3
重要参数说明:
- spring.cloud.nacos.config.server-addr:nacos配置中心地址(集群则用逗号隔开每台机器)
- spring.cloud.nacos.config.namespace:nacos配置中心命名空间id,默认为public(如果是public可以不写,否则导致加载不到)
- spring.cloud.nacos.config.prefix:配置中心该服务的配置文件的文件名(如果没有配置则默认为 ${spring.appliction.name})
- spring.cloud.nacos.config.file-extension:配置中心该服务的配置文件的后缀(没有配置则默认为properties)
- spring.cloud.nacos.config.group:配置文件的分组(不写默认为DEFAULT_GROUP)
以上的配置为了避免运行时出一些莫名其妙的错误尽量配置在bootstrap上,其他的任意配置都可以配置到nacos配置中心上
3. nacos配置中心设置配置文件
项目工程代码里配置好nacos配置中心后,就可以在nacos配置中心设置配置文件了
首先进入nacos可视化界面 ip:端口号/nacos,进入后会需要输入账号密码,默认是nacos / nacos
新增命名空间,线上项目往往需要分环境,或者多个系统共用一套nacos,为了方便区分可以给每个系统或者环境单独建立一个命令空间
命名空间建立好后就可以去配置管理里指定的命名空间去新增配置文件
这里需要注意的两个地方
配置文件的文件名dataId,springcloud加载nacos配置中心会按照
$ {spring.cloud.nacos.config.prefix}-$ {spring.config.activate.on-profile}.$ {spring.cloud.nacos.config.file-extension} 格式以及 $ {spring.cloud.nacos.config.group} 去匹配Data Id 和 Group并加载配置文件,因此,在同一个命名空间,Data Id + Group唯一,这其中Data Id的spring.config.activate.on-profile可以为空,如果为空,则按照
$ {spring.cloud.nacos.config.prefix}.$ {spring.cloud.nacos.config.file-extension} 格式去匹配
新建好配置文件后就可以在操作配置文件去配置属性了
以上配置都配置好以后就可以启动项目了
4. nacos设置权限
以上配置完成后nacos就可以正常使用了,但是还存在一个问题就是安全问题,如果多个系统共用显然需要划分权限,每个系统的操作者只能操作自己系统的配置
nacos默认是没开启权限控制的,开启权限控制则需要修改配置文件,如下
即将nacos的application中的nacos.core.auth.enabled配置为true
在nacos可视化界面我们可以看到权限控制一栏,这一栏只能管理员用户即nacos用户有权限设置
首先我们就创建用户
然后再创建角色并绑定用户
最后就是给角色添加权限,用户的权限就是来源于其所绑定的橘色
图中的例子我是创建了cgdata用户并赋予cg命名空间的读写权限,其他空间就无法操作了
此时我们用cgdata用户登录进入dev命名空间,则报权限认证失败
这时我们的权限配置就配置好了,但是我们再启动项目就报403了
com.alibaba.nacos.api.exception.NacosException: <html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Tue May 03 20:01:24 CST 2022</div><div>There was an unexpected error (type=Forbidden, status=403).</div><div>unknown user!</div></body></html>
at com.alibaba.nacos.client.config.impl.ClientWorker.getServerConfig(ClientWorker.java:330) ~[nacos-client-1.3.3.jar:na]
at com.alibaba.nacos.client.config.NacosConfigService.getConfigInner(NacosConfigService.java:149) ~[nacos-client-1.3.3.jar:na]
at com.alibaba.nacos.client.config.NacosConfigService.getConfig(NacosConfigService.java:97) ~[nacos-client-1.3.3.jar:na]
at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.loadNacosData(NacosPropertySourceBuilder.java:85) [spring-cloud-starter-alibaba-nacos-config-2.2.3.RELEASE.jar:2.2.3.RELEASE]
at com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder.build(NacosPropertySourceBuilder.java:74) [spring-cloud-starter-alibaba-nacos-config-2.2.3.RELEASE.jar:2.2.3.RELEASE]
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosPropertySource(NacosPropertySourceLocator.java:204) [spring-cloud-starter-alibaba-nacos-config-2.2.3.RELEASE.jar:2.2.3.RELEASE]
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadNacosDataIfPresent(NacosPropertySourceLocator.java:191) [spring-cloud-starter-alibaba-nacos-config-2.2.3.RELEASE.jar:2.2.3.RELEASE]
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.loadApplicationConfiguration(NacosPropertySourceLocator.java:142) [spring-cloud-starter-alibaba-nacos-config-2.2.3.RELEASE.jar:2.2.3.RELEASE]
at com.alibaba.cloud.nacos.client.NacosPropertySourceLocator.locate(NacosPropertySourceLocator.java:103) [spring-cloud-starter-alibaba-nacos-config-2.2.3.RELEASE.jar:2.2.3.RELEASE]
at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:52) [spring-cloud-context-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.cloud.bootstrap.config.PropertySourceLocator.locateCollection(PropertySourceLocator.java:47) [spring-cloud-context-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize(PropertySourceBootstrapConfiguration.java:98) [spring-cloud-context-2.2.6.RELEASE.jar:2.2.6.RELEASE]
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626) [spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:370) [spring-boot-2.3.5.RELEASE.jar:2.3.5.RELEASE]
添加了权限管理后我们需要给配置中心和注册中心添加账号密码配置,如下:
# 配置中心账号密码
spring.cloud.nacos.config.username=cgdata
spring.cloud.nacos.config.password=cgdata1234
# 注册中心账号密码
spring.cloud.nacos.discovery.username=cgdata
spring.cloud.nacos.discovery.password=cgdata1234