服务配置:实现动态刷新与配置共享

 

服务配置:实现动态刷新与配置共享插图亿华云

基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务。

同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。

在消息服务章节,我们介绍了MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比,在项目中整合了RocketMQ,并给大家介绍了RocketMQ的核心技术。

在服务配置章节,我们首先介绍了服务配置与Nacos作为配置中心的相关概念,并在项目中整合了Nacos配置中心。接下来,就基于Nacos实现动态刷新与配置共享。

本章总览​

服务配置:实现动态刷新与配置共享插图1亿华云

注意:本章中在测试每个案例时,都需要启动Nacos,Sentinel,ZipKin和RocketMQ。​

细心的小伙伴可能已经发现了,之前我们将微服务的配置放入了Nacos,但是此时如果在Nacos中修改了配置,程序是无法读取到修改后的配置的。所以,我们需要实现动态刷新的功能。

「注意:为了描述上的简便,这里,我们就以用户微服务举例说明,其他微服务的实现方式都是一样的。」

修改Nacos配置

在Nacos中修改server-user-dev.yaml的配置,在server-user-dev.yaml配置中新增如下内容。

author:

name: binghe

如下所示。

服务配置:实现动态刷新与配置共享插图2亿华云服务配置:实现动态刷新与配置共享插图3亿华云

点击发布后会弹出如下提示。

服务配置:实现动态刷新与配置共享插图4亿华云服务配置:实现动态刷新与配置共享插图5亿华云

直接点击确认发布即可。

通过IOC容器获取Nacos配置

(1)在用户微服务shop-user的io.binghe.shop.user.controller包下新建NacosController类,并在NacosController类中注入org.springframework.context.ConfigurableApplicationContext类,通过ConfigurableApplicationContext获取到系统环境变量,并从环境变量中获取到author.name属性的值,就是我们在Nacos中配置的作者姓名,如下所示。

/**

* @author binghe

* @version 1.0.0

* @description 从Nacos中获取配置项

*/

@Slf4j

@RestController

public class NacosController {

@Autowired

private ConfigurableApplicationContext context;

@GetMapping("/nacos/test")

public String nacosTest(){

String authorName = context.getEnvironment().getProperty("author.name");

log.info("获取到的作者姓名为:{}", authorName);

return authorName;

}

}

(2)启动用户微服务和网关服务,并在浏览器中输入http://localhost:10001/server-user/user/nacos/test,如下所示。

服务配置:实现动态刷新与配置共享插图6亿华云服务配置:实现动态刷新与配置共享插图7亿华云

可以看到,能够正确读取到Nacos中的配置信息。

(3)修改Nacos中server-user-dev.yaml的配置,将author.name的值修改为binghe001,如下所示。

服务配置:实现动态刷新与配置共享插图8亿华云服务配置:实现动态刷新与配置共享插图9亿华云

点击发布。

(4)发布后,不要重启用户微服务和网关服务,在浏览器上刷新http://localhost:10001/server-user/user/nacos/test链接,发现读取到的信息已经变成了binghe001,如下所示。

服务配置:实现动态刷新与配置共享插图10亿华云服务配置:实现动态刷新与配置共享插图11亿华云

可以看到,通过IOC容器能够读取到Nacos中修改后的配置。

通过注解获取Nacos配置

(1)在用户微服务shop-user的io.binghe.shop.user.controller.NacosController类上添加@RefreshScope注解,并将Nacos中的author.name的值注入到NacosController类中,并通过接口获取到注入的Nacos中的author.name值,如下所示。

/**

* @author binghe

* @version 1.0.0

* @description 从Nacos中获取配置项

*/

@Slf4j

@RefreshScope

@RestController

public class NacosController {

@Autowired

private ConfigurableApplicationContext context;

@Value("${author.name}")

private String nacosAuthorName;

@GetMapping("/nacos/test")

public String nacosTest(){

String authorName = context.getEnvironment().getProperty("author.name");

log.info("获取到的作者姓名为:{}", authorName);

return authorName;

}

@GetMapping("/nacos/name")

public String nacosName(){

log.info("从Nacos中获取到的作者的姓名为:{}", nacosAuthorName);

return nacosAuthorName;

}

}

(2)启动用户微服务和网关服务,并在浏览器中输入http://localhost:10001/server-user/user/nacos/name,如下所示。

服务配置:实现动态刷新与配置共享插图12亿华云

(3)修改Nacos中server-user-dev.yaml的配置,将author.name的值修改为binghe002,如下所示。

服务配置:实现动态刷新与配置共享插图13亿华云

(4)发布后,不要重启用户微服务和网关服务,在浏览器上刷新http://localhost:10001/server-user/user/nacos/name链接,发现读取到的信息已经变成了binghe002,如下所示。

服务配置:实现动态刷新与配置共享插图14亿华云

说明使用注解的方式也能够读取到Nacos中更新后的配置信息。

注意:虽然通过IOC容器和注解都能够读取到Nacos中更新后的配置信息,但是在实际项目中,推荐使用注解的方式获取Nacos中更新后的配置信息。

实现配置共享​

一般情况下,开发项目的过程中会包含:开发环境、测试环境、预发布环境和生成环境,每个环境中的配置大部分是相同的,有少部分配置不同,如果我们能够将大部分相同的配置抽取出来,让同一个微服务在不同的环境中共享,则能够大大降低我们的维护成本。

另外,如果使用的是相同的技术栈的话,对于每个微服务来说,可能大部分的配置也是相同的,如果我们将这些相同的配置抽取出来让各个微服务共享,则能够进一步降低维护成本。

所以,实现配置共享可以从

THE END
Copyright © 2024 亿华云