- SpringCloud-08: 引入Nacos服务注册中心与配置中心
- 注册中心
- 服务提供者
- 服务消费者(客户端)
- 微服务配置中心
- 基础配置
- 分类配置
- 根据DataID分类配置
- 根据Group分类配置
- 根据NameSpace分类配置
项目Github地址
Nacos官方文档
SpringCloud Alibaba 官方文档
SpringCloud Config 官方文档
注册中心 服务提供者-
新建子工程,该工程使用nacos作为服务配置中心
-
引入pom.xml依赖
seckill cc.seckill 1.0-SNAPSHOT 4.0.0 cloud-config-nacos-client3377 8 8 cc.seckill cloud-api-commons ${project.version} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test !!!我这里父项目没注意依赖整错了,记得修改父项目的依赖!!!
com.alibaba.cloud spring-cloud-alibaba-dependencies 2021.0.1.0 pom import -
application.yml
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localnacos:8848 management: endpoints: web: exposure: include: '*' -
主启动类
package cc.seckill.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class PaymentMain { public static void main(String[] args) { SpringApplication.run(PaymentMain.class, args); } } -
Controller
package cc.seckill.springcloud.controller; import cc.seckill.springcloud.entities.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping("/payment/nacos/get/{id}") public Result getPayment(@PathVariable("id") Long id) { Result result = new Result(); result.put("code", "200"); result.put("data", id); result.put("port", serverPort); return result; } } -
启动测试
-
nacos管理后台
-
再添加一个yml,以启动两个服务
server: port: 9002 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localnacos:8848 management: endpoints: web: exposure: include: '*' -
再次启动查看,说明配置成功
-
新建项目,不再过多阐述,只放配置代码
-
pom
seckill cc.seckill 1.0-SNAPSHOT 4.0.0 cloud-consumer-nacos-order80 8 8 org.springframework.cloud spring-cloud-starter-loadbalancer cc.seckill cloud-api-commons ${project.version} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test -
yml
server: port: 80 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localnacos:8848 -
Main
package cc.seckill.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class OrderMain { public static void main(String[] args) { SpringApplication.run(OrderMain.class, args); } } -
config
package cc.seckill.springcloud.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } } -
Controller
package cc.seckill.springcloud.controller; import cc.seckill.springcloud.entities.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController @Slf4j public class OrderNacosController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user}") private String serverURL; @GetMapping("/consumer/payment/nacos/get/{id}") public Result paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL + "/payment/nacos/get/" + id, Result.class); } } -
启动
-
测试
-
创建项目
-
引入pom.xml依赖
seckill cc.seckill 1.0-SNAPSHOT 4.0.0 cloud-config-nacos-client3377 8 8 org.springframework.cloud spring-cloud-starter-bootstrap cc.seckill cloud-api-commons ${project.version} com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test -
新建bootstrap.yml和application.yml
bootstrap.yml加载优先级要高于application.yml
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localnacos:8848 config: server-addr: localnacos:8848 file-extension: yamlapplication.yml
spring: profiles: active: dev -
Controller
package cc.seckill.springcloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } } -
配置文件名称规则
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
来源: Nacos官网
因此当前配置文件的名称应该为:nacos-config-client-dev.yaml
-
在nacos管理界面新建配置 (配图里的文件名是错的,注意!)
-
测试
-
NameSpace + Group + Data ID来区分配置,类似java类的包名+类名来提供全限定名。
NameSpace区分部署环境,Group、Data ID进行逻辑区分
比如我们有三个环境:开发、测试、成产环境,我们就可以创建三个NameSpace,不同的NameSpace之间是相互隔离的。Group可以将不同的微服务划分到同一个Group里,Data ID可以用来区分微服务。
-
修改配置文件application.yml中spring.profiles.active的值进行分类配置
spring: profiles: active: test # active: dev
-
添加配置
-
修改bootstrap.yaml(yaml和yml作用一样的),在config下添加group信息
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localnacos:8848 config: server-addr: localnacos:8848 file-extension: yaml group: TEST_GROUP同样修改application.yaml
spring: profiles: active: info # active: test # active: dev -
测试
-
去命名空间新建NameSpace,然后在配置管理界面切换到对应的命名空间
-
修改bootstrap.yaml
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localnacos:8848 config: server-addr: localnacos:8848 file-extension: yaml # group: TEST_GROUP namespace: 9fdb67b6-7d0d-4684-a1a2-bd2af588190dgroup可以不注释掉,但是需要和配置文件的group一致,因为我上面选的是DefaultGroup,所以直接注释掉了。
-
测试



