前言
随着 服务化
的普及, 你会发现越来越多的公司开始服务化的调整, 那么有哪些变化呢?
你会发现, 原来一个接口就实现了一套逻辑功能, 而服务化后, 服务
拆分的维度更细了, 实现一个功能, 可能需要同时协同很多的服务接口!
服务的拆分维度更细当然是有好处的, 服务间耦合度更低, 复用性更强, 但是随之而来的是服务间配置及管理成本的上升!
所以, 为了解决这些服务治理成本, Nacos应运而生.
Nacos 是阿里巴巴的开源项目,其核心定位是 动态服务发现、配置和服务管理平台
简而言之 nacos两个功能:
- 服务发现及管理
- 配置的管理
需要注意的是, Nacos本身是个独立的服务, 可以单独部署!
下面, 我们来实践下Nacos的部署,以及和Springboot的配合~
Docker 安装Nacos
下载nacos镜像
docker pull nacos/nacos-server
查看镜像
docker images
以单机模式运行nacos
# 登录密码默认nacos/nacos
# standalone代表着单机模式运行,非集群模式
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
访问Nacos
http://localhost:8848/nacos
配置Nacos
访问地址:http://localhost:8848/nacos
默认账号: nacos
默认密码: nacos
进入配置页面
创建一个新命名空间(你可以理解为一个组)
默认有个public公共空间, 我新建了sb-alibaba-nacos空间
创建完成后我们就可以直接开始服务的配置了
把服务的相关配置加入此即可.
我们新增sb-alibaba-nacos服务的两套环境的配置, dev 和 test
dev (服务端口: 8081):
test(服务端口: 8082):
再新建一个通用的配置(实际情况就是很多服务,大部分的配置是共用的, 少部分是自定义的,
nacos支持这样的配置) common
点击发布即可.
Springboot 整合 alibaba nacos
我们引入依赖
<properties>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
<spring-cloud-alibaba-version>2.2.1.RELEASE</spring-cloud-alibaba-version>
</properties>
<dependencyManagement>
<dependencies>
<!--SpringCloud依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringCloud Alibaba依赖 -->
<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>
<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>
</dependencies>
这里特别强调下, 必须要引入和springboot匹配版本的springcloud依赖哦, 否则会启动报错
org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'nacosAutoServiceRegistration' defined in classpath resource....
大致的版本对应关系如下
更详细的请去https://start.spring.io/actuator/info
查询!
这里, 咸鱼为了使用新特性, 所以spring-boot使用2.2.6.RELEASE版本, 所以对应的spring-cloud版本为Hoxton.SR4, spring-cloud-alibaba版本为2.2.1.RELEASE!
注意, 低版本的springboot会出现无法注册分组功能
也就是项目启动后, 当你在项目的alibaba nacos配置文件里填写了分组名称时,
在nacos 服务管理页面会发现分组名称
并没注册上(也就是显示为default
, 并不是我们指定的dev
)
配置springboot
要想springboot项目向nacos注册以及从nacos读取配置,我们就必须在项目中加上简单的配置
首先在启动类上加上注解@EnableDiscoveryClient
其次, 新建一个项目的配置文件bootstrap.properties
(nacos的配置就在此, springboot会优先读取bootstrap.properties
配置, 其次才是application.properties)
# 服务名, 会在nacos上显示服务的名称
spring.application.name=sb-alibaba-nacos
# 指定生效的配置为 dev
spring.profiles.active=dev
##################### Nacos基本配置
###### 1、注册中心配置
# Nacos注册中心地址, 也就是nacos所在 ip:端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 配置注册中心namespace id, 我们nacos创建空间时生成的唯一id
spring.cloud.nacos.discovery.namespace=070cc848-3106-49eb-a3be-3d5994701d96
# 指定注册中心namespace的group, 这个group可以随意指定, 会显示在nacos上
spring.cloud.nacos.discovery.group=dev
##### 2、配置中心配置
# Nacos配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 指定读取的配置文件后缀名, 我们nacos上新建配置时,配置的后缀格式
spring.cloud.nacos.config.file-extension=properties
# 指定命名空间, 必须指定id, 不能指定名称
spring.cloud.nacos.config.namespace=070cc848-3106-49eb-a3be-3d5994701d96
# 指定Group
spring.cloud.nacos.config.group = sb-alibaba-nacos
#### 相同namespace,不同group下的服务共享配置
## common配置
spring.cloud.nacos.config.extension-configs[0].group=common
spring.cloud.nacos.config.extension-configs[0].data-id=common.properties
spring.cloud.nacos.config.extension-configs[0].refresh=true
### 日志配置
logging.level.com.alibaba.nacos.client.config=warn
spring.main.allow-bean-definition-overriding=true
最后,我们启动springboot项目即可~
说明
注意, 从nacos读取配置, 启动业务服务后, 若修改了配置, 业务服务默认不会实时生效的!
如果, 个别配置项你需要实时的生效, 也就是无需重启业务服务就能生效, 请在项目中对应读取配置值的类上加上注解
@RefreshScope
项目地址
https://github.com/MrCoderStack/SpringBootDemo/tree/master/sb-alibaba-nacos