分布式配置中心Nacos

news2024/10/6 8:58:49

文章目录

  • 一、Nacos分布式配置中心
    • 1、使用分布式配置中心的优点
    • 2、Nacos配置中心和应用间的数据同步的三种模式
    • 3、Namespace命名空间
    • 4、DataID配置
    • 5、Group配置
  • 二、Nacos分布式配置中心的使用
    • 1、将应用对接Nacos配置中心
    • 2、Nacos实现配置动态刷新@RefreshScope
    • 3、Dubbo服务对接分布式配置中心
  • 三、搭建Nacos集群
    • 1、Nacos集群介绍
    • 2、Nacos使用MySQL实现数据持久化
    • 3、Docker搭建Nacos集群及配置
    • 4、使用Nginx作为负载均衡访问Nacos集群
  • 总结

一、Nacos分布式配置中心

1、使用分布式配置中心的优点

  1. 支持配置文件的动态更新:在实际的业务开发过程中,需要动态地更新配置文件,比如切换业务功能开关、变更图片服务器地址、变更数据库连接信息等。在传统配置模式下,需要修改本地配置文件并重新打包,然后重启应用并发布,这样才能保证配置文件能够生效。但这样会导致该服务在重启阶段不可用,从而影响服务整体的可用率。
  2. 支持配置集中式管理:在微服务架构中,为了保证某些核心服务的高性能会部署几百个节点。如果在每个节点上都维护一个本地配置文件,则不管是对运维人员或者开发人员而言,成本都是巨大的。
  3. 支持多环境部署:如果通过底层框架来维护不同环境的信息,则成本也是非常高的。

2、Nacos配置中心和应用间的数据同步的三种模式

  1. Pull模式:让应用开后长轮询,即定时地从配置中心拉取最新的配置信息,并更新到应用的内存中。

    长轮询:一般由客户端向服务器发出一个设置较长的网络超时时间的HTTP请求,并在HTTP连接超时前,不主动断开连接;待客户端超时或有数据返回后,再次建立一个同样的HTTP请求,重复以上过程。即会持续与服务器建立连接。

  2. Push模式:在配置中心的配置数据变更之后,主动推送配置数据到指定的应用,应用更新到本地内存中。

  3. 混合模式:应用和配置中心通过“事件机制+监听器”模式保持长连接。如果应用监听的配置信息发生了变化,则配置中心发布对应类型的事件。应用只有在监听到该事件之后,才会处理对应的配置信息,并更新到应用本地。

3、Namespace命名空间

  1. 在微服务体系中,一个系统往往被拆分为多个服务,每个服务都有自己的配置文件,然后每个系统往往还会准备开发环境、测试环境、正式环境。
  2. 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。默认namespace=public的保留空间,不支持删除;默认情况下。
  3. Nacos给的最佳实践表明,最外层的namespace是可以用于区分部署环境的,比如test,dev,prod等。
    即Nacos组件Namespace命名空间的主要作用是多环境下的配置隔离和管理
  4. 在命名空间中创建不同的部署环境
    在这里插入图片描述
  5. 在配置列表中切换不同的命名空间(部署环境)
    在这里插入图片描述

4、DataID配置

  1. Nacos 中的某个配置集的 ID,配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。
    在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集。
  2. DataID的拼接格式:prefix - spring.profiles.active . file-extension
    1)prefix:默认为 spring.application.name 的值。
    2)spring.profiles.active:即为当前环境对应的 profile。
    3)file-extension:文件后缀
  3. 当activeprofile为空时。DataID的拼接格式:prefix . file-extension
  4. 在配置列表中点击右上角的+号,即可新建配置,将application.yml文件中的配置复制到上面即可。
    在这里插入图片描述

5、Group配置

  1. Nacos中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串对配置集进行分组,从而区分Data ID相同的配置集。当您在 Nacos上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP 。
  2. 通过Group实现环境区分
    在这里插入图片描述
    即不同的系统或微服务的配置文件可以放在一个组里。比如用户系统和订单系统的配置文件都可以放在同个组中。

二、Nacos分布式配置中心的使用

1、将应用对接Nacos配置中心

  1. 在父工程中,右键创建新模块cloud-nacos-config3344
    在这里插入图片描述

  2. 在cloud-nacos-config3344中,添加如下依赖

    <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>
    
  3. 在cloud-nacos-config3344中,创建主启动类NacosConfigMain3344

    package com.zzx;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    /**
     * 主启动类
     */
    @SpringBootApplication
    @Slf4j
    @EnableDiscoveryClient
    public class NacosConfigMain3344 {
        public static void main(String[] args) {
            SpringApplication.run(NacosConfigMain3344.class,args);
            log.info("*********  NacosConfigMain3344 启动成功  *********");
        }
    }
    
    
  4. 在cloud-nacos-config3344中,创建ConfigController

    package com.zzx.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/nacos")
    public class ConfigController {
    
        @Value("${nacos.config}")
        private String config;
        @GetMapping("/config")
        public String config(){
            return config;
        }
    }
    
    
  5. 在cloud-nacos-config3344的resources中,创建bootstrap.yml

    server:
      port: 3344
    
    
    spring:
      application:
        name: nacos-config
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.126.32:8848
          config:
            # 服务器地址
            server-addr: 192.168.126.32:8848
            # 默认为Public命名空间,可以省略不写
            # 建立的命名空间需要指定对应的UUID
            namespace: aef5fb65-364c-4b6a-9d43-56d20c121301
            # 指定文件后缀
            file-extension: yaml
            #文件名 -- 如果没有配置则默认为 ${spring.appliction.name}
            prefix: ${spring.application.name}
            #指定配置群组 --如果是Public命名空间 则可以省略群组配置
            group: DEFAULT_GROUP
      profiles:
        active: dev
    
    
  6. 在Nacos中新建一个配置nacos-config-dev.yaml,用来测试是否能从nacos中拉取配置
    在这里插入图片描述

  7. 启动NacosConfigMain3344,在浏览器访问:http://localhost:3344/nacos/config
    在这里插入图片描述

2、Nacos实现配置动态刷新@RefreshScope

  1. 即在对应Controller类上面添加上一个@RefreshScope
    此时在ConfigController类上面添加上一个@RefreshScope
  2. 重启该项目,然后在Nacos上面修改配置信息
    在这里插入图片描述
  3. 在浏览器测试,动态刷新是否生效:http://localhost:3344/nacos/config
    在这里插入图片描述

3、Dubbo服务对接分布式配置中心

  1. 将duubo服务的消费者和生产者的application.yml文件,配置到nacos中,然后将application.yml文件删除。
    在这里插入图片描述

  2. 在cloud-dubbo-consumer-order80的resources中,创建bootstrap.yml文件,配置nacos即可

    spring:
      main:
        allow-bean-definition-overriding: true
        allow-circular-references: true
      application:
        name: order-consumer-dubbo
      cloud:
        nacos:
          config:
            # 服务器地址
            server-addr: 192.168.126.32:8848
            # 默认为Public命名空间,可以省略不写
            # 建立的命名空间需要指定对应的UUID
            namespace: aef5fb65-364c-4b6a-9d43-56d20c121301
            # 指定文件后缀
            file-extension: yaml
            #文件名 -- 如果没有配置则默认为 ${spring.appliction.name}
            prefix: ${spring.application.name}
            #指定配置群组 --如果是Public命名空间 则可以省略群组配置
            group: DEFAULT_GROUP
      profiles:
        active: dev
    
    
  3. 在cloud-dubbo-provider-payment8001的resources中,创建bootstrap.yml文件,配置nacos即可

    spring:
      main:
        allow-bean-definition-overriding: true
        allow-circular-references: true
      application:
        name: payment-provider-dubbo
      cloud:
        nacos:
          config:
            # 服务器地址
            server-addr: 192.168.126.32:8848
            # 默认为Public命名空间,可以省略不写
            # 建立的命名空间需要指定对应的UUID
            namespace: aef5fb65-364c-4b6a-9d43-56d20c121301
            # 指定文件后缀
            file-extension: yaml
            #文件名 -- 如果没有配置则默认为 ${spring.appliction.name}
            prefix: ${spring.application.name}
            #指定配置群组 --如果是Public命名空间 则可以省略群组配置
            group: DEFAULT_GROUP
      profiles:
        active: dev
    
    
  4. 在cloud-dubbo-consumer-order80的POM文件中,再添加如下依赖

    <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    
  5. 在cloud-dubbo-provider-payment8001的POM文件中,再添加如下依赖

    <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    
  6. 只需要启动dubbo的生产者和消费者服务即可测试
    在这里插入图片描述

三、搭建Nacos集群

1、Nacos集群介绍

  1. 默认Nacos使用嵌入式数据库Derby实现数据的存储。如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
  2. Nacos支持三种部署模式
    1)单机模式 - 用于测试和单机试用。
    2)集群模式 - 用于生产环境,确保高可用。
    3)多集群模式 - 用于多数据中心场景。

2、Nacos使用MySQL实现数据持久化

  1. 在虚拟机中使用Docker容器快速搭建MySQL:docker run --name mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

  2. 在navicat中连接该MySQL数据库
    在这里插入图片描述

  3. 新建一个数据库nacos
    在这里插入图片描述

  4. 因为Nacos是使用Docker容器部署的
    1)进入到Nacos容器中:docker exec -it nacos bash
    2)进入到Nacos的conf目录中:cd conf
    3)查看mysql-shema.sql:cat mysql-schema.sql
    4)在刚刚创建的nacos数据中新建查询,将结果复制到上面,执行运行即可
    在这里插入图片描述
    5)成功之后就会出现这些表
    在这里插入图片描述

  5. 修改nacos的配置文件
    1)将nacos的配置文件进行备份:cp application.properties application.properties.bak
    2)修改配置文件:vim application.properties

    spring.datasource.platform=mysql
    db.num=${MYSQL_DATABASE_NUM:1}
    db.url.0=jdbc:mysql://192.168.126.32:${MYSQL_SERVICE_PORT:3306}/nacos?${MYSQL_SEERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&auttoReconnect=true&useSSL=false}
    db.user.0=root
    db.password.0=123456
    
    

3)重启nacos:docker restart nacos,可能需要等几分钟才能访问,然后配置用MySQL数据库进行集中存储后,会直接从存储在Derby嵌入式数据库,改成存储在MySQL数据库中。
在这里插入图片描述

3、Docker搭建Nacos集群及配置

  1. 使用Docker创建三个Nacos,使用不同的端口号,模拟搭建Nacos集群(确保mysql已经启动)
    1)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -p 8848:8848 -p 9848:9848 -p 9849:9849 --name nacos1 --restart=always nacos/nacos-server:v2.2.0
    2)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -p 8858:8858 -p 9858:9858 -p 9859:9859 --name nacos2 --restart=always nacos/nacos-server:v2.2.0
    3)docker run -it -e PREFER_HOST_MODE=192.168.126.32 -e MODE=cluster -e NACOS_SERVERS="192.168.126.32:8848 192.168.126.32:8858 192.168.126.32:8868" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=192.168.126.32 -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=123456 -p 8868:8868 -p 9868:9868 -p 9869:9869 --name nacos3 --restart=always nacos/nacos-server:v2.2.0
  2. 修改nacos2的默认端口
    1)进入到nacos2容器中:docker exec -it nacos2 bash
    2)进入到nacos2的conf目录中:cd conf
    3)修改nacos配置文件:vim application.properties
    server.port=${NACOS_APPLICATION_PORT:8858}
    
    4)退出容器:ctrl + p + q
  3. 修改nacos3的默认端口
    1)进入到nacos3容器中:docker exec -it nacos3 bash
    2)进入到nacos3的conf目录中:cd conf
    3)修改nacos配置文件:vim application.properties
    server.port=${NACOS_APPLICATION_PORT:8868}
    
    4)退出容器:ctrl + p + q
  4. 重启nacos2、nacos3:docker restart nacos2/3,浏览器访问8848、8858、8868端口的nacos服务
    在这里插入图片描述

4、使用Nginx作为负载均衡访问Nacos集群

  1. 安装Nginx环境:yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel

  2. 下载nginx:http://nginx.org/download/nginx-1.22.1.tar.gz

  3. 将nginx通过mobax上传到/opt目录下,解压到/usr/local目录中:tar -zxvf /opt/nginx-1.22.1.tar.gz -C /usr/local

  4. 安装Nginx:
    1)检查生成.md文件:/usr/local/nginx-1.22.1/configure
    2)编译安装nginx:make && make install

  5. 修改nginx.conf文件:vim /usr/local/nginx/conf/nginx.conf

    #定义upstream名字,下面会引用
    upstream  nacos{  
        #指定后端服务器地址
        server 192.168.126.32:8848;    
        server 192.168.126.32:8858; 
        server 192.168.126.32:8868;   
    }
     
    server {
     listen 80;
     server_name localhost;
     location / {
       proxy_pass http://nacos;    #引用upstream
      }
    }
    
  6. 启动nginx:/usr/local/nginx/sbin/nginx

  7. 在浏览器访问nginx:http://192.168.126.32/nacos
    在这里插入图片描述

总结

  1. 即Namespace可以实现部署环境的区分,而DataID可以实现微服务的区分,而Group可以将多个微服务归属于同一个组。
  2. SpringBoot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application。也就是说从nacos拉取配置后,bootstrap.yml配置会被application.yml的相同配置覆盖掉。即低优先级覆盖高优先级。
  3. SpringCloudConfig需要启动Config服务,而Nacos不需要启动Nacos,直接配置即可。但是需要每个项目都引入Nacos的Config依赖。即SpringCloudConfig是作为一个微服务注册到Eureka中,由其他微服务去间接调用,但是Nacos的Config是每个微服务都可以直接配置调用。

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

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

相关文章

QT--day6(人脸识别、图像处理)

人脸识别&#xff1a; /***********************************************************************************头文件****************************************************************************************/#ifndef WIDGET_H #define WIDGET_H#include <QWidget>…

HCIP期中实验

考试需求 1 、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 OSPF 协议…

汽车销售企业消费税,增值税高怎么合理解决?

《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 汽车行业一直处于炙手可热的阶段&#xff0c;这是因为个人或者家庭用车的需求在不断攀升&#xff0c;同时随着新能源的技术进一步应用到汽车领域&#xff0c;一度实现了汽车销量的翻倍。…

JavaSE类和对象(2)(重点:封装、包、static静态变量和方法)

目录 一、封装 1.封装&#xff1a;从语法来看&#xff0c;就是被private修饰的成员变量或者成员方法。只能在当前类当中使用。 2.快捷键&#xff0c;自动生成set或者get方法 3.限定访问修饰符&#xff08;private、 protected、public&#xff09; public&#xff1a;可以理…

python数学建模_2:灰色预测模型(GM(1,1))使用文档

灰色预测模型(GM(1,1))使用文档简介使用时机处理数据类型函数说明使用示例注意事项具体项目 灰色预测模型(GM(1,1))使用文档 简介 灰色预测模型(GM(1,1))是灰色系统理论的重要部分&#xff0c;常用于对包含不确定性的系统进行建模和预测。 使用时机 当数据量较小&#xff0…

树莓派通过天线+gps获取经纬度并调用高德地图api在地图上标点

完整项目为《基于机器视觉的行人和路面缺陷检测及其边缘设备部署》 完整功能视频演示地址&#xff1a;本科最后的课设&#xff1a;“车载系统的辅助系统——基于机器视觉的行人和路面缺陷检测”完结撒花*罒▽罒*_哔哩哔哩_bilibili 该博客介绍的功能为&#xff1a; 1&#xff1…

VS下开发Qt应用环境搭建

VS下开发Qt应用环境搭建 版本说明环境搭建步骤QT新增组件重新安装QTVS中的配置 版本说明 vs2019 QT5.14 我之前是按照QT基础组件的安装&#xff0c;但是这个安装只是最基础的组件&#xff0c;如果想要在VS中使用QT&#xff0c;还得安装其他组件&#xff0c;下面的安装流程、 …

轻松解决宝塔面板设置了授权IP访问,但是IP变动导致访问不了面板

为了宝塔面板的安全与隐蔽性&#xff0c;我们很多站长会设置授权IP&#xff0c;授权IP的作用是&#xff1a;设置访问授权IP,多个请使用逗号(,)隔开;注意&#xff1a;一旦设置授权IP,只有指定IP的电脑能访问面板! 但是很多站长不是通过专用的虚拟通道访问&#xff0c;用的都是宽…

【Python系列】Python基础语法轻松入门—从变量到循环

目录 写在前面 语法介绍 变量 数据类型 整数 浮点数 字符串 列表 元组 字典 运算符 算术运算符 比较运算符 逻辑运算符 条件语句 循环语句 图书推荐 图书介绍 参与方式 中奖名单 写在前面 Python 是一种高级、解释型的编程语言&#xff0c;具有简单易学…

恒心工程PMO运作实践︱恒丰银行苏州分行行长(拟)姜兆华

恒丰银行股份有限公司苏州分行党委书记、行长&#xff08;拟&#xff09;&#xff0c;原总行金融科技部副总经理、恒心工程PMO办公室主任姜兆华先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;恒心工程PMO运作实践——以商业银行核…

京东的成功秘诀:找到自己独特而有效的商业模式

你知道京东为什么能够从一个卖电器的小网站发展成为中国最大的电商平台吗&#xff1f;如果京东一开始靠卖电器赚钱&#xff0c;不可能有今天&#xff0c;在十几年刘强东刚创业的时候&#xff0c;如果京东靠卖电器赚钱&#xff0c;你知道想当年的国美黄光裕和想当年的苏宁的张近…

磁盘均衡器:HDFS Disk Balancer

HDFS Disk Balancer 背景产生的问题以及解决方法 hdfs disk balancer简介HDFS Disk Balancer功能数据传播报告 HDFS Disk Balancer开启相关命令 背景 相比较于个人PC&#xff0c;服务器一般可以通过挂载多块磁盘来扩大单机的存储能力在Hadoop HDFS中&#xff0c;DataNode负责最…

F5 LTM 知识点和实验 7-使用SNATs处理流量

第七章:使用SNATs处理流量 SNATs: 传统的vs都是对目的地址和端口进行改变,而源地址没有改变,如果你需要对源地址和源端口进行更改,则需要使用SNAT能力,好处在于: 1、允许不可路由地址(网络内部)的设备获得可路由地址以进入网络外部。2、确保目标服务器通过BIG-IP系统返…

[Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

目录 0、CI/CD系统最终架构图规划IP地址 1、git配置Git下载pycharm配置gitidea配置git 2、GitLab安装与配置主机要求拉取镜像定义 compose.yml启动gitlab浏览器访问并修改密码查看登录密码修改密码 3、SonarQube 安装与配置拉取镜像修改虚拟内存的大小启动SonarQube登录 SonarQ…

5.2.16.静态映射操作LED3

5.2.16.静态映射操作LED3 5.2.16.1、添加驱动中的写函数 (1)先定义好应用和驱动之间的控制接口&#xff0c;这个是由自己来定义的。譬如定义为&#xff1a;应用向驱动写"on"则驱动让LED亮&#xff0c;应用向驱动写"off"&#xff0c;驱动就让LED灭 1. 驱动文…

自定义Controller接口参数的值不能为空的校验

需求&#xff1a;在进入到相应Controller控制器前&#xff0c;需要先校验参数是否符合规范要求&#xff0c;如是否为空等等。 有人说&#xff0c;可以使用PathVariable里面的required属性控制&#xff0c;然而该属性只是代表参数是否必填&#xff0c;并不能校验参数的值是否满…

python_在K线找出波段_01_找出所有转折点

目录 写在前面&#xff1a; 需要考虑的几种K线图情况&#xff1a; 寻找所有转折点逻辑&#xff1a; 代码&#xff1a; 寻找转折点方法&#xff1a;找到第一个转折点就返回 循环寻找峰谷方法 主方法 调用计算&#xff1a; 返回&#xff1a; 在【PyQt5开发验证K线视觉想…

C++继承特性(1)——含义与继承方式的讲解

目录 1.继承的含义 2.继承的定义&#xff1a; 3.继承方式 例子1&#xff1a;基类的访问限定符为public&#xff0c;两个派生类的继承方式分别为public、protected时&#xff1a; 例子2&#xff1a; 基类的访问限定符为protected&#xff0c;两个派生类的继承方式分别为pub…

软件测试工程师的职业规划,你都做好了吗?

第一阶段&#xff1a;初级测试工程师 一般刚刚入门&#xff0c;熟悉基本的测试流程&#xff0c;此时已打基础为主。入门薪资一般在6000-8000元之间。 具体工作是&#xff1a; &#xff08;1&#xff09; 按照测试方案和流程对产品进行功能测试&#xff0c;检查产品是否有缺陷…

Java读取及生成pb文件并转换jsonString

Java读取及生成pb文件并转换jsonString 1. 效果图2. 原理2.1 Protocol Buffers是什么2.2 支持的语言2.3 根据.proto生成.java2.4 初始化及构建pb&#xff0c;读取&#xff0c;转jsonString 3. 源码3.1 address.proto3.2 PbParseUtil.java 参考 读取pb及生成pb文件pb文件转换jso…