Commit b9984f82 by Nepxion

修改介绍

parent 601a85ec
...@@ -26,7 +26,7 @@ Nepxion Discovery是一款对Spring Cloud Discovery的服务注册增强插件 ...@@ -26,7 +26,7 @@ Nepxion Discovery是一款对Spring Cloud Discovery的服务注册增强插件
开发环境的本地服务(例如IP地址为172.16.0.8)已经注册到测试环境的服务注册发现中心,那么可以在配置中心维护一个黑/白名单的IP地址过滤(支持全局和局部的过滤)的规则,该本地服务不会被其他测试环境的服务所调用 开发环境的本地服务(例如IP地址为172.16.0.8)已经注册到测试环境的服务注册发现中心,那么可以在配置中心维护一个黑/白名单的IP地址过滤(支持全局和局部的过滤)的规则,该本地服务不会被其他测试环境的服务所调用
我们可以通过推送一份黑/白名单达到该效果 我们可以通过推送一份黑/白名单达到该效果
3. 多版本灰度访问控制 3. 多版本灰度访问控制
A服务调用B服务,而B服务有两个实例(B1、B2和B3),虽然三者相同的服务名,但功能上有差异,需求是在某个时刻,A服务只能调用B1,禁止调用B2和B3。在此场景下,我们在application.properties里为B1维护一个版本为1.0,为B2维护一个版本为1.1,以此类推 A服务调用B服务,而B服务有两个实例(B1、B2),虽然三者相同的服务名,但功能上有差异,需求是在某个时刻,A服务只能调用B1,禁止调用B2。在此场景下,我们在application.properties里为B1维护一个版本为1.0,为B2维护一个版本为1.1
我们可以通过推送A服务调用某个版本的B服务对应关系的配置,达到某种意义上的灰度控制,切换版本的时候,我们只需要再次推送即可 我们可以通过推送A服务调用某个版本的B服务对应关系的配置,达到某种意义上的灰度控制,切换版本的时候,我们只需要再次推送即可
## 依赖 ## 依赖
...@@ -73,6 +73,10 @@ Nepxion Discovery是一款对Spring Cloud Discovery的服务注册增强插件 ...@@ -73,6 +73,10 @@ Nepxion Discovery是一款对Spring Cloud Discovery的服务注册增强插件
<version> <version>
<!-- 表示消费端服务a的1.0,允许访问提供端服务b的1.0和1.1版本 --> <!-- 表示消费端服务a的1.0,允许访问提供端服务b的1.0和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;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;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> </version>
</discovery> </discovery>
</rule> </rule>
...@@ -97,7 +101,8 @@ Nepxion Discovery是一款对Spring Cloud Discovery的服务注册增强插件 ...@@ -97,7 +101,8 @@ Nepxion Discovery是一款对Spring Cloud Discovery的服务注册增强插件
2. 提供端的application.properties未定义版本号(即eureka.instance.metadataMap.version不存在),当消费端在xml里不做任何版本配置,才可以访问该提供端 2. 提供端的application.properties未定义版本号(即eureka.instance.metadataMap.version不存在),当消费端在xml里不做任何版本配置,才可以访问该提供端
``` ```
## 跟远程配置中心整合 ## 规则读取和订阅
### 跟远程配置中心整合
使用者可以跟携程Apollo,百度DisConf等远程配置中心整合 使用者可以跟携程Apollo,百度DisConf等远程配置中心整合
```xml ```xml
1. 主动从本地或远程配置中心获取规则 1. 主动从本地或远程配置中心获取规则
...@@ -127,12 +132,12 @@ public class DiscoveryConfigAdapter extends ConfigAdapter { ...@@ -127,12 +132,12 @@ public class DiscoveryConfigAdapter extends ConfigAdapter {
// 订阅远程配置中心的规则更新(推送策略自己决定,可以所有服务都只对应一个规则信息,也可以根据服务名获取对应的规则信息) // 订阅远程配置中心的规则更新(推送策略自己决定,可以所有服务都只对应一个规则信息,也可以根据服务名获取对应的规则信息)
@Autowired @Autowired
private PluginPublisher pluginPublisher; private DiscoveryConfigAdapter discoveryConfigAdapter;
@PostConstruct @PostConstruct
public void publish() { public void publish() {
InputStream inputStream = ...; InputStream inputStream = ...;
pluginPublisher.asyncPublish(inputStream); discoveryConfigAdapter.asyncPublish(inputStream);
} }
} }
``` ```
...@@ -150,19 +155,19 @@ public class DiscoveryConfigSubscriber { ...@@ -150,19 +155,19 @@ public class DiscoveryConfigSubscriber {
} }
``` ```
## 不整合远程配置中心 ### 单独推送规则信息
使用者可以通过Rest方式主动向一个微服务推送规则信息,但该方式只能每次推送到一个微服务上 使用者可以通过Rest方式主动向一个微服务推送规则信息,但该方式只能每次推送到一个微服务上
```xml ```xml
利用Post执行http://IP:PORT/admin/config,发送的内容即规则XML 利用Post执行http://IP:PORT/admin/config,发送的内容即规则XML
``` ```
## 查看当前生效的规则 ### 查看当前生效的规则信息
使用者可以通过Rest方式主动请求某个微服务当前生效的规则 使用者可以通过Rest方式主动请求某个微服务当前生效的规则
```xml ```xml
利用Get执行http://IP:PORT/admin/view 利用Get执行http://IP:PORT/admin/view
``` ```
## 扩展过滤条件监听 ## 扩展和自定义更多规则或者监听
使用者可以继承如下类 使用者可以继承如下类
```xml ```xml
AbstractRegisterListener,实现服务注册的扩展和监听 AbstractRegisterListener,实现服务注册的扩展和监听
...@@ -170,70 +175,57 @@ AbstractDiscoveryListener,实现服务发现的扩展和监听 ...@@ -170,70 +175,57 @@ AbstractDiscoveryListener,实现服务发现的扩展和监听
``` ```
## 示例 ## 示例
### B服务实现 ### 场景描述
B服务的两个实例B1、B2和B3采用标准的Spring Cloud入口,参考discovery-springcloud-example-b1、discovery-springcloud-example-b2和discovery-springcloud-example-b3工程 本地将模拟一个较为复杂的场景,如图1
配置applicaiton.properties
```xml ```xml
eureka.instance.metadataMap.version=[version] 1. 调用关系服务A->服务B->服务C
2. 服务A一个实例,服务B两个实例,服务C三个实例
3. 规则为服务A只能只能调用服务B的1.0和1.1版本,服务B的1.0版本只能调用服务C的1.0和1.1版本,服务B的1.1版本只能调用服务C的1.2版本
4. 当一切就绪后,动态切换规则,改变调用的版本对应关系
``` ```
### A服务实现 图1
A服务需要引入discovery-plugin-starter,参考discovery-springcloud-example-a工程 ![Alt text](https://github.com/Nepxion/Discovery/blob/master/discovery-plugin-doc/Version.jpg)
配置application.properties 上述服务分别见discovery-springcloud-example-xx字样的6个工程,对应的版本,端口号如下表
```xml | 服务 | 服务端口 | 管理端口 | 版本
# Spring cloud config | --- | --- | --- | --- |
spring.application.name=discovery-springcloud-example-a | A | 1100 | 8100 | 1.0 |
server.port=4321 | B1 | 1200 | 8200 | 1.0 |
eureka.client.serviceUrl.defaultZone=http://10.0.75.1:9528/eureka/ | B2 | 1201 | 8201 | 1.1 |
eureka.instance.preferIpAddress=true | C1 | 1300 | 无 | 1.0 |
eureka.instance.metadataMap.version=1.0 | C2 | 1301 | 无 | 1.1 |
| C3 | 1302 | 无 | 1.2 |
# Plugin config
# 开启和关闭服务注册层面的控制。一旦关闭,服务注册的黑/白名单过滤功能将失效。缺失则默认为true
spring.application.register.control.enabled=true
# 开启和关闭服务发现层面的控制。一旦关闭,服务多版本调用的控制功能将失效,动态屏蔽指定IP地址的服务实例被发现的功能将失效。缺失则默认为true
spring.application.discovery.control.enabled=true
# 开启和关闭远程配置中心规则文件读取。一旦关闭,默认读取本地规则文件(例如:rule.xml)。缺失则默认为true
spring.application.discovery.remote.config.enabled=true
management.port=5432
management.security.enabled=false
```
模拟实现跟远程配置中心整合
```xml ```xml
参考DiscoveryConfigAdapter.java 自行搭建Eureka服务,并在6个示例中application.properties的Eureka地址替换掉
``` ```
### 运行效果 ### 运行效果
黑/白名单的IP地址注册的过滤 黑/白名单的IP地址注册的过滤
```xml ```xml
1. 首先在rule1.xml把本地IP地址写入 1. 首先example-a或example-b在rule.xml把本地IP地址写入
2. 启动discovery-springcloud-example-a/DiscoveryApplication.java 2. 启动Application
3. 抛出禁止注册的异常,本机不会注册到服务注册发现中心 3. 抛出禁止注册的异常,本机不会注册到服务注册发现中心
``` ```
黑/白名单的IP地址发现的过滤,多版本灰度访问控制 黑/白名单的IP地址发现的过滤,多版本灰度访问控制(单个微服务需要推送多次,如果是远程配置中心,则推送一次够了)
```xml ```xml
1. 运行discovery-springcloud-example-b1、discovery-springcloud-example-b2和discovery-springcloud-example-b3下的DiscoveryApplication.java, 1. 启动6个工程的Application
2. 运行discovery-springcloud-example-a/DiscoveryApplication.java 2. 通过Postman或者浏览器,执行GET http://localhost:1200/instances,查看当前B1服务可访问C服务的列表,如图2
3. 通过Postman或者浏览器,执行GET http://localhost:4321/instances,看到当前时刻,A服务可访问B服务的列表,如图1 3. 通过Postman或者浏览器,执行GET http://localhost:1201/instances,查看当前B2服务可访问C服务的列表,如图3
4. 通过Postman或者浏览器,执行POST http://localhost:5432/admin/config,发送的内容即规则XML,更改相关规则,如图2 4. 通过Postman或者浏览器,执行POST http://localhost:8200/admin/config,发送新的规则XML,那么在B1服务上将会运行新的规则,再运行上述步骤,查看服务列表
5. 通过Postman或者浏览器,执行GET http://localhost:4321/admin/view,看到当前时刻,在A服务已经生效的规则,如图3 4. 通过Postman或者浏览器,执行POST http://localhost:8201/admin/config,发送同样的规则XML,那么在B1服务上将会运行新的规则,再运行上述步骤,查看服务列表
5. 通过Postman或者浏览器,执行GET http://localhost:8200/admin/view,查看当前在B1服务已经生效的规则
5. 通过Postman或者浏览器,执行GET http://localhost:8201/admin/view,查看当前在B2服务已经生效的规则
``` ```
图1
![Alt text](https://github.com/Nepxion/Discovery/blob/master/discovery-plugin-doc/Postman1.jpg)
图2 图2
![Alt text](https://github.com/Nepxion/Discovery/blob/master/discovery-plugin-doc/Postman2.jpg) ![Alt text](https://github.com/Nepxion/Discovery/blob/master/discovery-plugin-doc/Result1.jpg)
图3 图3
![Alt text](https://github.com/Nepxion/Discovery/blob/master/discovery-plugin-doc/Postman3.jpg) ![Alt text](https://github.com/Nepxion/Discovery/blob/master/discovery-plugin-doc/Result1.jpg)
## 鸣谢 ## 鸣谢
感谢Spring Cloud中国社区刘石明提供支持 感谢Spring Cloud中国社区刘石明提供支持
...@@ -26,7 +26,7 @@ public class DiscoveryApplication { ...@@ -26,7 +26,7 @@ public class DiscoveryApplication {
} }
@Bean @Bean
public DiscoveryConfigAdapter discoveryConfigLoader() { public DiscoveryConfigAdapter discoveryConfigAdapter() {
return new DiscoveryConfigAdapter(); return new DiscoveryConfigAdapter();
} }
......
...@@ -13,5 +13,6 @@ spring.application.discovery.control.enabled=true ...@@ -13,5 +13,6 @@ spring.application.discovery.control.enabled=true
# 开启和关闭远程配置中心规则文件读取。一旦关闭,默认读取本地规则文件(例如:rule.xml)。缺失则默认为true # 开启和关闭远程配置中心规则文件读取。一旦关闭,默认读取本地规则文件(例如:rule.xml)。缺失则默认为true
spring.application.discovery.remote.config.enabled=true spring.application.discovery.remote.config.enabled=true
# Admin config
management.port=8100 management.port=8100
management.security.enabled=false management.security.enabled=false
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<discovery>
<version>
<!-- 表示消费端服务a的1.0,允许访问提供端服务b的1.0和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;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>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment