zoukankan      html  css  js  c++  java
  • 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:Javajdk1.8.0_144jrelibsecurity”;

    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:springcloudconfigmicroconfigmicrocloud-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。

  • 相关阅读:
    Spring RedisTemplate操作-注解缓存操作(11)
    Spring RedisTemplate操作-通道操作(10)
    Spring RedisTemplate操作-事务操作(9)
    Spring RedisTemplate操作-发布订阅操作(8)
    Spring RedisTemplate操作-HyperLogLog操作(7)
    Spring RedisTemplate操作-Set操作(5)
    Spring RedisTemplate操作-ZSet操作(6)
    Spring RedisTemplate操作-List操作(4)
    Spring RedisTemplate操作-哈希操作(3)
    Spring RedisTemplate操作-String操作(2)
  • 原文地址:https://www.cnblogs.com/leeSmall/p/8878091.html
Copyright © 2011-2022 走看看