SpringCloud学习5-Nacos
Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
一句话:Nacos就是注册中心 + 配置中心的组合。
Nacos=Spring Cloud Consul
Nacos本地运行:
运行:在nacos的bin目录上cmd,输入:startup.cmd -m standalone,然后浏览器输入:http://localhost:8848/nacos即可
关闭服务:shutdown.cmd
Nacos服务注册中心:
实现服务的注册与发现
案例:
Nacos之服务提供者9001入驻Nacos中心:
-
建Model:cloudalibaba-provider-payment9001
-
pom文件导入相关依赖:
<!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> -
yml:
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 //之后9001以nacos-payment-provider名称入驻进8848 -
业务类:
@RestController @Slf4j public class PayAlibabaController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/pay/nacos/{id}") public String getPayInfo(@PathVariable("id") Integer id) { return "nacos registry, serverPort: " + serverPort + "\t id" + id; } }
Nacos之服务消费者83入驻Nacos中心:
-
建Model:cloudalibaba-consumer-nacos-order83
-
在pom文件中导入Nacos的相关依赖(两个)
注意:Nacos也支持客户端的负载均衡
<!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--loadbalancer--> //因为服务消费者调用服务时是按照名字进行调用的,认名不认死地址,如果一个名字后面有多个服务提供者,就需要负载均衡所 以需要导入loadbalancer依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> -
yml:
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #服务提供者以nacos-order-consumer(83)名称入驻进8848注册中心 #消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么) service-url: nacos-user-service: http://nacos-payment-provider -
实体类:使用RestTemplate或者OpenFeign都可
Nacos服务配置中心:
实现配置的动态变更
就是原来是在Consul上进行配置,现在变成在Nacos上配置
Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取,
拉取配置之后,才能保证项目的正常启动,为了满足动态刷新和全局广播通知
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
步骤:
-
建Model:cloudalibaba-config-nacos-client3377作为Nacos配置中心
-
在pom文件中导入相关依赖:
<dependencies> <!--bootstrap bootstrap.yml--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--nacos-config 配置服务的中心化管理功能--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--nacos-discovery入驻进Nacos--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--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> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> -
yml文件:
-
bootstrp.application
# nacos配置 spring: application: name: nacos-config-client #Nacos的配置中心将以nacos-config-client名称入驻Nacos注册中心 cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置(只认yml配置方式) # nacos端配置文件DataId的命名规则是: # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} # 本案例的DataID是:nacos-config-client-dev.yaml -
application.yml
server: port: 3377 spring: profiles: active: dev # 表示开发环境 #active: prod # 表示生产环境 #active: test # 表示测试环境
-
-
业务类controller:
@RefreshScope实现配置的自动更新
@RestController //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。 @RefreshScope public class NacosConfigClientController { @Value("${config.info}") //从Nocas上的yml中读取信息:(根据application和boootstrp.yml中配置的环境、分组来确定读取 Nacos上谁的配置信息!!! private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } } -
在Nacos中添加配置信息(重点)
//nacos端配置文件DataId的命名规则是: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 1.配置中心的名字 2.环境 3.支持什么格式 nacos-config-client - dev . yaml //prefix默认为spring.application.name //spring.profiles.active默认为当前环境对应的profile,可以通过配置项spring.profiles.active来配置 //spring.cloud.nacos.config.file-extension为配置内容的数据格式 # 所以本案例的DataID是:nacos-config-client-dev.yaml
在Nacos上的配置管理--配置列表--创建配置--写入正确的Data ID + 配置内容
注意:
-
因为我们使用了@RefreshScope注解,所以在Nacos上更新配置内容时,它会自己进行动态刷新。
-
Nacos会记录配置文件的历史版本默认保留30天,此外还有一键回滚功能,回滚操作将会触发配置更新
Nacos数据模型之Namespace-Group-DataId
问题1:
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生产环境。
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
问题2:
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......
那怎么对这些微服务配置进行分组和命名空间管理呢?
Nacos数据模型Key由三元组唯一确定,Namespace命名空间默认是空串,默认为(public),Group默认分组是DEFAULT_GROUP
- Namespace主要用来实现隔离。比如我们现在有3个环境:开发、测试、生产环境,我们就可以创建3个Namespace,不同的Namespace之间是隔离的
- Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到一个分组里去。
通过命名空间Namespace + Group +DataId 就形成了唯一的配置信息(类似于Java中的包名 类名 )
注意:
如果需要读取Nacos上不同环境、分组下的配置,需要更改yml文件(application.ymlh和bootstarp.yml中配置的要求读取哪个里面的配置文件)
eg: 上面在application.yml文件中代表读取的是Nacos默认命名空间、默认命名分组中的yml文件,bootstrap.yml文件中代表:读取的是Nocasdev环境的配置信息内容。之后controller中的configInfo属性到对应上述命名空间、环境、分组、DataId中去读取对应的配置信息。