微服务配置管理

news2024/11/24 10:48:30

       小编目前大一,刚开始着手学习微服务的相关知识,小编会把它们整理成知识点发布出来。我认为同为初学者,我把我对知识点的理解以这种代码加观点的方式分享出来不仅加深了我的理解,或许在某个时候对你也有所帮助,同时也欢迎大家在评论区分享你们的观点。

       知不足而奋进,望远山而前行。  


概述

        在前面我们已经学习了远程调用,Nacos注册中心,OpenFeign以及网关这些微服务组件。但是我们现在又会面临新的问题,就是微服务、注册中心、网关之中存在许多重复配置,维护成本比较高,另外就是业务配置经常变动,每次修改都要重启服务非常麻烦,网关路由配置写死,如果变更要重启网关。那么现在我们就可以用到配置管理服务。

        配置管理服务一方面读取配置,另一方面当配置发生改变时,它也可以去推送配置变更。这时可能很多人会疑惑那我们是不是需要去学习新的东西,其实这里是不用的,我们之前使用的注册中心Nacos同时也具备配置管理服务。

        

配置共享

        那么接下来就来看一下如何运用Nacos实现配置共享,大概分为两步,第一步将一些要共享的配置添加到Nacos中。这一块直接利用Nacos提供的界面进行操作就好了。我们首先来到nacos左侧的导航栏,配置管理模块下的配置列表。

         接着我们点击右侧的+号就可以去添加一个新的配置。一共需要必填三项Data IDGroup配置内容

        Data ID 就相当于配置项的名字,分组这一块咱们先默认,因为这是第一个配置,也没什么号分组的。配置格式我们选择yaml格式,配置内容我们就把与jdbc有关的配置给CV过来,同时记得把一些可变参数都设置成待读取的变量以及可以的话给上默认值。

        我已经带你完成了jdbc的配置,那日志的配置和swagger的配置你可不可以自己尝试做一下。现在这些共享配置已经添加到了nacos。接着第二步拉取共享配置,这一块就有点复杂了。

        第二步拉取共享配置,我们要基于NacosConfig拉取共享配置代替微服务的本地配置。既然我们有了Nacos配置后,我们项目的读取配置流程就如下图,首先拉取Nacos配置,再初始化SpringCloud的上下文,接着再去加载application配置文件,完成SpringBoot上下文的初始化。

        但是这一块就出问题了,我们是把Nacos的地址写在了application.yml中,因此这一块就矛盾了,一开始我们都不知道Nacos的地址怎么去拉取Nacos的配置呢。 

        在上面这种场景下SpringCloud就会有了一个新的配置文件叫做bootstrap.yml,叫做引导配置文件,项目一开始会从它开始启动,所以我们只需要将Nacos的地址写在bootstrap中就行了。

        文件加载,拉取配置这些操作我们只需要引入对应依赖就好了。 接着我们再去新建bootstrap完成配置就好了。

        首先第一步引入依赖这一块没什么好说的。

        <!--nacos配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--读取bootstrap文件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

         接着第二步我们去编写bootstrap文件,在这个配置文件中,我们只需要定义服务名称和nacos的地址,以及定义好config中的配置文件名,file-extension定义的是nacos中配置的文件格式,shared-configs中定义的配置文件,这里设置的名字id就是我们在nacos中设置的id。

spring:
  application:
    name: cart-service # 微服务名称
  profiles:
    active: dev
  cloud:
    inetutils:
      preferred-networks: 192.168.181.139
    nacos:
      server-addr: 192.168.181.139
      config:
        file-extension: yaml
        shared-configs:
          - data-id: shared-jdbc.yaml
          - data-id: shared-log.yaml
          - data-id: shared-swagger.yaml

        这时我们再来看application.yml文件,这时我们所要书写的配置就寥寥无几了。一个是端口,一个是OpenFeign的连接池,接着就是定义我们配置的变量就好了。

server:
  port: 8082
feign:
  okhttp:
    enabled: true # 开启Okhttp连接池支持
hm:
  db:
    database: hm-cart
  swagger:
    title: "黑马商城购物车服务接口文档"
    package: com.hmall.cart.controller

        到这里我们拉取配置就完成了,接着我们启动项目观察控制台输出,我们就可以发现那三个配置文件确实被加载到了。

 

        接着测试一下功能是否还可以使用,当然也是没有问题的。 

         到此共享配置我们已经实现了。

配置热更新

        刚刚我们已经实现了Nacos配置中心的第一个功能就是配置文件的配置共享,接着我们来看一下它的第二个功能配置热更新。

        配置热更新就是当我们修改配置文件中的配置时,微服务无需重启即可使配置生效。但是要实现配置热更新我们要有一些前提条件,首先第一个要求就是nacos中要有一个与微服务名有关的配置文件。

        其实这个文件名你其实是见过的,和下面bootstrap配置只能说一模一样。

spring:
  application:
    name: cart-service # 微服务名称
  profiles:
    active: dev
  cloud:
    inetutils:
      preferred-networks: 192.168.181.139 # 允许nacos外网访问的地址
    nacos:
      server-addr: 192.168.181.139 # nacos 地址
      config:
        file-extension: yaml  # 文件后缀名
        shared-configs:  # 共享配置
          - data-id: shared-jdbc.yaml # 共享mybatis配置
          - data-id: shared-log.yaml # 共享日志配置
          - data-id: shared-swagger.yaml # 共享日志配置

         第二个要求就是微服务当中要以特定方式读取需要热更新的配置属性。这个特定方式,一个是通过之前我们经常用的Config的方式,第二个就是通过Value注解来实现。这里我就采用第一种方式。

        按照上面的步骤,首先在nacos中新增配置文件。

 

        接着第二步书写配置类,我们设置了热更新属性maxItems

@Data
@Component
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {
    private Integer maxItems;
}

        接着在使用到的地方进行替换。

private void checkCartsFull(Long userId) {
        int count = lambdaQuery().eq(Cart::getUserId, userId).count();
        if (count >= cartProperties.getMaxItems()) {
            throw new BizIllegalException(StrUtil.format("用户购物车课程不能超过{}", cartProperties.getMaxItems()));
        }
    }

       接着我们来测试一下购物车功能

        确实显示没问题,接着我们来实现动态更新,不用重启服务,我们去更改配置中属性的值,也是可以成功的,这一块不好截图,自己尝试吧。

动态路由

        之前我们都是把路由写死在了网关服务的配置文件中,但是倘若我们要更新路由,我们就得重启网关服务,但是网关服务对于一个项目来说是相当重要的,所以这一块我们要改变方案,我们要实现动态路由。

        要实现动态路由首先要将路由配置保存到Nacos,当Nacos中的路由配置变更时,推送最新配置到网关,实现更新网关中的路由信息。我们主要要完成两件事情,第一件事情监听Nacos配置变更的消息,第二件事情当配置变更时,将最新的路由信息更新到网关路由表。

        第一步监听Nacos配置变更信息其实Nacos已经给我们提供好了相应的API,我们直接使用就好了。官方文档传送入口如下:

Java SDK (nacos.io)
 

        既然我们要做网关的配置管理,所以在网关服务下也要引入相关依赖。

        <!--nacos配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--读取bootstrap文件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        接着编写bootstrap文件,这一块和我们前面实现的时差不多的,只不过不需要数据库和swagger的配置了。

spring:
  application:
    name: gateway # 微服务名称
  profiles:
    active: dev
  cloud:
    inetutils:
      preferred-networks: 192.168.181.139 # 允许nacos外网访问的地址
    nacos:
      server-addr: 192.168.181.139 # nacos 地址
      config:
        file-extension: yaml  # 文件后缀名
        shared-configs:  # 共享配置
          - data-id: shared-log.yaml # 共享日志配置


        接下来我们就使用Nacos提供好的API来实现监听和更新路由信息。

@Slf4j
@Component
@RequiredArgsConstructor
public class DynamicRouterLoader {

    private final NacosConfigManager nacosConfigManager;
    private final RouteDefinitionWriter writer;
    private final Set<String> routeIds = new HashSet<>();

    private final String dataId = "gateway-routes.json";

    private final String group = "DEFAULT_GROUP";

    @PostConstruct
    public void initRouteConfigListener() throws NacosException {
        // 1. 项目启动时,先拉去一次配置,并且添加配置监听器
        String configInfo = nacosConfigManager.getConfigService()
                .getConfigAndSignListener(dataId, group, 5000, new Listener() {
                    @Override
                    public Executor getExecutor() {
                        return null;
                    }

                    @Override
                    public void receiveConfigInfo(String configInfo) {
                        // 2. 监听到配置变更,需要去更新路由表
                        updateConfigInfo(configInfo);
                    }
                });
        // 3. 第一次读取到配置,也需要更新到路由表
        updateConfigInfo(configInfo);
    }

    public void updateConfigInfo(String configInfo) {
        log.debug("监听到路由配置信息:{}", configInfo);
        // 1. 解析配置信息,转为RouteDefinition
        List<RouteDefinition> routeDefinitions = JSONUtil.toList(configInfo, RouteDefinition.class);
        // 2. 删除旧的路由表
        for (String routeId : routeIds) {
            writer.delete(Mono.just(routeId)).subscribe();
        }
        // 3. 更新路由表
        for (RouteDefinition routeDefinition : routeDefinitions) {
            // 3.1 更新路由表
            writer.save(Mono.just(routeDefinition)).subscribe();
            // 3.2 记录路由id,便于下一次更新时删除
            routeIds.add(routeDefinition.getId());
        }
    }
}

        现在我们可以不用先去nacos配置路由信息,先启动服务,会发现根本访问不了,接着我们再去Nacos配置路由信息我们就可以实现动态路由了。 

         以上就是动态路由的相关知识,还是比较难的。

        到此微服务配置管理这一块的基本知识就到此为止了。

        带着决心起床,带着满意入睡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计选题推荐-企业人事管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Mysql(一) - 数据库操作, 表操作, CRUD

目录 一.数据库操作 1.增加数据库 2.展示数据库 3.删除数据库 4.选定数据库 二.表操作 1.增加选定数据库中的表 2.展示选定数据库中的表 3.删除选定数据库中表 4.查看选定表的字段信息 三.增加和查找 1.增加 2.查找 a.where的使用 b.分页查询 四.更新和删除 1.…

Spring及Springboot事件机制详解

程序设计的所有原则和方法论都是追求一件事——简单——功能简单、依赖简单、修改简单、理解简单。因为只有简单才好用&#xff0c;简单才好维护。因此&#xff0c;不应该以评论艺术品的眼光来评价程序设计是否优秀&#xff0c;程序设计的艺术不在于有多复杂多深沉&#xff0c;…

中资优配:“迪王”,拔得头筹!

Wind数据闪现&#xff0c;现在已有逾越190家上市公司入围券商9月“金股”组合。从举荐频次看&#xff0c;“迪王”比亚迪拔得头筹&#xff0c;阳光电源、我国移动等标的获券商密布举荐&#xff0c;医药生物等工作含“金”量高。 展望9月商场&#xff0c;券商判别&#xff0c;其…

真实:关于源代码防泄漏工作一些经验分享

互联网的飞速发展&#xff0c;各行各业都在往数字化转型&#xff0c;很多传统的业务数据都需要逐渐录入到电脑中&#xff0c;不仅节省了空间&#xff0c;还节约了成本。而这些数据都需要通过各类型的应用程序&#xff0c;进行分类&#xff0c;统计&#xff0c;展示&#xff0c;…

远程桌面连接出现身份验证错误解决方法

远程桌面身份验证错误的原因是什么&#xff1f; 在尝试远程连接到其他设备时&#xff0c;您可能会遇到身份验证错误&#xff0c;通常会弹出提示“出现身份验证错误&#xff0c;要求的函数不受支持”。这种身份验证错误通常是因为您输入的凭据与受控设备上设置的安全帐户信息不…

B端系统门门清之:CRM-客户管理系统,客户是一切的源头。

公司最宝贵的是什么&#xff0c;有人说是人才、有人说品牌、还有人说是技术&#xff0c;错&#xff0c;大错特错了&#xff0c;最宝贵的永远是客户&#xff0c;没有了客户&#xff0c;人才、品牌、技术都无从谈起。 今天分享最常见的B端系统CRM&#xff0c;那么是什么是CRM呢&…

大模型技术开发与应用

大模型技术开发与应用 LLM背景知识介绍: 大语言模型是一种人工智能模型,旨在理解和生成人类语言.大语言模型可以处理多种自然语言任务,如文本分类,问答,翻译,对话等等. 通常,大语言模型(LLM)是指包含数千亿(或更多)参数的语言模型(目前定义参数数量超过10B的模型为大语言模…

UI自动化测试 —— web端元素获取元素等待实践!

前言 Web UI自动化测试是一种软件测试方法&#xff0c;通过模拟用户行为&#xff0c;自动执行Web界面的各种操作&#xff0c;并验证操作结果是否符合预期&#xff0c;从而提高测试效率和准确性。 目的&#xff1a; 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…

注册登陆(最新版)

整体概述 本项目中&#xff0c;使用数据库连接池实现服务器访问数据库的功能&#xff0c;使用POST请求完成注册和登录的校验工作。 本文内容 本篇将介绍同步实现注册登录功能&#xff0c;具体的涉及到流程图&#xff0c;载入数据库表&#xff0c;提取用户名和密码&#xff0…

AquaCrop模型数据制备、优化方法、敏感性与气候变化影响分析及源码解析

AquaCrop是由世界粮食及农业组织&#xff08;FAO&#xff09;开发的一个先进模型&#xff0c;旨在研究和优化农作物的水分生产效率。这个模型在全球范围内被广泛应用于农业水管理&#xff0c;特别是在制定农作物灌溉计划和应对水资源限制方面显示出其强大的实用性。AquaCrop 不…

PySide6复杂C/S系统开发

PySide6复杂C/S系统开发 目录 0.了解 1.前提 2.实际代码&#xff08;继承QGraphicsview修改&#xff09; 0.了解 之前写了一篇“PySimpleGUI复杂C/S系统开发”博客&#xff08;由于pysimplegui更改了协议&#xff0c;因此不再推荐&#xff0c;用了pyside6后yyds&#xff09…

Transiting from CUDA to HIP (二)

一、Identifying Architecture Features 1. HIP_ARCH Defines 在 CUDA 编程中&#xff0c;__CUDA_ARCH__ 是一个预定义的宏&#xff0c;用于指示当前编译的代码所针对的 NVIDIA GPU 的计算能力&#xff08;Compute Capability&#xff09;。开发者可以使用这个宏来编写条件代…

Xinstall助力App推广:全方位支持,精准数据分析,你值得拥有

在如今的移动互联网时代&#xff0c;App推广已成为每个应用开发者必须面对的重要课题。然而&#xff0c;推广过程中往往伴随着诸多痛点&#xff0c;如数据混乱、投放盲目、决策滞后以及作弊困扰等。这些问题不仅影响了推广效果&#xff0c;还可能导致资源的浪费和投入产出不均衡…

数据安全认证来了解一下

随着数据安全法及个人信息保护法的实施&#xff0c;数据安全相关岗位在安全行业变得极为热门。 根据数据安全法第二十条&#xff0c;国家鼓励教育、科研机构和企业等开展数据开发利用技术和数据安全相关的教育和培训&#xff0c;采用多种途径培育专业人才&#xff0c;促进人才…

【Linux】使用Linux实现小程序 - 进度条

目录 一、缓冲区二、回车换行的概念三、进度条的设计3.1 版本1&#xff08;没有配合场景&#xff09;3.2 版本2&#xff08;配合场景&#xff09;3.3 版本3&#xff08;美化进度条&#xff09; 结尾 一、缓冲区 C/C语言&#xff0c;会针对标准输出&#xff0c;给我们提供默认的…

c++----杨辉三角(补充)

大家好。今天我给大家带来的是&#xff0c;我们以前讨论过的知识点。杨辉三角。我相信大家在c的学习中已经清楚的了解和认识到了杨辉三角的实现逻辑和实现方法了。但是应该大多局限于在c中吧。我们都知道我们c与c其实在一些地方是可以相互成就的。那么我们在c中的经典题目杨辉三…

自定义实现log4j的appender

log4j&#xff0c;应用最广泛的日志框架。其作者后来推出logback&#xff0c;也是好选择。不多说废话。 log4j组件介绍 Log4j主要有三个组件&#xff1a; Logger&#xff1a;负责供客户端代码调用&#xff0c;执行debug(Object msg)、info(Object msg)、warn(Object msg)、err…

oracle----undo表空间

文章目录 undo表空间概念和作用undo表空间主要用于解决&#xff1a;1.1 读一致性1.2 回滚事务1.3 实例恢复 undo表空间操作查看UNDO表空间查看UNDO 参数查看undo表空间文件位置 undo表空间概念和作用 对于DML语句&#xff0c;只要修改了数据块&#xff0c;数据库就会把修改前的…

使用Amazon SageMaker JumpStart微调Meta Llama 3.1模型以进行生成式AI推理

文章目录 使用Amazon SageMaker JumpStart微调Meta Llama 3.1模型以进行生成式AI推理Meta Llama 3.1SageMaker JumpStartSageMaker JumpStart中Meta Llama 3.1模型的微调配置使用SageMaker JumpStart UI进行无代码微调使用SageMaker JumpStart SDK进行微调结论 使用Amazon Sage…