SpringBoot多环境动态环境切换(nacos)

2023-05-16

目录

1. 环境变量切换

1.1 建立各环境配置文件

1.2 设置环境变量

2. nacos配置中心动态切换

2.1 配置文件

2.2 nacos配置

2.3 启动服务

3. 同一nacos环境下服务不同环境控制

3.1 cloud方式

3.1.1 引入依赖

3.1.2 添加配置

3.1.3 添加环境变量

3.1.4 启动服务

3.1.5 读取数据库配置

4.Maven方式

4.1 创建配置文件

4.2 更改pom文件

4.3 maven打包

总结

常见问题

1.读取不到配置


多环境配置说明:

        在项目实际开发过程中,可能会有不同的环境,例如开发环境,测试环境和生产环境。不同的环境,对应的配置信息是不同的,将项目发布到不同的环境,需要去更改对应环境的配置信息,如果每次都是手动去更改环境,非常不友好,且容易漏掉配置,如果能够实现不同环境的自动识别,动态切换,将极大的提高工作效率。下面介绍一下自己在工作中使用到的多环境配置方法。

1. 环境变量切换

SpringBoot打包服务时,一些参数需要从外界获取,可以通过在配置文件中配置环境变量实现

spring:
  datasource:
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:table}?useUnicode=true&characterEncoding=UTF-8
      username: ${DB_USER:root}
      password: ${DB_PASSWORD:root}

上面案例中,${DB_HOST:localhost} 服务会先在系统环境变量 DB_HOST 中获取值,如果获取不到则使用默认值 localhost

​ 我们可以利用系统环境变量读取机制,在不同环境下给变量配置不同值,通过读取对应变量的值,获取不同的运行配置文件:

1.1 建立各环境配置文件

分别为 application-dev.yml 和 application-prod.yml 分别代表开发环境和生产环境的配置:


# application.yml
spring:
  profiles:
    active: ${HUACHUN_PROFILES_ACTIVE:dev}

# application-dev.yml
server:
  port: 9001

# application-prod.yml
server:
  port: 9002

这里只简单的测试环境切换服务端口号

1.2 设置环境变量

网上有示例配置和系统变量后IDEA自动会有环境配置,我的没有所以手动加上(可能是我使用的破解版吧 ,不知道是不是这个原因...)

如果使用的 linux 物理机, 使用 vim /etc/profile 命令,添加上一下配置

  SPRING_PROFILES_ACTIVE=prod
  export SPRING_PROFILES_ACTIVE

1.3 启动服务

2. nacos配置中心动态切换

        通过环境变量的方式,不同环境的配置可以直接观察到,不太安全(当然可以将关键配置抽离成环境变量)。可以将配置文件全部放置在 nacos 中,然后通过统一的域名访问 nacos 服务器,在不同的环境配置域名对应的host ,指向不同的nacos服务器地址,从而读取对应的配置。

2.1 配置文件

# application.yml
spring:
  profiles:
    active: ${HUACHUN_PROFILES_ACTIVE}

# application-prod.yml
nacos:
  config:
    server-addr: nacos_addr:port    # 这里填写相应环境nacos配置中心地址和端口号
    bootstrap:
      enable: true
      log-enable: true
    data-ids: environment.yaml
    type: yaml
    group: dev
    auto-refresh: true
#    namespace: 0e1ff256-8d17-4e94-a4dd-d81c06e9b56c   # 如果需要指定环境可以添加namespace属性

2.2 nacos配置

 nacos中 environment.yaml 配置如下:

server:
  port: 9004

2.3 启动服务

服务启动后发现已经从nacos读取到服务端口号

访问服务测试正常

3. 同一nacos环境下服务不同环境控制

        上面两种方式都是不同的环境对应不同的配置中心,如果多个环境都是使用的同一个配置中心(使用nacos作为配置中心),那么可以通过 dataId 实现不同环境的隔离。

3.1 cloud方式

3.1.1 引入依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <!-- 启动获取配置中心配置 原文链接:https://blog.csdn.net/chy2z/article/details/119464497 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>

如果不引用spring-cloud-starter-bootstrap则不会读取nacos配置

3.1.2 添加配置

添加 bootstrap.yml 配置文件

spring:
  profiles:
    active: ${HUACHUN_PROFILES_ACTIVE}
  cloud:
    nacos:
      config:
        server-addr: nacos_addr:port  # nacos服务访问地址和端口
        enabled: true
        file-extension: yaml
        prefix: environment
        group: dev
        refresh-enabled: true

nacos配置三个文件,端口好分别是9904,9908,9909(这里主要是快速简单的测试读取配置) 

3.1.3 添加环境变量

3.1.4 启动服务

3.1.5 读取数据库配置

1. 配置如下

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: ${env.project.db.username}
    password: ${env.project.db.password}
    url: jdbc:mysql://${env.project.db.adrr}:${env.project.db.port}/hhmt_cpa?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    type: com.alibaba.druid.pool.DruidDataSource

2. nacos配置

 

 访问正常

4.Maven方式

4.1 创建配置文件

application-dev.yml 和 application-prod.yml 分别代表开发环境和生产环境的配置

# application.yml
spring:
  profiles:
    active: ${HUACHUN_PROFILES_ACTIVE:dev}

# application-dev.yml
server:
  port: 9001

# application-prod.yml
server:
  port: 9002

4.2 更改pom文件

 <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <profileActive>dev</profileActive>
            </properties>
            <!--默认开发环境-->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profileActive>test</profileActive>
            </properties>
        </profile>
        <profile>
            <id>pro</id>
            <properties>
                <profileActive>pro</profileActive>
            </properties>
        </profile>
    </profiles>

4.3 maven打包

maven  -P dev

原文链接:https://blog.csdn.net/qq_41863849/article/details/122145312

5.配置加密

5.1 服务配置文件中加密

通常在连接数据库时候明文信息不太安全,所以需要加密,这里展示数据库连接用户名密码加解密,其他参数同理

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: JAS(sNhUs2TnBigaKiBTIeobYA==)
    password: JAS(BaqtsIAiaTrZx84TJaMWAq2ryBPvvKbl)

5.1.1 引入依赖

        <!-- web应用依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- cloud整合nacos依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

        <!-- cloud启动依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>

        <!-- mybatis-plus依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>

        <!-- mysql依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector.version}</version>
        </dependency>

        <!-- 数据库连接池依赖 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid-spring.version}</version>
        </dependency>

        <!-- lombok依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- 加解密依赖 -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

5.1.2 加解密工具类

package com.huachun.utils;

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;

public class JasyptUtil {

    /**
     * 加密方法
     *
     * @param password jasypt所需要的加密密码配置
     * @param value    需要加密的密码
     */
    public static String encyptPwd(String password, String value) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        String result = encryptor.encrypt(value);
        return result;
    }


    /**
     * 解密
     *
     * @param password jasypt所需要的加密密码配置
     * @param value    需要解密的密码
     */
    public static String decyptPwd(String password, String value) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        String realV = getValue(value);
        String result = encryptor.decrypt(realV);
        return result;
    }

    public static String getValue(String value) {
        if (value.contains("JAS")) {
            return value.substring(4, value.length() - 1);
        }
        return value;
    }

}

5.1.3 添加监听

package com.huachun.listener;

import com.huachun.utils.JasyptUtil;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.boot.env.OriginTrackedMapPropertySource;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EnvironmentPreparedListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ConfigurableEnvironment env = event.getEnvironment();
        MutablePropertySources pss = env.getPropertySources();
        List<PropertySource> list = new ArrayList<>();
        for (PropertySource ps : pss) {
            Map<String, Object> map = new HashMap<>();
            if (ps instanceof OriginTrackedMapPropertySource) {
                OriginTrackedMapPropertySource propertySource = new OriginTrackedMapPropertySource(ps.getName(), map);
                Map<String, Object> src = (Map<String, Object>) ps.getSource();
                src.forEach((k, v) -> {
                    String strValue = String.valueOf(v);
                    if (strValue.startsWith("JAS(") && strValue.endsWith(")")) {
                        v = JasyptUtil.decyptPwd(k, v.toString());
                    }
                    map.put(k, v);
                });
                list.add(propertySource);
            }
        }
        /**
         此处是删除原来的 OriginTrackedMapPropertySource 对象,
         把解密后新生成的放入到 Environment,为什么不直接修改原来的
         OriginTrackedMapPropertySource 对象,此处不做过多解释
         不懂的可以去看看它对应的源码,也算是留一个悬念,也是希望大家
         能够没事多看一看源码。
         */
        list.forEach(ps -> {
            pss.remove(ps.getName());
            pss.addLast(ps);
        });

    }
}

5.1.4 添加控制类

package com.huachun.controller;

import com.huachun.model.HcTest;
import com.huachun.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
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
@RequestMapping("/env")
public class EnvCdDbController {

    @Autowired
    private TestService testService;

    @GetMapping("/{id}")
    public HcTest env(@PathVariable("id") String id) {
        return testService.getData(id);
    }
}

5.1.5 访问测试

访问成功,查询数据库没有问题,说明解密成功。也可以打断点进去看 

5.2 SpringCloud读取Nacos中加密参数

虽然在服务配置文件中可以正常加解密,但是并不灵活,通常还是需要将参数信息放到nacos配置中心管理。

总结

1.springboot方式使用application.yml配置

2.springcloud方式使用bootstrap.yml配置

常见问题

1.读取不到配置

1.@NacosValue 注解换成 @Value
参考原文:SpringCloud无法获取Nacos中的配置文件信息_springcloud读取不到nacos配置文件_会脸红的情先生的博客-CSDN博客

参考原文:spring-cloud使用nacos配置中心的坑_黑暗行动的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot多环境动态环境切换(nacos) 的相关文章

  • Linux安装CUDA GCC版本不兼容

    环境KALI 我估计Ubuntu也是一样的 当前NVIDIA驱动版本 455 23 05 GCC版本 xff1a Debian 10 2 0 15 老铁们一定是这样操作的 xff1a span class token function su
  • LINUX设置临时路径

    有时候需要设置下临时路径以方便使用 xff0c 在逛github FCOS配置的时候看到了这种使用方式 xff0c 觉得蛮有用的 xff0c 分享给大家 xff1a span class token function export span
  • CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below m

    UPDATE 2023 01 11 我觉得评论区的方法比我的方法更加简单 xff0c 建议诸位老铁先看评论区 xff1a 好兄弟们看看是不是这个错 xff1a RuntimeError span class token punctuatio
  • TensorRT windows10 安装过程记录

    这俩天摸鱼玩耍有些多 比平时多 xff0c 电脑 另一台有双系统的 忘了带着了 我的环境和代码都在那台机子上呢 彳亍口巴 xff0c windows 上新配置一个TensorRT环境 咱就根据官方指南 TensorRT 8 4 1 来搞 x
  • 找不到 cl.exe 解决办法

    本篇适用于由于安装VS全家桶失误 xff0c 导致确实没有 cl exe xff0c 而不是有cl exe xff0c 但是没找到的情况哈 xff08 当然 xff0c 后边有添加到环境变量中的方法 xff09 cl exe 是一种工具 x
  • 余弦衰减学习率与linear warmup结合版代码

    以下代码摘自tensorflow官方tpu仓库 span class token keyword def span span class token function cosine learning rate with linear war
  • DiffusionDet源码阅读(1)

    本文仅仅适用于已经通读过全文的小伙伴 本文代码节选自 mmdet 中的 DiffusionDet 代码 xff0c 目前该代码还处于 Development 阶段 xff0c 所以我博客里写的代码和之后的稳定版本可能稍有不同 xff0c 不
  • 分割统一框架:KNet文章

    全文谷歌翻译 43 自己理解 原地址 xff1a https arxiv org pdf 2106 14855 pdf 0 摘要 语义 实例和全景分割已经使用不同的和专门的框架来解决 xff0c 尽管它们存在潜在的联系 本文为这些本质上相似
  • python问题记录 - paramiko模块报错

    文章目录 报错关键字1 代码2 输出3 报错信息4 解决方案 报错关键字 paramikoException ignored in lt function BufferedFile del at 0x109259820 gt Attribu
  • JSP的四种范围

    JSP的四种范围 xff0c 分别为page request session application 这四者都可以用setAttribute 34 getAttribute 34 其中用page时 xff0c 为pageContext se
  • week4-C - TT 的神秘礼物

    题目 TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪送给 TT 任务
  • 【linux】CentOS 7.4下使用yum安装MySQL5.7.20 最简单的

    默认配置文件路径 配置文件 xff1a etc my cnf 日志文件 xff1a var log var log mysqld log 服务启动脚本 xff1a usr lib systemd system mysqld service
  • mongodb生成自签名证书以及配置SSL以及mongo集群搭建(亲测有效)版本-5.0.6

    64 TOC mongodb生成自签名证书以及配置SSL 亲测有效 版本 5 0 6 一直以来都是向大神学习 xff0c 今天也做回大神分享 xff0c 哈哈 xff01 xff01 几个小时的努力不算白费 一 自签名证书生成 1 生成根证
  • mongodb创建用户名和密码(版本5.0.6)

    mongodb创建用户名和密码 xff08 版本5 0 6 xff09 官方文当地址 xff1a 1 mongodb 添加用户 2 mongodo将命令行参数转化为yaml参数的方法 将命令行选项转换为YAML 超级有用哦 3 mongod
  • Lua字符串切分

    lua 字符串切分示例 local requrl 61 34 10 20 144 127 8891 cas login 34 local cutstr 61 string sub requrl 2 print cutstr local cu
  • nginx lua开发配置文件详解

    加载lua文件和库文件 lua package path 34 waf nginx cnwaf lua waf nginx init lua waf nginx cnwaf plugins lua waf nginx cnwaf deps
  • win7系统安装使用高版本的nodejs-v16.19.1

    文章目录 参考 参考 win7这样操作 xff0c 可成功安装高版本node js xff01 注意 xff1a 首先安装13 14版本nodejs 删掉安装目录下的内容下载16 19 1版本的nodejs版本 xff08 下载zip的包
  • j记录一次gorm 使用协程 插入数据一直报错问题 -Duplicate entry ‘95‘ for key ‘PRIMARY‘ [14.649ms] [rows

    文章目录 问题描述问题解决 问题描述 报错代码如下 span class token keyword func span span class token function GetSystemInfoSave span span class
  • stable diffusion的使用

    文章目录 1 文生图1 1 mountains and trees and gree1 2 three dogs1 3 cats1 4 three lovely cats1 5 beautiful girl1 6 机器猫1 7 卡通图像生成
  • DIY:用开源软件搭建自己的物联网

    原文链接 xff1a DIY Open Source Software for your very own IoT 作者 xff1a Vishal Shah 翻译 xff1a 赵屹华 审校 xff1a 刘翔宇 图片来源 xff1a open

随机推荐

  • ubuntu开启rdp服务

    概要 ssh登录用于终端 xff0c 如果需要GUI的远程登陆ubuntu 我了解到大概3中方案 vncxrdp第三方软件 向日葵 TeamViewer之类的 因为vnc我一直配置不好 xff0c 所以试了一下xrdp xff0c 这样wi
  • csp模拟2-T1 HRZ的序列

    题目 时间限制 1s 空间限制 64MB 题目描述 相较于咕咕东 xff0c 瑞神是个起早贪黑的好孩子 xff0c 今天早上瑞神起得很早 xff0c 刷B站时看到了一个序列aaa xff0c 他对这个序列产生了浓厚的兴趣 他好奇是否存在一个
  • Ubuntu 中文件和目录的操作命令

    在 Ubuntu 中 xff0c 文件和目录的操作命令是非常重要的 这些命令帮助您在文件系统中创建 复制 移动 删除和查看文件和目录 以下是一些常用的文件和目录操作命令 xff1a cd cd 命令用于切换当前工作目录 例如 xff0c 要
  • Docker无法在WSL2的Ubuntu启动的问题

    今天在更新了WSL2上的Ubuntu22 04版本 xff0c 在安装Docker后无法启动 xff0c 查看Docker的日志显示如下的错误 INFO 2022 04 22T16 14 55 718999500 43 08 00 stop
  • C语言中的移位操作

    C语言中的移位操作 xff0c 内容不多 不过有些地方你不注意 xff0c 就疏忽了 先做两个小题先 1 unsigned char x 61 3 x lt lt 1是多少 xff1f x gt gt 1是多少 xff1f 2 char x
  • Android获取设备唯一标识的方法

    String uniqueId String mac 61 getMacAddressByInetAddress if mac 61 null amp amp mac equals 34 34 amp amp mac equals 34 0
  • Linux 搭建私有CA证书服务器之超详细版本

    一 CA简介 CA是什么 xff1f CA是Certificate Authority的简写 xff0c 从字面意思翻译过来是凭证管理中心 xff0c 认证授权 它有点类似我们生活中的身份证颁发机构 xff0c 这里的CA就相当于生活中颁发
  • 基于Nginx搭建RTMP-HLS视频直播服务器(推流+拉流)

    1 环境准备 Linux centos7 6 nginx 1 18 0 源码包 span class token function wget span http nginx org download nginx 1 8 1 tar gz n
  • k8s-部署本地仓库harbor

    1 基础配置 xff1a 主机名IP系统版本k8s master192 168 32 128centos 7 6k8s node1192 168 32 129centos 7 6k8s node2192 168 32 130centos 7
  • k8s部署nginx容器

    1 创建挂载nginx namespace yaml配置文件 xff08 k8s master xff1a 192 168 32 128 xff09 apiVersion v1 kind Namespace metadata name ng
  • k8s部署tomcat并且映射本地目录

    1 编写Dockerfile span class token punctuation span root 64 VM 12 7 centos opt span class token punctuation span span class
  • 自动化运维记录之GitLab CI/CD 自动化部署入门教程

    1 前端项目自动化部署需要的环境依赖 Node 安装项目依赖 打包都需要 Nginx web 项目部署必须 正向代理 方向代理 负载均衡等等 GitLab 也会用到 Nginx span class token punctuation sp
  • k8s-kubeadm证书过期续订解决方法

    1 实验目的 通过kubeadm安装的kubernetes集群各个组件所使用证书的期限为1年 xff0c 本实验练习的是到期之后如何续期 2 实验环境 ubernetes环境及版本 整个实验三台机器192 168 32 128作为maste
  • 宝塔部署Django项目-避坑必看

    1 在linux windoes机器上已经安装宝塔 浏览器登录宝塔管理页面 1 1打包模块 span class token number 1 span 将本地计算机的项目下的模块打包 python m pip freeze span cl
  • week11作业—A - 必做题11-1—

    题目 蒜头君从现在开始工作 xff0c 年薪 NNN 万 他希望在蒜厂附近买一套 606060 平米的房子 xff0c 现在价格是 200200200 万 假设房子价格以每年百分之 KKK 增长 xff0c 并且蒜头君未来年薪不变 xff0
  • Linux 系统 nginx 源码编译安装

    nginx版本 xff1a nginx 1 18 0 操作实施环境 Ubuntu 16 04 6 LTS SUSE Linux Enterprise Server 12 SP4 x86 64 注 xff1a 因为是源码安装 xff0c 操作
  • ubuntu18.04和20.04(ubuntu focal)安装MySQL8并使用navicat连接(详细)

    文章的第一节转载自原文连接 本文实现了服务器ubuntu18 04和虚拟机ubuntu20 04两个版本的MySQL8 的安装 xff0c 和navicat的连接 其中ubuntu18 04对应第二节 xff0c ubuntu20 04是u
  • 对接淘宝公共平台API

    1 说明 由于项目临时提出需求 xff0c 需要对接淘宝公共平台查询用户的一些信息 xff0c 所以需要和淘宝平台做对接 xff0c 我查看了一下淘宝公共平台开发文档 xff0c 虽然写的挺丰富挺整洁 xff0c 但我还是一头雾水 xff0
  • 使用IDEA插件从数据库表生成实体类

    目录 1 介绍 2 添加插件 3 创建数据库连接 4 添加数据库连接信息和驱动 5 表生成实体类 1 介绍 EasyCode是基于IntelliJ IDEA Ultimate版开发的一个代码生成插件 xff0c 主要通过自定义模板 基于ve
  • SpringBoot多环境动态环境切换(nacos)

    目录 1 环境变量切换 1 1 建立各环境配置文件 1 2 设置环境变量 2 nacos配置中心动态切换 2 1 配置文件 2 2 nacos配置 2 3 启动服务 3 同一nacos环境下服务不同环境控制 3 1 cloud方式 3 1