写点什么

SpringCloud 从入门到精通 12---Nacos 配置中心

用户头像
Felix
关注
发布于: 2021 年 01 月 18 日

随着微服务的增多,每个微服务有自己的配置文件,而且需要针对dev prod 等环境进行单独的配置,修改配置的工作量越来越多了,所以,为了解决这个问题,nacos本身就内置了配置中心,我们可以直接才nacos的页面上新建配置、修改配置等操作,nacos会为我们自动同步配置,我们通过单独的一个服务来尝试下从服务从nacos拉取配置的流程.

创建一个服务cloud-alibaba-config-client-3000

此次的pom.xml,在原来的基础上,我们增加对于nacos-config的引入

<?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>cloudservice</artifactId>        <groupId>com.felix</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>
<artifactId>cloud-alibaba-config-client-3000</artifactId>
<dependencies> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <dependency> <groupId>com.felix</groupId> <artifactId>cloud-mbg</artifactId> </dependency> <dependency> <groupId>com.felix</groupId> <artifactId>cloud-common</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> </dependencies>
</project>
复制代码

resources下新增两个yml文件

其实从图标上就可以看出来bootstrap.yml是从云端动态加载的配置,与常见项目不同的是,配置文件优先从bootstrap.yml中加载,然后加载application.yml的配置,但是假如两个配置文件有冲突,那么一定是由bootstrap.yml中的配置来决定的,其拥有最高的优先级

这里bootstrap.yml的配置文件如下

spring:  application:    name: cloud-alibaba-config-client  cloud:    nacos:      discovery:        server-addr: localhost:8848      config:        server-addr: localhost:8848        file-extension: yaml
server: port: 3000
management: endpoints: web: exposure: include: '*'
复制代码

我们定义nacons的配置文件从localhost:8848进行加载,配置文件的类型为yaml

application.yml的配置如下

spring:  profiles:    active: dev
复制代码

为了验证是否能从云端加载配置,我们创建一个简单的 ConfigController来读取本地不存在的配置文件

package com.felix.cloudconfig.controller;
import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.context.config.annotation.RefreshScope;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;
@Controller@RefreshScope@RequestMapping("/config")public class ConfigController { @Value("${config.info}") private String configInfo;
@GetMapping(value = "/info") @ResponseBody public String getConfigInfo(){ return configInfo; }}
复制代码

当我们访问`/config/info`的时候,会读取config.info的配置,但是这个配置在两个配置文件中并不存在,稍后我们会在nacosweb管理页面创建一个云端配置,来让其自动进行配置同步.注意,这里添加了@RefreshScope的注解,这个注解作用是当我们修改了云端的配置的时候,为我们更新应用新的配置

接下来,我们需要在nacosweb管理页面创建一个配置文件,配置文件的命名规则为

spring.application.name + spring.profiles.active + .yaml

在当前的项目中,配置文件的名字为cloud-alibaba-config-client-dev.yaml

请注意,这里的后缀需要为.yaml,因为截止目前.yml 并不能被识别到,后期阿里可能会修复这个问题


在云端创建了一个cloud-alibaba-config-client-dev.yaml配置文件,并且定义了config.info的配置,启动此服务器,访问接口http://localhost:3000/config/info,看是否能够读取到配置文件

然后,修改配置文件中的version为 2,再尝试访问接口


当然,对于一些特殊的操作,还是需要重启服务后才能够进行配置更新的,比如我将端口改为3002

直接访问http://localhost:3002/config/info是不通的

必须重启服务后,才会更新端口

当然,使用cloud-alibaba-config-client-dev.yaml可以写开发环境的配置,cloud-alibaba-config-client-prod.yaml可以写生产环境的配置,但是进行分类管理往往更好一些,所以我们需要知道namespacegroup的概念,我们先创建两个namespace


新建devprod两个命名空间,然后回到配置列表页,可一看到多出了两个命名空间

我们在每个命名空间下新增cloud-alibaba-config-client.yaml的配置文件,dev命名空间的配置文件内容为

config:     info: dev namespace, dev group,cloud-alibaba-config-client.yaml
复制代码

prod命名空间配置文件为

config:     info: prod namespace,prod group,cloud-alibaba-config-client.yaml
复制代码

然后,修改项目的bootstrap.yml文件为

spring:  application:    name: cloud-alibaba-config-client  cloud:    nacos:      discovery:        server-addr: localhost:8848      config:        server-addr: localhost:8848        file-extension: yaml        group: PROD_GROUP        namespace: e351a232-3e13-49e9-8453-f95f15384048#        group: DEV_GROUP#        namespace: 44dfd0e6-e3df-435b-848c-0ba064304419
server: port: 3000
management: endpoints: web: exposure: include: '*'
复制代码

我们添加了groupnamespace两个配置,分别于web端的对应

那么项目启动后,就会去查找prod命名空间下的PROD_GROUP中的cloud-alibaba-config-client.yaml的配置文件,访问http://localhost:3000/config/info可以看到,配置已经正常加载了


发布于: 2021 年 01 月 18 日阅读数: 37
用户头像

Felix

关注

还未添加个人签名 2020.12.24 加入

还未添加个人简介

评论

发布
暂无评论
SpringCloud 从入门到精通 12---Nacos配置中心