diff --git a/doc/docs/_sidebar.md b/doc/docs/_sidebar.md
index 49e150d4..fd3edf58 100644
--- a/doc/docs/_sidebar.md
+++ b/doc/docs/_sidebar.md
@@ -1,32 +1,34 @@
-* [首页](/?t=1568625289371)
+* [首页](/?t=1569825200224)
* 开发文档
- * [快速体验](files/10010_快速体验.md?t=1568625289374)
- * [项目接入到SOP](files/10011_项目接入到SOP.md?t=1568625289393)
- * [新增接口](files/10020_新增接口.md?t=1568625289393)
- * [开发流程](files/10021_开发流程.md?t=1568625289393)
- * [业务参数校验](files/10030_业务参数校验.md?t=1568625289393)
- * [错误处理](files/10040_错误处理.md?t=1568625289393)
- * [编写文档](files/10041_编写文档.md?t=1568625289393)
- * [接口交互详解](files/10050_接口交互详解.md?t=1568625289393)
- * [easyopen支持](files/10070_easyopen支持.md?t=1568625289394)
- * [使用签名校验工具](files/10080_使用签名校验工具.md?t=1568625289394)
- * [ISV管理](files/10085_ISV管理.md?t=1568625289394)
- * [自定义返回结果](files/10087_自定义返回结果.md?t=1568625289394)
- * [自定义过滤器](files/10088_自定义过滤器.md?t=1568625289394)
- * [路由授权](files/10090_路由授权.md?t=1568625289394)
- * [接口限流](files/10092_接口限流.md?t=1568625289394)
- * [监控日志](files/10093_监控日志.md?t=1568625289394)
- * [SDK开发](files/10095_SDK开发.md?t=1568625289395)
- * [使用SpringCloudGateway](files/10096_使用SpringCloudGateway.md?t=1568625289395)
- * [应用授权](files/10097_应用授权.md?t=1568625289395)
- * [传统web开发](files/10100_传统web开发.md?t=1568625289395)
- * [文件上传](files/10104_文件上传.md?t=1568625289395)
- * [配置Sleuth链路追踪](files/10109_配置Sleuth链路追踪.md?t=1568625289395)
- * [预发布灰度发布](files/10110_预发布灰度发布.md?t=1568625289395)
- * [动态修改请求参数](files/10111_动态修改请求参数.md?t=1568625289395)
+ * [快速体验](files/10010_快速体验.md?t=1569825200227)
+ * [项目接入到SOP](files/10011_项目接入到SOP.md?t=1569825200243)
+ * [新增接口](files/10020_新增接口.md?t=1569825200243)
+ * [开发流程](files/10021_开发流程.md?t=1569825200243)
+ * [业务参数校验](files/10030_业务参数校验.md?t=1569825200244)
+ * [错误处理](files/10040_错误处理.md?t=1569825200244)
+ * [编写文档](files/10041_编写文档.md?t=1569825200244)
+ * [接口交互详解](files/10050_接口交互详解.md?t=1569825200244)
+ * [easyopen支持](files/10070_easyopen支持.md?t=1569825200244)
+ * [使用签名校验工具](files/10080_使用签名校验工具.md?t=1569825200244)
+ * [ISV管理](files/10085_ISV管理.md?t=1569825200244)
+ * [自定义返回结果](files/10087_自定义返回结果.md?t=1569825200244)
+ * [自定义过滤器](files/10088_自定义过滤器.md?t=1569825200244)
+ * [路由授权](files/10090_路由授权.md?t=1569825200244)
+ * [接口限流](files/10092_接口限流.md?t=1569825200245)
+ * [监控日志](files/10093_监控日志.md?t=1569825200245)
+ * [SDK开发](files/10095_SDK开发.md?t=1569825200245)
+ * [使用SpringCloudGateway](files/10096_使用SpringCloudGateway.md?t=1569825200245)
+ * [应用授权](files/10097_应用授权.md?t=1569825200245)
+ * [传统web开发](files/10100_传统web开发.md?t=1569825200245)
+ * [文件上传](files/10104_文件上传.md?t=1569825200245)
+ * [配置Sleuth链路追踪](files/10109_配置Sleuth链路追踪.md?t=1569825200245)
+ * [预发布灰度发布](files/10110_预发布灰度发布.md?t=1569825200245)
+ * [动态修改请求参数](files/10111_动态修改请求参数.md?t=1569825200245)
+ * [使用eureka](files/10112_使用eureka.md?t=1569825200246)
+ * [扩展其它注册中心](files/10113_扩展其它注册中心.md?t=1569825200246)
* 原理分析
- * [原理分析之@ApiMapping](files/90010_原理分析之@ApiMapping.md?t=1568625289395)
- * [原理分析之如何存储路由](files/90011_原理分析之如何存储路由.md?t=1568625289395)
- * [原理分析之如何路由](files/90012_原理分析之如何路由.md?t=1568625289395)
- * [原理分析之文档归纳](files/90013_原理分析之文档归纳.md?t=1568625289396)
- * [常见问题](files/90100_常见问题.md?t=1568625289396)
+ * [原理分析之@ApiMapping](files/90010_原理分析之@ApiMapping.md?t=1569825200246)
+ * [原理分析之如何存储路由](files/90011_原理分析之如何存储路由.md?t=1569825200246)
+ * [原理分析之如何路由](files/90012_原理分析之如何路由.md?t=1569825200246)
+ * [原理分析之文档归纳](files/90013_原理分析之文档归纳.md?t=1569825200246)
+ * [常见问题](files/90100_常见问题.md?t=1569825200246)
diff --git a/doc/docs/files/10113_扩展其它注册中心.md b/doc/docs/files/10113_扩展其它注册中心.md
new file mode 100644
index 00000000..c211d29a
--- /dev/null
+++ b/doc/docs/files/10113_扩展其它注册中心.md
@@ -0,0 +1,86 @@
+# 扩展其它注册中心
+
+SOP默认使用的注册中心是[nacos](https://nacos.io/),可以扩展实现其它注册中心,其中`eureka`分支是已经扩展好的,使用eureka注册中心。
+
+现在以扩展[consul](https://www.consul.io/)为例,说下具体扩展步骤:
+
+- 扩展注册中心监听
+
+在`sop-gateway-common`工程下,找到com.gitee.sop.gatewaycommon.route包,可以看到有两个类
+
+`EurekaRegistryListener`和`NacosRegistryListener`
+
+这两个类的作用是监听注册中心服务注册,从而触发事件,然后获取新注册的服务。
+
+新建一个类:`ConsulRegistryListener`,继承`BaseRegistryListener`
+
+实现onEvent方法,具体内容可参考`EurekaRegistryListener`类
+
+```java
+public class ConsulRegistryListener extends BaseRegistryListener {
+ /**
+ * 注册中心触发事件,可以从中获取服务
+ *
+ * 这个方法做的事情有2个:
+ *
+ * 1. 找出新注册的服务,调用pullRoutes方法
+ * 2. 找出删除的服务,调用removeRoutes方法
+ *
+ * @param applicationEvent 事件体
+ */
+ @Override
+ public void onEvent(ApplicationEvent applicationEvent) {
+
+ }
+}
+```
+
+配置类中新增:
+
+```java
+@Bean
+@ConditionalOnProperty("spring.cloud.consul.host")
+RegistryListener registryListenerConsul() {
+ return new ConsulRegistryListener();
+}
+```
+
+其中`@ConditionalOnProperty("spring.cloud.consul.host")`的意思是只有配置了`spring.cloud.consul.host`属性,这个Bean才会被Spring注入
+
+`sop-gateway`工程添加`Spring Cloud Consul`相关依赖,配置文件新增consul配置
+
+- 扩展admin实现
+
+找到`sop-admin-server`工程下com.gitee.sop.adminserver.service包,可以看到有两个类,`RegistryServiceEurekaImpl`和`RegistryServiceNacosImpl`
+它们实现了`com.gitee.sop.adminserver.service.RegistryService`接口,因此我们要新建一个consul对应的类
+
+新建`RegistryServiceConsulImpl`,然后实现RegistryService接口中的方法,具体可参考RegistryServiceEurekaImpl
+
+```java
+public class RegistryServiceConsulImpl implements RegistryService {
+
+}
+```
+
+打开`com.gitee.sop.adminserver.config.WebConfig`类
+
+新增一条配置
+
+```java
+/**
+ * 当配置了registry.name=eureka生效。
+ *
+ * @return
+ */
+@Bean
+@ConditionalOnProperty(value = "registry.name", havingValue = "consul")
+RegistryService registryServiceEureka() {
+ return new RegistryServiceConsulImpl();
+}
+```
+
+application配置文件新增一条配置:
+
+```properties
+registry.name=consul
+```
diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/EurekaRegistryListener.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/EurekaRegistryListener.java
index 954cf1cf..2bf30286 100644
--- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/EurekaRegistryListener.java
+++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/route/EurekaRegistryListener.java
@@ -29,6 +29,16 @@ public class EurekaRegistryListener extends BaseRegistryListener {
private Set cacheServices = new HashSet<>();
+ /**
+ * 注册中心触发事件,可以从中获取服务
+ *
+ * 这个方法做的事情有2个:
+ *
+ * 1. 找出新注册的服务,调用pullRoutes方法
+ * 2. 找出删除的服务,调用removeRoutes方法
+ *
+ * @param applicationEvent 事件体
+ */
@Override
public void onEvent(ApplicationEvent applicationEvent) {
Object source = applicationEvent.getSource();
@@ -57,7 +67,7 @@ public class EurekaRegistryListener extends BaseRegistryListener {
if (cacheServices.size() > 0) {
this.doRemove(cacheServices);
}
-
+ // 缓存最新服务
cacheServices = new HashSet<>(serviceList);
}