チュートリアルのSpringCloudシリーズ| VII:春クラウドコンフィグ設定のセンターの可用性とリフレッシュ
Springboot:2.1.6.RELEASE
SpringCloud:Greenwich.SR1
特に指定しない限り、後でこのチュートリアルシリーズまたはをフルに活用
1.はじめに
私たちは、春のクラウドconfig設定センターを話した、とGitHubのは何と統合する前、私たちのサーバーは、自分がデモテスト、テスト環境のみを使用するか、それを行うことができ、サービスのいずれかのスタンドアロンバージョンのスタンドアロンエンドで本番環境が厳しく禁止されてスタンドアローンのサービス、および流通センターは全体のマイクロサービスシステムにおける重要なノード、DevOpsチームで特に自動拡張され、物流センターのダウンタイムならば、すべての自動拡張が失敗します。
だから我々はこれについて、高可用性構成の中心部を話し、それはspringcloudシステムでは、高可用性来る、レジストリがあり、その後、私たちのコンフィギュレーション・センターでは、サービスである、それはユーレカのサービス登録を使用して行うことが可能ですし、それを見つけました?
答えはイエスです。
2.エンドサーブ
私たちは、コンフィグは、サーブすることはユーレカに登録することができ、新しいディレクトリにコピーサーブの一つ、増加依存ユーレカ・クライアントに終了します。
2.1の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>
<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>
2.2プロファイルapplication.yml
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/
ユーレカアドレスの設定を増やします
2.3起動クラス
起動クラス@EnableEurekaClient活性化レジストリのためのサポートの強化
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);
}
}
サーバー側ので、修正が完了している登録。まず、ユーレカを開始サーブ再起動し、ブラウザでhttpで:// localhostを:8761 /、あなたが私たちのサーブの終わりには、レジストリに登録されている、と我々はクライアントの終了を変換するために始めた見ることができます。
3.クライアント側
CONFIG-クライアントサービスがレジストリから見つけることができる作り、増加依存ユーレカ・クライアントとして第一またはクライアントコピーの上端部を超えると、サーバー側。
3.1の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>
<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>
3.2 bootstrap.properties
ここでは、すべての構成は、すべてのbootstrap.propertiesに転送され、application.ymlを空にする必要があります。
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は、主に、最終的な3つの構成を増大させる、サーバ側のアドレス設定を直接除去します。
- spring.cloud.config.discovery.enabled:オープン構成サービスディスカバリをサポート
- spring.cloud.config.discovery.serviceId:即ちサーバ側spring.application.nameの値は、サーバー側の名前を指定
- eureka.client.serviceUrl.defaultZone:アドレス登録センターで
3.3起動クラス
起動クラス@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);
}
}
4.高可用性
今、私たちは、本番環境をシミュレートする必要があります。
まず、今度はユーレカ、サーバー、クライアントを起動します。
アイデアに2つのコンフィグサーブ開始し、我々は、スタートアップコンフィギュレーション、ポート8000スタートサーブ設定への変更を設定するには、アイデアを変更します。
最初の訪問のhttp:// localhostを:8761 /、次の2つの設定サーブが正しくレジストリに登録されて見ることができます。
上記のように見つけることができ、システムの影響を防止するために使用される二つのエンドサービス構成サーバセンターは、特定のステージの後ダウンし提供します。
ます。http:私たちは、リンクのクライアント側を訪問// localhostを:8081 /こんにちは、あなたは正しく表示さ見ることができます:こんにちは、その後のdevのアップデート1には、何の問題を示していない、数回更新し、そして今、我々はランダムに設定サーブサービスポートを停止し、ページを更新するには、そのページが正常に表示さ見つけることができます:ハローのdevのアップデート1。
至此,我们高可用的目的已经达到,但是,不知道各位有没有映像,我们上一篇留了一个坑,服务启动后,我们修改远端github上的配置时,这个配置并不会实时被客户端端所获取到,下面我们来聊一聊有关Spring Cloud Config 刷新的问题。
5. refresh
我们的客户端并不能主动去感知Git或者Svn的配置变化,从而主动获取最新的配置。那么,客户端如何去主动获取新的配置信息呢?springcloud已经给我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh。
修改config-client项目已到达可以refresh的功能。
5.1 添加依赖pom.xml
在我们原有的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的功能。
5.2 开启更新机制
需要给加载变量的类上面加载@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;
}
}
5.3 配置文件bootstrap.properties
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=*
- management.security.enabled: springboot 1.5.X 以上默认开通了安全认证,所以需要添加这个配置
- management.endpoints.web.exposure.include: springboot 2.x 默认只开启了info、health的访问,*代表开启所有访问
5.4 测试
我们先访问客户端的测试连接: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是一个好的办法。
6. webhook
WebHook是当某个事件发生时,通过发送http post请求的方式来通知信息接收方。Webhook来监测你在Github.com上的各种事件,最常见的莫过于push事件。如果你设置了一个监测push事件的Webhook,那么每当你的这个项目有了任何提交,这个Webhook都会被触发,这时Github就会发送一个HTTP POST请求到你配置好的地址。
如此一来,你就可以通过这种方式去自动完成一些重复性工作,比如,你可以用Webhook来自动触发一些持续集成(CI)工具的运作,比如Travis CI;又或者是通过 Webhook 去部署你的线上服务器。下图就是github上面的webhook配置。
- Payload URL: 触发后回调的URL
- Content type: 数据格式,两种一般使用json
- Secret: 用作给POST的body加密的字符串。采用HMAC算法
- events: 触发的事件列表
events事件类型 | 描述 |
---|---|
push | 仓库有push时触发。默认事件 |
create | 当有分支或标签被创建时触发 |
delete | 当有分支或标签被删除时触发 |
这样我们就可以利用hook的机制去触发客户端的更新,但是当客户端越来越多的时候hook支持的已经不够优雅,另外每次增加客户端都需要改动hook也是不现实的。其实Spring Cloud给了我们更好解决方案,我们在下一篇接着聊。