Commit b9984f82 by Nepxion

修改介绍

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