Spring Cloud微服務運營配置教程

banq發表於2019-01-11

在前面教程中,我們概括了進行微服務業務開發時需要的三個基礎功能:註冊伺服器、斷路器和Feign客戶端,有了這三個元件,你基本可以在本地進行微服務開發,但是在正式Spring Cloud生產環境中,還需要配置伺服器,這樣可以實現動態配置管理,同時需要類似Nginx這樣閘道器路由器Zuul或Spring Cloud Gateway,這兩個元件是生產執行配置方面:

1. Spring Cloud Bus
如何將配置推送到分散式微服務節點?本上我在生產中看到了以下解決方案:

  • 使用分散式快取(Hazelcast,Oracle Coherence ...)
  • 透過JMS或AMPQ等中介軟體推送設定。

Spring Cloud中的一個選項是使用Spring Cloud Bus,它或多或少是我列表中的第二個選項。節點之間的資訊傳輸正在透過AMPQ協議完成,但是他們在路線圖上有其他傳輸方式如JMS。現在我們使用AMPQ。

使用RabbitMQ和Spring Cloud Bus
需要做的就是:

  • 將spring-cloud-starter-bus-amqp依賴項新增到classpath
  • 確保訊息中介軟體正在執行。
  • 如果你在localhost(測試)上執行它,你不需要做任何事情.。如果您單獨執行RabbitMQ,則需要在每個節點上配置以下內容:

spring:
  rabbitmq:
    host: <broker host>
    port: <broker port>
    username: <broker user>
    password: <broker password>


配置Spring Cloud Config Server
Spring Cloud Bus提供的是將指令或配置傳送到偵聽匯流排的MicroServices,以透過以下內建HTTP端點觸發的AMPQ訊息重新載入Spring應用程式屬性(它的行為類似於分散式actuator):
"to invoke the reload of all application.properties of all MicroServices listening on the BUS"
/bus/refresh

"to invoke the reload of application.properties config of specific MicroService"
/bus/refresh?destination=<spring.application.name>:<app port>

"to send a specific key/value pair to MicroService Spring environment"
/bus/env

Spring Cloud Config通常是一個具有儲存在GIT倉庫中的屬性的元件。它們支援許多公共git入口網站,如GitHub,Bitbucket,GitLab ...如果您想使用其他儲存如資料庫來儲存屬性,也可以使用Oracle等配置
現在使用GIT。我們將以下屬性儲存到此GIT倉庫中:
service.dataBatchSize = 1

在microservice-spring-cloud-bus / config資料夾下,配置pring Cloud Config伺服器的地址:

spring.cloud.config.server.git.uri=https://tomask79@bitbucket.org/tomask79/microservice-spring-cloud-bus.git
spring.cloud.config.server.git.searchPaths=microservice-spring-cloud-bus, config


這個配置在告訴伺服器根據spring.cloud.config.server.git.uri屬性值獲取配置儲存庫,並嘗試搜尋幾個資料夾以找到配置檔案。
我們將使用名為citiesService,personsService的兩個MicroServices 來監聽RabbitMQ匯流排。因此config子資料夾將包含citiesService.properties和personsService.properties檔案。
檔名對應到客戶端的spring.application.name屬性值。

客戶端使用Spring Cloud Config Server 
每個MicroService都需要具有以下bootstrap.properties:

spring.cloud.config.uri=http://localhost:9999
spring.cloud.config.enabled=true


這樣,這個微服務就可以到配置伺服器找到我之前配置的屬性service.dataBatchSize。讓我們在以下簡單的citiesService使用這個屬性。

@RestController
@RefreshScope
public class CitiesController {

    @Value("${service.dataBatchSize:0}")
    private int dataBatchSize;

    final City[] cities = {
            new City("Brno", "Czech republic"),
            new City("Bern", "Switzerland"),
            new City("Berlin", "Germany"),
            new City("London", "England")
    };

    @RequestMapping("/cities")
    public Cities getCities() {
        final Cities result = new Cities();

        for (int i=0; i < dataBatchSize; i++) {
            result.getCities().add(cities[i]);
        }

        return result;
    }
}


測試:
  • 首先啟動RabbitMQ訊息系統(啟動取決於您安裝它的環境)
  • git clone https://bitbucket.org/tomask79/microservice-spring-cloud-bus.git
  • mvn clean install(在pom.xml的根資料夾中)
  • cd spring-microservice-registry
  • java -jar target / registry-0.0.1-SNAPSHOT.war
  • 驗證NetFlix Eureka是否在http:// localhost:9761上執行
  • cd ..
  • cd spring-microservice-config
  • java -jar target / config-0.0.1-SNAPSHOT.war
  • cd ..
  • cd spring-microservice-service1
  • java -jar target / service1-0.0.1-SNAPSHOT.war
  • http:// localhost:9761驗證citiesService已註冊
  • cd ..
  • cd spring-microservice-service2
  • java -jar target / service2-0.0.1-SNAPSHOT.war
  • http:// localhost:9761驗證personsService已經註冊

一切正常後可訪問:http://localhost:8081/cities

您應該看到大小等於“service.dataBatchSize”屬性的城市列表。現在更改GIT倉庫中citiesService.properties檔案中的屬性。如果您再次點選http:// localhost:8081 / cities,那麼您將看不到任何更改...要重新載入citiesService MicroService的Spring上下文,請執行以下命令:

(you can run this at any node having spring-cloud-starter-bus-amqp dependency)
curl -X POST http://localhost:9999/bus/refresh


也可以使用Postman的REST客戶端提交重新整理。

2. Spring Cloud Zuul作為微服務閘道器
在編寫微服務時,您將面臨以下問題:

  • 來自客戶端的一個請求跨多個微服務呼叫
  • 你需要如何做金絲雀版本釋出機制
  • 您需要反向代理來呼叫微服務 

類似Nginx一個總的入口閘道器。

Spring Cloud Zuul作為反向代理
在將微服務部署到Docker時,需要處理多個微服務對映到多個埠的問題。但是,您的API消費者不希望知道這些埠,他們只需要在8080埠呼叫其他所有埠的所有內容。這裡有很多解決方案,但使用Spring Cloud Zuul真的很棒!
讓我們在埠8081和8082上執行兩個微服務citiesService和personsService的先前演示,併為此做出反向代理,以便可以在一個埠下呼叫這兩個服務:

http://localhost:8080/cities  -> (redirect) -> http://localhost:8081/cities
http://localhost:8080/persons -> (redirect) -> http://localhost:8082/cities


在 Spring Cloud Zuul 下配置:

spring.application.name=personsService
eureka.client.serviceUrl.defaultZone=http://localhost:9761/eureka
eureka.client.healthcheck.enabled=true

zuul.routes.persons.path=/persons
zuul.routes.persons.serviceId=personsService

zuul.routes.cities.path=/cities
zuul.routes.cities.serviceId=citiesService

ribbon.eureka.enabled=true
server.port=8080


我們在這裡有兩條路由: /persons 和/cities。每次對路由'/ persons'的呼叫都將被重定向到在Netflix Eureka伺服器上註冊的personsService 。每次呼叫“/ cities”網址都會被重定向到在Eureka註冊的cititesService。

測試:

* Start RabbitMQ broker first (start depends on the environment you've got it installed in)
* git clone https://bitbucket.org/tomask79/microservice-spring-cloud-zuul.git
* mvn clean install (in the root folder with pom.xml)

* cd spring-microservice-registry
* java -jar target/registry-0.0.1-SNAPSHOT.war
verify that NetFlix Eureka is running at http://localhost:9761

* cd ..
* cd spring-microservice-config
* java -jar target/config-0.0.1-SNAPSHOT.war

* cd ..
* cd spring-microservice-service1
* java -jar target/service1-0.0.1-SNAPSHOT.war
verify at http://localhost:9761 that citiesService has been registered

* cd ..
* cd spring-microservice-service2
* java -jar target/service2-0.0.1-SNAPSHOT.war
verify at http://localhost:9761 that personsService has been registered

* cd ..
* cd spring-microservice-zuul
* java -jar target/spring-cloud-zuul-0.0.1-SNAPSHOT.war
(this will start your reverse proxy)


在瀏覽器執行:

http://localhost:8080/persons
http://localhost:8080/cities


點選標題見原文

其他:  Spring Cloud微服務雲應用教程
 

相關文章