22.Nacos做服务配置中心
1.Nacos作为配置中心-基础配置
先搭建环境:
1.新建一个项目:cloudAilibaba-config-client
2.pom文件中引入:下面两个jar包最好捆绑导入
1:服务注册中心包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.服务配置中心包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3.新建两个配置文件:1.bootstrap.yml(系统配置文件,优先加载) 2.application.yml(用户的自定义配置文件)
3.1 bootstrap.yml配置文件中的内容:
server:
port: 3377
spring:
application:
name: nacos-config-client3377
cloud:
nacos:
#重点1:服务注册中心的nacos地址
discovery:
server-addr: 192.168.2.129:8848 #Nacos服务注册中心地址
#重点2:服务配置中心的nacos地址
config:
server-addr: 192.168.2.129:8848 #Nacos服务配置中心地址
file-extension: yaml #指定文件后缀
3.2 application.yml中的配置:
#指定生效的配置文件后缀
spring:
profiles:
active: dev
4. 编写业务逻辑
@RestController
//重点1:加上@RefreshScope标签,来自动刷新
@RefreshScope
@Slf4j
public class ConfigController {
/*
判断逻辑是:看是否能取到nacos配置中心配置的config.info的值
*/
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/getConfigInfo/{id}")
public String getConfigInfo(@PathVariable("id") int id){
log.info("请求路径id:{}",id);
return configInfo;
}
}
5. 启动类代码:
@SpringBootApplication
//重点1:加上该标签,可以让服务注册中心扫描到
@EnableDiscoveryClient
public class ConfigClientApplication3377 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication3377.class, args);
}
}
6. 在nacos上配置服务配置
nacos的配置列表中的DataId的命名方式为如何呢,这个最重要,需要遵循规则:
参考地址:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
1.prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
2.spring.profiles.active 即为当前环境对应的 profile(即在application.yml中配置的spring.profiles.active)
注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
不过:尽量不为空,因为为空会有很多想不到的问题!!!
3.file-exetension 为配置内容的数据格式,
可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。
目前只支持 properties 和 yaml 类型。
示例看下图:
nacos-config-client3377-dev.yaml中的配置如下:
config:
info: nacos config info version:吴孟达
测试,访问:http://localhost:3377/config/getConfigInfo/3
可以正常取到
如何实现动态刷新呢?
nacos上的配置改了后,不需要发送post请求,客户端直接就更改了!!
2.Nacos作为配置中心-分类配置.
1.nameSpace可以用来区分部署环境
2.Group和DataId逻辑上区分两个目标对象
默认情况下,NmaeSpace=public ,Group=DEFAULT_GROUP,默认Cluster是DEFAULT
1.Nacos默认的命名空间是public,Namespace主要是用来实现隔离:
比如我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个NameSpace,不同的NameSpace之间是隔离的
2.Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去。
3.Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是Default,Cluster是对指定微服务的一个虚拟划分
比方说为了容灾,将service微服务分别部署在杭州机房和广州机房,
这时可以给杭州机房的service服务器起一个集群名称(HZ)
给广州机房的service微服务起一个集群名称(GZ),还可以尽量让同一机房的微服务互相调用,以提升性能。
4.最后的是Instance,就是微服务实例
3.Nacos集群和持久化配置(重要)
默认Nacos使用嵌入式数据库(Nacos自带的)实现数据的存储。所以,如果取启动多个默认配置下的Nacos节点(集群部署),数据的一致性很难保证。
为了解决这一问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持mysql的存储。(即采用mysql数据库作为Nacos集群的数据统一)
Nacos支持三种部署模式:
1.单机模式-用于测试和单机试用
2.集群模式-用于生产环境,确保高可用
3.多集群模式-用于多数据中心场景
Nacos内部内嵌了一个数据库:derby,每个nacos都会带一个,导致多节点nacos无法达到数据共享问题~~nacos的pom文件依赖如下
集群部署参考地址:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
集群配置需要ngix:未作