天天看點

java B2B2C電子商務平台分析之八--配置中心svn示例和refresh

國内很多公司都使用的svn來做代碼的版本控制,我們先介紹以下如何使用svn+Spring Cloud Config來做配置中心。願意了解源碼的朋友直接求求交流分享技術:二一四七七七五六三三

svn版本

同樣先示例server端的代碼,基本步驟一樣。

1、添加依賴

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

需要多引入svnkitr包

2、配置檔案

server:
  port: 8001
 
spring:
  cloud:
    config:
      server:
        svn:
          uri: http://192.168.0.6/svn/repo/config-repo
          username: username
          password: password
        default-label: trunk
  profiles:
    active: subversion
  application:
    name: spring-cloud-config-server
           

和git版本稍有差別,需要顯示聲明subversion.

3、啟動類

啟動類沒有變化,添加@EnableConfigServer激活對配置中心的支援

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
           

4、測試

服務端測試

通路:http :/ /localhost:8001/neo-config-dev.properties,傳回:neo.hello: hello im dev,說明服務端可以正常讀取到svn代碼庫中的配置資訊。修改配置檔案neo-config-dev.properties中配置資訊為:neo.hello=hello im dev update,再次在浏覽器通路http :/ /localhost:8001/neo-config-dev.properties,傳回:neo.hello: hello im dev update。說明server端會自動讀取最新送出的内容

用戶端測試

用戶端直接使用上一篇示例項目spring-cloud-config-client來測試,配置基本不用變動。啟動項目後通路:http :/ /localhost:8002/hello,傳回:hello im dev update說明已經正确的從server端擷取到了參數。同樣修改svn配置并送出,再次通路http :/ /localhost:8002/hello``依然擷取的是舊的資訊,和git版本的問題一樣。

refresh

現在來解決上一篇的遺留問題,這個問題在svn版本中依然存在。Spring Cloud Config分服務端和用戶端,服務端負責将git(svn)中存儲的配置檔案釋出成REST接口,用戶端可以從服務端REST接口擷取配置。但用戶端并不能主動感覺到配置的變化,進而主動去擷取新的配置。用戶端如何去主動擷取新的配置資訊呢,springcloud已經給我們提供了解決方案,每個用戶端通過POST方法觸發各自的/refresh。

修改spring-cloud-config-client項目已到達可以refresh的功能。

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

增加了spring-boot-starter-actuator包,spring-boot-starter-actuator是一套監控的功能,可以監控程式在運作時狀态,其中就包括/refresh的功能。

2、 開啟更新機制

需要給加載變量的類上面加載@RefreshScope,在用戶端執行/refresh的時候就會更新此類下面的變量值。

@RestController
@RefreshScope // 使用該注解的類,會在接到SpringCloud配置中心配置重新整理的時候,自動将新的配置更新到該類對應的字段中。
class HelloController {
 
    @Value("${neo.hello}")
    private String hello;
 
    @RequestMapping("/hello")
    public String from() {
        return this.hello;
    }
}
           

3、測試

springboot 1.5.X 以上預設開通了安全認證,是以需要在配置檔案application.properties添加以下配置

management.security.enabled=false

OK 這樣就改造完了,以post請求的方式來通路

http://localhost:8002/refresh

 就會更新修改後的配置檔案。

我們再次來測試,首先通路http :/ /localhost:8002/hello,傳回:hello im dev,我将庫中的值修改為hello im dev update。在win上面打開cmd執行curl -X POST

,傳回["neo.hello"]說明已經更新了neo.hello的值。 我 們 再次通路

http:/

/localhost:8002/hello,傳回:hello im dev update,用戶端已經得到了最新的值。

每次手動重新整理用戶端也很麻煩,有沒有什麼辦法隻要送出代碼就自動調用用戶端來更新呢,github的webhook是一個好的辦法。

4、webhook

WebHook是當某個事件發生時,通過發送http post請求的方式來通知資訊接收方。Webhook來監測你在Github.com上的各種事件,最常見的莫過于push事件。如果你設定了一個監測push事件的Webhook,那麼每當你的這個項目有了任何送出,這個Webhook都會被觸發,這時Github就會發送一個HTTP POST請求到你配置好的位址。

如此一來,你就可以通過這種方式去自動完成一些重複性工作,比如,你可以用Webhook來自動觸發一些持續內建(CI)工具的運作,比如Travis CI;又或者是通過 Webhook 去部署你的線上伺服器。下圖就是github上面的webhook配置。

java B2B2C電子商務平台分析之八--配置中心svn示例和refresh

Payload URL :觸發後回調的URL

Content type :資料格式,兩種一般使用json

Secret :用作給POST的body加密的字元串。采用HMAC算法

events :觸發的事件清單。

events事件類型 描述

push 倉庫有push時觸發。預設事件

create 當有分支或标簽被建立時觸發

delete 當有分支或标簽被删除時觸發

svn也有類似的hook機制,每次送出後會觸發post-commit腳本,我們可以在這裡寫一些post請求。

這樣我們就可以利用hook的機制去觸發用戶端的更新,但是當用戶端越來越多的時候hook支援的已經不夠優雅,另外每次增加用戶端都需要改動hook也是不現實的。其實Spring Cloud給了我們更好解決方案,後面文章來介紹。

技術架構圖如下:

資料和源碼來源
java B2B2C電子商務平台分析之八--配置中心svn示例和refresh