Spring Cloud是很多组件的集合,Spring将常用的技术框架进行包装和整合,如mybatis zookeeper rabbitmq redis等等,还有一些科技公司贡献出来的一些经过生产环境验证的组件如奈飞公司贡献出的eureke(服务发现) Hystrix(监控与隔离)  Feign(声明式服务调用)  Ribbon(负载均衡) Zuul(网关) 等等,详情移步官网 SpringCloud

Spring Cloud是目前比较流行的微服务开发框架,可以与容器技术如docker一起使用,提高生产力。但是组件过多也有一定的学习曲线,而且适合大公司的架构不见得适合我们的业务,要根据实际情况灵活运用。

Spring Cloud Config是基于git/svn仓库来管理配置,然后有一个ConfigServer来负责拉取配置,ConfigClient是使用配置的应用,比如现在有很多微服务应用,如订单管理,用户管理,地址管理,库存管理等等,在这些微服务的pom中增加ConfigClient就可以自动从ConfigServer拉取配置。我们还希望配置更新之后可以实时获取,这时候需要用到spring cloud中的bus组件,bus其实就是基于amqp的一个消息总线,spring对rabbitmq和kafka支持的比较好。常见的场景是:

1、更改配置

2、push到远程仓库

3、push动作触发一个web hook

4、这个web hook会使用post访问ConfigServer的一个接口

5、ConfigServer通过rabbitmq发送一个广播

6、client收到消息,自动拉取并刷新配置

这些不需要任何编码工作,只需要配置就可以。下面是一个简单的例子。

1、rabbitmq安装参照官网,十分简单,也可以参考俺的博客

2、启动一个Config Server

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>spring_cloud</groupId>
    <artifactId>config_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config</artifactId>
                <version>2.0.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <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>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-bus</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/libs-snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

入口类:

@EnableConfigServer

@SpringBootApplication

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

配置:application.properties

server.port=8888
#配置仓库地址
spring.cloud.config.server.git.uri=https://github.com/mychemicalromance/spring_cloud_config
## 配置文件夹
spring.cloud.config.server.git.searchPaths=configs
## 分支
spring.cloud.config.label=master
## 以下是bus相关配置 替换成自己的就行,比如host port name password
spring.cloud.bus.trace.enabled=true
spring.rabbitmq.host=192.168.137.5
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=rabbit
management.endpoints.web.exposure.include=*

解释:Spring Cloud只需要上述入口类就启动了一个web工程,使用的是嵌入的tomcat/jetty。默认读取application.[properties|yml|json] 使用喜欢的格式就行。

3、Config Client

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>spring_cloud</groupId>
    <artifactId>config_client</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config</artifactId>
                <version>2.0.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-bus</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/libs-snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

入口类:

@Configuration
@EnableAutoConfiguration
@RestController
@RefreshScope
public class Application {

    @Value("${a}")
    String name;

    @RequestMapping("/")
    public String home() {
        return "Hello " + name;
    }

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

}

配置:application.properties

server.port=8002
## bus相关配置,替换成自己的就行,比如host port name password
spring.cloud.bus.trace.enabled=true
spring.rabbitmq.host=192.168.137.5
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=rabbit
## 读取app1的配置
spring.application.name=app1
## profile是dev,可以有测试test,沙箱mirror,线上online等等
spring.cloud.config.profile=dev
management.endpoints.web.exposure.include=*

3、启动Config Server和Config Client,首先访问localhost:8888/app1/dev,可以看到所有配置,然后访问localhost:8002/可以看到获取了配置。然后本地更改配置文件并push。由于在github上配置web hook来调用本地是不现实的,所以我们用curl来模拟post访问Config Server,如果是在公司的git上,并且在公司局域网内可以访问Config Server,可以配置web hook来测试。

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

然后刷新Config Client,就能看到最新的配置了。