Back to Javatutorial

SpringCloudConfig

docs/Spring全家桶/SpringCloud/SpringCloudConfig.md

1.0.020.8 KB
Original Source

ڷֲʽ΢ϵͳУзж벻ļ֧֣Щļͨɸй properties yml ʽڸ΢·£ application.properties application.yml ȡ

ֽļɢڸеĹʽ⣺

  • Ѷȴļɢڸ΢УԹ
  • ȫԵøԴ뱣ڴУй©
  • ʱЧԲ΢е޸ĺ󣬱񣬷޷Ч
  • ****޷ֶ֧̬־ءܿء

Ϊ˽Щ⣬ͨǶʹĶýͳһϿԴкܶ࣬ٶȵ DisconfԱ diamond360 QConfЯ̵ Apollo ȶǽġSpring Cloud ҲԼķֲʽģǾ Spring Cloud Config

Spring Cloud Config

Spring Cloud Config Spring Cloud ŶӿĿΪ΢ܹи΢ṩлⲿ֧֡

򵥵˵ǣSpring Cloud Config Խ΢ļд洢һⲿĴ洢ֿϵͳ Git SVN ȣУõͳһָ֧΢С Spring Cloud Config ֣

  • Config ServerҲΪֲʽģһе΢ӦãòֿⲢΪͻṩȡϢϢͽϢķʽӿڡ
  • Config Clientָ΢ܹеĸ΢ͨ Config Server ýй Config Sever лȡͼϢ

Spring Cloud Config Ĭʹ Git 洢Ϣʹ Spirng Cloud Config ÷Ȼֶ֧΢õİ汾ǿʹ Git ͻ˹߷ضݽйͷʡ Git ⣬Spring Cloud Config ṩ˶洢ʽ֧֣ SVNػļϵͳȡ

Spring Cloud Config ԭ

Spring Cloud Config ԭͼ

ͼ1Spring Cloud Config ԭ

Spring Cloud Config £

  1. άԱύļԶ̵ Git ֿ⡣
  2. Config ˣֲʽģòֿ Git Config ͻ˱¶ȡõĽӿڡ
  3. Config ͻͨ Config ˱¶Ľӿڣȡòֿеá
  4. Config ͻ˻ȡϢַ֧С

Spring Cloud Config ص

Spring Cloud Config ص㣺

  • Spring Cloud Config Spring Cloud Ŷӿ˵ Spring ׶ӣܹ Spring ̬ϵ޷켯ɡ
  • Spring Cloud Config ΢ļд洢һⲿĴ洢ֿϵͳ GitУͳһ
  • Spring Cloud Config Ľ REST ӿڵʽ¶΢Է΢ȡ
  • ΢ͨ Spring Cloud Config ͳһȡԼϢ
  • ÷仯ʱ΢Ҫɸ֪õı仯ԶȡӦá
  • һӦÿж翪devԣtestprodȵȣԱͨ Spring Cloud Config ԲͬĸýйܹȷӦڻǨƺȻ֧С

Ǿͨʵʾ Spring Cloud Config ʹá

 Config

1. Github ϴһΪ springcloud-config IJֿ⣨Repositoryȡòֿĵַ Github վڹû˵ȶܴܿڼػ⣬ǿִиò

2. ڸ spring-cloud-demo2 £һΪ micro-service-cloud-config-center-3344 Spring Boot ģ飬 pom.xml Spring Cloud Config ¡

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>spring-cloud-demo2</artifactId>
        <groupId>net.biancheng.c</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>net.biancheng.c</groupId>
    <artifactId>micro-service-cloud-config-center-3344</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>micro-service-cloud-config-center-3344</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--ķ-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3. micro-service-cloud-config-center-3344 ·/resources Ŀ¼£һΪ application.yml ļ¡


server:
  port: 3344 #˿ں
spring:
  application:
    name: spring-cloud-config-center #
  cloud:
    config:
      server:
        git:
          # Git ַhttps://gitee.com/java-mohan/springcloud-config.git
          # ƣgiteeַ uri: https://github.com/javmohan/springcloud-config.git  (github վʽʹ gitee)
          uri: https://gitee.com/java-mohan/springcloud-config.git
          #ֿ
          search-paths:
            - springcloud-config
          force-pull: true
          # GitֿΪֿ⣬Բдû룬˽вֿҪд
          # username: ********
          # password: ********
      #֧
      label: master

eureka:                                            
  client: #ͻעᵽ eureka б
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/  #עᵽ Eureka Ⱥ

4. micro-service-cloud-config-center-3344 ϣʹ @EnableConfigServer ע⿪ Spring Cloud Config Ĺܣ¡

package net.biancheng.c;

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
@EnableEurekaClient
@EnableConfigServer
public class MicroServiceCloudConfigCenter3344Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroServiceCloudConfigCenter3344Application.class, args);
    }

}

5. ½һΪ config-dev.yml ļϴ springcloud-config ֿ master ֧£config-dev.yml ¡

config:
  info: c.biancheng.net
  version: 1.0

6. עģȺ micro-service-cloud-config-center-3344ʹʡhttp://localhost:3344/master/config-dev.ymlͼ

ͼ2ļ

Spring Cloud Config 涨һļʹ±

ʹʾ
/{application}/{profile}[/{label}]/config/dev/master
/{application}-{profile}.{suffix}/config-dev.yml
/{label}/{application}-{profile}.{suffix}/master/config-dev.yml

ʹڸ˵¡

  • {application}Ӧƣļƣ config-dev
  • {profile}һĿͨпdev汾ԣtest汾prod汾ļ application-{profile}.yml ʽ֣ application-dev.ymlapplication-test.ymlapplication-prod.yml ȡ
  • {label}Git ֧Ĭ master ֧ĬϷ֧µļʱòʡԣڶַʷʽ
  • {suffix}ļĺ׺ config-dev.yml ĺ׺Ϊ yml

ͨ׹ϾֱӶļзʡ

7. Ϸʡhttp://localhost:3344/config-dev.ymlͼ

ͼ3Spring Cloud Config ļ

8. Ϸʡhttp://localhost:3344/config/dev/master¡

{"name":"config","profiles":["dev"],"label":"master","version":"9caafcc3498e04147463482f8b29e925e8afcc3a","state":null,"propertySources":[{"name":"https://gitee.com/java-mohan/springcloud-config.git/config-dev.yml","source":{"config.info":"c.biancheng.net","config.version":1.0}}]}

ԴǾ˶ Spring Cloud Config ˵ĴͲԡ

 Config ͻ

1. ڸ spring-cloud-demo2 £һΪ micro-service-cloud-config-client-3355 Spring Boot ģ飬 pom.xml Spring Cloud Config ͻ˵¡


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>spring-cloud-demo2</artifactId>
        <groupId>net.biancheng.c</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>net.biancheng.c</groupId>
    <artifactId>micro-service-cloud-config-client-3355</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>micro-service-cloud-config-client-3355</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--Spring Cloud Config ͻ-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2. micro-service-cloud-config-client-3355 ·/resources Ŀ¼£һΪ bootstrap.yml ļ¡

#bootstrap.yml ϵͳģȼ application.yml ⲿò
server:
  port: 3355 #˿ں
spring:
  application:
    name: spring-cloud-config-client #
  cloud:
    config:
      label: master #֧
      name: config  #ļƣconfig-dev.yml е config
      profile: dev  #  config-dev.yml е dev
      #ﲻҪ http:// ޷ȡ
      uri: http://localhost:3344 #Spring Cloud Config ˣģַ

eureka:
  client: #ͻעᵽ eureka б
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/  #עᵽ Eureka Ⱥ

3. net.biancheng.c.controller £һΪ ConfigClientController ࣬ͨȡļеã¡


package net.biancheng.c.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

//ȡָļݣչʾҳ
@RestController
public class ConfigClientController {
    @Value("${server.port}")
    private String serverPort;

    @Value("${config.info}")
    private String configInfo;

    @Value("${config.version}")
    private String configVersion;

    @GetMapping(value = "/getConfig")
    public String getConfig() {
        return "info" + configInfo + "
version" + configVersion + "
port" + serverPort;
    }
}

4. micro-service-cloud-config-client-3355 ϣʹ @EnableEurekaClient ע⿪ Eureka ͻ˹ܣ¡


package net.biancheng.c;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class MicroServiceCloudConfigClient3355Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroServiceCloudConfigClient3355Application.class, args);
    }

}

5. micro-service-cloud-config-client-3355ʹʡhttp://localhost:3355/getConfig,ͼ

ͼ4Spring Cloud Config ͻ˻ȡϢ

6. ļ config-dev.yml config.version ֵ޸Ϊ 2.0¡

config:
  info: c.biancheng.net
  version: 2.0

7. Eureka עģȺ micro-service-cloud-config-center-3344 ʹʡhttp://localhost:3344/master/config-dev.ymlͼ

ͼ5Ļȡ޸ĺļ

ͼ 6 ԿѾɹػȡ޸ĺá

8. ٴηʡhttp://localhost:3355/getConfigͨ Spring Cloud Config ͻ˻ȡ޸ĺϢͼ

ͼ6Spring Cloud Config ͻ˻ȡ޸ĺϢ

9. micro-service-cloud-config-client-3355ٴʹ÷ʡhttp://localhost:3355/getConfigͼ

ͼ7 Spring Cloud Config ͻ˻ȡ

ͨʵǿԵõ 2 ۣ

  • øºSpring Cloud Config ˣServerֱӴ Git ֿлȡµá
  • Spring Cloud Config ͻˣClient޷ͨ Spring Cloud Config ˻ȡµϢ

ֶˢ

Ϊ˽ Config ͻ޷ȡõ⣬ǾͶ micro-service-cloud-config-client-3355 и죬첽¡

1. micro-service-cloud-config-client-3355 pom.xml Spring Boot actuator ģ顣



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

2. ļ bootstrap.yml ãⱩ¶ Spring Boot actuator ļؽڵ㡣


# Spring Boot 2.50 actuator ˴Ľڵ㣬ֻ¶ health ڵ㣬ã*Ϊ˿еĽڵ
management:
  endpoints:
    web:
      exposure:
        include: "*"   # * yaml ļڹؼ֣Ҫ

3. ConfigClientController ʹ @RefreshScope ע⿪ˢ£¡


package net.biancheng.c.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

// ȡָļݣչʾҳ
@RefreshScope //Ϊöֶ̬Ļȡµgit ã actuator ؼ RefreshScope
@RestController
public class ConfigClientController {
    @Value("${server.port}")
    private String serverPort;

    @Value("${config.info}")
    private String configInfo;

    @Value("${config.version}")
    private String configVersion;

    @GetMapping(value = "/getConfig")
    public String getConfig() {
        return "info" + configInfo + "
 version" + configVersion + "
port" + serverPort;
    }
}

4. micro-service-cloud-config-client-3355Ȼļ config-dev.yml е config.version ޸Ϊ 3.0¡

config:
  info: c.biancheng.net
  version: 3.0

5. ʹٴηʡhttp://localhost:3355/getConfigͼ

ͼ8 Spring Cloud Config ͻ˺ȡ

ͼ 9 ԿʹǶ Spring Cloud Config ͻ˽˸죬ҲȻ޷ֱӻȡá

6. дڣʹһ POST ˢ Spring Cloud Config 3355 ͻˣ֪ͨͻļѾ޸ģҪȥá

curl -X POST "http://localhost:3355/actuator/refresh"

  1. ʹٴηʡhttp://localhost:3355/getConfigͼ

ͼ9ֶˢ¿ͻ

ֶˢõ

ʵУͨ Config ͻˣ˿ںţ3355 Spring Boot actuator õı仯ʹǿڲ Config ͻ˵»ȡãԭͼ

ͼ10Spring Cloud Congfig ֶˢ

ַʽȻ Config ͻ˲ܻȡõ⣬һȴҲǾֻҪòֿе÷ı䣬Ҫǰ Config ͻֶ POST ֪ͨȡá

֪ν Config ͻʵһһķ΢ܹУһϵͳʮʮΪijһļ޸Ķʮ΢ POST ȻDzġ

ôûСһ֪ͨЧķʽأǿ϶ġSpring Cloud Config Bus ͿʵõĶ̬ˢ¡

Config+Bus ʵõĶ̬ˢ

Spring Cloud Bus ֱΪϢߣܹͨϢ RabbitMQKafka ȣ΢ܹеĸʵֹ㲥״̬ġ¼͵ȹܣʵ΢֮ͨŹܡ

Ŀǰ Spring Cloud Bus ֧ϢRabbitMQ Kafka

Spring Cloud Bus Ļԭ

Spring Cloud Bus ʹһϢһϢ TopicĬΪspringCloudBus Topic еϢᱻзʵѡеһˢʱSpring Cloud Bus Ϣ浽 Topic У Topic ķյϢԶѡ

Spring Cloud Bus ̬ˢõԭ

Spring Cloud Bus ƿʵֺܶ๦ܣ Spring Cloud Config ʵõĶ̬ˢ¾͵Ӧó֮һ

Git ֿе÷˸ı䣬ֻҪijһ񣨼ȿ Config ˣҲ Config ͻˣһ POST Spring Cloud Bus ͿͨϢ֪ͨȡãʵõĶ̬ˢ¡

Spring Cloud Bus ̬ˢõĹԭͼʾ

ͼ11Bus+Config ʵõĶ̬ˢ

ͼ 12 Spring Cloud Bus ʵõĶ̬ˢҪ²:

  1. Git ֿе÷ıάԱ Config ˷һ POST ·Ϊ/actuator/refresh
  2. Config ˽յ󣬻Ὣת Spring Cloud Bus
  3. Spring Cloud Bus ӵϢ󣬻֪ͨ Config ͻˡ
  4. Config ͻ˽յ֪ͨ Config ȡá
  5. Config ͻ˶ȡµá

Spring Cloud Bus ̬ˢãȫֹ㲥

RabbitMQ Ϊʾʹ Config+Bus ʵõĶ̬ˢ¡

1. micro-service-cloud-config-center-3344 pom.xml У Spring Boot actuator ģ Spring Cloud Bus ¡


<!--ϢߣBus RabbitMQ ֧-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<!--Spring Boot actuator ģ-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. micro-service-cloud-config-center-3344 ļ application.yml У RabbitMQ Spring Boot actuator ã¡

##### RabbitMQ ã15672 web Ķ˿ڣ5672  MQ ķʶ˿###########
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

# Spring Boot 2.50 actuator ˴Ľڵ㣬ֻ¶ heath ڵ㣬ã*Ϊ˿еĽڵ
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'

3. micro-service-cloud-config-client-3355 pom.xml У Spring Cloud Bus ¡



1.  <!--ϢߣBus RabbitMQ ֧-->
2.  <dependency>
3.  <groupId>org.springframework.cloud</groupId>
4.  spring-cloud-starter-bus-amqp
5.  </dependency>

  1. micro-service-cloud-config-client-3355 ļ bootstrap.yml á

<!--ϢߣBus RabbitMQ ֧-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

5. micro-service-cloud-config-client-3355½һΪ micro-service-cloud-config-client-bus-3366 Spring Boot ģ飨˿ںΪ 3366ļ bootstrap.yml á


#bootstrap.yml ϵͳģȼ application.yml ⲿò
server:
  port: 3366  #˿ںΪ 3366
spring:
  application:
    name: spring-cloud-config-client-bus

  cloud:
    config:
      label: master #֧
      name: config  #ļƣconfig-dev.yml е config
      profile: dev  #ļĺ׺  config-dev.yml е dev
      #ﲻҪ http:// ޷ȡ
      uri: http://localhost:3344 #spring cloud ĵַ

##### RabbitMQ ã15672 web Ķ˿ڣ5672  MQ ķʶ˿###########
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
###################### eureka  ####################
eureka:
  client: #ͻעᵽ eureka б
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/  #עᵽ Eureka Ⱥ

# Spring Boot 2.50 actuator ˴Ľڵ㣬ֻ¶ heath ڵ㣬ã*Ϊ˿еĽڵ
management:
  endpoints:
    web:
      exposure:
        include: "*"   # * yaml ļڹؼ֣Ҫ

6. micro-service-cloud-config-center-3344micro-service-cloud-config-client-3355ʹʡhttp://localhost:3355/getConfigͼ

ͼ12Spring Cloud Bus ̬ˢ

7. micro-service-cloud-config-client-bus-3366ʹʡhttp://localhost:3366/getConfigͼ

ͼ13Spring Cloud Bus ̬ˢ

  1. ļ config-dev.yml е config.version ޸Ϊ 4.0¡
config:
  info: c.biancheng.net
  version: 4.0

9. дڣʹ micro-service-cloud-config-center-3344Config Serverһ POST ˢá

curl -X POST "http://localhost:3344/actuator/bus-refresh"

  1. ʹٴηʡhttp://localhost:3355/getConfigͼ

ͼ14Spring Cloud Bus ̬ˢ

  1. ʹٴηʡhttp://localhost:3366/getConfigͼ

ͼ15Spring Cloud Bus ̬ˢ

ע⣺ʹ Spring Cloud Bus ʱ뱣֤ Bus ӵϢ RabbitMQѾȷװ

Spring Cloud Bus ̬ˢã֪ͨ

ν֪ͨDz֪ͨе Config ͻˣǸֻ֪ͨijһ Config ͻˡ

ʹ Spring Cloud Bus ʵֶ֪ͨķʮּ򵥣ֻҪڷ POST ʱʹ¸ʽɡ

http://{hostname}:{port}/actuator/bus-refresh/{destination}

˵£

  • {hostname} ʾ Config ˵ַȿҲ IP ַ
  • {port}ʾ Config ˵Ķ˿ں.
  • {destination}ʾҪ֪ͨ Config ͻˣ΢񣩣 Config ͻ˵ķspring.application.name+˿ںţserver.portɣֻ֪ͨ micro-service-cloud-config-client-3355 ˢãȡֵΪ spring-cloud-config-client:3355

Ǿͨһ򵥵ʵʾ Spring Cloud Bus ̬ˢµĶ֪ͨ

1. ļ config-dev.yml е config.version ޸Ϊ 5.0¡

config:
  info: c.biancheng.net
  version: 5.0

2. дڣʹ micro-service-cloud-config-center-3344 һ POST

curl -X POST "http://localhost:3344/actuator/bus-refresh/spring-cloud-config-client:3355"

3. ʹʡhttp://localhost:3355/getConfigͼ

ͼ16Spring Cloud Bus ֪ͨ

4. ʹٴηʡhttp://localhost:3366/getConfigͼ

ͼ17Spring Cloud Bus ֪ͨ

ο

https://lijunyi.xyz/docs/SpringCloud/SpringCloud.html#_2-2-x-%E5%88%86%E6%94%AF https://mp.weixin.qq.com/s/2jeovmj77O9Ux96v3A0NtA https://juejin.cn/post/6931922457741770760 https://github.com/D2C-Cai/herring http://c.biancheng.net/springcloud https://github.com/macrozheng/springcloud-learning