上一篇咱们聊了Spring Cloud Config 配置中心,而且和Github作了集成,咱们的Server端是单机版的,任何单机版的服务都只能使用与测试环境或者本身作Demo测试,生产环境严禁使用单机服务,配置中心在整个微服务体系中都是及其重要的一个节点,尤为是在DevOps中自动扩容,若是配置中心宕机,那么全部的自动扩容都会失败。(了解源码可+求求: 1791743380)java
因此这一篇咱们聊聊配置中心的高可用,说到高可用,在springcloud体系中,是有注册中心的,那么,咱们的配置中心也是一个服务,可不可使用Eureka作服务的注册与发现呢?git
答案是确定的。github
咱们将上一篇的Serve端Copy到新的目录中,增长Eureka-client的依赖,使得Config-Serve能够注册到Eureka上。web
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.springcloud</groupId> <artifactId>config-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>config-server</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
server: port: 8080 spring: application: name: spring-cloud-config-server cloud: config: server: git: uri: https://github.com/meteor1993/SpringCloudLearning search-paths: chapter6/springcloud-config username: username password: password eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
增长eureka的地址配置算法
启动类增长@EnableEurekaClient激活对注册中心的支持spring
package com.springcloud.configserver; 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 ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
这样Server注册端咱们就修改完成了。先启动Eureka,再启动Serve,在浏览器中访问http://localhost:8761/,就能够看到咱们的Serve端已经注册到注册中心了,接下来咱们开始改造Client端。apache
首先仍是将上一篇的Client端Copy过来,和Server端同样,增长Eureka-client的依赖,使得Config-Client能够从注册中心上发现服务。json
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.springcloud</groupId> <artifactId>config-client</artifactId> <version>0.0.1-SNAPSHOT</version> <name>config-client</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
这里咱们须要先清空application.yml,全部的配置全都转移到bootstrap.properties中。bootstrap
spring.application.name=spring-cloud-config-client server.port=8081 spring.cloud.config.name=springcloud-config spring.cloud.config.profile=dev spring.cloud.config.label=master spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.serviceId=spring-cloud-config-server eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
主要是去掉了spring.cloud.config.uri直接指向server端地址的配置,增长了最后的三个配置:浏览器
启动类增长@EnableEurekaClient激活对注册中心的支持
package com.springcloud.configclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } }
如今咱们来模拟生产环境。
首先,顺次启动Eureka,Server,Client。
在idea启动两个config-serve,咱们修改idea配置启动配置,换到8000端口启动config-serve。
先访问http://localhost:8761/,能够看到两个config-serve都正常注册到注册中心。
[
](https://springcloud-oss.oss-c...
如上图就可发现会有两个server端同时提供配置中心的服务,防止某一台down掉以后影响整个系统的使用。
咱们访问client端的连接:http://localhost:8081/hello, 能够看到页面正常显示:hello dev update1,刷新几回,显示都没问题,如今咱们随机停掉一个端口的config-serve服务,再去刷新页面,能够发现,页面依然能够正常显示:hello dev update1。
至此,咱们高可用的目的已经达到,可是,不知道各位有没有映像,咱们上一篇留了一个坑,服务启动后,咱们修改远端github上的配置时,这个配置并不会实时被客户端端所获取到,下面咱们来聊一聊有关Spring Cloud Config 刷新的问题。
咱们的客户端并不能主动去感知Git或者Svn的配置变化,从而主动获取最新的配置。那么,客户端如何去主动获取新的配置信息呢?springcloud已经给咱们提供了解决方案,每一个客户端经过POST方法触发各自的/refresh。
修改config-client项目已到达能够refresh的功能。
在咱们原有的config-client项目的pom.xml的基础增长新的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
增长了spring-boot-starter-actuator包,spring-boot-starter-actuator是一套监控的功能,能够监控程序在运行时状态,其中就包括/refresh的功能。
须要给加载变量的类上面加载@RefreshScope,在客户端执行/refresh的时候就会更新此类下面的变量值。
package com.springcloud.configclient.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Author: shiyao.wei * @Date: 2019/7/4 16:19 * @Version: 1.0 * @Desc: */ @RestController @RefreshScope // 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。 public class HelloController { @Value("${springcloud.hello}") private String hello; @RequestMapping("/hello") public String from() { return this.hello; } }
spring.application.name=spring-cloud-config-client server.port=8081 spring.cloud.config.name=springcloud-config spring.cloud.config.profile=dev spring.cloud.config.label=master spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.serviceId=spring-cloud-config-server eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ management.security.enabled=false management.endpoints.web.exposure.include=*
咱们先访问客户端的测试链接:http://localhost:8081/hello, 这时,页面的显示是:hello dev update1,咱们修改github上的信息,修改成:hello dev update,如今访问http://localhost:8081/hello,获得的信息仍是:hello dev update1,如今咱们刷新一下客户端,经过cmd命令行执行:curl -X POST http://localhost:8081/actuator/refresh,能够看到命令行上有显示:[“springcloud.hello”,”config.client.version”],意味着springcloud.hello这个配置已经刷新,这时,咱们再去刷新一下页面,能够看到,页面上获得的信息已经变为了:hello dev update,这时咱们refresh成功。
每次手动刷新客户端仍是很麻烦,有没有什么办法只要提交代码就自动调用客户端来更新呢,github的webhook是一个好的办法。
WebHook是当某个事件发生时,经过发送http post请求的方式来通知信息接收方。Webhook来监测你在Github.com上的各类事件,最多见的莫过于push事件。若是你设置了一个监测push事件的Webhook,那么每当你的这个项目有了任何提交,这个Webhook都会被触发,这时Github就会发送一个HTTP POST请求到你配置好的地址。
如此一来,你就能够经过这种方式去自动完成一些重复性工做,好比,你能够用Webhook来自动触发一些持续集成(CI)工具的运做,好比Travis CI;又或者是经过 Webhook 去部署你的线上服务器。下图就是github上面的webhook配置。
[
](https://springcloud-oss.oss-c...
events事件类型
描述
push
仓库有push时触发。默认事件
create
当有分支或标签被建立时触发
delete
当有分支或标签被删除时触发
这样咱们就能够利用hook的机制去触发客户端的更新,可是当客户端愈来愈多的时候hook支持的已经不够优雅,另外每次增长客户端都须要改动hook也是不现实的。