在引入nacos前,先了解一下nacos的几个简单概念,如下:

命名空间(Namespace),配置分组(Group),配置集(Data ID),其中命名空间和配置分组,主要可以用来做服务和环境的隔离,而配置集则主要用来抽离服务配置,比如说把一些公共的配置抽离成配置集,避免重复的写在每个nacos服务创建的配置中,由于用来测试的几个服务比较简单,所以就不抽离配置集了,下来演示一下,用命名空间来划分服务,用配置分组来划分环境的nacos配置中心使用场景。

目前来说,每个服务的配置文件都需要在配置中心维护,避免因为要修改配置文件而引起繁琐的重启操作。所以在mall-common模块中引入Nacos Config的依赖,如下:

<!--配置中心nacos-config-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

接下里使用mall-product项目来做个测试,在mall-product项目的resources目录下新建一个bootstrap.properties文件作为分布式配置中心所需的配置文件,为什么要建这个文件,这里涉及到一个一个配置文件的优先级,从高到低依次是bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml,所以建就建个最高的bootstrap.properties文件。

假设mall-product项目现在有3种环境,dev(开发),test(测试),prod(生产),启动配置中心nacos,为mall-product项目添加相应配置,如下:

先新建一个命名空间,名字就用项目名,一个命名空间对应一个项目,如下:

nacos namespace创建_配置文件

然后在该命名空间下新建3个配置文件,配置分组分别为dev,test,prod,对应3个环境,如下:

nacos namespace创建_spring_02

接下来拿dev环境下的配置信息,来做测试,如下:

nacos namespace创建_spring_03

在mall-product项目的bootstrap.properties文件中添加如下信息:

#指定配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定项目名
spring.application.name=mall-product
#指定命名空间
spring.cloud.nacos.config.namespace=557d643c-03df-43f7-a134-31d5b83e9019
#指定配置文件分组
spring.cloud.nacos.config.group=dev

然后修改下ProductController的接口,读取nacos上的dev环境的配置信息,用来做测试,如下:

package com.example.mallproduct.controller;

import com.example.mallcommon.domain.Product;
import com.example.mallproduct.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope//在需要动态读取配置的类上添加此注解就可以实现动态刷新功能
public class ProductController {

    @Autowired
    private ProductService productService;

    @Value("${product.name}")
    private String name;

    //商品信息查询
    @GetMapping("/product/{pid}")
    public Product findById(@PathVariable("pid") Integer pid) {
        Product product = productService.findByPid(pid);
        return product;
    }

    @GetMapping("/get")
    public String get() {
        return name;
    }
}

访问http://localhost:10010/get,返回结果为:

nacos namespace创建_配置文件_04

在nacos上修改属性值为苹果,不重启服务,再次访问,结果如下:

nacos namespace创建_spring_05

可以发现已经实现了配置动态更新的功能。

通过以上测试案例,就可以使用命名空间配合上配置分组,把每个微服务的配置在nacos隔离开做维护,同时配置也更清晰和易查找,不过个人理解,不是所有的配置都放到配置中心上就是好的,把一些可能会改动的配置项放到配置中心即可,项目好歹留些配置信息做保底,当然了配置中心也是要高可用的。

PS:如果发现Nacos一直读取不到配置文件,记得使用重启大法。还有就是建议不要使用一些默认存在的配置项来做动态刷新的测试,这样可能不会触发动态刷新。