微服務架構—服務增強元件Nepxion Discovery
Nepxion Discovery是一款對Spring Cloud的服務註冊發現的增強中介軟體,其功能包括多版本灰度釋出,黑/白名單的IP地址過濾,限制註冊等,支援Eureka、Consul和Zookeeper,Spring Cloud微服務可以方便引入該外掛,並且程式碼零侵入,引入注意事項如下:
- 引入相關Plugin Starter依賴到pom.xml
- 必須為微服務定義一個版本號(version),在application.properties或者yaml裡
- 必須為微服務自定義一個便於為微服務歸類的Key,例如組名(group)或者應用名(application),在application.properties或者yaml的metadata裡,便於遠端配置中心推送和灰度介面分析
使用者只需要關注相關規則推送。可以採用如下方式之一
- 通過遠端配置中心推送規則
- 通過控制檯介面推送規則
Nepxion Discovery優勢
- 基於Spring Cloud的微服務和Zuul閘道器的支援
- 具有極大靈活性 - 支援在任何環節做過濾控制和版本灰度釋出
- 具有極小限制性 - 只要開啟了服務註冊發現,程式入口加了@EnableDiscoveryClient
實現服務註冊層面的控制 - 基於黑/白名單的IP地址過濾機制禁止對相應的微服務進行註冊
- 基於最大註冊數的限制微服務註冊。一旦微服務叢集下注冊的例項數目已經達到上限,將禁止後續的微服務進行註冊
- 基於黑/白名單的IP地址過濾機制禁止對相應的微服務被發現
- 基於版本配對,通過對消費端和提供端可訪問版本對應關係的配置,在服務發現和負載均衡層面,進行多版本訪問控制
- 實現灰度釋出
- 實現通過事件匯流排機制(EventBus)的功能,實現釋出/訂閱功能
- 對接遠端配置中心,預設整合阿里巴巴的Nacos,非同步接受遠端配置中心主動推送規則資訊,動態改變微服務的規則
- 結合Spring Boot Actuator,非同步接受Rest主動推送規則資訊,動態改變微服務的規則
- 使用者可以自定義更多的規則過濾條件
- 實現圖形化的灰度釋出功能
pom依賴
微服務選擇相應的外掛引入,最後一個如需對接Nacos遠端配置中心,則引入
<dependency >
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-starter-eureka</artifactId>
<version>${discovery.plugin.version}</version>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-starter-consul</artifactId>
<version>${discovery.plugin.version}</version>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-starter-zookeeper</artifactId>
<version>${discovery.plugin.version}</version>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-plugin-config-center-extension-nacos</artifactId>
<version>${discovery.plugin.version}</version>
</dependency>
獨立控制檯引入,最後一個如需對接Nacos遠端配置中心,則引入
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-console-starter</artifactId>
<version>${discovery.plugin.version}</version>
</dependency>
<dependency>
<groupId>com.nepxion</groupId>
<artifactId>discovery-console-extension-nacos</artifactId>
<version>${discovery.plugin.version}</version>
</dependency>
工程
規則和策略
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<!-- 如果不想開啟相關功能,只需要把相關節點刪除即可,例如不想要黑名單功能,把blacklist節點刪除 -->
<register>
<!-- 服務註冊的黑/白名單註冊過濾,只在服務啟動的時候生效。白名單表示只允許指定IP地址字首註冊,黑名單表示不允許指定IP地址字首註冊。每個服務只能同時開啟要麼白名單,要麼黑名單 -->
<!-- filter-type,可選值blacklist/whitelist,表示白名單或者黑名單 -->
<!-- service-name,表示服務名 -->
<!-- filter-value,表示黑/白名單的IP地址列表。IP地址一般用字首來表示,如果多個用“;”分隔,不允許出現空格 -->
<!-- 表示下面所有服務,不允許10.10和11.11為字首的IP地址註冊(全域性過濾) -->
<blacklist filter-value="10.10;11.11">
<!-- 表示下面服務,不允許172.16和10.10和11.11為字首的IP地址註冊 -->
<service service-name="discovery-springcloud-example-a" filter-value="172.16"/>
</blacklist>
<!-- <whitelist filter-value="">
<service service-name="" filter-value=""/>
</whitelist> -->
<!-- 服務註冊的數目限制註冊過濾,只在服務啟動的時候生效。當某個服務的例項註冊達到指定數目時候,更多的例項將無法註冊 -->
<!-- service-name,表示服務名 -->
<!-- filter-value,表示最大例項註冊數 -->
<!-- 表示下面所有服務,最大例項註冊數為10000(全域性配置) -->
<count filter-value="10000">
<!-- 表示下面服務,最大例項註冊數為5000,全域性配置值10000將不起作用,以區域性配置值為準 -->
<service service-name="discovery-springcloud-example-a" filter-value="5000"/>
</count>
</register>
<discovery>
<!-- 服務發現的黑/白名單發現過濾,使用方式跟“服務註冊的黑/白名單過濾”一致 -->
<!-- 表示下面所有服務,不允許10.10和11.11為字首的IP地址被發現(全域性過濾) -->
<blacklist filter-value="10.10;11.11">
<!-- 表示下面服務,不允許172.16和10.10和11.11為字首的IP地址被發現 -->
<service service-name="discovery-springcloud-example-b" filter-value="172.16"/>
</blacklist>
<!-- 服務發現的多版本灰度訪問控制 -->
<!-- service-name,表示服務名 -->
<!-- version-value,表示可供訪問的版本,如果多個用“;”分隔,不允許出現空格 -->
<version>
<!-- 表示消費端服務a的1.0,允許訪問提供端服務b的1.0和1.1版本 -->
<service consumer-service-name="discovery-springcloud-example-a" providerservice-name="discovery-springcloud-example-b" consumer-version-value="1.0" provider-version-value="1.0;1.1"/>
<!-- 表示消費端服務b的1.0,允許訪問提供端服務c的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"/>
<!-- 表示消費端服務b的1.1,允許訪問提供端服務c的1.2版本 -->
<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>
多版本灰度規則策略
版本策略介紹
1. 標準配置,舉例如下
<service consumer-service-name="a" provider-service-name="b" consumer-version-value="1.0" provider-version-value="1.0,1.1"/>
表示消費端1.0版本,允許訪問提供端1.0和1.1版本
2. 版本值不配置,舉例如下
<service consumer-service-name="a" provider-service-name="b" provider-version-value="1.0,1.1"/>
表示消費端任何版本,允許訪問提供端1.0和1.1版本
<service consumer-service-name="a" provider-service-name="b" consumer-version-value="1.0"/>
表示消費端1.0版本,允許訪問提供端任何版本
<service consumer-service-name="a" provider-service-name="b"/>
表示消費端任何版本,允許訪問提供端任何版本
3. 版本值空字串,舉例如下
<service consumer-service-name="a" provider-service-name="b" consumer-version-value="" provider-version-value="1.0,1.1"/>
表示消費端任何版本,允許訪問提供端1.0和1.1版本
<service consumer-service-name="a" provider-service-name="b" consumer-version-value="1.0" provider-version-value=""/>
表示消費端1.0版本,允許訪問提供端任何版本
<service consumer-service-name="a" provider-service-name="b" consumer-version-value="" provider-version-value=""/>
表示消費端任何版本,允許訪問提供端任何版本
4. 版本對應關係未定義,預設消費端任何版本,允許訪問提供端任何版本特殊情況處理,在使用上需要極力避免該情況發生
1. 消費端的application.properties未定義版本號,則該消費端可以訪問提供端任何版本
2. 提供端的application.properties未定義版本號,當消費端在xml裡不做任何版本配置,才可以訪問該提供端
動態改變規則策略
微服務啟動的時候,由於規則(例如:rule.xml)已經配置在本地,使用者希望改變一下規則,而不重啟微服務,達到規則的改變
規則分為本地規則和動態規則
本地規則是通過在本地規則(例如:rule.xml)檔案定義的,也可以從遠端配置中心獲取,在微服務啟動的時候讀取
動態規則是通過POST方式動態設定,或者由遠端配置中心推送設定
規則初始化的時候,如果接入了遠端配置中心,先讀取遠端規則,如果不存在,再讀取本地規則檔案
多規則灰度獲取規則的時候,先獲取動態規則,如果不存在,再獲取本地規則
動態改變版本策略
微服務啟動的時候,由於版本已經寫死在application.properties裡,使用者希望改變一下版本,而不重啟微服務,達到訪問版本的路徑改變
版本分為本地版本和動態版本
本地版本是通過在application.properties裡配置的,在微服務啟動的時候讀取
動態版本是通過POST方式動態設定
多版本灰度獲取版本值的時候,先獲取動態版本,如果不存在,再獲取本地版本
黑/白名單的IP地址註冊的過濾策略
微服務啟動的時候,禁止指定的IP地址註冊到服務註冊發現中心。支援黑/白名單,白名單表示只允許指定IP地址字首註冊,黑名單表示不允許指定IP地址字首註冊
全域性過濾,指註冊到服務註冊發現中心的所有微服務,只有IP地址包含在全域性過濾欄位的字首中,都允許註冊(對於白名單而言),或者不允許註冊(對於黑名單而言)
區域性過濾,指專門針對某個微服務而言,那麼真正的過濾條件是全域性過濾+區域性過濾結合在一起
最大註冊數的限制的過濾策略
微服務啟動的時候,一旦微服務叢集下注冊的例項數目已經達到上限(可配置),將禁止後續的微服務進行註冊
全域性配置值,只下面配置所有的微服務叢集,最多能註冊多少個
區域性配置值,指專門針對某個微服務而言,那麼該值如存在,全域性配置值失效
黑/白名單的IP地址發現的過濾策略
微服務啟動的時候,禁止指定的IP地址被服務發現。它使用的方式和“黑/白名單的IP地址註冊的過濾”一致
版本屬性欄位定義策略
不同的服務註冊發現元件對應的版本配置值
功能開關策略
#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