最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot多環(huán)境動態(tài)環(huán)境切換方式(nacos)

 更新時間:2025年12月08日 09:15:27   作者:春卷-huachun  
本文介紹了多環(huán)境配置的幾種方法,包括環(huán)境變量切換、Nacos配置中心動態(tài)切換、同一Nacos環(huán)境下服務不同環(huán)境控制、Maven方式配置以及配置加密

多環(huán)境配置說明:

在項目實際開發(fā)過程中,可能會有不同的環(huán)境,例如開發(fā)環(huán)境,測試環(huán)境和生產環(huán)境。不同的環(huán)境,對應的配置信息是不同的,將項目發(fā)布到不同的環(huán)境,需要去更改對應環(huán)境的配置信息,如果每次都是手動去更改環(huán)境,非常不友好,且容易漏掉配置,如果能夠實現不同環(huán)境的自動識別,動態(tài)切換,將極大的提高工作效率。下面介紹一下自己在工作中使用到的多環(huán)境配置方法。

1. 環(huán)境變量切換

SpringBoot打包服務時,一些參數需要從外界獲取,可以通過在配置文件中配置環(huán)境變量實現

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} 服務會先在系統(tǒng)環(huán)境變量 DB_HOST 中獲取值,如果獲取不到則使用默認值 localhost。

? 我們可以利用系統(tǒng)環(huán)境變量讀取機制,在不同環(huán)境下給變量配置不同值,通過讀取對應變量的值,獲取不同的運行配置文件:

1.1 建立各環(huán)境配置文件

分別為 application-dev.yml 和 application-prod.yml 分別代表開發(fā)環(huán)境和生產環(huán)境的配置:

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

# application-dev.yml
server:
  port: 9001

# application-prod.yml
server:
  port: 9002

這里只簡單的測試環(huán)境切換服務端口號

1.2 設置環(huán)境變量

網上有示例配置和系統(tǒng)變量后IDEA自動會有環(huán)境配置,我的沒有所以手動加上(可能是我使用的破解版吧 ,不知道是不是這個原因...)

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

  SPRING_PROFILES_ACTIVE=prod
  export SPRING_PROFILES_ACTIVE

1.3 啟動服務

2. nacos配置中心動態(tài)切換

通過環(huán)境變量的方式,不同環(huán)境的配置可以直接觀察到,不太安全(當然可以將關鍵配置抽離成環(huán)境變量)。

可以將配置文件全部放置在 nacos 中,然后通過統(tǒng)一的域名訪問 nacos 服務器,在不同的環(huán)境配置域名對應的host ,指向不同的nacos服務器地址,從而讀取對應的配置。

2.1 配置文件

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

# application-prod.yml
nacos:
  config:
    server-addr: nacos_addr:port    # 這里填寫相應環(huán)境nacos配置中心地址和端口號
    bootstrap:
      enable: true
      log-enable: true
    data-ids: environment.yaml
    type: yaml
    group: dev
    auto-refresh: true
#    namespace: 0e1ff256-8d17-4e94-a4dd-d81c06e9b56c   # 如果需要指定環(huán)境可以添加namespace屬性

2.2 nacos配置

 nacos中 environment.yaml 配置如下:

server:
  port: 9004

2.3 啟動服務

服務啟動后發(fā)現已經從nacos讀取到服務端口號

訪問服務測試正常

3. 同一nacos環(huán)境下服務不同環(huán)境控制

上面兩種方式都是不同的環(huán)境對應不同的配置中心,如果多個環(huán)境都是使用的同一個配置中心(使用nacos作為配置中心),那么可以通過 dataId 實現不同環(huán)境的隔離。

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 添加環(huán)境變量

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 創(chuàng)建配置文件

application-dev.yml 和 application-prod.yml 分別代表開發(fā)環(huán)境和生產環(huán)境的配置

# 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>
            <!--默認開發(fā)環(huán)境-->
            <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???????

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 添加監(jiān)聽

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配置

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java愛心代碼完整示例(脫單必備)

    java愛心代碼完整示例(脫單必備)

    最近看到個好玩的,就是用代碼實現愛心的形狀,對于不懂編程的人來說,這是一個很好的玩的東西,這篇文章主要給大家介紹了關于java愛心代碼的相關資料,需要的朋友可以參考下
    2023-07-07
  • Java動態(tài)代理靜態(tài)代理實例分析

    Java動態(tài)代理靜態(tài)代理實例分析

    這篇文章主要介紹了Java動態(tài)代理靜態(tài)代理實例分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java Web應用程序實現基礎的文件下載功能的實例講解

    Java Web應用程序實現基礎的文件下載功能的實例講解

    這里我們演示了Servelet驅動Tomcat來進行HTTP下載的方法,接下來就詳細來看Java Web應用程序實現基礎的文件下載功能的實例講解
    2016-05-05
  • spring 中事務注解@Transactional與trycatch的使用

    spring 中事務注解@Transactional與trycatch的使用

    這篇文章主要介紹了spring 中事務注解@Transactional與trycatch的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java中該如何優(yōu)雅的使用線程池詳解

    Java中該如何優(yōu)雅的使用線程池詳解

    在java開發(fā)中我們對“池”的概念并不陌生,常見的有數據庫連接池、線程池、對象池、常量池等等,其作用基本上就是避免頻繁的創(chuàng)建和回收,造成資源浪費,線程池也不例外,這篇文章主要給大家介紹了關于Java中該如何優(yōu)雅的使用線程池的相關資料,需要的朋友可以參考下
    2021-12-12
  • JavaSwing FlowLayout 流式布局的實現

    JavaSwing FlowLayout 流式布局的實現

    這篇文章主要介紹了JavaSwing FlowLayout 流式布局的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 使用反射方式獲取JPA Entity的屬性和值

    使用反射方式獲取JPA Entity的屬性和值

    這篇文章主要介紹了使用反射方式獲取JPA Entity的屬性和值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 教你如何用Java根據日期生成流水號

    教你如何用Java根據日期生成流水號

    這篇文章主要介紹了教你如何用Java根據日期生成流水號,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringCloud Zuul在何種情況下使用Hystrix及問題小結

    SpringCloud Zuul在何種情況下使用Hystrix及問題小結

    這篇文章主要介紹了SpringCloud Zuul在何種情況下使用Hystrix 及問題小結,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • java使用poi在excel單元格添加超鏈接設置字體顏色的方法

    java使用poi在excel單元格添加超鏈接設置字體顏色的方法

    這篇文章主要介紹了java使用poi在excel單元格添加超鏈接,設置字體顏色,poi功能還是很強大的,基本能想到的功能都能通過poi實現,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-09-09

最新評論

团风县| 通许县| 太白县| 遂溪县| 卢龙县| 普陀区| 乐安县| 夏邑县| 彰化市| 靖远县| 新巴尔虎左旗| 黄冈市| 贺兰县| 灵寿县| 千阳县| 安化县| 盐城市| 万全县| 彭水| 佛坪县| 佛学| 开远市| 揭阳市| 靖西县| 武穴市| 壶关县| 凭祥市| 乡宁县| 丰都县| 霍林郭勒市| 德令哈市| 会同县| 阿巴嘎旗| 仁化县| 克拉玛依市| 株洲县| 星座| 攀枝花市| 深圳市| 萨嘎县| 淮滨县|