• Java Spring Cloud XXIII 之 配置中心


    Java Spring Cloud XXIII 之 配置中心

    配置中心

    1.配置中心简介

    所谓配置中心:将项目需要的配置信息保存在配置中心,需要读取时直接从配置中心读取,方便配置管理的微服务工具

    我们可以将部分yml文件的内容保存在配置中心

    一个微服务项目有很多子模块,这些子模块可能在不同的服务器上,如果有一些统一的修改,我们要逐一修改这些子模块的配置,由于它们是不同的服务器,所以修改起来很麻烦

    如果将这些子模块的配置集中在一个服务器上,我们修改这个服务器的配置信息,就相当于修改了所有子模块的信息,这个服务器就是配置中心

    使用配置中心的原因就是能够达到高效的修改各模块配置的目的

    2.配置中心的使用

    Nacos既可以做注册中心,也可以做配置中心

    Nacos做配置中心,支持各种格式\类型的配置文件

    properties\yaml(yml)\txt\json\xml等

    3.Nacos数据结构

    请添加图片描述
    namespace:命名空间

    group:分组

    Service/DataId:具体数据

    命名空间

    namespace是Nacos提供的最大的数据结构

    一个Nacos可以创建多个命名空间

    一个命名空间能够包含多个group

    在nacos中创建命名空间
    请添加图片描述
    在上图连接的位置可以新增命名空间,填写命名空间名称和描述即可

    Nacos有默认的命名空间public不能删除和修改

    添加命名空间后,我们在Nacos中注册的服务或添加的配置就可以指定命名空间了

    因为多个命名空间可以隔离项目,每个项目使用自己的命名空间,互不干扰
    请添加图片描述
    分组

    一个命名空间中可以有多个分组,进行进一步分离

    我们使用时,如果不需要进一步分组,推荐使用group名称:DEFAULF_GROUP

    服务或配置

    确定了命名空间和分组之后

    我们就可以添加服务或配置了

    之前我们启动的各种模块都是服务,之前都是默认保存在public命名空间中

    下面我们主要使用配置中心的功能,在命名空间中添加配置

    添加配置就是设置DataId

    实际在Nacos中定位一个配置的结构为

    Namespace>Group>DataId

    4.Nacos添加配置

    Nacos首页->配置管理->配置列表->添加配置(右侧的大"+"号)
    请添加图片描述
    添加cart模块数据库连接配置
    请添加图片描述
    点击发布,nacos就保存这个配置了

    5.项目读取配置

    如果要读取配置中心的信心,首先要添加依赖

    
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    dependency>
    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-bootstrapartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    像其他程序一样,在添加完依赖之后,还需要添加yml文件的配置

    我们使用过application.properties和application.yml两种配置文件添加配置

    实际上这两个配置文件加载是有顺序的

    先加载yml

    后加载properties

    如果两个配置文件同时设置了同一个属性,后加载的覆盖掉先加载的

    在SpringCloud环境下,实际上可以再多出一组配置文件

    它们是bootstarp.yml和bootstarp.properties

    这一组的加载时机整体早于application这一组

    所以一个SpringCloud项目加载配置文件的顺序最终可能如下图
    请添加图片描述
    bootstrap这组配置文件,一般用于配置加载一些系统级别的配置,这些配置的特征是一般不会轻易修改

    我们再后面的学习过程中,会将配置中心的信息,加载到这组配置文件中

    必须是SpringCloud项目,才能支持bootstrap这组配置文件的加载

    支持这组配置的依赖就是上面我们添加的依赖

    
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-bootstrapartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意SpringCloud版本早于2020之前,添加的不是这个依赖,可以自行查询

    下面我们就在cart-webapi项目中resources文件夹中添加bootstarp.yml文件

    spring:
      cloud:
        nacos:
          config:
            #  指定配置中心的位置
            server-addr: 192.168.137.150:8848
            # 指定配置文件所在的组名(命名空间默认public不需要指定)
            group: DEFAULT_GROUP
            # 设置配置文件的后缀名
            # 默认情况下会加载[服务器名].[后缀名]为DataId的配置
            # 当前项目名称为nacos-cart所以默认加载的DataId为:nacos-cart.yaml
            file-extension: yaml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    如果一切顺利,那么cart模块是可以通过knife4j测试操作连接数据库的

    我们可以新增购物车信息,或删除购物车信息后简单数据库是否有对应操作

    因为我们已经删除了本地yml文件中数据库的配置,所以,它能连接操作数据库一定是配置中心生效了!

    6.使用RestTemplate调用远程控制层方法

    我们现在项目中使用的RPC远程调用技术是Dubbo

    实际上除了Dubbo技术之外,还有很多远程调用的方法

    它们有些调用的思想都和Dubbo完全不同

    Dubbo是SpringCloudAlibaba提供的功能强大的RPC框架

    但是Dubbo功能也有限制,如果我们想调用的方法不是我们当前项目的组件或功能,甚至想调用的方法不是java编写的,那么Dubbo就无能为力了

    我们可以使用RestTemplate来调用任何语言编写的公开的控制器路径

    也就是只要能够使用浏览器访问的路径,我们都可以使用RestTemplate发送请求,接收响应

    使用步骤如下

    步骤1:

    先在调用的发起方,也就是使用RestTemplate发起请求的项目配置文件中,向Spring容器注入一个该类型对象

    的类型,SpringBoot配置类都可以添加下面代码,我们选择SpringBoot启动类添加如下代码

    @Bean
    // 负载均衡的注解,编写之后采用负载均衡算法
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    步骤2:

    我们要确定要调用的控制器方法,这个方法必须是GetMapping

    我们修改CartController中删除购物车的方法为@GetMapping 为了测试

    我们本地stock模块减少库存的方法中使用RestTemplate调用删除购物车商品的方法

    在StockController类中编写代码如下

    @Autowired
    private RestTemplate restTemplate;
    //.....
    public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    
            // 这里发送RestTemplate请求
            // 调用cart模块的删除购物车的方法
            // 先确定要调用的路径
            String url="http://localhost:20001/base/cart/delete" +
                    "?userId={1}&commodityCode={2}";
            // 再发起调用
            // getForObject参数1请求的路径   参数2返回类型的反射
            // 从参数3开始是url中{1} 占位符的值 参数4是{2}的值 以此类推
            JsonResult jsonResult=restTemplate.getForObject(url,JsonResult.class,
                    "UU100",
                    stockReduceCountDTO.getCommodityCode());
            System.out.println(jsonResult);
            stockService.reduceCommodityCount(stockReduceCountDTO);
            return JsonResult.ok("商品库存减少完成!");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    步骤3:

    发送测试

    将相关的模块都启动

    cart\stock

    调用stock模块减少库存的方法

    运行后检查购物车中减少库存的商品是否会被删除

    如果删除了证明调用成功了

    我是将军;我一直都在,。!

  • 相关阅读:
    阿里云轻量服务器使用
    docker安装mysql数据库,忽略大小写,设置时区
    Hadoop NameNode执行命令工作流程
    应急物资管理系统-完善应急物资保障体系
    可移植性测试包括哪些
    工厂方法设计模式是什么?什么是 Factory Method 工厂方法设计模式?Python 工厂方法设计模式示例代码
    一个敏感词检查功能是怎么来的
    全志V853芯片 如何在Tina V85x平台切换sensor?
    市面上真正的全光谱灯品牌有哪些?全光谱护眼照明灯的作用很明显
    本地搭建svn服务器及TortoiseSVN的基本使用
  • 原文地址:https://blog.csdn.net/letterljhx/article/details/126987870