SpringCloud系列十:SpringCloudConfig 高級配置(密鑰加密處理(JCE)、KeyStore 加密處理、SpringCloudConfig 高可用機制、SpringCloudBus 服務總線)


聲明:本文來源於MLDN培訓視頻的課堂筆記,寫在這里只是為了方便查閱。

1、概念:SpringCloudConfig 高級配置

2、具體內容

在 SpringCloudConfig 之中考慮到所有配置文件都暴露在遠程倉庫之中的安全性問題,所以提供有安全訪問的處理機制,這樣可以對一些數據進行加密以及在讀取的時候實現解密的控制。

2.1、密鑰加密處理

所謂的密鑰的處理指的就是設置一個公共的操作訪問密碼,而后通過 curl 命令對要進行訪問的數據做一個加密處理即可。

1、 【microcloud-config-7101】修改 application.yml 配置文件,進行密鑰的設置:

encrypt:
  key: studyjava.cn    # 設置了一個加密的訪問密鑰

隨后立即啟動“microcloud-config-7101”微服務進程。

2、 更換要使用的 JCE(下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html)

· 將下載后的文件做解壓縮處理,而后保存到使用的 JDK 目錄:“D:\Java\jdk1.8.0_144\jre\lib\security”;

3、 【本地系統】利用 curl 命令進行微服務訪問,對指定的數據做一個加密的操作處理:

· 注意:一定要保證你現在的微服務使用的 JDK 是已經更新過 JCE 的 JDK。

curl -X POST http://studyava:hello@config-7101.com:7101/encrypt -d mysqladmin

密碼加密處理后: a2722e75244753f656aa9776e5af8a4e94452046fe68087b798a1500fee9bdca

現在可以發現加密后的內容是比較長的。如果要解密的話也可以使用:

curl -X POST http://studyava:hello@config-7101.com:7101/decrypt -d a2722e75244753f656aa9776e5af8a4e94452046fe68087b798a1500fee9bdca

4、 【GITHUB】修改“D:\springcloudconfig\microconfig\microcloud-config-dept-client\ microcloud-config-dept-client.yml”文件,將加密后的內容保存到此處,但是需要注意一個問題,如果要想進行正確的解密要保持下面的格式:

spring:
  profiles: dev
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource    # 配置當前要使用的數據源的操作類型
    driver-class-name: org.gjt.mm.mysql.Driver      # 配置MySQL的驅動程序類
    url: jdbc:mysql://localhost:3306/study8001           # 數據庫連接地址
    username: root                                  # 數據庫用戶名
    password: '{cipher}a2722e75244753f656aa9776e5af8a4e94452046fe68087b798a1500fee9bdca'

5、 【GITHUB】將修改后的microcloud-config-dept-client.yml提交到 GITHUB 之中:

現在只是保存到 GITHUB 上的內容進行了加密處理,但是由於有 SpringCloudConfig 配置中心的存在(配置好了密鑰),所以用戶按照傳統的模式正常訪問即可。

訪問路徑:http://studyava:hello@config-7101.com:7101/microcloud-config-dept-client-dev.yml;

最為關鍵的是現在可以發現進行解密處理的時候,如果沒有加密的數據是不會進行解密處理的。

2.2、KeyStore 加密處理

在進行加密處理的時候還有一種加密的方式會更加的方便,就是直接利用 JKS 操作的模式來完成,通過這種的加密更加的安全,因為只需要有一個 jks 配置文件即可實現加密與解密。

1、 【本地系統】需要生成一個進行加密處理的 key 信息(主要是得到了“*.jks”文件)

keytool -genkeypair -alias mytestkey -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass
changeit -keystore server.jks -storepass studyjava

2、 【microcloud-config-7101】此時會出現有一個“server.jks”配置文件,將配置文件拷貝到項目中的“src/main/resources”目錄之中,如下圖所示:

3、 【microcloud-config-7101】修改 application.yml 配置文件,在這個配置文件之中追加有 keystore 相關配置項:

encrypt:
  keyStore:
    location: classpath:/server.jks   # server.jks的配置文件的路徑
    password: studyjava      # 設置store的密碼 
    alias: mytestkey
    secret: changeit      # keypass密碼

 4、 【microcloud-config-7101】以上的配置文件之中已經設置了 server.jks 的路徑,但是這個路徑你現在如果在 maven 里面是找不到的,所以應該修改項目中的 pom.xml 文件,追加資源的輸出配置項:

    <build>
        <finalName>microcloud-config</finalName>
        <resources>
            <resource>     <!-- 防止JKS被Maven過掉 -->
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

 5、 【瀏覽器測試】進行數據的加密與解密處理:

 數據加密:curl -X POST http://studyjava:hello@config-7101.com:7101/encrypt -d mysqladmin

 加密結果: AQABpN8ZrZbbYNx2cVBoy2qCQLI/mGCeTjA5L...此處省略幾千個字符

 數據解密: curl -X POST http://studyjava:hello@config-7101.com:7101/decrypt -d AQABpN8ZrZbbY ...此處省略幾千個字符

 6、 【GITHUB】修改 microcloud-config-dept-client.yml 配置文件,將加密后的內容配置上:

spring:
  profiles: dev
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource    # 配置當前要使用的數據源的操作類型
    driver-class-name: org.gjt.mm.mysql.Driver      # 配置MySQL的驅動程序類
    url: jdbc:mysql://localhost:3306/study8001           # 數據庫連接地址
    username: root                                  # 數據庫用戶名
    password: '{cipher}AQABpN8ZrZbbYNx2cVBoy2qCQLI/mGCeTjA5L6cksGdcTGlBoaYBsvMvLanShWukEv985CmtMETDlqpviKZ7YXEO3PGIW9sLgQXf2MB2yEFzTKoUzQk1EPUBnYLndw8jrkeI41Yiwzq6pJ28yJfE4lWV8mcirb7XhdwR4xYwy/BwgAna8c+4gHo9pLhtDU4Mvu0ccR3EqPv6hc9sK8ElR7SaQ48HGjOsZJZT0v4g1HWrWMf58xShgOd1qBL2iXsHkCbGjUpzbtCQBkDEavaMHxiA3sLLqtCX7CuFOv1enE09w1L0Vdj3wHjCMNygr1PmMNpuGrl3VbMDKSYSu5KD3kKN/NcwvAL+Jwt01j/fdHp7Q6Jpi2o5PWMccYV+mPLCnP8='
  

 隨后將配置文件提交到 GITHUB 之中,再通過 SpringCloudConfig 訪問后就可以得到原始的數據了。

 2.3、SpringCloudConfig 高可用機制

 現在已經實現了整個的 SpringCloudConfig 的配置項處理,但是在這之中會存在有一個小小的問題,就是說所有的服務現在都 需要通過 SpringCloudConfig 加載配置文件,那么一旦 SpringCloudConfig 出錯了,所有的服務就掛掉了

 1、 【microcloud-config-eureka-7301】建立一新的模塊,通過已有的 eureka 服務的配置模塊拷貝過來,為了方便本次的 eureka 就 只設計一個節點,隨后為了以后方便訪問,可以修改 hosts 配置文件,追加新的主機名稱:

 127.0.0.1 eureka-config.com

 2、 【microcloud-config-eureka-7301】修改項目中的 application.yml 配置文件:

spring:
  profiles:
    active:
    - dev-7301
---
spring:
  profiles: dev-7301
  application: 
    name: microcloud-eureka-7301
server:
  port: 7301
security:
  basic:
    enabled: true   # 啟用安全認證處理
  user:
    name: edmin     # 用戶名
    password: studyjava  # 密碼
eureka: 
  client: # 客戶端進行Eureka注冊的配置
    service-url:
      defaultZone: http://edmin:studyjava@eureka-7301.com:7002/eureka
    register-with-eureka: false    # 當前的微服務不注冊到eureka之中
    fetch-registry: false     # 不通過eureka獲取注冊信息
  instance: # eureak實例定義
    hostname: eureka-7301.com # 定義Eureka實例所在的主機名稱

 配置完成之后進行服務的啟動,訪問地址:http://edmin:studyjava@eureka-config.com:7301

 3、 【microcloud-config-*】修改 pom.xml 配置文件,追加 eureka 客戶端依賴包:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

 4、 【microcloud-config-*】修改 application.yml 配置文件,主要是進行 eureka 客戶端的配置處理:

eureka:
  client:
    service-url:
      defaultZone: http://edmin:studyjava@eureka-config.com:7301/eureka
  instance:
    prefer-ip-address: true     # 在地址欄上使用IP地址進行顯示
    instance-id: config-7101.com

 隨后的其它的配置文件只需要考慮到“instance-id”的不同即可;

 5、 【microcloud-config-*】修改程序啟動類,追加 Eureka 客戶端注解:

package cn.study.microcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient public class Config_7101_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Config_7101_StartSpringCloudApplication.class, args);
    }
}

 6、 【本地主機】修改 hosts 配置文件,追加多個配置主機名稱:

127.0.0.1 config-7101.com
127.0.0.1 config-7102.com
127.0.0.1 config-7103.com

 7、 【本地測試】分別啟動所有的 SpringCloudConfig 微服務進程,隨后進行訪問測試:

 

8、 【GITHUB】修改 microcloud-config-client.yml 配置文件,在這個配置文件里面需要考慮好 eureka 的問題;

spring:
  profiles:
    active:
    - dev
---
server:
  port: 8201
spring:
  profiles: dev
  application: 
    name: microcloud-config-client
eureka: 
  client:
    service-url:
      defaultZone: http://edmin:studyjava@eureka-config.com:7301/eureka
---
server:
  port: 8102
spring:
  profiles: beta
  application: 
    name: microcloud-config-client
eureka: 
  client:
    service-url:
      defaultZone: http://edmin:studyjava@eureka-config.com:7301/eureka

 9、 【microcloud-config-client-8201】修改 bootstrap.yml 配置文件,此時的配置文件需要通過 eureka 獲取 config 服務信息;

spring:
  cloud:
    config:
      name: microcloud-config-client    # 定義要讀取的資源文件的名稱
      profile: beta      # 定義profile的 名稱
      label: master     # 定義配置文件所在的分支
      # uri: http://config-7101.com:7101  # SpringCloudConfig的服務地址
      username: studyjava  # 連接的用戶名
      password: hello   # 連接的密碼
      discovery:
        enabled: true   # 通過配置中心加載配置文件
        service-id: MICROCLOUD-CONFIG   # 在eureka之中注冊的服務ID
      
eureka: # 一定要編寫一個eureka的地址
  client: # 目的是為了讓客戶端可以通過eureka找到SpringCloudConfig微服務
    service-url:
      defaultZone: http://edmin:studyjava@eureka-config.com:7301/eureka

 10、 【microcloud-config-client-8201】在啟動類上追加 Eureka 客戶端的配置注解:

package cn.study.microcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient public class Client_8201_StartSpringCloudApplication {
    public static void main(String[] args) {
        SpringApplication.run(Client_8201_StartSpringCloudApplication.class, args);
    }
}

 那么現在就實現了 SpringCloudConfig 基於 Eureka 的高可用處理機制。

2.4、SpringCloudBus 服務總線

在整個 SpringCloudConfig 設計之中,主要考慮的是所有微服務配置文件過多的統一管理問題,但是在整個的設計上還存在有一個小小的缺陷,就是配置信息的實時更新

SpringCloudBus 服務總線工作原理

說明:

傳統的做法是配置更新以后重啟微服務,但是我們不這樣做,我們要做的是通過消息中間件作為橋梁,客戶端訂閱消息中間件的消息服務,SpringCloudConfig 更新配置以后通知消息中間件,客戶端就能及時知道配置有更新從而做出對應的更新

 在實現 SpringCloudBus 的過程之中必須要有一個明確的消息服務組件,而這種服務組件一般會有兩類處理模式:RabbitMQ、 Kafka。

 1、 【GITHUB】本次的操作中為了簡化處理,直接采用一些服務信息的更新獲取;

spring:
  profiles:
    active:
    - dev
---
server:
  port: 8201
spring:
  profiles: dev
  application: 
    name: microcloud-config-client
eureka: 
  client:
    service-url:
      defaultZone: http://edmin:studyjava@eureka-config.com:7301/eureka
info:
  app.name: study-microcloud-dev-1
  company.name: www.study.cn
  app.version: v-dev-1.0.0

---
server:
  port: 8102
spring:
  profiles: beta
  application: 
    name: microcloud-config-client
eureka: 
  client:
    service-url:
      defaultZone: http://edmin:studyjava@eureka-config.com:7301/eureka
info:
  app.name: study-microcloud-beta-1
  company.name: www.studyjava.cn
  app.version: v-beta-1.0.0

 2、 【microcloud-config-bus-7201】該項目模塊是通過 microcloud-config-7101 復制過來的,本項目依然要求將服務注冊到 eureka 之中;

 3、 【microcloud-config-bus-7201】修改 pom.xml 配置文件:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

 4、 【microcloud-config-bus-7201】修改 application.yml 配置文件,追加 rabbitmq 的相關配置項:

spring: 
  rabbitmq:     # 現在將集成RabbitMQ作為消息服務總線處理
    host: rabbitmq-server   # RabbitMQ主機服務地址
    port: 5672    # RabbitMQ的監聽端口
    username: studyjava  # 用戶名
    password: hello # 密碼

 5、 【microcloud-config-bus-7201】啟動此微服務信息,而后一定要保證該微服務已經注冊到了 Eureka 之中,同時還需要觀察出現 的訪問路徑,此時會出現有一個重要的路徑信息:

 restartedMain] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/bus/refresh],methods=[POST]}"
onto public void org.springframework.cloud.bus.endpoint.RefreshBusEndpoint.refresh(java.lang.String)

 6、 【microcloud-config-bus-client-8301】該項目模塊是通過“microcloud-config-client-8201”模塊復制得來的;

 7、 【microcloud-config-bus-client-8301】修改 pom.xml 配置文件,追加與 SpringCloudConfig 同樣的依賴包:

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

 8、 【microcloud-config-bus-client-8301】修改 bootstrap.yml 配置文件,追加 rabbitmq 的相關地址配置:

spring:
  rabbitmq:     # 現在將集成RabbitMQ作為消息服務總線處理
    host: rabbitmq-server   # RabbitMQ主機服務地址
    port: 5672    # RabbitMQ的監聽端口
    username: studyjava  # 用戶名
    password: hello # 密碼

 9、 【microcloud-config-bus-client-8301】建立一個可以進行配置文件內容保存的程序類,該類的主要功能是可以進行配置的刷新獲取(如果是一些系統的服務,例如:eureka.defaultZone 之類的內容,不容易看見):

package cn.study.microcloud.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@Component
@RefreshScope // 如果現在沒有這個注解,則在通過SpringCloudBus獲取配置信息的時候無法進行刷新
public class InfoConfig {    // 將所有可能動態獲取的配置內容寫在一個類之中,到處引用
    @Value("${info.app.name}")
    private String appName ;
    @Value("${info.company.name}")
    private String companyName ;
    @Value("${info.app.version}")
    private String appVersion ;
    public String getAppName() {
        return appName;
    }
    public String getAppVersion() {
        return appVersion;
    }
    public String getCompanyName() {
        return companyName;
    }
}

 10、 【microcloud-config-bus-client-8301】創建 InfoClientRest 的客戶端顯示程序

package cn.study.microcloud.rest;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.study.microcloud.config.InfoConfig;

@RestController
public class InfoClientRest {
    @Resource
    private InfoConfig infoConfig;
    @RequestMapping("/config")
    public String getConfig() {
        return "ApplicationName = " + this.infoConfig.getAppName()
                + "、CompanyName = " + this.infoConfig.getCompanyName()
                + "、ApplicationVersion = " + this.infoConfig.getAppVersion();
    }
}

 11、 【microcloud-config-bus-client-8301】啟動該微服務,而后獲取信息:

 · 訪問路徑:http://studyjava:hello@client-8201.com:8102/config;

 12、 【GITHUB】修改 microcloud-config-client.yml 配置文件,修改 beta 部分的內容:

info:
 app.name: mldn-microcloud-beta-2
 company.name: www.mldnjava.cn
 app.version: v-beta-2.1.2

 此時 GITHUB 上的配置文件已經發生了改變,但是客戶端並不知道 GITHUB 上的這次操作,所以其顯示的內容還屬於原始內容,如果要想加載新的內容,則就必須進行服務總線的刷新。

 13、 【microcloud-security】如果要想進行總線服務刷新,用戶必須具備有“ACTUATOR”角色,所以需要修改用戶的配置程序類

package cn.study.microcloud.config;

import javax.annotation.Resource;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
   @Resource public void configGlobal(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.inMemoryAuthentication().withUser("studyjava").password("hello")
                .roles("ACTUATOR").and().withUser("admin").password("hello")
                .roles("USER", "ADMIN"); }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 表示所有的訪問都必須進行認證處理后才可以正常進行
        http.httpBasic().and().authorizeRequests().anyRequest()
                .fullyAuthenticated().and().csrf().disable();
        // 所有的Rest服務一定要設置為無狀態,以提升操作性能
        http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}

 14、 【本地系統】通過 curl 命令發出一個 post 請求訪問指定的 SpringCloudConfig 微服務:

 curl -X POST http://studyjava:hello@config-7201.com:7201/bus/refresh

 此時需要觀察以下幾個方面:

 · 需要觀察 RabbitMQ 消息的信息:

 

· 觀察后台的提示信息:

 Received remote refresh request. Keys refreshed [info.app.version, info.app.name]

 這個時候刷新了配置信息后實際上會自動找到“@RefreshScope”標記的程序類並且對其進行更新處理。

 15、 【microcloud-config-bus-7201】如果用戶有需要也可以獲取一些跟蹤軌跡信息,映射路徑:“/trace”,但是要想實現這樣的更新處理,必須做一個配置上的變更,修改 application.yml 配置文件,追加“spring.cloud.bus.trace.enabled=true”配置項:

spring: 
  cloud:  # 進行SpringCloud的相關配置
    bus:
      trace:
        enabled: true

 則這個時候就可以通過 trace 進行配置的更新追蹤:http://studyjava:hello@config-7201.com:7201/trace。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM