暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Cloud 实战(三)- Spring Cloud Config配置

走在怀挺的小路上 2019-01-11
380

Spring Cloud Config配置

线上环境,修改配置,动态加载是刚需。本节我将记录下如何运用Spring Cloud Config动态加载服务所需的配置,实现热加载的功能。


前期准备

Config 服务前期准备

Spring Cloud Config需要 git或者svn 作为配置的存储之处。我在 git 上建立了一个Config-Repo的工程,如下图:


这里需要了解一下,Spring boot启动时加载文件的顺序问题


具体可参考:翟永超的《Spring Cloud 微服务实战》一书,第25页。


其中 newproduct.yml 配置为:


spring:

  profiles:

    active: dev


newproduct-dev.yml 为:


#server

server:

  port: 9005

#spring

spring:

  application:

    name: newproduct

  datasource:

    name: SpringCloudSell

    type: com.alibaba.druid.pool.DruidDataSource

    #druid

    druid:

      filters: stat

      driver-class-name: com.mysql.jdbc.Driver

      url: jdbc:mysql://localhost:3306/SpringCloudSell?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false

      username: zyx

      password: zyx

      initial-size: 1

      min-idle: 1

      max-active: 20

      max-wait: 60000

      time-between-eviction-runs-millis: 60000

      min-evictable-idle-time-millis: 300000

      validation-query: SELECT 'x'

      test-while-idle: true

      test-on-borrow: false

      test-on-return: false

      pool-prepared-statements: false

      max-pool-prepared-statement-per-connection-size: 20


#mybatis

mybatis:

  mapper-locations: classpath:mapping/*.xml

  type-aliases-package: com.taeyeon


#logging

logging:

  level:

    com.taeyeon.category.dao: debug

    com.taeyeon.info.dao: debug

    

#test

girl:

  name: zwy

  age: 23

  

#boy

boy:

  name: zyx

  age: 18


Config服务配置

1. pom 文件需要引入依赖:

<dependency>

      <groupId>org.springframework.cloud</groupId>

      <artifactId>spring-cloud-config-server</artifactId>

      <version>2.0.1.RELEASE</version>

</dependency>


2. 启动类需要注解 @EnableConfigServer

@SpringBootApplication

@EnableEurekaClient

@EnableConfigServer

public class ConfigApplication {

    public static void main(String[] args) {

        System.out.println("++++++++++++++++++++++ConfigApplication Start+++++++++++++++++++++++++");

        SpringApplication.run(ConfigApplication.class, args);

        System.out.println("======================ConfigApplication Start is Done=========================");

    }

}


3. application.yml 配置

server:

  port: 9001

#spring

spring:

  application:

    name: config


#uri 填写Config-Repo的 github 地址;如果Config-Repo是私有项目,则username和 Password 则填写你的

#github的用户名和密码; 否则,username和 Password不用配置

  cloud:

    config:

      server:

        git:

          uri: xxxx

          username: xxxx

          password: xxxx

#eureka

eureka:

  client:

    service-url:

      defaultZone: http://peers1:9010/eureka/,http://peers0:9009/eureka/

    fetch-registry: true

    register-with-eureka: true

  instance:

    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}


#这里需要消息队列,实现将配置的更改信息推送到消息对列,然后消费者从消息队列中获取配置信息。

rabbitmq:

  addresses: localhost

  port: 15672

  username: guest

  password: guest


#主要用于开启refresh 功能

management:

  endpoints:

    web:

      exposure:

        include: "*"


至此,config 服务配置完毕,接下来配置config-client:newproduct服务。


newproduct服务配置

1. pom 依赖

<!-- RabbitMQ-->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-bus-amqp</artifactId>

            <version>2.0.0.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-config-client</artifactId>

            <version>2.0.1.RELEASE</version>

        </dependency>


2. bootstrap.yml 配置

由于 newproduct需要从 config服务中拉去配置信息,因此 newproduct本地配置 bootstrap.yml,且它的加载优先级高于application.yml。

#spring

spring:

  application:

    name: newproduct

  cloud:

    config:

      discovery:

        enabled: true

        service-id: CONFIG

      profile: dev


rabbitmq:

  addresses: localhost

  port: 15672

  username: guest

  password: guest


  #Eureka Server

eureka:

  client:

    service-url:

      defaultZone: http://peers0:9009/eureka/,http://peers1:9010/eureka/

    register-with-eureka: true

    fetch-registry: true

  instance:

    instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}


3. RefreshScope

两种方式指定需要动态刷新的 bean:

1) 调用类

比如,我们现在需要在controller 层调用一个可以动态变化的参数girl的 age 字段(如 Config-Repo 中配置的 newproduct-dev.yml所示),调用的 controller 类如下所示:

@RestController

@RefreshScope

public class ConfigController {

    @Autowired

    private Environment env;


    @GetMapping("/girl")

    public Map<String,String> getGirl(){

        Map<String,String> map = new HashMap<>();

        map.put("Name",env.getProperty("girl.name"));

        map.put("Age",env.getProperty("girl.age"));

        return map;

    }


2) 配置类(推荐)

@Data

@Component

@ConfigurationProperties("boy")

public class BoyConfig {

    private String name;

    private String age;

}


controller 调用:


@RestController

@RefreshScope

public class ConfigController {

@Autowired

private BoyConfig boyConfig;

  

@GetMapping("/boy")

public Map<String,String> getBoy(){

    Map<String,String> map = new HashMap<>();

    map.put("Name",boyConfig.getName());

    map.put("Age",boyConfig.getAge());

    return map;

}


刷新配置

前面的配置已经完成了大部分,但是若想要完成热加载,还需要调用 bus-refresh,两种方式:


1. 手动

github 上手动更改了 girl 或者 boy 的信息后,本地调用config服务的 bus-refresh 请求:

curl -v -X POST “http://localhost:9001/actuator/bus-refresh”


2. webhooks

github、gitee 等都有 webhooks 相关功能,更多功能可百度、谷歌。。。。。。

我用的是 github,若想实现修改配置保存成功后就发送一个 post 请求到本地,那就必须要有一个公网的地址和本地地址映射,大家可以了解下 natapp.cn,可以免费申请一个临时的地址。

PayLoad URL 填写 http://xxxx/monitor ,其中 xxxx 即为你申请到的地址。

End…


文章转载自走在怀挺的小路上,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论