一、Nacos代替Config作为服务配置中心
1、为了测试,我们创建新的module,cloudalibaba-config-nacos-client3377:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.jiguiquan.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-config-nacos-client3377</artifactId> <dependencies> <!--springcloud alibaba nacos config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--springcloud alibaba nacos discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--公共服务模块依赖--> <dependency> <groupId>com.jiguiquan.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <!--springboot项目web和actuator最好一起走--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--热部署devtools--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> </project>
2、配置文件:application.yml 和 bootstrap.yml
Nacos作为服务配置中心时,和springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动;
bootstrap.yml的优先级高于application.yml;
bootstrap.yml:
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} # 这就是实际拼接好的配置文件的名称 "nacos-config-client-dev.yaml"
application.yml:
spring: profiles: active: dev
3、主启动类:NacosConfigClientMain3377.java:
@SpringBootApplication @EnableDiscoveryClient public class NacosConfigClientMain3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); } }
4、业务类ConfigClientController.java:
@RestController @RefreshScope //为了自动动态刷新 public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping(value = "/config/info") public String getConfigInfo(){ return configInfo; } }
到这里,准备工作就做完了,在配置之前,重点记住匹配规则:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 这就是实际拼接好的配置文件的名称 "nacos-config-client-dev.yaml"
二、开始在Nacos中增加配置文件——无命名空间无分组情况
1、在Nacos的 配置管理——配置列表中,增加如下配置:
2、启动3377服务,进行测试:
访问地址: http://localhost:3377/config/info
显然,配置信息正常被读取了,配置中心生效!
3、测试动态刷新配置信息,直接将配置文件中的version修改为version=2.0
别的什么都不要动,依旧访问上面的地址:
配置信息修改依旧生效,特别的方便,比SpringCloud Config + Bus方便很多;
三、Nacos配置中心中命名空间、分组、DataID 三者的关系
首先思考两个问题:
问题1:
实际开发中,通常一个系统会准备:dev、test、prod等环境,那么如何保证指定环境启动时,服务等到到对应环境的配置文件?
问题2:
一个大型的分布式微服务系统中,会有很多小的微服务项目;每一个微服务都会有自己的dev、test、prod环境的配置文件;
那该怎么对这些微服务的配置文件进行管理呢?
肯定得有类似于文件夹的分类功能吧!
1、先来看看Nacos作为配置中心的界面:
2、Namespace + Group + DataID 三者的关系?
这三者的关系设计,类似于Java中的 package名和类名;
Namespace :区分部署环境;
Group和DataID:逻辑上区分两个目标对象;
三者的情况如图:
Namespace:public
Group:DEFAULT_GROUP
默认的Cluster集群:DEFAULT
3、实际使用:
比如我们有三个环境:开发dev、测试test、生产prod,我们可以创建三个Namespace,不同的Namespace用以区分不同的环境,之间是隔离的;
上图中额Service就是一个服务,一个Service中可以包含多个Cluster集群,Nacos中默认的Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分;
比如为了容灾,我们可以将服务Service分别不再杭州机房和广州机房,这是我们就可以给杭州机房的微服务集群起名为HZ,将广州集群起名为GZ,还可以尽量让同一个机房的服务相互调用,以提高性能;
最后是Instance,就是微服务的单个实例;
四、综合使用Namespace + Group + DataID的Case
1、在命名空间下新建dev和test两个Namespace;
新建完成后,我们就能看到对应的命名空间ID,public(保留空间)是没有办法删除的;
2、然后,我们再在test 156b63d1-9ad3-4e42-bdc5-072549704f30 命名空间下,创建三个配置文件,他们分别属于三个不同的分组;
3、我们修改3377服务的配置文件bootstrap.yml:
增加namespace和group的配置:
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml namespace: 156b63d1-9ad3-4e42-bdc5-072549704f30 group: DEV_GROUP # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} # 这就是实际拼接好的配置文件的名称 "nacos-config-client-dev.yaml"
4、重启3377服务,继续访问上面的地址:
访问结果,与我们预期一致!
五、Nacos集群和持久化配置
上面的知识点都是很浅显的简单使用,而且使用的是Windows版的Nacos,单机部署,且配置信息没有持久化配置到我们制定的数据库,而是使用的Nacos本身自带的数据库;
这些显然是不可能满足实际生产需求的;
所以实际生产中我么肯定是要使用 Linux版 + 集群部署 + 指定数据库持久化数据;
由于这部分内容比较多,所以需要单独开一片文章讲解!
连接在此:http://www.jiguiquan.com/archives/943
个人此项目代码地址(持续更新):