-
引入相關Plugin Starter依賴到pom.xml
-
必須為微服務定義一個版本號(version),在application.properties或者yaml的metadata裡
-
必須為微服務自定義一個便於為微服務歸類的Key,例如組名(group)或者應用名(application),在application.properties或者yaml的metadata裡,便於遠端配置中心推送和灰度介面分析
-
使用者只需要關註相關規則推送。可以採用如下方式之一:
透過遠端配置中心推送規則
透過控制檯介面推送規則
透過客戶端工具(例如Postman)推送推測
-
請訪問http://www.iqiyi.com/w_19rzwzovrl.html,影片清晰度改成720P,然後最大化播放。
-
請訪問https://pan.baidu.com/s/1eq_N56VbgSCaTXYQ5aKqiA,獲取更清晰的影片 Alt text Alt text。
-
如果你是運維負責人,是否會經常發現,你掌管的測試環境中的服務註冊中心,被一些不負責的開發人員把他本地開發環境註冊上來,造成測試人員測試失敗。你希望可以把本地開發環境註冊給遮蔽掉,不讓註冊。
-
如果你是運維負責人,生產環境的某個微服務叢集下的某個實體,暫時出了問題,但又不希望它下線。你希望可以把該實體給遮蔽掉,暫時不讓它被呼叫。
-
如果你是業務負責人,鑒於業務服務的快速迭代性,微服務叢集下的實體釋出不同的版本。你希望根據版本管理策略進行路由,提供給下游微服務區別呼叫,達到多版本灰度訪問控制。
-
如果你是測試負責人,希望對微服務做A/B測試,那麼透過動態改變版本達到該目的。
-
具有極大靈活性——支援在任何環節做過濾控制和版本灰度釋出。
-
具有極小限制性——只要開啟了服務註冊發現,程式入口加了@EnableDiscoveryClient。
-
基於黑/白名單的IP地址過濾機制禁止對相應的微服務進行註冊。
-
基於最大註冊數的限制微服務註冊。一旦微服務叢集下註冊的實體數目已經達到上限,將禁止後續的微服務進行註冊。
-
基於黑/白名單的IP地址過濾機制禁止對相應的微服務被髮現。
-
基於版本配對,透過對消費端和提供端可訪問版本對應關係的配置,在服務發現和負載均衡層面,進行多版本訪問控制。
-
透過規則改變,實現灰度釋出。
-
透過版本切換,實現灰度釋出。
-
實現透過XML進行上述規則的定義。
-
對接遠端配置中心,預設整合阿裡巴巴的Nacos,非同步接受遠端配置中心主動推送規則資訊,動態改變微服務的規則。
-
結合Spring Boot Actuator,非同步接受Rest主動推送規則資訊,動態改變微服務的規則。
-
結合Spring Boot Actuator,動態改變微服務的版本。
-
在服務註冊層面的控制中,一旦禁止註冊的條件觸發,主動推送非同步事件,以便使用者訂閱。
-
使用者可以自定義更多的規則過濾條件。
-
使用者可以對服務註冊發現核心事件進行監聽。
-
開發環境的本地微服務(例如IP地址為172.16.0.8)不希望被註冊到測試環境的服務註冊發現中心,那麼可以在配置中心維護一個黑/白名單的IP地址過濾(支援全域性和區域性的過濾)的規則。
-
我們可以透過提供一份黑/白名單達到該效果。
-
當某個微服務註冊數目已經達到上限(例如10個),那麼後面起來的微服務,將再也不能註冊上去。
-
開發環境的本地微服務(例如IP地址為172.16.0.8)已經註冊到測試環境的服務註冊發現中心,那麼可以在配置中心維護一個黑/白名單的IP地址過濾(支援全域性和區域性的過濾)的規則,該本地微服務不會被其他測試環境的微服務所呼叫。
-
我們可以透過推送一份黑/白名單達到該效果。
-
A服務呼叫B服務,而B服務有兩個實體(B1、B2),雖然三者相同的服務名,但功能上有差異,需求是在某個時刻,A服務只能呼叫B1,禁止呼叫B2。在此場景下,我們在application.properties裡為B1維護一個版本為1.0,為B2維護一個版本為1.1。
-
我們可以透過推送A服務呼叫某個版本的B服務對應關係的配置,達到某種意義上的灰度控制,切換版本的時候,我們只需要再次推送即可。
-
在A/B測試中,透過動態改變版本,不重啟微服務,達到訪問版本的路徑改變。
-
假設當前生產環境,呼叫路徑為閘道器(V1.0)->服務A(V1.0)->服務B(V1.0)。
-
運維將釋出新的生產環境,部署新服務叢集,服務A(V1.1),服務B(V1.1)。
-
由於閘道器(1.0)並未指向服務A(V1.1),服務B(V1.1),所以它們是不能被呼叫的。
-
新增用作灰度釋出的閘道器(V1.1),指向服務A(V1.1)->服務B(V1.1)。
-
灰度閘道器(V1.1)釋出到服務註冊發現中心,但禁止被服務發現,閘道器外的呼叫進來無法負載均衡到閘道器(V1.1)上。
-
在灰度閘道器(V1.1)->服務A(V1.1)->服務B(V1.1)這條呼叫路徑做灰度測試。
-
灰度測試成功後,把閘道器(V1.0)指向服務A(V1.1)->服務B(V1.1)。
-
下線服務A(V1.0),服務B(V1.0),灰度成功。
-
灰度閘道器(V1.1)可以不用下線,留作下次版本上線再次灰度釋出。
-
Spring Cloud F版,請採用4.x.x版本,具體程式碼參考master分支。
-
Spring Cloud C版、D版和E版,請採用3.x.x版本,具體程式碼參考Edgware分支。
-
4.x.x版本由於Swagger和Spring Boot 2.x.x版本的Actuator用法有衝突,故暫時不支援Endpoint功能,其他功能和3.x.x版本一致。
-
Spring Cloud F版,最好採用Consul的1.2.1伺服器版本(或者更高),從https://releases.hashicorp.com/consul/1.2.1/獲取。
-
Spring Cloud C版、D版和E版,必須採用Consul的0.9.3伺服器版本(或者更低),從https://releases.hashicorp.com/consul/0.9.3/獲取。
-
Spring Cloud F版,必須採用Zookeeper的3.5.x伺服器版本(或者更高)。
-
Spring Cloud C版、D版和E版,最好採用Zookeeper的3.5.0以下伺服器版本(或者更低)。
-
跟Spring Cloud版本保持一致。
<dependency>
<groupId>com.nepxiongroupId>
<artifactId>discovery-plugin-starter-eurekaartifactId>
<version>${discovery.plugin.version}version>
dependency>
<dependency>
<groupId>com.nepxiongroupId>
<artifactId>discovery-plugin-starter-consulartifactId>
<version>${discovery.plugin.version}version>
dependency>
<dependency>
<groupId>com.nepxiongroupId>
<artifactId>discovery-plugin-starter-zookeeperartifactId>
<version>${discovery.plugin.version}version>
dependency>
<dependency>
<groupId>com.nepxiongroupId>
<artifactId>discovery-plugin-config-center-extension-nacosartifactId>
<version>${discovery.plugin.version}version>
dependency>
<dependency>
<groupId>com.nepxiongroupId>
<artifactId>discovery-console-starterartifactId>
<version>${discovery.plugin.version}version>
dependency>
<dependency>
<groupId>com.nepxiongroupId>
<artifactId>discovery-console-extension-nacosartifactId>
<version>${discovery.plugin.version}version>
dependency>
工程名 | 描述 |
---|---|
discovery-plugin-framework | 核心框架 |
discovery-plugin-framework-eureka | 核心框架的Eureka實現 |
discovery-plugin-framework-consul | 核心框架的Consul實現 |
discovery-plugin-framework-zookeeper | 核心框架的Zookeeper實現 |
discovery-plugin-config-center | 配置中心實現 |
discovery-plugin-config-center-extension-nacos | 配置中心的Nacos擴充套件 |
discovery-plugin-admin-center | 管理中心實現 |
discovery-plugin-starter-eureka | Eureka Starter |
discovery-plugin-starter-consul | Consul Starter |
discovery-plugin-starter-zookeeper | Zookeeper Starter |
discovery-console | 獨立控制檯,提供給UI |
discovery-console-extension-nacos | 獨立控制檯的Nacos擴充套件 |
discovery-console-starter | Console Starter |
discovery-console-desktop | 圖形化灰度釋出等桌面程式 |
discovery-springcloud-example-console | 獨立控制檯示例 |
discovery-springcloud-example-eureka | Eureka伺服器 |
discovery-springcloud-example | 灰度釋出等示例 |
<rule>
<register>
<blacklist filter-value="10.10;11.11">
<service service-name="discovery-springcloud-example-a" filter-value="172.16"/>
blacklist>
<count filter-value=“10000”>
<service service-name=“discovery-springcloud-example-a” filter-value=“5000”/>
count>
register>
<discovery>
<blacklist filter-value=“10.10;11.11”>
<service service-name=“discovery-springcloud-example-b” filter-value=“172.16”/>
blacklist>
<version>
<service consumer-service-name=“discovery-springcloud-example-a” provider-service-name=“discovery-springcloud-example-b” consumer-version-value=“1.0” provider-version-value=“1.0;1.1”/>
<service consumer-service-name=“discovery-springcloud-example-b” provider-service-name=“discovery-springcloud-example-c” consumer-version-value=“1.0” provider-version-value=“1.0;1.1”/>
<service consumer-service-name=“discovery-springcloud-example-b” provider-service-name=“discovery-springcloud-example-c” consumer-version-value=“1.1” provider-version-value=“1.2”/>
version>
discovery>
rule>
"a" provider-service-name="b" consumer-version-value="1.0" provider-version-value="1.0,1.1"/>
"a" provider-service-name="b" provider-version-value="1.0,1.1"/>
"a" provider-service-name="b" consumer-version-value="1.0"/>
<service consumer-service-name="a" provider-service-name="b"/>
"a" provider-service-name="b" consumer-version-value="" provider-version-value="1.0,1.1"/>
"a" provider-service-name="b" consumer-version-value="1.0" provider-version-value=""/>
"a" provider-service-name="b" consumer-version-value="" provider-version-value=""/>
-
消費端的application.properties未定義版本號,則該消費端可以訪問提供端任何版本。
-
提供端的application.properties未定義版本號,當消費端在xml裡不做任何版本配置,才可以訪問該提供端。
-
規則分為本地規則和動態規則。
-
本地規則是透過在本地規則(例如:rule.xml)檔案定義的,也可以從遠端配置中心獲取,在微服務啟動的時候讀取。
-
動態規則是透過POST方式動態設定,或者由遠端配置中心推送設定。
-
規則初始化的時候,如果接入了遠端配置中心,先讀取遠端規則,如果不存在,再讀取本地規則檔案。
-
多規則灰度獲取規則的時候,先獲取動態規則,如果不存在,再獲取本地規則。
-
版本分為本地版本和動態版本。
-
本地版本是透過在application.properties裡配置的,在微服務啟動的時候讀取。
-
動態版本是透過POST方式動態設定。
多版本灰度獲取版本值的時候,先獲取動態版本,如果不存在,再獲取本地版本。
-
全域性過濾,指註冊到服務註冊發現中心的所有微服務,只有IP地址包含在全域性過濾欄位的字首中,都允許註冊(對於白名單而言),或者不允許註冊(對於黑名單而言)。
-
區域性過濾,指專門針對某個微服務而言,那麼真正的過濾條件是全域性過濾+區域性過濾結合在一起。
-
全域性配置值,只下麵配置所有的微服務叢集,最多能註冊多少個。
-
區域性配置值,指專門針對某個微服務而言,那麼該值如存在,全域性配置值失效。
# Eureka config
eureka.instance.metadataMap.version=1.0
eureka.instance.metadataMap.group=xxx-service-group
# 奇葩的Consul配置(參考https://springcloud.cc/spring-cloud-consul.html - 元資料和Consul標簽)
# Consul config(多個值用“,”分隔,例如version=1.0,value=abc)
spring.cloud.consul.discovery.tags=version=1.0,group=xxx-service-group
# Zookeeper config
spring.cloud.zookeeper.discovery.metadata.version=1.0
spring.cloud.zookeeper.discovery.metadata.group=xxx-service-group
# Plugin config
# 開啟和關閉服務註冊層面的控制。一旦關閉,服務註冊的黑/白名單過濾功能將失效,最大註冊數的限制過濾功能將失效。缺失則預設為true
spring.application.register.control.enabled=true
# 開啟和關閉服務發現層面的控制。一旦關閉,服務多版本呼叫的控制功能將失效,動態遮蔽指定IP地址的服務實體被髮現的功能將失效。缺失則預設為true
spring.application.discovery.control.enabled=true
# 開啟和關閉透過Rest方式對規則配置的控制和推送。一旦關閉,只能透過遠端配置中心來控制和推送。缺失則預設為true
spring.application.config.rest.control.enabled=true
# 本地規則檔案的路徑,支援兩種方式:classpath:rule.xml - 規則檔案放在resources目錄下,便於打包進jar;file:rule.xml - 規則檔案放在工程根目錄下,放置在外部便於修改。缺失則預設為不裝載本地規則
spring.application.config.path=classpath:rule.xml
# 為微服務歸類的Key,一般透過group欄位來歸類,例如eureka.instance.metadataMap.group=xxx-group或者eureka.instance.metadataMap.application=xxx-application。缺失則預設為group
# spring.application.group.key=group
# spring.application.group.key=application
-
拉取配置,參考discovery-plugin-config-center-extension-nacos工程。
-
推送配置,參考discovery-console-extension-nacos工程。
-
一系列批次功能。
-
跟Nacos整合,實現配置推送和清除。
-
AbstractRegisterListener,實現服務註冊的擴充套件和監聽,用法參考discovery-springcloud-example下MyRegisterListener。
-
AbstractDiscoveryListener,實現服務發現的擴充套件和監聽,用法參考discovery-springcloud-example下MyDiscoveryListener。註意,在Consul下,同時會觸發service和management兩個實體的事件,需要區別判斷,如下圖。
-
AbstractLoadBalanceListener,實現負載均衡的擴充套件和監聽,用法參考discovery-springcloud-example下MyLoadBalanceListener。
-
閘道器Zuul叢集部署了1個
-
微服務叢集部署了3個,分別是A服務叢集、B服務叢集、C服務叢集,分別對應的實體數為2、2、3
-
閘道器Zuul的1.0版本只能呼叫服務A的1.0版本,閘道器Zuul的1.1版本只能呼叫服務A的1.1版本。
-
服務A的1.0版本只能呼叫服務B的1.0版本,服務A的1.1版本只能呼叫服務B的1.1版本。
-
服務B的1.0版本只能呼叫服務C的1.0和1.1版本,服務B的1.1版本只能呼叫服務C的1.2版本。
<rule>
<discovery>
<version>
<service consumer-service-name="discovery-springcloud-example-zuul" provider-service-name="discovery-springcloud-example-a" consumer-version-value="1.0" provider-version-value="1.0"/>
<service consumer-service-name="discovery-springcloud-example-zuul" provider-service-name="discovery-springcloud-example-a" consumer-version-value="1.1" provider-version-value="1.1"/>
<service consumer-service-name="discovery-springcloud-example-a" provider-service-name="discovery-springcloud-example-b" consumer-version-value="1.0" provider-version-value="1.0"/>
<service consumer-service-name="discovery-springcloud-example-a" provider-service-name="discovery-springcloud-example-b" consumer-version-value="1.1" provider-version-value="1.1"/>
<service consumer-service-name="discovery-springcloud-example-b" provider-service-name="discovery-springcloud-example-c" consumer-version-value="1.0" provider-version-value="1.0;1.1"/>
<service consumer-service-name="discovery-springcloud-example-b" provider-service-name="discovery-springcloud-example-c" consumer-version-value="1.1" provider-version-value="1.2"/>
version>
discovery>
rule>
微服務 | 服務埠 | 管理埠 | 版本 |
---|---|---|---|
A1 | 1100 | 5100 | 1.0 |
A2 | 1101 | 5101 | 1.1 |
B1 | 1200 | 5200 | 1.0 |
B2 | 1201 | 5201 | 1.1 |
C1 | 1300 | 5300 | 1.0 |
C2 | 1301 | 5301 | 1.1 |
C3 | 1302 | 5302 | 1.2 |
Zuul | 1400 | 5400 | 1.0 |
服務埠 | 管理埠 |
---|---|
2222 | 3333 |
<dependency>
<groupId>com.nepxiongroupId>
<artifactId>discovery-plugin-starter-eurekaartifactId>
<version>${discovery.plugin.version}version>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
-
在rule.xml把本地IP地址寫入到相應地方。
-
啟動DiscoveryApplicationA1.java。
-
丟擲禁止註冊的異常,即本地服務受限於黑名單的IP地址串列,不會註冊到服務註冊發現中心;白名單操作也是如此,不過邏輯剛好相反。
-
在rule.xml修改最大註冊數為0。
-
啟動DiscoveryApplicationA1.java。
-
丟擲禁止註冊的異常,即本地服務受限於最大註冊數,不會註冊到服務註冊發現中心。
-
在rule.xml把本地IP地址寫入到相應地方。
-
啟動DiscoveryApplicationA1.java和DiscoveryApplicationB1.java、DiscoveryApplicationB2.java。
-
你會發現A服務無法獲取B服務的任何實體,即B服務受限於黑名單的IP地址串列,不會被A服務的發現;白名單操作也是如此,不過邏輯剛好相反。
-
請訪問http://www.iqiyi.com/w_19s07thtsh.html,影片清晰度改成720P,然後最大化播放。
-
請訪問https://pan.baidu.com/s/1eq_N56VbgSCaTXYQ5aKqiA,獲取更清晰的影片。
<rule>
<discovery>
<version>
<service consumer-service-name="discovery-springcloud-example-b" provider-service-name="discovery-springcloud-example-c" consumer-version-value="" provider-version-value="3.0"/>
version>
discovery>
rule>
-
在上面基礎上,啟動discovery-springcloud-example下DiscoveryApplicationZuul。
-
因為Zuul是一種特殊的微服務,所有操作過程跟上面完全一致。