上篇文章我们介绍了服务采用nacos作为注册中心,其实nacos还有另外一个作用是作为配置中心,但是功能要比springcloud-config功能强大配置简单。说配置文件大家都比较了解。我们在项目里经常使用各种properties配置各种内容,比如我们把调用其它服务的url配置到配置文件中统一管理。但是在分布式架构生态下各个应用自己都维护一份配置显然就会出现不足。第一:配置的动态更新问题,第二:配置相同需要多次修改问题,第三:安全性问题。所以一般我们在微服务体系中会维护一个配置中心来动态变更配置并可以动态把变更的内容推送到相应的服务节点上。达到热更新的效果。所以配置中心也是在微服务体系下一个重要的组件。
nacos作为配置中心介绍
我们现在作为配置中心的开源组件有很多,比如zookeeper,apollo,spring cloud config等等。无论是哪种组件最终要实现的功能是相同的。nacos作为服务发现功能我们上篇已经进行了介绍,上篇文章中我们说过对于nacos讲另一个核心功能就是作为配置中心,它实现了对配置内容的增删改查,实现了热更改内容配置。接下来我们介绍一下怎么实现nacos config功能。
nacos实现config功能配置
- 进入Nacos的控制页面,在配置列表功能页面中,点击右上角的“+”按钮,进入“新建配置”页面,如下图填写内容:
如上配置我们简单说明一下:
- Data ID:task-gray
- Group:暂时不用修改,默认的DEFAULT_GROUP即可
- 配置格式:我们一般选择yaml或者properties或者json
- 配置内容:应用要加载的配置内容,这里仅作为示例
配置的具体内容也可以通过rest接口进行更改,或者通过登录该图形界面进行编辑发布。
curl -X "POST" "http://127.0.0.1:8848/nacos/v1/cs/configs" \
-H 'Content-Type: application/x-www-form-urlencoded; charset=utf-8' \
--data-urlencode "dataId=nacos.properties" \
--data-urlencode "group=DEFAULT_GROUP" \
--data-urlencode "content=useLocalCache=true
- 项目中使用
- 创建一个Spring Boot应用,可以命名为:alibaba-nacos-config。pom文件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
对照上篇文章我们可以看到,这个例子中并没有加入nacos的注册中心模块,所以这两个内容是完全可以独立使用的。
- 创建应用主类,并实现一个controller接口:
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Slf4j
@RestController
@RefreshScope
static class TestController {
@Value("${gray-city}")
private String city;
@GetMapping("/test")
public String hello() {
return city;
}
}
}
- 创建配置文件bootstrap.properties,并配置服务名称和Nacos地址
spring.application.name=alibaba-nacos-config
server.port=8001
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
注意:这里必须使用bootstrap.properties。同时,spring.application.name值必须与上一阶段Nacos中创建的配置Data Id匹配(除了.properties或者.yaml后缀)
- 启动上面创建的应用
2021-01-27 18:29:43.497 INFO 93597 --- [main] o.s.c.a.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'alibaba-nacos-config.properties', group: 'DEFAULT_GROUP'
2021-01-27 18:29:43.498 INFO 93597 --- [main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-config.properties'}]}
- 验证配置获取和验证动态刷新
用curl或者postman等工具,访问接口: localhost:8001/test,一切正常的话,将返回Nacos中配置的内容。然后,再通过Nacos页面,修改这个内容,点击发布之后,再访问接口,可以看到返回结果变了。
同时,在应用的客户端,我们还能看到如下日志:
2021-01-27 18:39:14.162 INFO 93597 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [gray-city]
Nacos配置规则详解
Nacos中创建的配置内容是这样的:
- Data ID:alibaba-nacos-config.properties
- Group:DEFAULT_GROUP
拆解一下,主要有三个元素,它们与具体应用的配置内容对应关系如下: - Data ID中的alibaba-nacos-config:对应客户端的配置其实就是服务名称
- spring.cloud.nacos.config.prefix,默认值为${spring.application.name},即:服务名
- Data ID中的properties:对应客户端的配置spring.cloud.nacos.config.file-extension,默认值为properties
- Group的值DEFAULT_GROUP:对应客户端的配置spring.cloud.nacos.config.group,默认值为DEFAULT_GROUP
在采用默认值的应用要加载的配置规则就是:Data ID=${spring.application.name}.properties,Group=DEFAULT_GROUP。
- 如果我们想要加载yaml格式的内容,而不是Properties格式的内容,那么可以通过如下配置,实现加载Data ID=alibaba-nacos-config.yaml,Group=DEFAULT_GROUP。
- 如果我们对配置做了分组管理,那么可以通过如下配置,实现加载Data ID=alibaba-nacos-config.yaml,Group=TEST_GROUP
对于spring.cloud.nacos.config.group的配置来说,还是用它来区分不同用途的配置内容、再或者用它来区分不同环境的配置。具体的配置细节我们可以参考一下官网的配置示例。
Namespace说明:如果存在相同的Group或Data ID的配置。Namespace的常用场景之一是不同环境的配置的区分隔离,例如:开发测试环境和生产环境的资源(如配置、服务)隔离等。
- 先在Nacos中,根据环境名称来创建多个Namespace。
- 在配置列表的最上方,可以看到除了Public之外,多了几个刚才创建的Namepsace。分别在DEV和TEST空间下为alibaba-nacos-config应用创建配置内容。
- 在alibaba-nacos-config应用的配置文件中,增加Namespace的指定配置,比如:spring.cloud.nacos.config.namespace=上面的唯一标识。(这里需要注意namespace的配置不是使用名称,而是使用Namespace的ID。)官方建议的方式是通过Namespace来区分不同的环境,释放了Group的自由度,这样可以让Group的使用专注于做业务层面的分组管理。
Nacos配置的多文件加载,Nacos中配置内容的对应关系是通过下面三个参数控制的: - spring.cloud.nacos.config.prefix
- spring.cloud.nacos.config.file-extension
- spring.cloud.nacos.config.group
默认情况下,会加载Data ID=${spring.application.name}.properties,Group=DEFAULT_GROUP的配置。首先在Nacos中创建Data ID=a.properties,Group=DEFAULT_GROUP和Data ID=b.properties,Group=DEFAULT_GROUP的配置内容。之后在Spring Cloud应用中通过使用spring.cloud.nacos.config.ext-config参数来配置要加载的这两个配置内容:
spring.cloud.nacos.config.ext-config[0].data-id=a.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=b.properties
spring.cloud.nacos.config.ext-config[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config配置是一个数组List类型。每个配置中包含三个参数:data-id、group,refresh;
Nacos的数据持久化
Nacos的单机运行模式仅适用于学习与测试环境,对于有高可用要求的生产环境显然是不合适的,所以我们对于nacos的数据必有一套持久化方案。默认情况下,Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只要支持MySQL的存储。
- 安装数据库
- 初始化MySQL数据库,数据库初始化文件:nacos-mysql.sql,该文件可以在Nacos程序包下的conf目录下获得
- 修改conf/application.properties文件,增加支持MySQL数据源配置,添加(目前只支持mysql)数据源的url、用户名和密码
nacos数据一致性算法raft算法,我们在以后文章在进行介绍。
Nacos的集群部署
在Nacos的conf目录下有一个cluster.conf.example,可以直接把example扩展名去掉来使用,也可以单独创建一个cluster.conf文件,然后打开将后续要部署的Nacos实例地址配置在这里。
本文以在本地不同端点启动3个Nacos服务端为例,可以如下配置:
127.0.0.1:8841
127.0.0.1:8842
127.0.0.1:8843
在完成了上面的配置之后,我们就可以开始在各个节点上启动Nacos实例,以组建Nacos集群来使用了。
生产部署
在实际生产环境部署的时候,由于每个实例分布在不同的节点上,只需要在各个节点的Nacos的bin目录下执行sh startup.sh命令即可。另外我们需要为启动的三个Nacos实例做一个可以为它们实现负载均衡的访问点。这个实现的方式非常多,我们可以使用nginx进行反向代理负载均衡到后面的三个节点上,也就是上图中的VIP。之后我们可以通过Nginx配置的代理地址:http://localhost:8080/nacos/来访问Nacos,在Spring Cloud应用中也可以用这个地址来作为注册中心和配置中心的访问地址来配置(也可以spring.cloud.nacos.config.server-addr=127.0.0.1:8841,127.0.0.1:8842,127.0.0.1:8843)。
想要学习更多微服务相关内容欢迎来到公众号:IT技术小栈。来发现更多学习内容。