diff --git a/.github/stale.yml b/.github/stale.yml
new file mode 100644
index 0000000000..29bb6a3cb3
--- /dev/null
+++ b/.github/stale.yml
@@ -0,0 +1,61 @@
+# General configuration
+# Number of days of inactivity before an issue becomes stale
+daysUntilStale: 60
+# Issues with these labels will never be considered stale
+exemptLabels:
+ - good first issue
+ - contribution welcome
+ - bug
+ - discussion
+ - enhancement
+ - feature
+ - feature request
+ - help wanted
+ - info
+ - need investigation
+ - tips
+
+# Set to true to ignore issues in a project (defaults to false)
+exemptProjects: true
+# Set to true to ignore issues in a milestone (defaults to false)
+exemptMilestones: true
+# Set to true to ignore issues with an assignee (defaults to false)
+exemptAssignees: true
+# Label to use when marking an issue as stale
+staleLabel: stale
+
+# Pull request specific configuration
+pulls:
+ # Number of days of inactivity before a stale Issue or Pull Request is closed.
+ # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
+ daysUntilClose: 30
+ # Comment to post when marking as stale. Set to `false` to disable
+ markComment: >
+ This pull request has been automatically marked as stale because it has not had activity
+ in the last 90 days. It will be closed in 30 days if no further activity occurs. Please
+ feel free to give a status update now, ping for review, or re-open when it's ready.
+ Thank you for your contributions!
+ # Comment to post when closing a stale Issue or Pull Request.
+ closeComment: >
+ This pull request has been automatically closed because it has not had
+ activity in the last 30 days. Please feel free to give a status update now, ping for review, or re-open when it's ready.
+ Thank you for your contributions!
+ # Limit the number of actions per hour, from 1-30. Default is 30
+ limitPerRun: 1
+
+# Issue specific configuration
+issues:
+ # Number of days of inactivity before a stale Issue or Pull Request is closed.
+ daysUntilClose: 14
+ # Comment to post when marking as stale. Set to `false` to disable
+ markComment: >
+ This issue has been automatically marked as stale because it has not had activity in the
+ last 90 days. It will be closed in 14 days unless it is tagged "help wanted" or other activity
+ occurs. Thank you for your contributions.
+ # Comment to post when closing a stale Issue or Pull Request.
+ closeComment: >
+ This issue has been automatically closed because it has not had activity in the
+ last 14 days. If this issue is still valid, please ping a maintainer and ask them to label it as "help wanted".
+ Thank you for your contributions.
+ # Limit the number of actions per hour, from 1-30. Default is 30
+ limitPerRun: 1
\ No newline at end of file
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
new file mode 100644
index 0000000000..e9cae0ab63
--- /dev/null
+++ b/.github/workflows/maven.yml
@@ -0,0 +1,25 @@
+# This workflow will build a Java project with Maven
+# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
+
+name: build
+
+on:
+ push:
+ branches: [ 6.x.x ]
+ pull_request:
+ branches: [ 6.x.x ]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK 8
+ uses: actions/setup-java@v2
+ with:
+ java-version: '8'
+ distribution: 'adopt'
+ - name: Build with Maven
+ run: mvn -B package --file pom.xml
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 9e54ddd3c5..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: java
-
-jdk:
- - openjdk8
\ No newline at end of file
diff --git a/README.md b/README.md
index fea82906f8..d5c7791dea 100644
--- a/README.md
+++ b/README.md
@@ -1,1042 +1,561 @@
-# Nepxion Discovery
-[](https://tokei.rs/b1/github/Nepxion/Discovery?category=lines)
-[](https://github.com/Nepxion/Discovery/blob/master/LICENSE)
-[](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.nepxion%22%20AND%20discovery)
-[](http://www.javadoc.io/doc/com.nepxion/discovery-plugin-framework)
-[](https://travis-ci.org/Nepxion/Discovery)
-[](https://www.codacy.com/project/HaojunRen/Discovery/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Nepxion/Discovery&utm_campaign=Badge_Grade_Dashboard)
+
-Nepxion Discovery是一款对Spring Cloud Discovery服务注册发现、Ribbon负载均衡、Feign和RestTemplate调用、Hystrix或者阿里巴巴Sentinel熔断隔离限流降级的增强中间件,其功能包括灰度发布(包括切换发布和平滑发布)、服务隔离、服务路由(包括多机房区域路由、多版本路由和多IP和端口路由)、服务权重、黑/白名单的IP地址过滤、限制注册、限制发现、灰度调用链等,支持Eureka、Consul、Zookeeper和阿里巴巴的Nacos为服务注册发现中间件,支持阿里巴巴的Nacos、携程的Apollo和Redis为远程配置中心,支持Spring Cloud Gateway、Zuul网关和微服务的灰度发布,支持用户自定义和编程”禁止注册“、”禁止被发现“、”禁止被负载均衡“策略 ,支持用户自定义和编程灰度路由策略(包括RPC和REST两种调用方式),支持运维调度灰度发布和路由的元数据,支持多数据源的数据库灰度发布等客户特色化灰度发布,兼容Spring Cloud Edgware版、Finchley版和Greenwich版。现有的Spring Cloud微服务很方便引入该中间件,代码零侵入。鉴于Spring Cloud官方对Eureka和Hystrix不再做新功能的迭代,推荐用Nacos和Sentinel,它们对Spring Cloud灰度发布和路由更具出色的兼容性和友好性
+# Discovery【探索】云原生微服务解决方案
+ [](https://github.com/Nepxion/Discovery/blob/6.x.x/LICENSE) [](https://search.maven.org/artifact/com.nepxion/discovery) [](http://www.javadoc.io/doc/com.nepxion/discovery-plugin-framework-starter) [](https://github.com/Nepxion/Discovery/actions) [](https://www.codacy.com/gh/Nepxion/Discovery/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Nepxion/Discovery&utm_campaign=Badge_Grade) [](https://github.com/Nepxion/Discovery/stargazers) [](https://gitee.com/Nepxion/Discovery/stargazers)
-:100:鸣谢
-- 感谢阿里巴巴中间件Nacos和Sentinel团队,尤其是Nacos负责人@于怀,Sentinel负责人@子衿,Spring Cloud Alibaba负责人@亦盏的技术支持
-- 感谢携程Apollo团队,尤其是@宋顺,特意开发OpenApi包和技术支持
-- 感谢代码贡献者@Esun,@JikaiSun,@HaoHuang,@Fan Yang,@Ankeway等同学,感谢为本框架提出宝贵意见和建议的同学
-- 感谢使用本框架的公司和企业
+
-:100:建议
-- 强烈建议,先学习 [极简示例](https://github.com/Nepxion/DiscoveryGray)
+[](https://github.com/Nepxion/Discovery/wiki) [](https://gitee.com/nepxion/Discovery/wikis/pages?sort_id=3993615&doc_id=1124387) [](https://nepxion.github.io/Discovery/docs/link-doc/discovery-ppt.html) [](https://nepxion.github.io/Discovery/) [](https://nepxion.github.io/DiscoveryPlatform) [](https://nepxion.github.io/DiscoveryDesktop) [](https://polaris-paas.github.io/polaris-wiki)
-:100:特性
-1. 使用方便。只需如下步骤:
+
-- 引入相关依赖到pom.xml,参考 [依赖兼容](#依赖兼容)
-- 操作配置文件,参考 [配置文件](#配置文件)
- - 在元数据MetaData中,为微服务定义一个版本号(version),定义一个所属组名(group)或者应用名(application),定义一个所属区域(region)名
- - 根据项目实际情况,开启和关闭相关功能项或者属性值,达到最佳配置
-- 规则推送,参考 [规则定义](#规则定义)
- - 通过远程配置中心推送规则
- - 通过控制平台界面推送规则
- - 通过客户端工具(例如Postman)推送
-- 导入Postman脚本
- - 为方便体验示例,把discovery-springcloud-postman/Nepxion.postman_collection.json导入到Postman运行即可
+如果您觉得本框架具有一定的参考价值和借鉴意义,请帮忙在页面右上角 [**Star**]
-2. 兼容性强。支持如下版本:
+## 简介
-| 框架版本 | 框架状态 | 适用Spring Cloud版本 | 适用Spring Boot版本 | 适用Spring Cloud Alibaba版本 |
-| --- | --- | --- | --- | --- |
-| 5.1.2 | 维护中,可用 | Greenwich | 2.1.x.RELEASE | 0.9.x.RELEASE |
-| 4.9.2 | 维护中,可用 | Finchley | 2.0.x.RELEASE | 0.2.x.RELEASE |
-| 3.9.2 | 维护中,可用 | Edgware | 1.5.x.RELEASE | 0.1.x.RELEASE |
-| 2.0.x | 不维护,不可用 | Dalston | N/A | N/A |
-| 1.0.x | 不维护,不可用 | Camden | N/A | N/A |
-
-:triangular_flag_on_post:由于Greenwich和Finchley版是兼容的,所以Nepxion Discovery版本对于Greenwich和Finchley版也是通用的,即Greenwich和Finchley版既可以使用5.x.x版,也可以使用4.x.x版;Edgware存在着不兼容性,必须使用3.x.x版
-
-## 目录
-- [请联系我](#请联系我)
-- [快速开始](#快速开始)
-- [现有痛点](#现有痛点)
-- [应用场景](#应用场景)
-- [功能简介](#功能简介)
-- [名词解释](#名词解释)
-- [架构工程](#架构工程)
- - [架构](#架构)
- - [工程](#工程)
-- [依赖兼容](#依赖兼容)
- - [依赖](#依赖)
- - [兼容](#兼容)
-- [规则定义](#规则定义)
- - [规则示例](#规则示例)
- - [黑/白名单的IP地址注册的过滤规则](#黑/白名单的IP地址注册的过滤规则)
- - [最大注册数的限制的过滤规则](#最大注册数的限制的过滤规则)
- - [黑/白名单的IP地址发现的过滤规则](#黑/白名单的IP地址发现的过滤规则)
- - [版本访问的灰度发布规则](#版本访问的灰度发布规则)
- - [版本权重的灰度发布规则](#版本权重的灰度发布规则)
- - [全局版本权重的灰度发布规则](#全局版本权重的灰度发布规则)
- - [全局区域权重的灰度发布规则](#全局区域权重的灰度发布规则)
- - [网关端全链路路由策略的灰度发布规则](#网关端全链路路由策略的灰度发布规则)
- - [用户自定义的灰度发布规则](#用户自定义的灰度发布规则)
- - [动态改变规则](#动态改变规则)
- - [动态改变版本](#动态改变版本)
-- [策略定义](#策略定义)
- - [服务端的编程灰度路由策略](#服务端的编程灰度路由策略)
- - [Zuul端的编程灰度路由策略](#Zuul端的编程灰度路由策略)
- - [Gateway端的编程灰度路由策略](#Gateway端的编程灰度路由策略)
- - [REST调用的内置多版本灰度路由策略](#REST调用的内置多版本灰度路由策略)
- - [REST调用的内置多区域灰度路由策略](#REST调用的内置多区域灰度路由策略)
- - [REST调用的内置多IP和端口灰度路由策略](#REST调用的内置多IP和端口灰度路由策略)
- - [REST调用的内置版本权重灰度路由策略](#REST调用的内置版本权重灰度路由策略)
- - [REST调用的内置区域权重灰度路由策略](#REST调用的内置区域权重灰度路由策略)
- - [REST调用的编程灰度路由策略](#REST调用的编程灰度路由策略)
- - [RPC调用的编程灰度路由策略](#RPC调用的编程灰度路由策略)
-- [规则和策略](#规则和策略)
- - [规则和策略的区别](#规则和策略的区别)
- - [规则和策略的关系](#规则和策略的关系)
-- [服务隔离](#服务隔离)
- - [内置服务隔离](#内置服务隔离)
- - [自定义服务隔离](#自定义服务隔离)
-- [配置文件](#配置文件)
- - [基础属性配置](#基础属性配置)
- - [功能开关配置](#功能开关配置)
- - [外部元数据配置](#外部元数据配置)
-- [配置中心](#配置中心)
-- [管理中心](#管理中心)
-- [控制平台](#控制平台)
-- [监控平台](#监控平台)
-- [界面工具](#界面工具)
- - [基于图形化桌面程序的灰度发布](#基于图形化桌面程序的灰度发布)
- - [基于图形化Web程序的灰度发布](#基于图形化Web程序的灰度发布)
- - [基于Apollo界面的灰度发布](#基于Apollo界面的灰度发布)
- - [基于Nacos界面的灰度发布](#基于Nacos界面的灰度发布)
- - [基于Rest方式的灰度发布](#基于Rest方式的灰度发布)
-- [性能分析](#性能分析)
-- [Star走势图](#Star走势图)
-
-## 快速开始
-- [极简示例](https://github.com/Nepxion/DiscoveryGray)
-- [入门教程](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_QUICK_START.md)
-- [示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)
-
-## 请联系我
-微信和公众号
-
-
-
-
-## 界面展示
-
-图形化灰度发布桌面程序
-
-
-
-图形化灰度发布Web平台
-
-集成规则配置的Apollo配置中心
-
-集成规则配置的Nacos配置中心
-
-Nacos服务注册发现中心
-
-Spring Boot Admin监控平台
-
-集成Spring Boot Admin(F版或以上)监控平台,实现通过JMX向Endpoint推送规则和版本,实现灰度发布
-
-集成Spring Boot Admin(E版)监控平台,实现通过JMX向Endpoint推送规则和版本,实现灰度发布
-
-集成Sentinel熔断隔离限流降级平台
-
-
-集成健康检查的Consul界面
-
-
-## 现有痛点
-现有的Spring Cloud微服务痛点
-- 如果你是运维负责人,是否会经常发现,你掌管的测试环境中的服务注册中心,被一些不负责的开发人员把他本地开发环境注册上来,造成测试人员测试失败。你希望可以把本地开发环境注册给屏蔽掉,不让注册
-- 如果你是运维负责人,生产环境的某个微服务集群下的某个实例,暂时出了问题,但又不希望它下线。你希望可以把该实例给屏蔽掉,暂时不让它被调用
-- 如果你是业务负责人,鉴于业务服务的快速迭代性,微服务集群下的实例发布不同的版本。你希望根据版本管理策略进行路由,提供给下游微服务区别调用,例如访问控制快速基于版本的不同而切换,例如在不同的版本之间进行流量调拨
-- 如果你是业务负责人,希望灰度发布功能可以基于业务场景特色定制,例如根据用户手机号进行不同服务器的路由
-- 如果你是DBA负责人,希望灰度发布功能可以基于数据库切换上
-- 如果你是测试负责人,希望对微服务做A/B测试,那么通过动态改变版本达到该目的
-
-## 应用场景
-- 黑/白名单的IP地址注册的过滤
- - 开发环境的本地微服务(例如IP地址为172.16.0.8)不希望被注册到测试环境的服务注册发现中心,那么可以在配置中心维护一个黑/白名单的IP地址过滤(支持全局和局部的过滤)的规则
- - 我们可以通过提供一份黑/白名单达到该效果
-- 最大注册数的限制的过滤
- - 当某个微服务注册数目已经达到上限(例如10个),那么后面起来的微服务,将再也不能注册上去
-- 黑/白名单的IP地址发现的过滤
- - 开发环境的本地微服务(例如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的流量在B1和B2进行调拨
-- 多区域权重的灰度控制
- - 上述场景中,我们也可以通过配给不同区域的权重(流量比例),根据需求,A访问B的流量在B1和B2(B1和B2所属不同区域)进行调拨
-- 多数据源的数据库灰度控制
- - 我们事先为微服务配置多套数据源,通过灰度发布实时切换数据源
-- 动态改变微服务版本
- - 在A/B测试中,通过动态改变版本,不重启微服务,达到访问版本的路径改变
-- 用户自定义和编程灰度路由策略,可以通过非常简单编程达到如下效果
- - 在业务REST调用上,在Header上传入服务名和版本对应关系的Json字符串,后端若干个服务会把请求路由到指定版本的服务器上
- - 在业务REST调用上,在Header上传入区域(region)名,后端若干个服务会把请求路由到指定区域(region)名的服务器上
- - 在业务REST调用上,在Header上传入Token,根据不同的Token查询到不同的用户,后端若干个服务会把请求路由到指定的服务器上
- - 在业务RPC调用上,根据不同的业务参数,例如手机号或者身份证号,后端若干个服务会把请求路由到指定的服务器上
-
-## 功能简介
-- 基于Spring Cloud的微服务和Spring Cloud Gateway和Zuul网关实现下述功能,它具有几个特性
- - 具有极大的灵活性 - 支持在任何环节(微服务和两个网关),多种方式(REST和RPC)做过滤控制和灰度发布
- - 具有极小的限制性 - 只要开启了服务注册发现,程序入口加了@EnableDiscoveryClient注解
- - 具有极强的健壮性 - 当远程配置中心全部挂了,可以通过Rest方式进行灰度发布;当远程规则配置不规范,马上切换到本地规则来代替
- - 具有极简的易用性 - 只需要引入相关的包同时规则里含有了对应的配置,该功能将自然启动
-- 实现服务注册层面的控制
- - 基于黑/白名单的IP地址过滤机制禁止对相应的微服务进行注册
- - 基于最大注册数的限制微服务注册。一旦微服务集群下注册的实例数目已经达到上限,将禁止后续的微服务进行注册
-- 实现服务发现层面的控制
- - 基于黑/白名单的IP地址过滤机制禁止对相应的微服务被发现
- - 基于版本号配对,通过对消费端和提供端可访问版本对应关系的配置,在服务发现和负载均衡层面,进行多版本访问控制
- - 基于版本权重配对,通过对消费端和提供端版本权重(流量)对应关系的配置,在服务发现和负载均衡层面,进行多版本流量调拨访问控制
- - 基于区域权重配对,通过对消费端和提供端所属区域的权重(流量)对应关系的配置,在服务发现和负载均衡层面,进行多区域流量调拨访问控制
-- 实现用户业务层面的控制
- - 使用者可以通过订阅业务参数的变化,实现特色化的灰度发布,例如,多数据源的数据库切换的灰度发布
-- 实现灰度发布
- - 通过版本的动态改变,实现切换灰度发布
- - 通过版本访问规则的改变,实现切换灰度发布
- - 通过版本权重规则的改变,实现平滑灰度发布
- - 通过区域权重规则的改变,实现平滑灰度发布
-- 实现通过XML或者Json进行上述规则的定义
-- 实现通过事件总线机制(EventBus)的功能,实现发布/订阅功能
- - 对接远程配置中心,集成Nacos和Redis,异步接受远程配置中心主动推送规则信息,动态改变微服务的规则
- - 结合Spring Boot Actuator,异步接受Rest主动推送规则信息,动态改变微服务的规则,支持同步和异步推送两种方式
- - 结合Spring Boot Actuator,动态改变微服务的版本,支持同步和异步推送两种方式
- - 在服务注册层面的控制中,一旦禁止注册的条件触发,主动推送异步事件,以便使用者订阅
-- 实现通过Listener机制进行扩展
- - 使用者可以对服务注册发现核心事件进行监听
-- 实现通过策略扩展,用户自定义和编程灰度路由策略
- - 使用者可以实现跟业务有关的路由策略,根据业务参数的不同,负载均衡到不同的服务器
- - 使用者可以根据内置的版本路由策略+区域路由策略+IP和端口路由策略+自定义策略,随心所欲的达到需要的路由功能
-- 实现支持Spring Boot Actuator和Swagger集成
-- 实现支持Spring Boot Admin的集成
-- 实现支持Sentinel熔断隔离限流降级的集成
-- 实现支持未来扩展更多的服务注册中心
-- 实现控制平台微服务,支持对规则和版本集中管理、推送、更改和删除
-- 实现基于控制平台微服务的图形化的灰度发布功能
-
-## 名词解释
-- E版和F版,即Spring Cloud的Edgware和Finchley的首字母,以此类推
-- 切换灰度发布(也叫刚性灰度发布)和平滑灰度发布(也叫柔性灰度发布),切换灰度发布即在灰度发布的时候,没有过渡过程,流量直接从旧版本切换到新版本;平滑灰度发布即在灰度发布的时候,有个过渡过程,可以根据实际情况,先给新版本分配低额流量,给旧版本分配高额流量,对新版本进行监测,如果没有问题,就继续把旧版的流量切换到新版本上
-- IP地址,即根据微服务上报的它所在机器的IP地址。本系统内部强制以IP地址上报,禁止HostName上报,杜绝Spring Cloud应用在Docker或者Kubernetes部署时候出现问题
-- 规则定义和策略定义,规则定义即通过XML或者Json定义既有格式的规则;策略定义即专指用户自定义和编程灰度路由的策略,属于编程方式的一种扩展
-- 本地版本,即初始化读取本地配置文件获取的版本,也可以是第一次读取远程配置中心获取的版本。本地版本和初始版本是同一个概念
-- 动态版本,即灰度发布时的版本。动态版本和灰度版本是同一个概念
-- 本地规则,即初始化读取本地配置文件获取的规则,也可以是第一次读取远程配置中心获取的规则。本地规则和初始规则是同一个概念
-- 动态规则,即灰度发布时的规则。动态规则和灰度规则是同一个概念
-- 事件总线,即基于Google Guava的EventBus构建的组件。通过事件总线可以推送动态版本和动态规则的更新和删除
-- 远程配置中心,即可以存储规则配置XML格式的配置中心,可以包括不限于Nacos,Redis,Apollo,DisConf,Spring Cloud Config
-- 配置(Config)和规则(Rule),在本系统中属于同一个概念,例如更新配置,即更新规则;例如远程配置中心存储的配置,即规则XML
-- 服务端口和管理端口,即服务端口指在配置文件的server.port值,管理端口指management.port(E版)值或者management.server.port(F版或以上)值
-
-## 架构工程
-### 架构
-服务治理架构图
-
-
-
-全局架构图
-
-
-
-从上图,可以分析出两种基于网关的灰度发布方案,您可以研究更多的灰度发布策略
-
-:triangular_flag_on_post:基于网关版本权重的灰度发布
-- 灰度发布前
- - 网关不需要配置版本
- - 网关->服务A(V1.0),网关配给服务A(V1.0)的100%权重(流量)
-- 灰度发布中
- - 上线服务A(V1.1)
- - 在网关层调拨10%权重(流量)给A(V1.1),给A(V1.0)的权重(流量)减少到90%
- - 通过观测确认灰度有效,把A(V1.0)的权重(流量)全部切换到A(V1.1)
-- 灰度发布后
- - 下线服务A(V1.0),灰度成功
-
-:triangular_flag_on_post:基于网关版本切换的灰度发布
-- 灰度发布前
- - 假设当前生产环境,调用路径为网关(V1.0)->服务A(V1.0)
- - 运维将发布新的生产环境,部署新服务集群,服务A(V1.1)
- - 由于网关(1.0)并未指向服务A(V1.1),所以它们是不能被调用的
-- 灰度发布中
- - 新增用作灰度发布的网关(V1.1),指向服务A(V1.1)
- - 灰度网关(V1.1)发布到服务注册发现中心,但禁止被服务发现,网关外的调用进来无法负载均衡到网关(V1.1)上
- - 在灰度网关(V1.1)->服务A(V1.1)这条调用路径做灰度测试
- - 灰度测试成功后,把网关(V1.0)指向服务A(V1.1)
-- 灰度发布后
- - 下线服务A(V1.0),灰度成功
- - 灰度网关(V1.1)可以不用下线,留作下次版本上线再次灰度发布
- - 如果您对新服务比较自信,可以更简化,可以不用灰度网关和灰度测试,当服务A(V1.1)上线后,原有网关直接指向服务A(V1.1),然后下线服务A(V1.0)
-
-模块结构图
-
-
-
-### 工程
-
-| 工程名 | 描述 |
-| --- | --- |
-| discovery-common | 通用模块 |
-| discovery-common-apollo | 封装Apollo通用操作逻辑 |
-| discovery-common-nacos | 封装Nacos通用操作逻辑 |
-| discovery-common-redis | 封装Redis通用操作逻辑 |
-| discovery-plugin-framework | 核心框架 |
-| discovery-plugin-framework-eureka | 核心框架服务注册发现的Eureka实现 |
-| discovery-plugin-framework-consul | 核心框架服务注册发现的Consul实现 |
-| discovery-plugin-framework-zookeeper | 核心框架服务注册发现的Zookeeper实现 |
-| discovery-plugin-framework-nacos | 核心框架服务注册发现的Nacos实现 |
-| discovery-plugin-config-center | 配置中心实现 |
-| discovery-plugin-config-center-starter-apollo | 配置中心的Apollo Starter |
-| discovery-plugin-config-center-starter-nacos | 配置中心的Nacos Starter |
-| discovery-plugin-config-center-starter-redis | 配置中心的Redis Starter |
-| discovery-plugin-admin-center | 管理中心实现 |
-| discovery-plugin-starter-eureka | Eureka Starter |
-| discovery-plugin-starter-consul | Consul Starter |
-| discovery-plugin-starter-zookeeper | Zookeeper Starter |
-| discovery-plugin-starter-nacos | Nacos Starter |
-| discovery-plugin-strategy | 用户自定义和编程灰度路由策略 |
-| discovery-plugin-strategy-starter-service | 用户自定义和编程灰度路由策略的Service Starter |
-| discovery-plugin-strategy-starter-zuul | 用户自定义和编程灰度路由策略的Zuul Starter |
-| discovery-plugin-strategy-starter-gateway | 用户自定义和编程灰度路由策略的Spring Cloud Gateway Starter |
-| discovery-plugin-strategy-starter-hystrix | 用户自定义和编程灰度路由策略下,Hystrix做线程模式的服务隔离必须引入的插件 Starter |
-| discovery-console | 控制平台,集成接口给UI |
-| discovery-console-starter-apollo | 控制平台的Apollo Starter |
-| discovery-console-starter-nacos | 控制平台的Nacos Starter |
-| discovery-console-starter-redis | 控制平台的Redis Starter |
-| discovery-console-desktop | 图形化灰度发布等桌面程序 |
-| discovery-springcloud-example-admin | Spring Boot Admin服务台示例 |
-| discovery-springcloud-example-console | 控制平台示例 |
-| discovery-springcloud-example-eureka | Eureka服务器示例 |
-| discovery-springcloud-example-service | 用于灰度发布的微服务示例 |
-| discovery-springcloud-example-zuul | 用于灰度发布的Zuul示例 |
-| discovery-springcloud-example-gateway | 用于灰度发布的Spring Cloud Gateway示例 |
-
-## 依赖兼容
-### 依赖
-:exclamation:下面标注[必须引入]是一定要引入的包,标注[选择引入]是可以选择一个引入,或者不引入
-
-核心插件引入,支持微服务端、网关Zuul端和网关Spring Cloud Gateway端,包括核心灰度发布功能,管理中心,配置中心等
-```xml
-[必须引入] 四个服务注册发现的中间件的增强插件,请任选一个引入
-
- com.nepxion
- discovery-plugin-starter-eureka
- discovery-plugin-starter-consul
- discovery-plugin-starter-zookeeper
- discovery-plugin-starter-nacos
- ${discovery.version}
-
-
-[选择引入] 三个远程配置中心的中间件的扩展插件,如需要,请任选一个引入,或者也可以引入您自己的扩展
-
- com.nepxion
- discovery-plugin-config-center-starter-apollo
- discovery-plugin-config-center-starter-nacos
- discovery-plugin-config-center-starter-redis
- ${discovery.version}
-
-```
-
-扩展功能引入,支持微服务端、网关Zuul端和网关Spring Cloud Gateway端,包括内置版本路由、区域路由、用户自定义和编程灰度路由
-```xml
-微服务端引入
-[选择引入] 用户自定义和编程灰度路由,如需要,请引入
-
- com.nepxion
- discovery-plugin-strategy-starter-service
- ${discovery.version}
-
-
-网关Zuul端引入
-[选择引入] 用户自定义和编程灰度路由,如需要,请引入
-
- com.nepxion
- discovery-plugin-strategy-starter-zuul
- ${discovery.version}
-
-
-网关Spring Cloud Gateway端引入
-[选择引入] 用户自定义和编程灰度路由,如需要,请引入
-
- com.nepxion
- discovery-plugin-strategy-starter-gateway
- ${discovery.version}
-
-```
-
-[选择引入] 用户自定义和编程灰度路由时候,Hystrix做线程模式的服务隔离必须引入的插件,信号量模式不需要引入
-```xml
-
- com.nepxion
- discovery-plugin-strategy-starter-hystrix
- ${discovery.version}
-
-```
-
-控制平台引入
-```xml
-[选择引入] 三个远程配置中心的中间件的扩展插件,如需要,请任选一个引入,或者也可以引入您自己的扩展
-
- com.nepxion
- discovery-console-starter-apollo
- discovery-console-starter-nacos
- discovery-console-starter-redis
- ${discovery.version}
-
-```
-
-:warning:特别注意:中间件的引入一定要在所有层面保持一致,绝不允许出现类似如下情况,这也是常识
-- 例如,网关用Eureka做服务注册发现,微服务用Consul做服务注册发现
-- 例如,控制平台用Nacos做远程配置中心,微服务用Redis做远程配置中心
-
-:star:如果只想要“用户自定义和编程灰度路由”功能,而不想要灰度发布功能
-- “用户自定义和编程灰度路由”是不需要接入远程配置中心的,所以建议去除远程配置中心包的引入
-```xml
-
- com.nepxion
- discovery-plugin-config-center-starter-xxx
- ${discovery.version}
-
-```
-- “用户自定义和编程灰度路由”是不会对服务注册发现等逻辑产生影响,所以建议下面两项配置改为false
-```xml
-# 开启和关闭服务注册层面的控制。一旦关闭,服务注册的黑/白名单过滤功能将失效,最大注册数的限制过滤功能将失效。缺失则默认为true
-spring.application.register.control.enabled=false
-# 开启和关闭服务发现层面的控制。一旦关闭,服务多版本调用的控制功能将失效,动态屏蔽指定IP地址的服务实例被发现的功能将失效。缺失则默认为true
-spring.application.discovery.control.enabled=false
-```
-
-### 兼容
-版本兼容情况
-- Spring Cloud F版或以上,请采用4.x.x版本,具体代码参考master分支
-- Spring Cloud E版,请采用3.x.x版本,具体代码参考Edgware分支
-- 4.x.x版本和3.x.x版本功能完全一致,但在Endpoint的URL使用方式上稍微有个小的区别。例如
- - 3.x.x的Endpoint URL为[http://localhost:5100/config/view](http://localhost:5100/config/view)
- - 4.x.x的Endpoint URL为[http://localhost:5100/actuator/config/config/view](http://localhost:5100/actuator/config/config/view),注意,路径中config为两个,前面那个是Endpoint Id,Spring Boot 2.x.x规定Endpoint Id必须指定,且全局唯一
-
-中间件兼容情况
-- Consul
- - Consul服务器版本不限制,推荐用最新版本,从[https://releases.hashicorp.com/consul/](https://releases.hashicorp.com/consul/)获取
-- Zookeeper
- - Spring Cloud F版或以上,必须采用Zookeeper服务器的3.5.x服务器版本(或者更高),从[http://zookeeper.apache.org/releases.html#download](http://zookeeper.apache.org/releases.html#download)获取
- - Spring Cloud E版,Zookeeper服务器版本不限制
-- Eureka
- - 跟Spring Cloud版本保持一致,自行搭建服务器
-- Apollo
- - Apollo服务器版本,推荐用最新版本,从[https://github.com/ctripcorp/apollo/releases](https://github.com/ctripcorp/apollo/releases)获取
-- Nacos
- - Nacos服务器版本,推荐用最新版本,从[https://github.com/alibaba/nacos/releases](https://github.com/alibaba/nacos/releases)获取
-- Redis
- - Redis服务器版本,推荐用最新版本,从[https://redis.io/](https://redis.io/)获取
-
-## 规则定义
-规则是基于XML或者Json为配置方式,存储于本地文件或者远程配置中心,可以通过远程配置中心修改的方式达到规则动态化。其核心代码参考discovery-plugin-framework以及它的扩展、discovery-plugin-config-center以及它的扩展和discovery-plugin-admin-center等
-
-### 规则示例
-XML示例(Json示例见discovery-springcloud-example-service下的rule.json)
-
-:warning:特别注意:服务名大小写规则
-- 在配置文件(application.properties、application.yaml等)里,定义服务名(spring.application.name)不区分大小写
-- 在规则文件(XML、Json)里,引用的服务名必须小写
-- 在Nacos、Apollo、Redis等远程配置中心的Key,包含的服务名必须小写
-
-```xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {"discovery-springcloud-example-a":"1.0", "discovery-springcloud-example-b":"1.0", "discovery-springcloud-example-c":"1.0;1.2"}
-
-
- {"discovery-springcloud-example-a":"qa;dev", "discovery-springcloud-example-b":"dev", "discovery-springcloud-example-c":"qa"}
-
-
- {"discovery-springcloud-example-a":"192.168.43.101:1100", "discovery-springcloud-example-b":"192.168.43.101:1201", "discovery-springcloud-example-c":"192.168.43.101:1300"}
-
-
- {"discovery-springcloud-example-a":"1.0=90;1.1=10", "discovery-springcloud-example-b":"1.0=90;1.1=10", "discovery-springcloud-example-c":"1.0=90;1.1=10"}
-
-
- {"discovery-springcloud-example-a":"dev=85;qa=15", "discovery-springcloud-example-b":"dev=85;qa=15", "discovery-springcloud-example-c":"dev=85;qa=15"}
-
-
-
-
-
-
-
-
-
-
-
- {"discovery-springcloud-example-a":"1.0", "discovery-springcloud-example-b":"1.0", "discovery-springcloud-example-c":"1.0;1.2"}
- {"discovery-springcloud-example-a":"qa;dev", "discovery-springcloud-example-b":"dev", "discovery-springcloud-example-c":"qa"}
- {"discovery-springcloud-example-a":"192.168.43.101:1100", "discovery-springcloud-example-b":"192.168.43.101:1201", "discovery-springcloud-example-c":"192.168.43.101:1300"}
- {"discovery-springcloud-example-a":"1.0=90;1.1=10", "discovery-springcloud-example-b":"1.0=90;1.1=10", "discovery-springcloud-example-c":"1.0=90;1.1=10"}
- {"discovery-springcloud-example-a":"dev=85;qa=15", "discovery-springcloud-example-b":"dev=85;qa=15", "discovery-springcloud-example-c":"dev=85;qa=15"}
-
-
-
-
-
-
-
-
-
-
-
-```
-
-### 黑/白名单的IP地址注册的过滤规则
-微服务启动的时候,禁止指定的IP地址注册到服务注册发现中心。支持黑/白名单,白名单表示只允许指定IP地址前缀注册,黑名单表示不允许指定IP地址前缀注册。规则如何使用,见示例说明
-- 全局过滤,指注册到服务注册发现中心的所有微服务,只有IP地址包含在全局过滤字段的前缀中,都允许注册(对于白名单而言),或者不允许注册(对于黑名单而言)
-- 局部过滤,指专门针对某个微服务而言,那么真正的过滤条件是全局过滤+局部过滤结合在一起
-
-### 最大注册数的限制的过滤规则
-微服务启动的时候,一旦微服务集群下注册的实例数目已经达到上限(可配置),将禁止后续的微服务进行注册。规则如何使用,见示例说明
-- 全局配置值,只下面配置所有的微服务集群,最多能注册多少个
-- 局部配置值,指专门针对某个微服务而言,那么该值如存在,全局配置值失效
-
-### 黑/白名单的IP地址发现的过滤规则
-微服务启动的时候,禁止指定的IP地址被服务发现。它使用的方式和“黑/白名单的IP地址注册的过滤规则”一致
-
-### 版本访问的灰度发布规则
-```xml
-1. 标准配置,举例如下
- 表示消费端1.0版本,允许访问提供端1.0和1.1版本
-2. 版本值不配置,举例如下
- 表示消费端任何版本,允许访问提供端1.0和1.1版本
- 表示消费端1.0版本,允许访问提供端任何版本
- 表示消费端任何版本,允许访问提供端任何版本
-3. 版本值空字符串,举例如下
- 表示消费端任何版本,允许访问提供端1.0和1.1版本
- 表示消费端1.0版本,允许访问提供端任何版本
- 表示消费端任何版本,允许访问提供端任何版本
-4. 版本对应关系未定义,默认消费端任何版本,允许访问提供端任何版本
-
-特殊情况处理,在使用上需要极力避免该情况发生
-1. 消费端的application.properties未定义版本号,则该消费端可以访问提供端任何版本
-2. 提供端的application.properties未定义版本号,当消费端在xml里不做任何版本配置,才可以访问该提供端
-```
-
-### 版本权重的灰度发布规则
-```xml
-1. 标准配置,举例如下
- 表示消费端访问提供端的时候,提供端的1.0版本提供90%的权重流量,1.1版本提供10%的权重流量
- 表示所有消费端访问提供端的时候,提供端的1.0版本提供90%的权重流量,1.1版本提供10%的权重流量
-2. 局部配置,即指定consumer-service-name,专门为该消费端配置权重。全局配置,即不指定consumer-service-name,为所有消费端配置相同情形的权重。当局部配置和全局配置同时存在的时候,以局部配置优先
-3. 尽量为线上所有版本都赋予权重值
-```
-
-### 全局版本权重的灰度发布规则
-```xml
-1. 标准配置,举例如下
- 表示版本为1.0的服务提供85%的权重流量,版本为1.1的服务提供15%的权重流量
-2. 全局版本权重可以切换整条调用链的权重配比
-3. 尽量为线上所有版本都赋予权重值
-```
-
-### 区域权重的灰度发布规则
-```xml
-1. 标准配置,举例如下
- 表示消费端访问提供端的时候,区域为dev的服务提供85%的权重流量,区域为qa的服务提供15%的权重流量
- 表示所有消费端访问提供端的时候,区域为dev的服务提供85%的权重流量,区域为qa的服务提供15%的权重流量
-2. 局部配置,即指定consumer-service-name,专门为该消费端配置权重。全局配置,即不指定consumer-service-name,为所有消费端配置相同情形的权重。当局部配置和全局配置同时存在的时候,以局部配置优先
-3. 尽量为线上所有版本都赋予权重值
-```
-
-### 全局区域权重的灰度发布规则
-```xml
-1. 标准配置,举例如下
- 表示区域为dev的服务提供85%的权重流量,区域为qa的服务提供15%的权重流量
-2. 全局区域权重可以切换整条调用链的权重配比
-3. 尽量为线上所有区域都赋予权重值
-```
-
-### 网关端全链路路由策略的灰度发布规则
-```xml
-1. 标准配置,举例如下
-
-
- {"discovery-springcloud-example-a":"1.0", "discovery-springcloud-example-b":"1.0", "discovery-springcloud-example-c":"1.0;1.2"}
-
-
- {"discovery-springcloud-example-a":"qa;dev", "discovery-springcloud-example-b":"dev", "discovery-springcloud-example-c":"qa"}
-
-
- {"discovery-springcloud-example-a":"192.168.43.101:1100", "discovery-springcloud-example-b":"192.168.43.101:1201", "discovery-springcloud-example-c":"192.168.43.101:1300"}
-
-
- {"discovery-springcloud-example-a":"1.0=90;1.1=10", "discovery-springcloud-example-b":"1.0=90;1.1=10", "discovery-springcloud-example-c":"1.0=90;1.1=10"}
-
-
- {"discovery-springcloud-example-a":"dev=85;qa=15", "discovery-springcloud-example-b":"dev=85;qa=15", "discovery-springcloud-example-c":"dev=85;qa=15"}
-
-
-2. 用法和基于Http Header头部传路由参数一致。前置是通过前端或者网关传入,后者是配置在配置文件里。让两者全部启用的时候,以前端或者网关传入Header方式优先
-```
-:triangular_flag_on_post:注意
+### 作者简介
+- Nepxion开源社区创始人
+- 2020年阿里巴巴中国云原生峰会出品人
+- 2020年被Nacos和Spring Cloud Alibaba纳入相关开源项目
+- 2021年阿里巴巴技术峰会上海站演讲嘉宾
+- 2021年荣获陆奇博士主持的奇绩资本,进行风险投资的关注和调研
+- 2021年入选Gitee最有价值开源项目
+- 2024年入围中国开源创新榜候选项目
+- 阿里巴巴官方书籍《Nacos架构与原理》作者之一
+- Spring Cloud Alibaba Steering Committer、Nacos Group Member
+- Spring Cloud Alibaba、Nacos、Sentinel、OpenTracing Committer & Contributor
-路由策略的入口有三个为例:
-- 从外界传入(例如:Postman),在Header上加入。例如:n-d-version={"discovery-springcloud-example-a":"1.0", "discovery-springcloud-example-b":"1.0", "discovery-springcloud-example-c":"1.0;1.2"}
-- 在网关Zuul或者Spring Cloud Gateway的Filter中指定Header
-- 网关端全链路路由策略的灰度发布规则,在配置中心或者本地rule.xml配置
+
-其作用的优先级
-- 在服务中,Header方式>配置中心或者本地rule.xml配置
-- 在网关中,通过如下配置,决定优先级
-```xml
-# 当外界传值Header的时候,网关也设置并传递同名的Header,需要决定哪个Header传递到后边的服务去。如果下面开关为true,以网关设置为优先,否则以外界传值为优先。缺失则默认为true
-spring.application.strategy.gateway.header.priority=false
+### 商业合作
+① Discovery系列
-# 当外界传值Header的时候,网关也设置并传递同名的Header,需要决定哪个Header传递到后边的服务去。如果下面开关为true,以网关设置为优先,否则以外界传值为优先。缺失则默认为true
-spring.application.strategy.zuul.header.priority=false
-```
+| 框架名称 | 框架版本 | 支持Spring Cloud版本 | 使用许可 |
+| --- | --- | --- | --- |
+| Discovery | 1.x.x ~ 6.x.x | Camden ~ Hoxton | 开源,永久免费 |
+| DiscoveryX | 7.x.x + | 2020 + | 闭源,商业许可 |
-### 用户自定义的灰度发布规则
-通过订阅业务参数的变化,实现特色化的灰度发布,例如,多数据源的数据库切换的灰度发布
-```xml
-1. 标准配置,举例如下
-
-2. 上述示例,是基于多数据源的数据库切换的灰度发布
- 服务a有两个库的配置,分别是测试数据库(database的value为qa)和生产数据库(database的value为prod)
- 上线后,一开始数据库指向测试数据库,对应value为qa,然后灰度发布的时候,改对应value为prod,即实现数据库的灰度发布
-```
+② Polaris系列
-### 动态改变规则
-微服务启动的时候,由于规则(例如:rule.xml)已经配置在本地,使用者希望改变一下规则,而不重启微服务,达到规则的改变
-- 规则分为本地规则和动态规则
-- 本地规则是通过在本地规则(例如:rule.xml)文件定义的,也可以从远程配置中心获取,在微服务启动的时候读取
-- 动态规则是通过POST方式动态设置,或者由远程配置中心推送设置
-- 规则初始化的时候,如果接入了远程配置中心,先读取远程规则,如果不存在,再读取本地规则文件
-- 多规则灰度获取规则的时候,先获取动态规则,如果不存在,再获取本地规则
-- 规则可以持久化到远程配置中心,一旦微服务死掉后,再次启动,仍旧可以拿到灰度规则,所以动态改变规则策略属于永久灰度发布手段
-- 规则推送到远程配置中心可以分为局部推送和全局推送
- - 局部推送是基于Group+ServiceId来推送的,就是同一个Group下同一个ServiceId的服务集群独立拥有一个规则配置,如果采用这种方式,需要在每个微服务集群下做一次灰度发布。优点是独立封闭,本服务集群灰度发布失败不会影响到其它服务集群,缺点是相对繁琐
- - 全局推送是基于Group来推送的(接口参数中的ServiceId由Group来代替),就是同一个Group下所有服务集群共同拥有一个规则配置,如果采用这种方式,只需要做一次灰度发布,所有服务集群都生效。优点是非常简便,缺点具有一定风险,因为这个规则配置掌握着所有服务集群的命运。全局推送用于全链路灰度发布
- - 如果既执行了全局推送,又执行了局部推送,那么,当服务运行中,优先接受最后一次推送的规则;当服务重新启动的时候,优先读取局部推送的规则
+Polaris为Discovery高级定制版,特色功能
-### 动态改变版本
-微服务启动的时候,由于版本已经写死在application.properties里,使用者希望改变一下版本,而不重启微服务,达到访问版本的路径改变
-- 版本分为本地版本和动态版本
-- 本地版本是通过在application.properties里配置的,在微服务启动的时候读取
-- 动态版本是通过POST方式动态设置
-- 多版本灰度获取版本值的时候,先获取动态版本,如果不存在,再获取本地版本
-- 版本不会持久化到远程配置中心,一旦微服务死掉后,再次启动,拿到的还是本地版本,所以动态改变版本策略属于临时灰度发布手段
+- 基于Nepxion Discovery集成定制
+- 多云、多活、多机房流量调配
+- 跨云动态域名、跨环境适配
+- DCN、DSU、SET单元化部署
+- 组件灵活装配、配置对外屏蔽
+- 极简低代码PaaS平台
-## 策略定义
-策略是通过REST或者RPC调用传递Header或者参数,达到用户自定义和编程灰度路由的目的。使用者可以实现跟业务有关的路由策略,根据业务参数的不同,负载均衡到不同的服务器,其核心代码参考discovery-plugin-strategy以及它的扩展
-
-### 服务端的编程灰度路由策略
-基于服务端的编程灰度路由,实现DiscoveryEnabledStrategy,通过RequestContextHolder(获取来自网关的Header参数)和ServiceStrategyContext(获取来自RPC方式的方法参数)获取业务上下文参数,进行路由自定义,见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-### Zuul端的编程灰度路由策略
-基于Zuul端的编程灰度路由,实现DiscoveryEnabledStrategy,通过Zuul自带的RequestContext(获取来自网关的Header参数)获取业务上下文参数,进行路由自定义,见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-### Gateway端的编程灰度路由策略
-基于Spring Cloud Gateway端的编程灰度路由,实现DiscoveryEnabledStrategy,通过GatewayStrategyContext(获取来自网关的Header参数)获取业务上下文参数,进行路由自定义,见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-### REST调用的内置多版本灰度路由策略
-基于Feign/RestTemplate的REST调用的多版本灰度路由,在Header上传入服务名和版本对应关系的Json字符串,如下表示,如果REST请求要经过a,b,c三个服务,那么只有a服务的1.0版本,b服务的1.1版本,c服务的1.1或1.2版本,允许被调用到
-Header的Key为"n-d-version",value为:
-```xml
-{"discovery-springcloud-example-a":"1.0", "discovery-springcloud-example-b":"1.1", "discovery-springcloud-example-c":"1.1;1.2"}
-```
-见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-如果,链路调用中所有的服务都是指定某个版本(例如1.1),那么value的格式可以简化,不需要Json字符串,直接是
-```xml
-1.1
-```
-
-如果上述表达式还未满足需求,也可以采用通配符(具体详细用法,参考Spring AntPathMatcher)
-```xml
-"discovery-springcloud-example-c":"1.*;1.2.?" - 表示c服务的版本调用范围是1开头的所有版本,或者是1.2开头的所有版本(末尾必须是1个字符)
-```
-```xml
-* - 表示调用范围为所有服务的所有版本
-1.* - 表示调用范围为所有服务的1开头的所有版本
-```
-
-多版本灰度路由架构图
-
-
-### REST调用的内置多区域灰度路由策略
-基于Feign/RestTemplate的REST调用的多区域灰度路由,在Header上传入服务名和版本对应关系的Json字符串,如下表示,如果REST请求要经过a,b,c三个服务,那么只有dev区域的a服务,qa区域的b服务,dev和qa区域c服务,允许被调用到
-Header的Key为"n-d-region",value为:
-```xml
-{"discovery-springcloud-example-a":"dev", "discovery-springcloud-example-b":"qa", "discovery-springcloud-example-c":"dev;qa"}
-```
-见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-如果,链路调用中所有的服务都是指定某个区域(例如dev),那么value的格式可以简化,不需要Json字符串,直接是
-```xml
-dev
-```
-
-如果上述表达式还未满足需求,也可以采用通配符(具体详细用法,参考Spring AntPathMatcher)
-```xml
-"discovery-springcloud-example-c":"d*;q?" - 表示c服务的区域调用范围是d开头的所有区域,或者是q开头的所有区域(末尾必须是1个字符)
-```
-```xml
-* - 表示调用范围为所有服务的所有区域
-d* - 表示调用范围为所有服务的d开头的所有区域
-```
-
-多区域灰度路由架构图
-
-
-:warning:特别注意:Spring Cloud内置zone的策略,功能跟region策略很相似,但zone策略不能跟用户自定义路由组合使用,故提供了更友好的region策略
-
-### REST调用的内置多IP和端口灰度路由策略
-基于Feign/RestTemplate的REST调用的多版本灰度路由,在Header上传入服务名和版本对应关系的Json字符串,如下表示,如果REST请求要经过a,b,c三个服务,那么只需要指定三个服务所给定的IP(或者IP和端口组合),允许被调用到
-Header的Key为"n-d-address",value为:
-```xml
-{"discovery-springcloud-example-a":"192.168.43.101:1101", "discovery-springcloud-example-b":"192.168.43.101:1201", "discovery-springcloud-example-c":"192.168.43.101:1302"}
-```
-见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-如果上述表达式还未满足需求,也可以采用通配符(具体详细用法,参考Spring AntPathMatcher)
-```xml
-"discovery-springcloud-example-c":"192.168.43.*;192.168.44.10?" - 表示c服务的地址调用范围是192.168.43开头的所有IP,或者是192.168.44.10开头的所有IP(末尾必须是1个字符)
-```
-```xml
-* - 表示调用范围为所有服务的所有IP
-192.168.43* - 表示调用范围为所有服务的192.168.43开头的所有IP
-```
-
-多IP和端口灰度路由架构图
-
-
-### REST调用的内置版本权重灰度路由策略
-基于Feign/RestTemplate的REST调用的多版本权重灰度路由,在Header上传入服务名和版本流量百分比对应关系的Json字符串,如下表示,如果REST请求要经过a,b,c三个服务的版本权重配比,那么只需要它们版本对于流量的百分比
-Header的Key为"n-d-version-weight",value为:
-```xml
-{"discovery-springcloud-example-a":"1.0=90;1.1=10", "discovery-springcloud-example-b":"1.0=90;1.1=10", "discovery-springcloud-example-c":"1.0=90;1.1=10"}
-```
-如果三个服务权重比一致,那么value的格式可以简化,不需要Json字符串,直接是
-```xml
-1.0=90;1.1=10
-```
-见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-### REST调用的内置区域权重灰度路由策略
-基于Feign/RestTemplate的REST调用的多区域灰度路由,在Header上传入区域流量百分比对应关系的字符串,如下表示,如果REST请求要经过两个区域,那么只需要它们区域对于流量的百分比
-Header的Key为"n-d-region-weight",value为:
-```xml
-{"discovery-springcloud-example-a":"dev=85;qa=15", "discovery-springcloud-example-b":"dev=85;qa=15", "discovery-springcloud-example-c":"dev=85;qa=15"}
-```
-如果三个服务权重比一致,那么value的格式可以简化,不需要Json字符串,直接是
-```xml
-dev=85;qa=15
-```
-见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-### REST调用的编程灰度路由策略
-基于Feign/RestTemplate的REST调用的自定义路由,见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-### RPC调用的编程灰度路由策略
-基于Feign/RestTemplate的RPC调用的自定义路由,见[示例演示](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_EXAMPLE.md)的“用户自定义和编程灰度路由的操作演示”
-
-## 规则和策略
-### 规则和策略的区别
-| 属性 | 规则 | 策略 |
-| --- | --- | --- |
-| 方式 | 通过XML或者Json配置 | 通过REST或者RPC调用传递Header或者参数 |
-| 频率 | 灰度发布期间更新,频率低 | 每次调用时候传递,频率高 |
-| 扩展性 | 内置,有限扩展,继承三个AbstractXXXListener | 内置,完全扩展,实现DiscoveryEnabledStrategy |
-| 作用域 | 运行前,运行期 | 运行期 |
-| 依赖性 | 依赖配置中心或者本地配置文件 | 依赖每次调用 |
-
-### 规则和策略的关系
-- 规则和策略,可以混合在一起工作,也关闭一项,让另一项单独工作
-- 规则和策略,一起工作的时候,先执行规则过滤逻辑,再执行策略过滤逻辑
-- 规则和策略关闭
- - 规则关闭,spring.application.register.control.enabled=false和spring.application.discovery.control.enabled=false
- - 策略关闭,spring.application.strategy.control.enabled=false
-
-## 服务隔离
-
-### 内置服务隔离
-元数据中的Group在一定意义上代表着系统ID或者系统逻辑分组,基于Group策略意味着只有同一个系统中的服务才能相互发生关系
-
-- 注册服务隔离,基于Group黑/白名单的策略,即当前的服务所在的Group,不在Group的黑名单或者在白名单里,才允许被注册。只需要在网关或者服务端,开启如下配置即可:
-```xml
-# 启动和关闭注册的服务隔离(基于Group黑/白名单的策略)。缺失则默认为false
-spring.application.strategy.register.isolation.enabled=true
-```
-默认方式,黑/白名单通过如此方式配置
-```xml
-spring.application.strategy.register.isolation.group.blacklist=
-spring.application.strategy.register.isolation.group.whitelist=
-```
-
-- 消费端服务隔离,基于Group是否相同的策略,即消费端拿到的提供端列表,两者的Group必须相同。只需要在网关或者服务端,开启如下配置即可:
-```xml
-# 启动和关闭消费端的服务隔离(基于Group是否相同的策略)。缺失则默认为false
-# spring.application.strategy.consumer.isolation.enabled=true
-```
-
-- 提供端服务隔离,基于Group是否相同的策略,即服务端被消费端调用,两者的Group必须相同,否则拒绝调用,异构系统可以通过Header方式传递n-d-service-group值进行匹配。只需要在网关或者服务端,开启如下配置即可:
-```xml
-# 启动和关闭提供端的服务隔离(基于Group是否相同的策略)。缺失则默认为false
-# spring.application.strategy.provider.isolation.enabled=true
-```
-还必须做如下配置
-```xml
-# 用户自定义和编程灰度路由策略的时候,需要指定对业务RestController类的扫描路径。此项配置作用于RPC方式的调用拦截和消费端的服务隔离两项工作
-spring.application.strategy.scan.packages=com.nepxion.discovery.gray.service.feign
-```
-
-### 自定义服务隔离
-使用者可以继承如下类
-- AbstractRegisterListener,实现自定义”禁止注册“,用法参考discovery-springcloud-example-service下MyRegisterListener
-- AbstractDiscoveryListener,实现自定义”禁止被发现“,用法参考discovery-springcloud-example-service下MyDiscoveryListener。注意,在Consul下,同时会触发service和management两个实例的事件,需要区别判断,见上图“集成了健康检查的Consul界面”
-- AbstractLoadBalanceListener,实现自定义”禁止被负载均衡“,用法参考discovery-springcloud-example-service下MyLoadBalanceListener
-
-## 配置文件
-### 基础属性配置
-不同的服务注册发现组件对应的不同的配置值(region配置可选),请仔细阅读
-```xml
-# Eureka config for discovery
-eureka.instance.metadataMap.group=xxx-service-group
-eureka.instance.metadataMap.version=1.0
-eureka.instance.metadataMap.region=dev
-
-# 奇葩的Consul配置(参考https://springcloud.cc/spring-cloud-consul.html - 元数据和Consul标签)
-# Consul config for discovery
-spring.cloud.consul.discovery.tags=group=xxx-service-group,version=1.0,region=dev
-
-# Zookeeper config for discovery
-spring.cloud.zookeeper.discovery.metadata.group=xxx-service-group
-spring.cloud.zookeeper.discovery.metadata.version=1.0
-spring.cloud.zookeeper.discovery.metadata.region=dev
-
-# Nacos config for discovery
-spring.cloud.nacos.discovery.metadata.group=example-service-group
-spring.cloud.nacos.discovery.metadata.version=1.0
-spring.cloud.nacos.discovery.metadata.region=dev
-
-# Admin config
-# E版配置方式
-# 关闭访问Rest接口时候的权限验证
-management.security.enabled=false
-management.port=5100
-
-# F版或以上配置方式
-management.server.port=5100
-```
-
-### 功能开关配置
-请注意,如下很多配置项,如果使用者不想做特色化的处理,为避免繁琐,可以零配置(除了最底下,但一般也不会被用到)
-```xml
-# Plugin core 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
-# 规则文件的格式,支持xml和json。缺失则默认为xml
-# spring.application.config.format=xml
-# spring.application.config.format=json
-# 本地规则文件的路径,支持两种方式:classpath:rule.xml(rule.json) - 规则文件放在resources目录下,便于打包进jar;file:rule.xml(rule.json) - 规则文件放在工程根目录下,放置在外部便于修改。缺失则默认为不装载本地规则
-# spring.application.config.path=classpath:rule.xml
-# spring.application.config.path=classpath:rule.json
-# 为微服务归类的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
-# 由于服务未注册,或者被过滤,或者被隔离,导致消费端拿不到服务实例的时候,通过日志方式通知。缺失则默认为false
-# spring.application.no.server.found.notification.enabled=false
-
-# Plugin strategy config
-# 开启和关闭策略扩展功能的控制。一旦关闭,用户自定义和编程灰度路由策略功能将失效。缺失则默认为true
-# spring.application.strategy.control.enabled=true
-# 开启和关闭Ribbon默认的ZoneAvoidanceRule负载均衡策略。一旦关闭,则使用RoundRobin简单轮询负载均衡策略。缺失则默认为true
-# spring.application.strategy.zone.avoidance.rule.enabled=true
-# 启动和关闭用户自定义和编程灰度路由策略的时候,对REST方式的调用拦截。缺失则默认为true
-# spring.application.strategy.rest.intercept.enabled=true
-# 用户自定义和编程灰度路由策略的时候,对REST方式调用拦截的时候(支持Feign或者RestTemplate调用),希望把来自外部自定义的Header参数传递到服务里,那么配置如下值。如果多个用“;”分隔,不允许出现空格
-spring.application.strategy.request.headers=token
-# 启动和关闭用户自定义和编程灰度路由策略的时候,对RPC方式的调用拦截。缺失则默认为false
-spring.application.strategy.rpc.intercept.enabled=true
-# 用户自定义和编程灰度路由策略的时候,需要指定对业务RestController类的扫描路径。此项配置作用于RPC方式的调用拦截和消费端的服务隔离两项功能
-spring.application.strategy.scan.packages=com.nepxion.discovery.plugin.example.service.feign
-# 启动和关闭注册的服务隔离(基于Group黑/白名单的策略)。缺失则默认为false
-spring.application.strategy.register.isolation.enabled=true
-# 启动和关闭消费端的服务隔离(基于Group是否相同的策略)。缺失则默认为false
-spring.application.strategy.consumer.isolation.enabled=true
-# 启动和关闭提供端的服务隔离(基于Group是否相同的策略)。缺失则默认为false
-spring.application.strategy.provider.isolation.enabled=true
-# 启动和关闭Header传递的日志打印,注意每调用一次都会打印一次,会对性能有所影响,建议压测环境和生产环境关闭。缺失则默认为false
-spring.application.strategy.intercept.log.print=true
-# 开启服务端实现Hystrix线程隔离模式做服务隔离时,必须把spring.application.strategy.hystrix.threadlocal.supported设置为true,同时要引入discovery-plugin-strategy-starter-hystrix包,否则线程切换时会发生ThreadLocal上下文对象丢失
-# spring.application.strategy.hystrix.threadlocal.supported=true
-```
-
-### 外部元数据配置
-外部系统(例如运维发布平台)在远程启动制定微服务的时候,可以通过参数传递来动态改变元数据或者增加运维特色的参数,最后注册到远程配置中心。有两种方式,如下图:
-
-- 通过Program arguments来传递,它的用法是前面加“--”。支持Eureka、Zookeeper和Nacos(增量覆盖),Consul支持的不好(全量覆盖)
-- 通过VM arguments来传递,它的用法是前面加“-D”。支持上述所有的注册组件,它的限制是变量前面必须要加“ext.”
-- 两种方式尽量避免同时用
-
-## 配置中心
-- 默认集成
- - 本系统跟Apollo集成,如何安装使用,请参考[https://github.com/ctripcorp/apollo](https://github.com/ctripcorp/apollo)
- - 本系统跟Nacos集成,如何安装使用,请参考[https://github.com/alibaba/nacos](https://github.com/alibaba/nacos)
- - 本系统跟Redis集成
-- 扩展集成
- - 使用者也可以跟更多远程配置中心集成
- - 参考三个跟Nacos或者Redis有关的工程
-
-## 管理中心
-:exclamation:PORT端口号为服务端口或者管理端口都可以
-- 配置接口
-- 版本接口
-- 路由接口
-参考Swagger界面,如下图
-
-
-
-## 控制平台
-为UI提供相关接口,包括
-- 一系列批量功能
-- 跟Nacos、Apollo和Redis集成,实现配置拉取、推送和清除
-
-:exclamation:PORT端口号为服务端口或者管理端口都可以
-- 控制平台接口
-参考Swagger界面,如下图
-
-
-
-## 监控平台
-基于Spring Boot Actuator技术的Spring Boot Admin监控平台
-
-参考[https://github.com/codecentric/spring-boot-admin](https://github.com/codecentric/spring-boot-admin)
-
-## 熔断隔离限流降级平台
-基于Alibaba Sentinel的熔断隔离限流降级平台
-
-参考[https://github.com/alibaba/Sentinel](https://github.com/alibaba/Sentinel)
-
-## 界面工具
-请参考[入门教程](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_QUICK_START.md)的“界面操作”
-
-### 基于图形化桌面程序的灰度发布
-- 见[入门教程](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_QUICK_START.md)的“运行图形化灰度发布桌面程序”
-
-### 基于图形化Web程序的灰度发布
-- 见[入门教程](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_QUICK_START.md)的“运行图形化灰度发布Web程序”
-
-### 基于Apollo界面的灰度发布
-- 见[入门教程](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_QUICK_START.md)的“运行Apollo配置界面”
-
-### 基于Nacos界面的灰度发布
-- 见[入门教程](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_QUICK_START.md)的“运行Nacos配置界面”
-
-### 基于Rest方式的灰度发布
-- 见[入门教程](https://github.com/Nepxion/Docs/raw/master/discovery-doc/README_QUICK_START.md)的“运行Swagger或者Postman方式”
-
-## 性能分析
-在我的电脑上,做了如下性能测试:
-
-应用耗时
-
-| 应用 | 耗时 | 内存 |
-| --- | --- | --- |
-| 空的Spring Cloud启动 | 9秒 | 400M |
-| 带有Discovery Plugin的Spring Cloud启动 | 13秒 | 480M |
-
-启动项耗时
-
-| 启动项 | 耗时 |
+| 框架名称 | 框架版本 | 支持Discovery版本 | 支持Spring Cloud版本 | 使用许可 |
+| --- | --- | --- | --- | --- |
+| Polaris | 1.x.x | 6.x.x | Finchley ~ Hoxton | 闭源,商业许可 |
+| Polaris | 2.x.x | 7.x.x + | 2020 + | 闭源,商业许可 |
+
+有商业版需求的企业和用户,请添加微信1394997,联系作者,洽谈合作事宜
+
+### 入门资料
+ Discovery【探索】企业级云原生微服务开源解决方案
+
+① 快速入门
+- [快速入门Github版](https://github.com/Nepxion/Discovery/wiki)
+- [快速入门Gitee版](https://gitee.com/Nepxion/Discovery/wikis/pages)
+
+② 解决方案
+- [解决方案WIKI版](http://nepxion.com/discovery)
+- [解决方案PPT版](https://nepxion.github.io/Discovery/docs/link-doc/discovery-ppt.html)
+
+③ 最佳实践
+- [最佳实践PPT版](https://nepxion.github.io/Discovery/docs/link-doc/discovery-ppt-1.html)
+
+④ 平台桌面
+- [平台界面WIKI版](http://nepxion.com/discovery-platform)
+- [图形桌面WIKI版](http://nepxion.com/discovery-desktop)
+
+⑤ 框架源码
+- [框架源码Github版](https://github.com/Nepxion/Discovery)
+- [框架源码Gitee版](https://gitee.com/Nepxion/Discovery)
+
+⑥ 指南示例源码
+- [指南示例源码Github版](https://github.com/Nepxion/DiscoveryGuide)
+- [指南示例源码Gitee版](https://gitee.com/Nepxion/DiscoveryGuide)
+
+⑦ 指南示例说明
+- Spring Cloud Finchley ~ Hoxton版本
+ - [极简版指南示例](https://github.com/Nepxion/DiscoveryGuide/tree/6.x.x-simple),分支为6.x.x-simple
+ - [极简版域网关部署指南示例](https://github.com/Nepxion/DiscoveryGuide/tree/6.x.x-simple-domain-gateway),分支为6.x.x-simple-domain-gateway
+ - [极简版非域网关部署指南示例](https://github.com/Nepxion/DiscoveryGuide/tree/6.x.x-simple-non-domain-gateway),分支为6.x.x-simple-non-domain-gateway
+ - [集成版指南示例](https://github.com/Nepxion/DiscoveryGuide/tree/6.x.x),分支为6.x.x
+ - [高级版指南示例](https://github.com/Nepxion/DiscoveryGuide/tree/6.x.x-complex),分支为6.x.x-complex
+- Spring Cloud 20xx版本
+ - [极简版指南示例](https://github.com/Nepxion/DiscoveryGuide/tree/master-simple),分支为master-simple
+ - [极简版本地化指南示例](https://github.com/Nepxion/DiscoveryGuide/tree/master-simple-native),分支为master-simple-native
+ - [集成版指南示例](https://github.com/Nepxion/DiscoveryGuide/tree/master),分支为master
+
+ Polaris【北极星】企业级云原生微服务商业解决方案
+
+① 解决方案
+- [解决方案WIKI版](http://nepxion.com/polaris)
+
+② 框架源码
+- [框架源码Github版](https://github.com/polaris-paas/polaris-sdk)
+- [框架源码Gitee版](https://gitee.com/polaris-paas/polaris-sdk)
+
+③ 指南示例源码
+- [指南示例源码Github版](https://github.com/polaris-paas/polaris-guide)
+- [指南示例源码Gitee版](https://gitee.com/polaris-paas/polaris-guide)
+
+④ 指南示例说明
+- Spring Cloud Finchley ~ Hoxton版本
+ - [指南示例](https://github.com/polaris-paas/polaris-guide/tree/1.x.x),分支为1.x.x
+- Spring Cloud 20xx版本
+ - [指南示例](https://github.com/polaris-paas/polaris-guide/tree/master),分支为master
+
+### 功能概述
+Discovery【探索】微服务框架,基于Spring Cloud & Spring Cloud Alibaba,Discovery服务注册发现、Ribbon & Spring Cloud LoadBalancer负载均衡、Feign & RestTemplate & WebClient调用、Spring Cloud Gateway & Zuul过滤等组件全方位增强的企业级微服务开源解决方案,更贴近企业级需求,更具有企业级的插件引入、开箱即用特征
+
+① 微服务框架支持的技术栈,如下
+- 支持阿里巴巴Spring Cloud Alibaba中间件生态圈
+- 支持阿里巴巴Nacos、Eureka、Consul和Zookeeper四个服务注册发现中心
+- 支持阿里巴巴Nacos、携程Apollo、Redis、Zookeeper、Consul和Etcd六个远程配置中心
+- 支持阿里巴巴Sentinel、Hystrix和Resilience4J三个熔断限流降级权限中间件
+- 支持OpenTracing和OpenTelemetry规范下的调用链中间件,Jaeger、SkyWalking和Zipkin等
+- 支持Prometheus Micrometer和Spring Boot Admin两个指标中间件
+- 支持Java Agent解决异步跨线程ThreadLocal上下文传递
+- 支持Spring Spel解决蓝绿灰度参数的驱动逻辑
+- 支持Spring Matcher解决元数据匹配的通配逻辑
+- 支持Spring Cloud Gateway、Zuul网关和微服务三大模块的蓝绿灰度发布等一系列功能
+- 支持和兼容Spring Cloud Edgware版、Finchley版、Greenwich版、Hoxton版和20xx版以及更高的Spring Cloud版本
+- 支持和兼容Java8~Java17以及更高的SDK版本
+
+
+
+② Discovery【探索】微服务框架支持的应用功能,如下
+- 全链路蓝绿灰度发布
+ - 全链路版本、区域、 IP地址和端口匹配蓝绿发布
+ - 全链路版本、区域、 IP地址和端口权重灰度发布
+ - 全链路蓝 | 绿 | 兜底、蓝 | 兜底的蓝绿路由类型
+ - 全链路稳定、灰度的灰度路由类型
+ - 全链路网关、服务端到端混合蓝绿灰度发布
+ - 全链路单网关、域网关、非域网关部署
+ - 全链路条件驱动、非条件驱动
+ - 全链路前端触发后端蓝绿灰度发布
+ - 全局订阅式蓝绿灰度发布
+ - 全链路自定义网关、服务的过滤器、负载均衡策略类触发蓝绿灰度发布
+ - 全链路Header、Parameter、Cookie、域名、RPC Method等参数化规则策略驱动
+ - 全链路本地和远程、局部和全局无参数化规则策略驱动
+ - 全链路条件表达式、通配表达式支持
+ - 全链路内置Header,支持定时Job的服务调用蓝绿灰度发布
+ - 全链路手工编排、智能编排、无编排蓝绿灰度发布
+- 全链路自动化测试
+ - 全链路自动化模拟流程测试
+ - 全链路自动化模拟流程本地测试
+ - 全链路自动化模拟流程云上测试
+ - 全链路自动化流量侦测测试
+ - 全链路自动化流量侦测本地测试
+ - 全链路自动化流量侦测云上测试
+- 全链路流量管控对接DevOps运维平台
+- 全链路多活单元化
+- 全链路隔离路由
+ - 全链路组隔离路由
+ - 组负载均衡的消费端隔离
+ - 组Header传值的提供端隔离
+ - 全链路版本偏好路由
+ - 全链路区域调试路由
+ - 全链路环境隔离路由
+ - 全链路可用区亲和性隔离路由
+ - 全链路IP地址和端口隔离路由
+- 全链路隔离准入
+ - 基于IP地址黑白名单注册准入
+ - 基于最大注册数限制注册准入
+ - 基于IP地址黑白名单发现准入
+ - 自定义注册发现准入
+- 全链路故障转移
+ - 全链路版本故障转移
+ - 全链路区域故障转移
+ - 全链路环境故障转移
+ - 全链路可用区故障转移
+ - 全链路IP地址和端口故障转移
+- 全链路服务无损下线,实时性的流量绝对无损
+ - 全局唯一ID屏蔽
+ - IP地址和端口屏蔽
+- 异步场景下全链路蓝绿灰度发布
+ - 异步跨线程Agent插件
+ - Hystrix线程池隔离插件
+- 网关动态路由
+ - 路由动态添加
+ - 路由动态修改
+ - 路由动态删除
+ - 路由动态批量更新
+ - 路由查询
+ - 路由动态变更后的事件通知
+- 全链路服务限流熔断降级权限
+ - Sentinel基于服务名的防护
+ - Sentinel基于组的防护
+ - Sentinel基于版本的防护
+ - Sentinel基于区域的防护
+ - Sentinel基于环境的防护
+ - Sentinel基于可用区的防护
+ - Sentinel基于IP地址和端口的防护
+ - Sentinel自定义Header、Parameter、Cookie的防护
+ - Sentinel自定义业务参数的防护
+ - Sentinel自定义组合式的防护
+- 全链路监控
+ - 蓝绿灰度埋点和熔断埋点的调用链监控
+ - 蓝绿灰度埋点和熔断埋点的日志监控
+ - 熔断埋点的指标监控
+- 全链路蓝绿灰度发布编排建模和流量侦测
+ - 全链路蓝绿发布编排建模
+ - 全链路灰度发布编排建模
+ - 全链路蓝绿发布流量侦测
+ - 全链路灰度发布流量侦测
+ - 全链路蓝绿灰度发布混合流量侦测
+- 全链路数据库和消息队列蓝绿发布
+ - 基于多DataSource的数据库蓝绿发布
+ - 基于多Queue的消息队列蓝绿发布
+- 全链路服务侧注解
+- 元数据流量染色
+ - 基于Git插件的元数据流量染色
+ - 基于服务名前缀的元数据流量染色
+ - 基于启动参数的元数据流量染色
+ - 基于配置文件的元数据流量染色
+ - 基于系统参数的元数据流量染色
+ - 基于POM版本号的元数据流量染色
+- 扫描目录
+ - 自动扫描目录
+ - 手工扫描目录
+ - 注入扫描目录
+- 规则策略推送
+ - 基于配置中心的规则策略订阅推送
+ - 基于Swagger和Rest的规则策略推送
+ - 基于平台端和桌面端的规则策略推送
+- 统一配置订阅执行器
+
+
+
+③ Discovery【探索】微服务框架支持的功能维度,如下
+
+微服务框架支持组(Group)、版本(Version)、区域(Region)、环境(Env)、可用区(Zone)、IP地址和端口(Address)、全局唯一ID七大经典维度实施流量管控的方式,通过“并集”方式叠加作用在流量控制上。上述七个维度在功能上各有各的侧重点,如下表格主要讲述各自的区别
+
+| 维度 | 概念 | 场景 | 功能侧重点 | 关键头
+| --- | --- | --- | --- | --- |
+| 组 | 服务实例的系统ID 系统逻辑分组 | 路由隔离 | ① 组负载均衡隔离 - 调用端和提供端的元数据group是否相同 ② 组Header传值策略隔离 - Header(n-d-group)和提供端的元数据group是否相同 ③ 不支持故障转移 | n-d-group |
+| 版本 | 服务实例的版本 适用于生产环境 | 蓝绿灰度发布 路由转移 故障转移 | ① 版本条件匹配蓝绿发布 ② 版本权重灰度发布 ③ 版本偏好 - 非蓝绿灰度发布场景下,路由到相应版本的实例 - 稳定版本策略、指定版本策略 ④ 版本故障转移 - 未找到相应版本的服务实例,路由到其它版本 - 负载均衡策略、稳定版本策略、指定版本策略 | n-d-version n-d-version-weight n-d-version-prefer n-d-version-failover |
+| 区域 | 服务实例的区域 适用于多活单元化 适用于多机房 适用于多环境 | 蓝绿灰度发布 同城双活/异地多活 路由转移 故障转移 | ① 区域条件匹配蓝绿发布 ② 区域权重灰度发布 ③ 区域多活单元化 ④ 区域调试路由 - 多区域路由隔离下跨区服务调用的调试手段 ⑤ 区域故障转移 - 未找到相应区域的服务实例,路由到其它区域 - 负载均衡策略、指定区域策略 | n-d-region n-d-region-weight n-d-region-transfer n-d-region-failover |
+| 环境 | 服务实例的环境 适用于测试环境 | 路由隔离 故障转移 | ① 环境隔离路由 - Header(n-d-env)和提供端的元数据env是否相同 ② 环境故障转移 - 未找到相应环境的服务实例,路由到其它环境 - 指定环境(未配置,默认为common)策略 | n-d-env n-d-env-failover |
+| 可用区 | 服务实例的可用区 适用于多机房 | 路由隔离 故障转移 | ① 可用区亲和性隔离路由 - 调用端和提供端的元数据zone是否相同 ② 可用区故障转移 - 未找到相应可用区的服务实例,路由到其它可用区 - 支持负载均衡策略、指定区可用区策略 | n-d-zone-failover |
+| IP地址和端口 |服务实例机器地址 | 蓝绿灰度发布 路由隔离 故障转移 无损下线 | ① IP地址和端口匹配蓝绿发布 ② IP地址和端口权重灰度发布 ③ IP地址和端口故障转移 - 未找到相应IP地址和端口的服务实例,路由到其它地址 - 负载均衡策略、指定区IP地址和端口策略 ④ IP地址和端口无损下线黑名单屏蔽 | n-d-address n-d-address-failover n-d-address-blacklist |
+| 全局唯一ID | 服务实例机器ID | 无损下线 | ① 全局唯一ID无损下线黑名单屏蔽 | n-d-id-blacklist |
+
+
+
+### 发展历程
+- 2017年12月开始筹划
+- 2018年03月开始编码
+- 2018年06月在GitHub开源
+- 2018年06月发布v1.0.0,支持Camden版
+- 2018年06月发布v2.0.0,支持Dalston版
+- 2018年07月发布v3.0.0,支持Edgware版
+- 2018年07月发布v4.0.0,支持Finchley版
+- 2019年04月发布v5.0.0,支持Greenwich版
+- 2020年04月发布v6.0.0,支持Hoxton版
+- 2021年04月完成v7.0.0,支持2020版
+- 2022年04月完成v8.0.0,支持2021版
+- 2023年01月完成v9.0.0,支持2022版
+- 2024年03月完成v10.0.0,支持2023版
+
+### 版本列表
+① 微服务框架版本兼容列表,如下
+
+ 提醒:版本号右边, `↑` 表示>=该版本号, `↓` 表示<=该版本号
+
+| 框架版本 | 框架分支 | 框架状态 | Spring Cloud版本 | Spring Boot版本 | Spring Cloud Alibaba版本 |
+| --- | --- | --- | --- | --- | --- |
+| 10.0.0 商业版 | DiscoveryX/master |  | 2023.x.x | 3.2.x | 2023.x.x.x |
+| 9.0.0 商业版 | DiscoveryX/9.x.x |  | 2022.x.x | 3.1.x 3.0.x | 2022.x.x.x |
+| 8.0.0 商业版 | DiscoveryX/8.x.x |  | 2021.x.x | 2.7.x 2.6.x | 2021.x.x.x |
+| 7.0.0 商业版 | DiscoveryX/7.x.x |  | 2020.x.x | 2.5.x 2.4.1 `↑` | 2021.x |
+| 6.23.0 | Discovery/6.x.x |  | Hoxton.SR5 `↑` Hoxton Greenwich Finchley | 2.3.x.RELEASE 2.2.x.RELEASE 2.1.x.RELEASE 2.0.x.RELEASE | 2.2.7.RELEASE `↑` |
+| 6.12.13 `↓` | Discovery/6.x.x |  | Hoxton.SR5 `↑` Hoxton Greenwich Finchley | 2.3.x.RELEASE 2.2.x.RELEASE 2.1.x.RELEASE 2.0.x.RELEASE | 2.2.6.RELEASE `↓` 2.1.x.RELEASE 2.0.x.RELEASE |
+| ~~5.6.0~~ | ~~Discovery/5.x.x~~ |  | Greenwich | 2.1.x.RELEASE | 2.1.x.RELEASE |
+| ~~4.15.0~~ | ~~Discovery/4.x.x~~ |  | Finchley | 2.0.x.RELEASE | 2.0.x.RELEASE |
+| 3.41.0 | Discovery/3.x.x |  | Edgware | 1.5.x.RELEASE | 1.5.x.RELEASE |
+| ~~2.0.x~~ | ~~Discovery/2.x.x~~ |  | Dalston | 1.x.x.RELEASE | 1.5.x.RELEASE |
+| ~~1.0.x~~ | ~~Discovery/1.x.x~~ |  | Camden | 1.x.x.RELEASE | 1.5.x.RELEASE |
+
+ 表示维护中 |  表示不维护,但可用,强烈建议升级 |  表示不维护,不可用,已废弃
+
+- 10.x.x版本(适用于2023.x.x)将继续维护
+- 9.x.x版本(适用于2022.x.x)将继续维护
+- 8.x.x版本(适用于2021.x.x)将继续维护
+- 7.x.x版本(适用于2020.x.x)将继续维护
+- 6.x.x版本(同时适用于Finchley、Greenwich和Hoxton)将继续维护
+- 5.x.x版本(适用于Greenwich)已废弃
+- 4.x.x版本(适用于Finchley)已废弃
+- 3.x.x版本(适用于Edgware)不维护,但可用,强烈建议升级
+- 2.x.x版本(适用于Dalston)已废弃
+- 1.x.x版本(适用于Camden)已废弃
+
+② 相关中间件版本列表,如下
+
+| 组件类型 | 组件版本 |
| --- | --- |
-| Spring Boot预热启动 | 2秒 |
-| Discovery Plugin预热启动 | 2秒 |
-| Spring上下文扫描加载 | 2秒 |
-| RestController和Swagger扫描加载 | 1秒 |
-| determine local hostname | 1.5秒 |
-| 连本地配置中心,并打印本地规则和远程规则 | 1.5秒 |
-| Actuator Endpoint扫描加载 | 1秒 |
-| 连本地服务注册中心,并启动结束 | 2秒 |
+| 基础组件 | [](https://search.maven.org/artifact/com.google.guava/guava) [](https://search.maven.org/artifact/com.github.ben-manes.caffeine/caffeine) [](https://search.maven.org/artifact/org.redisson/redisson-spring-boot-starter) [](https://search.maven.org/artifact/org.dom4j/dom4j) [](https://search.maven.org/artifact/io.swagger/swagger-models) [](https://search.maven.org/artifact/io.springfox/springfox-swagger2) |
+| 注册配置组件 | [](https://search.maven.org/artifact/com.ctrip.framework.apollo/apollo-client) [](https://search.maven.org/artifact/org.apache.curator/curator-framework) [](https://search.maven.org/artifact/com.ecwid.consul/consul-api) [](https://search.maven.org/artifact/io.etcd/jetcd-core) [](https://search.maven.org/artifact/com.alibaba.nacos/nacos-client) [](https://search.maven.org/artifact/com.netflix.eureka/eureka-client) [](https://search.maven.org/artifact/org.springframework.data/spring-data-redis) [](https://search.maven.org/artifact/org.redisson/redisson-spring-boot-starter) |
+| 防护组件 | [](https://search.maven.org/artifact/com.alibaba.csp/sentinel-core) [](https://search.maven.org/artifact/com.netflix.hystrix/hystrix-core) |
+| 监控组件 | [](https://search.maven.org/artifact/org.apache.skywalking/apm-toolkit-opentracing) [](https://search.maven.org/artifact/io.opentelemetry/opentelemetry-api) [](https://search.maven.org/artifact/io.opentracing/opentracing-api) [](https://search.maven.org/artifact/io.opentracing.contrib/opentracing-spring-cloud-starter) [](https://search.maven.org/artifact/io.opentracing.contrib/opentracing-spring-jaeger-starter) [](https://search.maven.org/artifact/io.opentracing.contrib/opentracing-concurrent) [](https://search.maven.org/artifact/de.codecentric/spring-boot-admin-dependencies) |
+| Spring组件 | [](https://search.maven.org/artifact/com.alibaba.spring/spring-context-support) [](https://search.maven.org/artifact/org.springframework.cloud/spring-cloud-dependencies) [](https://search.maven.org/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies) [](https://search.maven.org/artifact/org.springframework.boot/spring-boot-dependencies) |
+
+### 企业用户
+不完全统计,目前社区开源项目(包括本框架以及关联框架或组件)已经被如下公司使用或者调研
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+为提供更好的专业级服务,请更多已经使用本框架的公司和企业联系我,并希望在[Github Issues](https://github.com/Nepxion/Discovery/issues/56)上登记
+
+### 落地案例
+① 某大型银行信用卡新核心系统在生产环境接入Nepxion Discovery框架的服务实例数(包括异地双活,同城双活,多机房全部汇总)将近10000个
+
+② 某大型互联网教育公司在生产环境接入Nepxion Discovery框架的服务实例数截至到2021年2月已达到2600多个,基本接入完毕
+
+
+
+- [企业级落地:阿里巴巴 Nacos 企业级落地上篇](https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247490123&idx=1&sn=10d7cd89bf43f07152513718c08dd80c&chksm=fdeb282bca9ca13d2ffb2128c2b5e1acfa5743c0cf835e266835cd5e0233bef5adbca896c8bd&mpshare=1&scene=1&srcid=0724z4xF3FAu0ky75IQ5kexf&sharer_sharetime=1595589366762&sharer_shareid=45ec30ab664def961bd5a4f87aafb0f2&key=ef51a5b0b69d9d3093d17fcab26ddf2c201b696670a1736109d481338e2a980b0c9a82df17369c8796381093f405f0a7cb21c9e467871948960c8890753de7c3f0346a03314d993c33e16817f805c42e&ascene=1&uin=MjczOTY4MzIw&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=AfxA6ifl0AcuT4OYhZcXm7k%3D&pass_ticket=c2pshxbFqNmjiwpp%2FUl%2FCP77XI63HuMtvWrO9d2Egrv7y16EseCu1CRLBih3O2MM)
+- [企业级落地:阿里巴巴 Nacos 企业级落地中篇](https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247490179&idx=2&sn=6d14417c9770729c89e0ace90f689338&chksm=fdeb28e3ca9ca1f53495cbfeba4bcc0692ff802c034f2e4290f37735428ac0138be050638d46&mpshare=1&scene=1&srcid=0730GwwgWoI8MciSSaATpowp&sharer_sharetime=1596108490727&sharer_shareid=45ec30ab664def961bd5a4f87aafb0f2&key=56c1a4d5743468c93969185004d8e48519dcd2f967bba6978f4e1be13ce7b50d42a51670394473104091352b0fd51e8baed4a72591c511a123166888fd1ff6cc5d54a9326947ef8ebec5f813817669ee&ascene=1&uin=MjczOTY4MzIw&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=Ade%2FPtqCCcfAHZQ%2F3vyVCuI%3D&pass_ticket=JDwi8tQ2jPpAhhIOjlvLIetXOdV%2FpqfV3xJ%2B0vfu4O2n10K5qhVh8aZz8bjlwA%2B8)
+- [企业级落地:阿里巴巴 Nacos 企业级落地下篇](https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247490231&idx=2&sn=d77c78dfaa244c8c2d95c70fdfa5638a&chksm=fdeb28d7ca9ca1c144bd38e8622af472dbbb7bbe328dcabeddac757130431d354cc75f788196&mpshare=1&scene=1&srcid=0806bN7XW61MNRzsq6IFoZbr&sharer_sharetime=1596716100660&sharer_shareid=45ec30ab664def961bd5a4f87aafb0f2&key=9255e861c291e6d5033faa3da87c4e627d0272caaf2dbd7f01f573ad886ede89da90cff052cb800b029ebfbbe146348d65533fc11db0256cdcaa17edb0752b46d61deb6de3f883413e9fa4e8394f3544&ascene=1&uin=MjczOTY4MzIw&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=AZqS6bHMqvgI%2B36YHV%2FRudU%3D&pass_ticket=0wm6xz%2FLhV%2FSxdCvwyJulMHDWW60%2BLZb6hInajgK9oW%2FE9IOemST8NPOOc4mEX7s)
+- [企业级落地:全链路蓝绿灰度发布智能化实践](https://mp.weixin.qq.com/s?__biz=MzU1NTgxNDM0Nw==&mid=2247484172&idx=1&sn=41ba2fed39d468f7ee4913e9c305f1b3&chksm=fbcfdfa8ccb856be2280e9484e5e5c091645f98b78dd36e4caf9e3c580a58654d3057e0b4ab0&mpshare=1&scene=1&srcid=04239tBo6ikZqGBMEJwg0h57&sharer_sharetime=1591065506571&sharer_shareid=45ec30ab664def961bd5a4f87aafb0f2&key=1712c1d3e731e2888f16059008c5350eadd5f936fdb5e86d01f61ebf46041db0dbe926e940ae2fa24731e4e0a27412840aaed72f2159f6aaddf87489b5e7a181fe77b4962c39b5a5565dd4c93773b8ad&ascene=1&uin=MjczOTY4MzIw&devicetype=Windows+10+x64&version=62090070&lang=zh_CN&exportkey=AZwuvPfR%2BRhkKms5F7xjmXY%3D&pass_ticket=MQsjBxWL55r6TkZZPKDk9MzUlNhSMI7BVZtQPMwSXWNJ8YsqsiWz41EqXEfYqTUD)
+
+### 郑重致谢
+- 感谢阿里巴巴中间件Nacos、Sentinel和Spring Cloud Alibaba团队,尤其是Nacos负责人@彦林、@于怀,Sentinel负责人@宿何、@子衿,Spring Cloud Alibaba负责人@铖朴、@良名、@小马哥、@洛夜、@亦盏的技术支持
+- 感谢携程Apollo团队,尤其是@宋顺的技术支持
+- 感谢所有Committers和Contributors
+- 感谢所有帮忙分析和定位问题的同学
+- 感谢所有提出宝贵建议和意见的同学
+- 感谢支持和使用本框架的公司和企业
+
+### 请联系我
+微信、钉钉、公众号和文档
+
+
## Star走势图
-
[](https://starchart.cc/Nepxion/Discovery)
\ No newline at end of file
diff --git a/deploy.bat b/deploy.bat
index b3d1147aab..483a32b4d6 100644
--- a/deploy.bat
+++ b/deploy.bat
@@ -15,6 +15,6 @@
@title Nepxion Discovery
@color 0a
-call mvn clean deploy -DskipTests -e -P release -pl discovery-plugin-starter-eureka,discovery-plugin-starter-consul,discovery-plugin-starter-zookeeper,discovery-plugin-starter-nacos,discovery-plugin-config-center-starter-apollo,discovery-plugin-config-center-starter-nacos,discovery-plugin-config-center-starter-redis,discovery-console-starter-apollo,discovery-console-starter-nacos,discovery-console-starter-redis,discovery-plugin-strategy-starter-service,discovery-plugin-strategy-starter-zuul,discovery-plugin-strategy-starter-gateway,discovery-plugin-strategy-starter-hystrix -am
+call mvn clean deploy -DskipTests -e -P release -pl discovery-plugin-register-center/discovery-plugin-register-center-starter-eureka,discovery-plugin-register-center/discovery-plugin-register-center-starter-consul,discovery-plugin-register-center/discovery-plugin-register-center-starter-zookeeper,discovery-plugin-register-center/discovery-plugin-register-center-starter-nacos,discovery-plugin-config-center/discovery-plugin-config-center-starter-apollo,discovery-plugin-config-center/discovery-plugin-config-center-starter-nacos,discovery-plugin-config-center/discovery-plugin-config-center-starter-redis,discovery-plugin-config-center/discovery-plugin-config-center-starter-zookeeper,discovery-plugin-config-center/discovery-plugin-config-center-starter-consul,discovery-plugin-config-center/discovery-plugin-config-center-starter-etcd,discovery-console/discovery-console-starter-apollo,discovery-console/discovery-console-starter-nacos,discovery-console/discovery-console-starter-redis,discovery-console/discovery-console-starter-zookeeper,discovery-console/discovery-console-starter-consul,discovery-console/discovery-console-starter-etcd,discovery-plugin-admin-center/discovery-plugin-admin-center-starter,discovery-plugin-admin-center/discovery-plugin-admin-center-starter-swagger,discovery-plugin-strategy/discovery-plugin-strategy-starter-service,discovery-plugin-strategy/discovery-plugin-strategy-starter-zuul,discovery-plugin-strategy/discovery-plugin-strategy-starter-gateway,discovery-plugin-strategy/discovery-plugin-strategy-starter-hystrix,discovery-plugin-strategy/discovery-plugin-strategy-starter-opentelemetry,discovery-plugin-strategy/discovery-plugin-strategy-starter-opentracing,discovery-plugin-strategy/discovery-plugin-strategy-starter-skywalking,discovery-plugin-strategy/discovery-plugin-strategy-starter-sentinel-datasource,discovery-plugin-strategy/discovery-plugin-strategy-starter-sentinel-limiter,discovery-plugin-strategy/discovery-plugin-strategy-starter-sentinel-opentelemetry,discovery-plugin-strategy/discovery-plugin-strategy-starter-sentinel-opentracing,discovery-plugin-strategy/discovery-plugin-strategy-starter-sentinel-skywalking,discovery-plugin-strategy/discovery-plugin-strategy-starter-sentinel-micrometer,discovery-plugin-test/discovery-plugin-test-starter-automation -am
pause
\ No newline at end of file
diff --git a/discovery-common-apollo/pom.xml b/discovery-common-apollo/pom.xml
deleted file mode 100644
index b98448b43e..0000000000
--- a/discovery-common-apollo/pom.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
- discovery-common-apollo
- Nepxion Discovery Common Apollo
- jar
- 4.0.0
- Nepxion Discovery is an enhancement for Spring Cloud Discovery
- http://www.nepxion.com
-
-
- com.nepxion
- discovery
- 5.2.0-SNAPSHOT
-
-
-
-
- com.ctrip.framework.apollo
- apollo-client
-
-
-
- org.apache.commons
- commons-lang3
-
-
-
- org.springframework.boot
- spring-boot-autoconfigure
-
-
-
\ No newline at end of file
diff --git a/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/configuration/ApolloAutoConfiguration.java b/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/configuration/ApolloAutoConfiguration.java
deleted file mode 100644
index c17a6132dd..0000000000
--- a/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/configuration/ApolloAutoConfiguration.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.nepxion.discovery.common.apollo.configuration;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.env.Environment;
-
-import com.ctrip.framework.apollo.Config;
-import com.ctrip.framework.apollo.ConfigService;
-import com.nepxion.discovery.common.apollo.constant.ApolloConstant;
-import com.nepxion.discovery.common.apollo.operation.ApolloOperation;
-
-@Configuration
-public class ApolloAutoConfiguration {
- @Autowired
- private Environment environment;
-
- @Bean
- @ConditionalOnMissingBean
- public Config apolloConfig() {
- String namespace = environment.getProperty(ApolloConstant.APOLLO_PLUGIN_NAMESPACE);
- if (StringUtils.isNotEmpty(namespace)) {
- return ConfigService.getConfig(namespace);
- } else {
- return ConfigService.getAppConfig();
- }
- }
-
- @Bean
- public ApolloOperation apolloOperation() {
- return new ApolloOperation();
- }
-}
\ No newline at end of file
diff --git a/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/constant/ApolloConstant.java b/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/constant/ApolloConstant.java
deleted file mode 100644
index 835aa9a5bf..0000000000
--- a/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/constant/ApolloConstant.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.nepxion.discovery.common.apollo.constant;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import com.ctrip.framework.apollo.core.ConfigConsts;
-
-public class ApolloConstant implements ConfigConsts {
- public static final String TYPE = "Apollo";
- public static final String APOLLO_PLUGIN_NAMESPACE = "apollo.plugin.namespace";
-}
\ No newline at end of file
diff --git a/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloOperation.java b/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloOperation.java
deleted file mode 100644
index f1f1b38cc2..0000000000
--- a/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloOperation.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.nepxion.discovery.common.apollo.operation;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import com.ctrip.framework.apollo.Config;
-import com.ctrip.framework.apollo.ConfigChangeListener;
-import com.ctrip.framework.apollo.model.ConfigChange;
-import com.ctrip.framework.apollo.model.ConfigChangeEvent;
-import com.google.common.collect.Sets;
-
-public class ApolloOperation {
- @Autowired
- private Config apolloConfig;
-
- public String getConfig(String group, String serviceId) {
- return apolloConfig.getProperty(group + "-" + serviceId, null);
- }
-
- public ConfigChangeListener subscribeConfig(String group, String serviceId, ApolloSubscribeCallback subscribeCallback) {
- ConfigChangeListener configListener = new ConfigChangeListener() {
- @Override
- public void onChange(ConfigChangeEvent changeEvent) {
- ConfigChange change = changeEvent.getChange(group + "-" + serviceId);
- String config = change.getNewValue();
- subscribeCallback.callback(config);
- }
- };
-
- apolloConfig.addChangeListener(configListener, Sets.newHashSet(group + "-" + serviceId));
-
- return configListener;
- }
-
- public void unsubscribeConfig(String group, String serviceId, ConfigChangeListener configListener) {
- apolloConfig.removeChangeListener(configListener);
- }
-}
\ No newline at end of file
diff --git a/discovery-common-nacos/pom.xml b/discovery-common-nacos/pom.xml
deleted file mode 100644
index 05011c3475..0000000000
--- a/discovery-common-nacos/pom.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
- discovery-common-nacos
- Nepxion Discovery Common Nacos
- jar
- 4.0.0
- Nepxion Discovery is an enhancement for Spring Cloud Discovery
- http://www.nepxion.com
-
-
- com.nepxion
- discovery
- 5.2.0-SNAPSHOT
-
-
-
-
- com.alibaba.nacos
- nacos-client
-
-
-
- org.springframework.boot
- spring-boot-autoconfigure
-
-
-
\ No newline at end of file
diff --git a/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/configuration/NacosAutoConfiguration.java b/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/configuration/NacosAutoConfiguration.java
deleted file mode 100644
index d27066b279..0000000000
--- a/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/configuration/NacosAutoConfiguration.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.nepxion.discovery.common.nacos.configuration;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.util.Properties;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.env.Environment;
-
-import com.alibaba.nacos.api.NacosFactory;
-import com.alibaba.nacos.api.config.ConfigService;
-import com.alibaba.nacos.api.exception.NacosException;
-import com.nepxion.discovery.common.nacos.constant.NacosConstant;
-import com.nepxion.discovery.common.nacos.operation.NacosOperation;
-
-@Configuration
-public class NacosAutoConfiguration {
- @Autowired
- private Environment environment;
-
- @Bean
- @ConditionalOnMissingBean
- public ConfigService nacosConfigService() throws NacosException {
- Properties properties = new Properties();
-
- String serverAddr = environment.getProperty(NacosConstant.NACOS_SERVER_ADDR);
- if (StringUtils.isNotEmpty(serverAddr)) {
- properties.put(NacosConstant.SERVER_ADDR, serverAddr);
- } else {
- throw new IllegalArgumentException(NacosConstant.NACOS_SERVER_ADDR + " can't be null or empty");
- }
-
- String accessKey = environment.getProperty(NacosConstant.NACOS_ACCESS_KEY);
- if (StringUtils.isNotEmpty(accessKey)) {
- properties.put(NacosConstant.ACCESS_KEY, accessKey);
- }
-
- String secretKey = environment.getProperty(NacosConstant.NACOS_SECRET_KEY);
- if (StringUtils.isNotEmpty(secretKey)) {
- properties.put(NacosConstant.SECRET_KEY, secretKey);
- }
-
- String namespace = environment.getProperty(NacosConstant.NACOS_PLUGIN_NAMESPACE);
- if (StringUtils.isNotEmpty(namespace)) {
- properties.put(NacosConstant.NAMESPACE, namespace);
- }
-
- String clusterName = environment.getProperty(NacosConstant.NACOS_PLUGIN_CLUSTER_NAME);
- if (StringUtils.isNotEmpty(clusterName)) {
- properties.put(NacosConstant.CLUSTER_NAME, clusterName);
- }
-
- String contextPath = environment.getProperty(NacosConstant.NACOS_PLUGIN_CONTEXT_PATH);
- if (StringUtils.isNotEmpty(contextPath)) {
- properties.put(NacosConstant.CONTEXT_PATH, contextPath);
- }
-
- String endpoint = environment.getProperty(NacosConstant.NACOS_PLUGIN_ENDPOINT);
- if (StringUtils.isNotEmpty(endpoint)) {
- properties.put(NacosConstant.ENDPOINT, endpoint);
- }
-
- String endpointPort = environment.getProperty(NacosConstant.NACOS_PLUGIN_ENDPOINT_PORT);
- if (StringUtils.isNotEmpty(endpointPort)) {
- properties.put(NacosConstant.ENDPOINT_PORT, endpointPort);
- }
-
- String isUseEndpointParsingRule = environment.getProperty(NacosConstant.NACOS_PLUGIN_IS_USE_ENDPOINT_PARSING_RULE);
- if (StringUtils.isNotEmpty(isUseEndpointParsingRule)) {
- properties.put(NacosConstant.IS_USE_ENDPOINT_PARSING_RULE, isUseEndpointParsingRule);
- }
-
- String encode = environment.getProperty(NacosConstant.NACOS_PLUGIN_ENCODE);
- if (StringUtils.isNotEmpty(encode)) {
- properties.put(NacosConstant.ENCODE, encode);
- }
-
- String namingLoadCacheAtStart = environment.getProperty(NacosConstant.NACOS_PLUGIN_NAMING_LOAD_CACHE_AT_START);
- if (StringUtils.isNotEmpty(namingLoadCacheAtStart)) {
- properties.put(NacosConstant.NAMING_LOAD_CACHE_AT_START, namingLoadCacheAtStart);
- }
-
- String namingClientBeatThreadCount = environment.getProperty(NacosConstant.NACOS_PLUGIN_NAMING_CLIENT_BEAT_THREAD_COUNT);
- if (StringUtils.isNotEmpty(namingClientBeatThreadCount)) {
- properties.put(NacosConstant.NAMING_CLIENT_BEAT_THREAD_COUNT, namingClientBeatThreadCount);
- }
-
- String namingPollingThreadCount = environment.getProperty(NacosConstant.NACOS_PLUGIN_NAMING_POLLING_THREAD_COUNT);
- if (StringUtils.isNotEmpty(namingPollingThreadCount)) {
- properties.put(NacosConstant.NAMING_POLLING_THREAD_COUNT, namingPollingThreadCount);
- }
-
- String ramRoleName = environment.getProperty(NacosConstant.NACOS_PLUGIN_RAM_ROLE_NAME);
- if (StringUtils.isNotEmpty(ramRoleName)) {
- properties.put(NacosConstant.RAM_ROLE_NAME, ramRoleName);
- }
-
- return NacosFactory.createConfigService(properties);
- }
-
- @Bean
- public NacosOperation nacosOperation() {
- return new NacosOperation();
- }
-}
\ No newline at end of file
diff --git a/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/constant/NacosConstant.java b/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/constant/NacosConstant.java
deleted file mode 100644
index aa639a2b12..0000000000
--- a/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/constant/NacosConstant.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.nepxion.discovery.common.nacos.constant;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import com.alibaba.nacos.api.PropertyKeyConst;
-
-public class NacosConstant extends PropertyKeyConst {
- public static final String TYPE = "Nacos";
- public static final String NACOS_SERVER_ADDR = "nacos.server-addr";
- public static final String NACOS_ACCESS_KEY = "nacos.access-key";
- public static final String NACOS_SECRET_KEY = "nacos.secret-key";
- public static final String NACOS_PLUGIN_NAMESPACE = "nacos.plugin.namespace";
- public static final String NACOS_PLUGIN_CLUSTER_NAME = "nacos.plugin.cluster-name";
- public static final String NACOS_PLUGIN_CONTEXT_PATH = "nacos.plugin.context-path";
- public static final String NACOS_PLUGIN_CONFIG_LONG_POLL_TIMEOUT = "nacos.plugin.config-long-poll-timeout";
- public static final String NACOS_PLUGIN_CONFIG_RETRY_TIME = "nacos.plugin.config-retry-time";
- public static final String NACOS_PLUGIN_MAX_RETRY = "nacos.plugin.max-retry";
- public static final String NACOS_PLUGIN_ENDPOINT = "nacos.plugin.endpoint";
- public static final String NACOS_PLUGIN_ENDPOINT_PORT = "nacos.plugin.endpoint-port";
- public static final String NACOS_PLUGIN_IS_USE_ENDPOINT_PARSING_RULE = "nacos.plugin.is-use-endpoint-parsing-rule";
- public static final String NACOS_PLUGIN_IS_USE_CLOUD_NAMESPACE_PARSING = "nacos.plugin.is-use-cloud-namespace-parsing";
- public static final String NACOS_PLUGIN_ENCODE = "nacos.plugin.encode";
- public static final String NACOS_PLUGIN_NAMING_LOAD_CACHE_AT_START = "nacos.plugin.naming-load-cache-at-start";
- public static final String NACOS_PLUGIN_NAMING_CLIENT_BEAT_THREAD_COUNT = "nacos.plugin.naming-client-beat-thread-count";
- public static final String NACOS_PLUGIN_NAMING_POLLING_THREAD_COUNT = "nacos.plugin.naming-polling-thread-count";
- public static final String NACOS_PLUGIN_RAM_ROLE_NAME = "nacos.plugin.ram-role-name";
- public static final String NACOS_PLUGIN_ENABLE_REMOTE_CONFIG_SYNC = "nacos.plugin.enable-remote-config-sync";
- public static final String NACOS_PLUGIN_TIMEOUT = "nacos.plugin.timout";
-
- public static final long DEFAULT_TIMEOUT = 30000;
-}
\ No newline at end of file
diff --git a/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosOperation.java b/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosOperation.java
deleted file mode 100644
index 172f8b4a26..0000000000
--- a/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosOperation.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.nepxion.discovery.common.nacos.operation;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.util.concurrent.Executor;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-
-import com.alibaba.nacos.api.config.ConfigService;
-import com.alibaba.nacos.api.config.listener.Listener;
-import com.alibaba.nacos.api.exception.NacosException;
-import com.nepxion.discovery.common.nacos.constant.NacosConstant;
-
-public class NacosOperation {
- @Autowired
- private ConfigService nacosConfigService;
-
- @Autowired
- private Environment environment;
-
- public String getConfig(String group, String serviceId) throws NacosException {
- long timeout = environment.getProperty(NacosConstant.NACOS_PLUGIN_TIMEOUT, Long.class, NacosConstant.DEFAULT_TIMEOUT);
-
- return nacosConfigService.getConfig(serviceId, group, timeout);
- }
-
- public boolean removeConfig(String group, String serviceId) throws NacosException {
- return nacosConfigService.removeConfig(serviceId, group);
- }
-
- public boolean publishConfig(String group, String serviceId, String config) throws NacosException {
- return nacosConfigService.publishConfig(serviceId, group, config);
- }
-
- public Listener subscribeConfig(String group, String serviceId, Executor executor, NacosSubscribeCallback subscribeCallback) throws NacosException {
- Listener configListener = new Listener() {
- @Override
- public void receiveConfigInfo(String config) {
- subscribeCallback.callback(config);
- }
-
- @Override
- public Executor getExecutor() {
- return executor;
- }
- };
-
- nacosConfigService.addListener(serviceId, group, configListener);
-
- return configListener;
- }
-
- public void unsubscribeConfig(String group, String serviceId, Listener configListener) {
- nacosConfigService.removeListener(serviceId, group, configListener);
- }
-}
\ No newline at end of file
diff --git a/discovery-common-redis/pom.xml b/discovery-common-redis/pom.xml
deleted file mode 100644
index 29786ec5a6..0000000000
--- a/discovery-common-redis/pom.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
- discovery-common-redis
- Nepxion Discovery Common Redis
- jar
- 4.0.0
- Nepxion Discovery is an enhancement for Spring Cloud Discovery
- http://www.nepxion.com
-
-
- com.nepxion
- discovery
- 5.2.0-SNAPSHOT
-
-
-
-
- org.apache.commons
- commons-lang3
-
-
-
- org.springframework.boot
- spring-boot-starter-data-redis
-
-
-
\ No newline at end of file
diff --git a/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/configuration/RedisAutoConfiguration.java b/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/configuration/RedisAutoConfiguration.java
deleted file mode 100644
index 33aa38043d..0000000000
--- a/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/configuration/RedisAutoConfiguration.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.nepxion.discovery.common.redis.configuration;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @author JiKai Sun
- * @version 1.0
- */
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.core.HashOperations;
-import org.springframework.data.redis.core.StringRedisTemplate;
-
-import com.nepxion.discovery.common.redis.operation.RedisOperation;
-
-@Configuration
-public class RedisAutoConfiguration {
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- @Bean
- public HashOperations hashOperations() {
- return stringRedisTemplate.opsForHash();
- }
-
- @Bean
- public RedisOperation redisOperation() {
- return new RedisOperation();
- }
-}
\ No newline at end of file
diff --git a/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisOperation.java b/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisOperation.java
deleted file mode 100644
index 4ec1487761..0000000000
--- a/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisOperation.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.nepxion.discovery.common.redis.operation;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @author JiKai Sun
- * @version 1.0
- */
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.HashOperations;
-import org.springframework.data.redis.core.StringRedisTemplate;
-
-public class RedisOperation {
- @Autowired
- private StringRedisTemplate stringRedisTemplate;
-
- @Autowired
- private HashOperations hashOperations;
-
- public String getConfig(String group, String serviceId) {
- return hashOperations.get(group, serviceId);
- }
-
- public boolean removeConfig(String group, String serviceId) {
- publishConfig(group, serviceId, StringUtils.EMPTY);
-
- return hashOperations.delete(group, serviceId) == 1;
- }
-
- public boolean publishConfig(String group, String serviceId, String config) {
- hashOperations.put(group, serviceId, config);
- stringRedisTemplate.convertAndSend(group + "-" + serviceId, config);
-
- return true;
- }
-
- public void subscribeConfig(String config, RedisSubscribeCallback redisSubscribeCallback) {
- redisSubscribeCallback.callback(config);
- }
-}
\ No newline at end of file
diff --git a/discovery-common/pom.xml b/discovery-common/pom.xml
deleted file mode 100644
index 4cf0a642d6..0000000000
--- a/discovery-common/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
- discovery-common
- Nepxion Discovery Common
- jar
- 4.0.0
- Nepxion Discovery is an enhancement for Spring Cloud Discovery
- http://www.nepxion.com
-
-
- com.nepxion
- discovery
- 5.2.0-SNAPSHOT
-
-
-
-
- org.apache.commons
- commons-lang3
-
-
-
- org.apache.commons
- commons-collections4
-
-
-
- commons-io
- commons-io
-
-
-
- org.springframework
- spring-web
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
-
-
-
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java b/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java
deleted file mode 100644
index a94cece31d..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.nepxion.discovery.common.constant;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-public class DiscoveryConstant {
- public static final String DISCOVERY_VERSION = "5.2.0-SNAPSHOT";
-
- public static final String SPRING_APPLICATION_DISCOVERY_PLUGIN = "spring.application.discovery.plugin";
- public static final String SPRING_APPLICATION_DISCOVERY_VERSION = "spring.application.discovery.version";
- public static final String SPRING_APPLICATION_REGISTER_CONTROL_ENABLED = "spring.application.register.control.enabled";
- public static final String SPRING_APPLICATION_DISCOVERY_CONTROL_ENABLED = "spring.application.discovery.control.enabled";
- public static final String SPRING_APPLICATION_CONFIG_REST_CONTROL_ENABLED = "spring.application.config.rest.control.enabled";
- public static final String SPRING_APPLICATION_SERVLET_WEB_SERVER_ENABLED = "spring.application.servlet.web.server.enabled";
- public static final String SPRING_APPLICATION_REACTIVE_WEB_SERVER_ENABLED = "spring.application.reactive.web.server.enabled";
- public static final String SPRING_APPLICATION_CONFIG_FORMAT = "spring.application.config.format";
- public static final String SPRING_APPLICATION_CONFIG_PATH = "spring.application.config.path";
- public static final String SPRING_APPLICATION_GROUP_KEY = "spring.application.group.key";
- public static final String SPRING_APPLICATION_CONTEXT_PATH = "spring.application.context-path";
- public static final String SPRING_APPLICATION_NO_SERVER_FOUND_NOTIFICATION_ENABLED = "spring.application.no.server.found.notification.enabled";
-
- public static final String CONTEXT_PATH = "server.servlet.context-path";
-
- public static final String ANNOTATION_CONFIG_SERVLET_WEB_SERVER_APPLICATION_CONTEXT = "AnnotationConfigServletWebServerApplicationContext";
- public static final String ANNOTATION_CONFIG_REACTIVE_WEB_SERVER_APPLICATION_CONTEXT = "AnnotationConfigReactiveWebServerApplicationContext";
-
- public static final String SPRING_APPLICATION_NAME = "spring.application.name";
- public static final String SPRING_APPLICATION_TYPE = "spring.application.type";
- public static final String GROUP = "group";
- public static final String SERVICE_ID = "serviceId";
- public static final String HOST = "host";
- public static final String PORT = "port";
- public static final String METADATA = "metadata";
-
- public static final String SERVICE_TYPE = "service";
- public static final String GATEWAY_TYPE = "gateway";
-
- public static final String DYNAMIC_VERSION = "dynamicVersion";
- public static final String RULE = "rule";
- public static final String DYNAMIC_RULE = "dynamicRule";
- public static final String REACH_MAX_LIMITED_COUNT = "reach max limited count";
- public static final String REGISTER_ISOLATION = "register isolation";
-
- public static final String VERSION = "version";
- public static final String REGION = "region";
- public static final String ADDRESS = "address";
- public static final String VERSION_WEIGHT = "version-weight";
- public static final String REGION_WEIGHT = "region-weight";
-
- public static final String N_D_PREFIX = "n-d-";
- public static final String N_D_SERVICE_PREFIX = "n-d-service";
-
- public static final String N_D_SERVICE_TYPE = "n-d-service-type";
- public static final String N_D_SERVICE_ID = "n-d-service-id";
- public static final String N_D_SERVICE_ADDRESS = "n-d-service-address";
- public static final String N_D_SERVICE_GROUP = "n-d-service-group";
- public static final String N_D_SERVICE_VERSION = "n-d-service-version";
- public static final String N_D_SERVICE_REGION = "n-d-service-region";
-
- public static final String N_D_VERSION = "n-d-version";
- public static final String N_D_REGION = "n-d-region";
- public static final String N_D_ADDRESS = "n-d-address";
- public static final String N_D_VERSION_WEIGHT = "n-d-version-weight";
- public static final String N_D_REGION_WEIGHT = "n-d-region-weight";
-
- public static final String XML_FORMAT = "xml";
- public static final String JSON_FORMAT = "json";
- public static final String PREFIX_CLASSPATH = "classpath:";
- public static final String PREFIX_FILE = "file:";
-
- public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
- public static final String ENCODING_UTF_8 = "UTF-8";
- public static final String SEPARATE = ";";
- public static final String EQUALS = "=";
- public static final String DASH = "-";
-
- public static final String ASYNC = "async";
- public static final String SYNC = "sync";
- public static final String GLOBAL = "global";
- public static final String PARTIAL = "partial";
- public static final String OK = "OK";
- public static final String NO = "NO";
- public static final String UNKNOWN = "UNKNOWN";
- public static final String EXT = "ext";
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/CustomizationEntity.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/CustomizationEntity.java
deleted file mode 100644
index 54fd911639..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/CustomizationEntity.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.io.Serializable;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-public class CustomizationEntity implements Serializable {
- private static final long serialVersionUID = -5135099669922746855L;
-
- private Map> customizationMap = new LinkedHashMap>();
-
- public Map> getCustomizationMap() {
- return customizationMap;
- }
-
- public void setCustomizationMap(Map> customizationMap) {
- this.customizationMap = customizationMap;
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
-
- @Override
- public boolean equals(Object object) {
- return EqualsBuilder.reflectionEquals(this, object);
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterType.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterType.java
deleted file mode 100644
index fe7db208ae..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterType.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-public enum FilterType {
- BLACKLIST("blacklist", "blacklist"),
- WHITELIST("whitelist", "whitelist");
-
- private String value;
- private String description;
-
- private FilterType(String value, String description) {
- this.value = value;
- this.description = description;
- }
-
- public String getValue() {
- return value;
- }
-
- public String getDescription() {
- return description;
- }
-
- public static FilterType fromString(String value) {
- for (FilterType type : FilterType.values()) {
- if (type.getValue().equalsIgnoreCase(value)) {
- return type;
- }
- }
-
- throw new IllegalArgumentException("No matched type with value=" + value);
- }
-
- @Override
- public String toString() {
- return value;
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java
deleted file mode 100644
index 61c88f1518..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.io.Serializable;
-import java.util.Map;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-public class InstanceEntity implements Serializable {
- private static final long serialVersionUID = -3001191508072178378L;
-
- private String serviceType;
- private String serviceId;
- private String version;
- private String region;
- private String host;
- private int port;
- private Map metadata;
-
- public String getServiceType() {
- return serviceType;
- }
-
- public void setServiceType(String serviceType) {
- this.serviceType = serviceType;
- }
-
- public String getServiceId() {
- return serviceId;
- }
-
- public void setServiceId(String serviceId) {
- this.serviceId = serviceId;
- }
-
- public String getVersion() {
- return version;
- }
-
- public void setVersion(String version) {
- this.version = version;
- }
-
- public String getRegion() {
- return region;
- }
-
- public void setRegion(String region) {
- this.region = region;
- }
-
- public String getHost() {
- return host;
- }
-
- public void setHost(String host) {
- this.host = host;
- }
-
- public int getPort() {
- return port;
- }
-
- public void setPort(int port) {
- this.port = port;
- }
-
- public Map getMetadata() {
- return metadata;
- }
-
- public void setMetadata(Map metadata) {
- this.metadata = metadata;
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
-
- @Override
- public boolean equals(Object object) {
- return EqualsBuilder.reflectionEquals(this, object);
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntityWrapper.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntityWrapper.java
deleted file mode 100644
index c798717f7a..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntityWrapper.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.util.Map;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.nepxion.discovery.common.constant.DiscoveryConstant;
-
-public class InstanceEntityWrapper {
- public static String getContextPath(InstanceEntity instanceEntity) {
- Map metadata = instanceEntity.getMetadata();
-
- return metadata.get(DiscoveryConstant.SPRING_APPLICATION_CONTEXT_PATH);
- }
-
- public static String getGroup(InstanceEntity instanceEntity) {
- Map metadata = instanceEntity.getMetadata();
- String groupKey = metadata.get(DiscoveryConstant.SPRING_APPLICATION_GROUP_KEY);
- if (StringUtils.isEmpty(groupKey)) {
- return StringUtils.EMPTY;
- }
-
- String filter = metadata.get(groupKey);
- if (filter == null) {
- return StringUtils.EMPTY;
- }
-
- return filter;
- }
-
- public static String getPlugin(InstanceEntity instanceEntity) {
- Map metadata = instanceEntity.getMetadata();
- String plugin = metadata.get(DiscoveryConstant.SPRING_APPLICATION_DISCOVERY_PLUGIN);
- if (plugin == null) {
- return StringUtils.EMPTY;
- }
-
- return plugin;
- }
-
- public static boolean isRegisterControlEnabled(InstanceEntity instanceEntity) {
- Map metadata = instanceEntity.getMetadata();
- String flag = metadata.get(DiscoveryConstant.SPRING_APPLICATION_REGISTER_CONTROL_ENABLED);
- if (flag == null) {
- return true;
- }
-
- return Boolean.valueOf(flag);
- }
-
- public static boolean isDiscoveryControlEnabled(InstanceEntity instanceEntity) {
- Map metadata = instanceEntity.getMetadata();
- String flag = metadata.get(DiscoveryConstant.SPRING_APPLICATION_DISCOVERY_CONTROL_ENABLED);
- if (flag == null) {
- return true;
- }
-
- return Boolean.valueOf(flag);
- }
-
- public static boolean isConfigRestControlEnabled(InstanceEntity instanceEntity) {
- Map metadata = instanceEntity.getMetadata();
- String flag = metadata.get(DiscoveryConstant.SPRING_APPLICATION_CONFIG_REST_CONTROL_ENABLED);
- if (flag == null) {
- return true;
- }
-
- return Boolean.valueOf(flag);
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ResultEntity.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ResultEntity.java
deleted file mode 100644
index d9a55cd98f..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ResultEntity.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.io.Serializable;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-public class ResultEntity implements Serializable {
- private static final long serialVersionUID = -3322655604556025836L;
-
- private String url;
- private String result;
-
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public String getResult() {
- return result;
- }
-
- public void setResult(String result) {
- this.result = result;
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
-
- @Override
- public boolean equals(Object object) {
- return EqualsBuilder.reflectionEquals(this, object);
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntity.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntity.java
deleted file mode 100644
index d6aadceea9..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntity.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.io.Serializable;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-public class RuleEntity implements Serializable {
- private static final long serialVersionUID = 7079024435084528751L;
-
- private RegisterEntity registerEntity;
- private DiscoveryEntity discoveryEntity;
- private StrategyEntity strategyEntity;
- private CustomizationEntity customizationEntity;
- private StrategyCustomizationEntity strategyCustomizationEntity;
- private String content;
-
- public RegisterEntity getRegisterEntity() {
- return registerEntity;
- }
-
- public void setRegisterEntity(RegisterEntity registerEntity) {
- this.registerEntity = registerEntity;
- }
-
- public DiscoveryEntity getDiscoveryEntity() {
- return discoveryEntity;
- }
-
- public void setDiscoveryEntity(DiscoveryEntity discoveryEntity) {
- this.discoveryEntity = discoveryEntity;
- }
-
- public CustomizationEntity getCustomizationEntity() {
- return customizationEntity;
- }
-
- public void setCustomizationEntity(CustomizationEntity customizationEntity) {
- this.customizationEntity = customizationEntity;
- }
-
- public StrategyEntity getStrategyEntity() {
- return strategyEntity;
- }
-
- public void setStrategyEntity(StrategyEntity strategyEntity) {
- this.strategyEntity = strategyEntity;
- }
-
- public StrategyCustomizationEntity getStrategyCustomizationEntity() {
- return strategyCustomizationEntity;
- }
-
- public void setStrategyCustomizationEntity(StrategyCustomizationEntity strategyCustomizationEntity) {
- this.strategyCustomizationEntity = strategyCustomizationEntity;
- }
-
- public String getContent() {
- return content;
- }
-
- public void setContent(String content) {
- this.content = content;
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
-
- @Override
- public boolean equals(Object object) {
- return EqualsBuilder.reflectionEquals(this, object);
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ServiceType.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ServiceType.java
deleted file mode 100644
index 61a695ac0a..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ServiceType.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import com.nepxion.discovery.common.constant.DiscoveryConstant;
-
-public enum ServiceType {
- SERVICE(DiscoveryConstant.SERVICE_TYPE, DiscoveryConstant.SERVICE_TYPE),
- GATEWAY(DiscoveryConstant.GATEWAY_TYPE, DiscoveryConstant.GATEWAY_TYPE);
-
- private String value;
- private String description;
-
- private ServiceType(String value, String description) {
- this.value = value;
- this.description = description;
- }
-
- public String getValue() {
- return value;
- }
-
- public String getDescription() {
- return description;
- }
-
- public static ServiceType fromString(String value) {
- for (ServiceType type : ServiceType.values()) {
- if (type.getValue().equalsIgnoreCase(value)) {
- return type;
- }
- }
-
- throw new IllegalArgumentException("No matched type with value=" + value);
- }
-
- @Override
- public String toString() {
- return value;
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionEntity.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionEntity.java
deleted file mode 100644
index d12686c222..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionEntity.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.io.Serializable;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-public class StrategyConditionEntity implements Serializable {
- private static final long serialVersionUID = 1249482860170990672L;
-
- private String id;
- private Map headerMap = new LinkedHashMap();
- private String versionId;
- private String regionId;
- private String addressId;
- private String versionWeightId;
- private String regionWeightId;
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public Map getHeaderMap() {
- return headerMap;
- }
-
- public void setHeaderMap(Map headerMap) {
- this.headerMap = headerMap;
- }
-
- public String getVersionId() {
- return versionId;
- }
-
- public void setVersionId(String versionId) {
- this.versionId = versionId;
- }
-
- public String getRegionId() {
- return regionId;
- }
-
- public void setRegionId(String regionId) {
- this.regionId = regionId;
- }
-
- public String getAddressId() {
- return addressId;
- }
-
- public void setAddressId(String addressId) {
- this.addressId = addressId;
- }
-
- public String getVersionWeightId() {
- return versionWeightId;
- }
-
- public void setVersionWeightId(String versionWeightId) {
- this.versionWeightId = versionWeightId;
- }
-
- public String getRegionWeightId() {
- return regionWeightId;
- }
-
- public void setRegionWeightId(String regionWeightId) {
- this.regionWeightId = regionWeightId;
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
-
- @Override
- public boolean equals(Object object) {
- return EqualsBuilder.reflectionEquals(this, object);
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyCustomizationEntity.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyCustomizationEntity.java
deleted file mode 100644
index 380e8abefe..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyCustomizationEntity.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-public class StrategyCustomizationEntity implements Serializable {
- private static final long serialVersionUID = 4903833660194433964L;
-
- private List strategyConditionEntityList;
- private List strategyRouteEntityList;
-
- public List getStrategyConditionEntityList() {
- return strategyConditionEntityList;
- }
-
- public void setStrategyConditionEntityList(List strategyConditionEntityList) {
- this.strategyConditionEntityList = strategyConditionEntityList;
- }
-
- public List getStrategyRouteEntityList() {
- return strategyRouteEntityList;
- }
-
- public void setStrategyRouteEntityList(List strategyRouteEntityList) {
- this.strategyRouteEntityList = strategyRouteEntityList;
-
- // Header参数越多,越排在前面
- Collections.sort(this.strategyConditionEntityList, new Comparator() {
- public int compare(StrategyConditionEntity object1, StrategyConditionEntity object2) {
- Integer count1 = object1.getHeaderMap().size();
- Integer count2 = object2.getHeaderMap().size();
-
- return count2.compareTo(count1);
- }
- });
- }
-
- @Override
- public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
- }
-
- @Override
- public boolean equals(Object object) {
- return EqualsBuilder.reflectionEquals(this, object);
- }
-
- @Override
- public String toString() {
- return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyType.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyType.java
deleted file mode 100644
index 2cbd309ad3..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyType.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import com.nepxion.discovery.common.constant.DiscoveryConstant;
-
-public enum StrategyType {
- VERSION(DiscoveryConstant.VERSION, DiscoveryConstant.VERSION),
- REGION(DiscoveryConstant.REGION, DiscoveryConstant.REGION),
- ADDRESS(DiscoveryConstant.ADDRESS, DiscoveryConstant.ADDRESS),
- VERSION_WEIGHT(DiscoveryConstant.VERSION_WEIGHT, DiscoveryConstant.VERSION_WEIGHT),
- REGION_WEIGHT(DiscoveryConstant.REGION_WEIGHT, DiscoveryConstant.REGION_WEIGHT);
-
- private String value;
- private String description;
-
- private StrategyType(String value, String description) {
- this.value = value;
- this.description = description;
- }
-
- public String getValue() {
- return value;
- }
-
- public String getDescription() {
- return description;
- }
-
- public static StrategyType fromString(String value) {
- for (StrategyType type : StrategyType.values()) {
- if (type.getValue().equalsIgnoreCase(value)) {
- return type;
- }
- }
-
- throw new IllegalArgumentException("No matched type with value=" + value);
- }
-
- @Override
- public String toString() {
- return value;
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntityWrapper.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntityWrapper.java
deleted file mode 100644
index 232076c635..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntityWrapper.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import com.nepxion.discovery.common.constant.DiscoveryConstant;
-import com.nepxion.discovery.common.util.JsonUtil;
-import com.nepxion.discovery.common.util.StringUtil;
-
-public class WeightEntityWrapper {
- @SuppressWarnings("unchecked")
- public static List parseWeightEntityList(String weightValue) {
- List weightEntityList = new ArrayList();
-
- Map jsonWeightMap = JsonUtil.fromJson(weightValue, Map.class);
- for (Map.Entry entry : jsonWeightMap.entrySet()) {
- String providerServiceName = entry.getKey();
- String providerWeightValue = entry.getValue();
-
- WeightEntity weightEntity = new WeightEntity();
- weightEntity.setProviderServiceName(providerServiceName);
-
- parseWeightEntity(weightEntity, providerWeightValue);
-
- weightEntityList.add(weightEntity);
- }
-
- return weightEntityList;
- }
-
- public static void parseWeightEntity(MapWeightEntity weightEntity, String weightValue) {
- Map weightMap = weightEntity.getWeightMap();
- List providerWeightValueList = StringUtil.splitToList(weightValue, DiscoveryConstant.SEPARATE);
- for (String value : providerWeightValueList) {
- String[] valueArray = StringUtils.split(value, DiscoveryConstant.EQUALS);
- String key = valueArray[0].trim();
- int weight = 0;
- try {
- weight = Integer.valueOf(valueArray[1].trim());
- if (weight < 0) {
- weight = 0;
- }
- } catch (NumberFormatException e) {
-
- }
-
- weightMap.put(key, weight);
- }
- }
-
- public static int getWeight(String consumerServiceId, String providerServiceId, String providerKey, Map> weightEntityMap) {
- if (MapUtils.isEmpty(weightEntityMap)) {
- return -1;
- }
-
- List weightEntityList = weightEntityMap.get(consumerServiceId);
-
- return getWeight(providerServiceId, providerKey, weightEntityList);
- }
-
- public static int getWeight(String providerServiceId, String providerKey, List weightEntityList) {
- if (CollectionUtils.isEmpty(weightEntityList)) {
- return -1;
- }
-
- for (WeightEntity weightEntity : weightEntityList) {
- String providerServiceName = weightEntity.getProviderServiceName();
- if (StringUtils.equalsIgnoreCase(providerServiceName, providerServiceId)) {
- return getWeight(providerKey, weightEntity);
- }
- }
-
- return -1;
- }
-
- public static int getWeight(String providerKey, MapWeightEntity weightEntity) {
- if (weightEntity == null) {
- return -1;
- }
-
- Map weightMap = weightEntity.getWeightMap();
- if (MapUtils.isEmpty(weightMap)) {
- return -1;
- }
-
- Integer weight = weightMap.get(providerKey);
- if (weight != null) {
- return weight;
- } else {
- return -1;
- }
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightType.java b/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightType.java
deleted file mode 100644
index a8b51b9865..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightType.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.nepxion.discovery.common.entity;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import com.nepxion.discovery.common.constant.DiscoveryConstant;
-
-public enum WeightType {
- VERSION(DiscoveryConstant.VERSION, DiscoveryConstant.VERSION),
- REGION(DiscoveryConstant.REGION, DiscoveryConstant.REGION);
-
- private String value;
- private String description;
-
- private WeightType(String value, String description) {
- this.value = value;
- this.description = description;
- }
-
- public String getValue() {
- return value;
- }
-
- public String getDescription() {
- return description;
- }
-
- public static WeightType fromString(String value) {
- for (WeightType type : WeightType.values()) {
- if (type.getValue().equalsIgnoreCase(value)) {
- return type;
- }
- }
-
- throw new IllegalArgumentException("No matched type with value=" + value);
- }
-
- @Override
- public String toString() {
- return value;
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/handler/RestErrorHandler.java b/discovery-common/src/main/java/com/nepxion/discovery/common/handler/RestErrorHandler.java
deleted file mode 100644
index 8446fcdc64..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/handler/RestErrorHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.nepxion.discovery.common.handler;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.commons.io.IOUtils;
-import org.springframework.http.client.ClientHttpResponse;
-import org.springframework.web.client.DefaultResponseErrorHandler;
-
-import com.nepxion.discovery.common.constant.DiscoveryConstant;
-
-public class RestErrorHandler extends DefaultResponseErrorHandler {
- private String cause;
-
- @Override
- public void handleError(ClientHttpResponse response) throws IOException {
- // 这里绝对不能关闭InputStream
- InputStream inputStream = response.getBody();
- cause = IOUtils.toString(inputStream, DiscoveryConstant.ENCODING_UTF_8);
- }
-
- public String getCause() {
- return cause;
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/thread/NamedThreadFactory.java b/discovery-common/src/main/java/com/nepxion/discovery/common/thread/NamedThreadFactory.java
deleted file mode 100644
index 9acacb068c..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/thread/NamedThreadFactory.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.nepxion.discovery.common.thread;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
-// Copy from Alibaba Sentinel project
-public class NamedThreadFactory implements ThreadFactory {
- private AtomicInteger count = new AtomicInteger(1);
- private ThreadGroup group;
- private String namePrefix;
- private boolean daemon;
-
- public NamedThreadFactory(String namePrefix) {
- this(namePrefix, false);
- }
-
- public NamedThreadFactory(String namePrefix, boolean daemon) {
- SecurityManager securityManager = System.getSecurityManager();
- this.group = securityManager != null ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup();
- this.namePrefix = namePrefix;
- this.daemon = daemon;
- }
-
- @Override
- public Thread newThread(Runnable runnable) {
- Thread thread = new Thread(group, runnable, namePrefix + "-thread-" + count.getAndIncrement(), 0);
- thread.setDaemon(daemon);
-
- return thread;
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/util/JsonUtil.java b/discovery-common/src/main/java/com/nepxion/discovery/common/util/JsonUtil.java
deleted file mode 100644
index 4df2e5eeb0..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/util/JsonUtil.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.nepxion.discovery.common.util;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.io.IOException;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-
-public class JsonUtil {
- private static ObjectMapper objectMapper;
-
- static {
- objectMapper = new ObjectMapper();
- // objectMapper.getSerializerProvider().setNullKeySerializer(new NullKeySerializer());
- // objectMapper.setDateFormat(new SimpleDateFormat(DiscoveryConstant.DATE_FORMAT));
- }
-
- public static class NullKeySerializer extends StdSerializer {
- private static final long serialVersionUID = -9176767187240330396L;
-
- public NullKeySerializer() {
- this(null);
- }
-
- public NullKeySerializer(Class object) {
- super(object);
- }
-
- @Override
- public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
- gen.writeFieldName(StringUtils.EMPTY);
- }
- }
-
- public static String toJson(T object) {
- if (object == null) {
- throw new IllegalArgumentException("Object is null");
- }
-
- try {
- return objectMapper.writeValueAsString(object);
- } catch (JsonProcessingException e) {
- throw new IllegalArgumentException(e.getMessage(), e);
- }
- }
-
- public static T fromJson(String json, Class clazz) {
- if (StringUtils.isEmpty(json)) {
- throw new IllegalArgumentException("Json is null or empty");
- }
-
- try {
- return objectMapper.readValue(json, clazz);
- } catch (Exception e) {
- throw new IllegalArgumentException(e.getMessage(), e);
- }
- }
-
- public static T fromJson(String json, TypeReference typeReference) {
- if (StringUtils.isEmpty(json)) {
- throw new IllegalArgumentException("Json is null or empty");
- }
-
- try {
- return objectMapper.readValue(json, typeReference);
- } catch (Exception e) {
- throw new IllegalArgumentException(e.getMessage(), e);
- }
- }
-
- public static ObjectMapper getObjectMapper() {
- return objectMapper;
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/util/RestUtil.java b/discovery-common/src/main/java/com/nepxion/discovery/common/util/RestUtil.java
deleted file mode 100644
index 94dc8ec6c7..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/util/RestUtil.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.nepxion.discovery.common.util;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.web.client.ResponseErrorHandler;
-import org.springframework.web.client.RestTemplate;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.nepxion.discovery.common.handler.RestErrorHandler;
-
-public class RestUtil {
- public static T fromJson(RestTemplate restTemplate, String result, TypeReference typeReference) {
- try {
- return JsonUtil.fromJson(result, typeReference);
- } catch (Exception e) {
- String cause = getCause(restTemplate);
- if (StringUtils.isNotEmpty(cause)) {
- throw new IllegalArgumentException(cause);
- }
-
- throw e;
- }
- }
-
- public static String getCause(RestTemplate restTemplate) {
- ResponseErrorHandler responseErrorHandler = restTemplate.getErrorHandler();
- if (responseErrorHandler instanceof RestErrorHandler) {
- RestErrorHandler errorHandler = (RestErrorHandler) responseErrorHandler;
-
- return errorHandler.getCause();
- }
-
- return null;
- }
-}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/util/StringUtil.java b/discovery-common/src/main/java/com/nepxion/discovery/common/util/StringUtil.java
deleted file mode 100644
index c4672339ef..0000000000
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/util/StringUtil.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.nepxion.discovery.common.util;
-
-/**
- * Title: Nepxion Discovery
- * Description: Nepxion Discovery
- * Copyright: Copyright (c) 2017-2050
- * Company: Nepxion
- * @author Haojun Ren
- * @version 1.0
- */
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
-public class StringUtil {
- public static List splitToList(String value, String separate) {
- if (StringUtils.isEmpty(value)) {
- return null;
- }
-
- String[] valueArray = StringUtils.split(value, separate);
-
- return Arrays.asList(valueArray);
- }
-}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-apollo/pom.xml b/discovery-commons/discovery-common-apollo/pom.xml
new file mode 100644
index 0000000000..6fec8e711a
--- /dev/null
+++ b/discovery-commons/discovery-common-apollo/pom.xml
@@ -0,0 +1,28 @@
+
+
+ discovery-common-apollo
+ Nepxion Discovery Common Apollo
+ jar
+ 4.0.0
+ Nepxion Discovery is a solution for Spring Cloud with blue green, gray, weight, limitation, circuit breaker, degrade, isolation, monitor, tracing, dye, failover, async agent
+ http://www.nepxion.com
+
+
+ com.nepxion
+ discovery-commons
+ 6.23.0
+
+
+
+
+ ${project.groupId}
+ discovery-common
+
+
+
+ com.ctrip.framework.apollo
+ apollo-client
+
+
+
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/configuration/ApolloAutoConfiguration.java b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/configuration/ApolloAutoConfiguration.java
new file mode 100644
index 0000000000..95a128351f
--- /dev/null
+++ b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/configuration/ApolloAutoConfiguration.java
@@ -0,0 +1,53 @@
+package com.nepxion.discovery.common.apollo.configuration;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+
+import com.ctrip.framework.apollo.Config;
+import com.ctrip.framework.apollo.ConfigService;
+import com.nepxion.discovery.common.apollo.constant.ApolloConstant;
+import com.nepxion.discovery.common.apollo.operation.ApolloOperation;
+
+@Configuration
+public class ApolloAutoConfiguration {
+ @Autowired
+ private Environment environment;
+
+ @Bean
+ @ConditionalOnMissingBean
+ public Config apolloConfig() {
+ String namespace = getNamespace(environment);
+
+ return ConfigService.getConfig(namespace);
+ }
+
+ @Bean
+ public ApolloOperation apolloOperation() {
+ return new ApolloOperation();
+ }
+
+ public static String getNamespace(Environment environment) {
+ String namespace = environment.getProperty(ApolloConstant.APOLLO_NAMESPACE);
+ if (StringUtils.isEmpty(namespace) || namespace.contains(ApolloConstant.SEPARATE)) {
+ namespace = environment.getProperty(ApolloConstant.APOLLO_BOOTSTRAP_NAMESPACES);
+ }
+ if (StringUtils.isEmpty(namespace) || namespace.contains(ApolloConstant.SEPARATE)) {
+ namespace = ApolloConstant.NAMESPACE_APPLICATION;
+ }
+
+ return namespace;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/constant/ApolloConstant.java b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/constant/ApolloConstant.java
new file mode 100644
index 0000000000..944f0bb0d0
--- /dev/null
+++ b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/constant/ApolloConstant.java
@@ -0,0 +1,18 @@
+package com.nepxion.discovery.common.apollo.constant;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.ctrip.framework.apollo.core.ConfigConsts;
+
+public class ApolloConstant implements ConfigConsts {
+ public static final String APOLLO_BOOTSTRAP_NAMESPACES = "apollo.bootstrap.namespaces";
+ public static final String APOLLO_NAMESPACE = "apollo.namespace";
+ public static final String SEPARATE = ",";
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloOperation.java b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloOperation.java
new file mode 100644
index 0000000000..b1aaa4e924
--- /dev/null
+++ b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloOperation.java
@@ -0,0 +1,46 @@
+package com.nepxion.discovery.common.apollo.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.ctrip.framework.apollo.Config;
+import com.ctrip.framework.apollo.ConfigChangeListener;
+import com.ctrip.framework.apollo.model.ConfigChange;
+import com.ctrip.framework.apollo.model.ConfigChangeEvent;
+import com.google.common.collect.Sets;
+
+public class ApolloOperation {
+ @Autowired
+ private Config apolloConfig;
+
+ public String getConfig(String group, String serviceId) {
+ return apolloConfig.getProperty(group + "-" + serviceId, null);
+ }
+
+ public ConfigChangeListener subscribeConfig(String group, String serviceId, ApolloSubscribeCallback apolloSubscribeCallback) {
+ ConfigChangeListener configChangeListener = new ConfigChangeListener() {
+ @Override
+ public void onChange(ConfigChangeEvent changeEvent) {
+ ConfigChange change = changeEvent.getChange(group + "-" + serviceId);
+ String config = change.getNewValue();
+ apolloSubscribeCallback.callback(config);
+ }
+ };
+
+ apolloConfig.addChangeListener(configChangeListener, Sets.newHashSet(group + "-" + serviceId));
+
+ return configChangeListener;
+ }
+
+ public void unsubscribeConfig(String group, String serviceId, ConfigChangeListener configChangeListener) {
+ apolloConfig.removeChangeListener(configChangeListener);
+ }
+}
\ No newline at end of file
diff --git a/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloSubscribeCallback.java b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloSubscribeCallback.java
similarity index 100%
rename from discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloSubscribeCallback.java
rename to discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/operation/ApolloSubscribeCallback.java
diff --git a/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/proccessor/ApolloProcessor.java b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/proccessor/ApolloProcessor.java
new file mode 100644
index 0000000000..7140656275
--- /dev/null
+++ b/discovery-commons/discovery-common-apollo/src/main/java/com/nepxion/discovery/common/apollo/proccessor/ApolloProcessor.java
@@ -0,0 +1,90 @@
+package com.nepxion.discovery.common.apollo.proccessor;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.ctrip.framework.apollo.ConfigChangeListener;
+import com.nepxion.discovery.common.apollo.operation.ApolloOperation;
+import com.nepxion.discovery.common.apollo.operation.ApolloSubscribeCallback;
+import com.nepxion.discovery.common.entity.ConfigType;
+import com.nepxion.discovery.common.processor.DiscoveryConfigProcessor;
+
+public abstract class ApolloProcessor extends DiscoveryConfigProcessor {
+ @Autowired
+ private ApolloOperation apolloOperation;
+
+ private ConfigChangeListener configChangeListener;
+
+ @PostConstruct
+ public void initialize() {
+ beforeInitialization();
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logSubscribeStarted();
+
+ try {
+ configChangeListener = apolloOperation.subscribeConfig(group, dataId, new ApolloSubscribeCallback() {
+ @Override
+ public void callback(String config) {
+ try {
+ callbackConfig(config);
+ } catch (Exception e) {
+ logCallbackFailed(e);
+ }
+ }
+ });
+ } catch (Exception e) {
+ logSubscribeFailed(e);
+ }
+
+ logGetStarted();
+
+ try {
+ String config = apolloOperation.getConfig(group, dataId);
+ if (config != null) {
+ callbackConfig(config);
+ } else {
+ logNotFound();
+ }
+ } catch (Exception e) {
+ logGetFailed(e);
+ }
+
+ afterInitialization();
+ }
+
+ @Override
+ public void destroy() {
+ if (configChangeListener == null) {
+ return;
+ }
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logUnsubscribeStarted();
+
+ try {
+ apolloOperation.unsubscribeConfig(group, dataId, configChangeListener);
+ } catch (Exception e) {
+ logUnsubscribeFailed(e);
+ }
+ }
+
+ @Override
+ public ConfigType getConfigType() {
+ return ConfigType.APOLLO;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-apollo/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/discovery-commons/discovery-common-apollo/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 0000000000..2ef842fcef
--- /dev/null
+++ b/discovery-commons/discovery-common-apollo/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,10 @@
+{
+ "properties": [
+ {
+ "name": "apollo.namespace",
+ "type": "java.lang.String",
+ "defaultValue": "application",
+ "description": "Apollo namespace."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-apollo/src/main/resources/META-INF/spring.factories b/discovery-commons/discovery-common-apollo/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..825892edf0
--- /dev/null
+++ b/discovery-commons/discovery-common-apollo/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.nepxion.discovery.common.apollo.configuration.ApolloAutoConfiguration
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/pom.xml b/discovery-commons/discovery-common-consul/pom.xml
new file mode 100644
index 0000000000..a7cdc4836a
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/pom.xml
@@ -0,0 +1,28 @@
+
+
+ discovery-common-consul
+ Nepxion Discovery Common Consul
+ jar
+ 4.0.0
+ Nepxion Discovery is a solution for Spring Cloud with blue green, gray, weight, limitation, circuit breaker, degrade, isolation, monitor, tracing, dye, failover, async agent
+ http://www.nepxion.com
+
+
+ com.nepxion
+ discovery-commons
+ 6.23.0
+
+
+
+
+ ${project.groupId}
+ discovery-common
+
+
+
+ com.ecwid.consul
+ consul-api
+
+
+
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/configuration/ConsulAutoConfiguration.java b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/configuration/ConsulAutoConfiguration.java
new file mode 100644
index 0000000000..347904dd20
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/configuration/ConsulAutoConfiguration.java
@@ -0,0 +1,46 @@
+package com.nepxion.discovery.common.consul.configuration;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+
+import com.ecwid.consul.v1.ConsulClient;
+import com.nepxion.discovery.common.consul.constant.ConsulConstant;
+import com.nepxion.discovery.common.consul.operation.ConsulOperation;
+import com.nepxion.discovery.common.exception.DiscoveryException;
+
+@Configuration
+public class ConsulAutoConfiguration {
+ @Autowired
+ private Environment environment;
+
+ @Bean
+ public ConsulOperation consulOperation() {
+ return new ConsulOperation();
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public ConsulClient consulClient() {
+ String consulHost = environment.getProperty(ConsulConstant.CONSUL_HOST);
+ if (StringUtils.isBlank(consulHost)) {
+ throw new DiscoveryException(ConsulConstant.CONSUL_HOST + " can't be null or empty");
+ }
+
+ int consulPort = environment.getProperty(ConsulConstant.CONSUL_PORT, Integer.class);
+
+ return new ConsulClient(consulHost, consulPort);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/constant/ConsulConstant.java b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/constant/ConsulConstant.java
new file mode 100644
index 0000000000..298c9317f0
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/constant/ConsulConstant.java
@@ -0,0 +1,18 @@
+package com.nepxion.discovery.common.consul.constant;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+public class ConsulConstant {
+ public static final String CONSUL_HOST = "consul.host";
+ public static final String CONSUL_PORT = "consul.port";
+ public static final String CONSUL_TIMEOUT = "consul.timeout";
+ public static final String CONSUL_TOKEN = "consul.token";
+ public static final int CONSUL_DEFAULT_TIMEOUT = 1;
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulListener.java b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulListener.java
new file mode 100644
index 0000000000..4608dc838c
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulListener.java
@@ -0,0 +1,82 @@
+package com.nepxion.discovery.common.consul.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.TimeUnit;
+
+import com.ecwid.consul.v1.ConsulClient;
+import com.ecwid.consul.v1.QueryParams;
+import com.ecwid.consul.v1.Response;
+import com.ecwid.consul.v1.kv.model.GetValue;
+
+public class ConsulListener implements Runnable {
+ private String group;
+ private String serviceId;
+
+ private int timeout;
+ private String token;
+
+ private ConsulClient consulClient;
+ private ConsulSubscribeCallback consulSubscribeCallback;
+
+ private volatile long lastIndex;
+ private volatile boolean running = true;
+
+ public ConsulListener(String group, String serviceId, int timeout, String token, ConsulClient consulClient, ConsulSubscribeCallback consulSubscribeCallback) {
+ this.group = group;
+ this.serviceId = serviceId;
+ this.timeout = timeout;
+ this.token = token;
+ this.consulClient = consulClient;
+ this.consulSubscribeCallback = consulSubscribeCallback;
+
+ initialize();
+ }
+
+ private void initialize() {
+ Response response = consulClient.getKVValue(group + "-" + serviceId, token);
+ if (response != null) {
+ lastIndex = response.getConsulIndex();
+ }
+ }
+
+ @Override
+ public void run() {
+ while (running) {
+ Response response = consulClient.getKVValue(group + "-" + serviceId, token, new QueryParams(timeout, lastIndex));
+ if (response == null) {
+ try {
+ TimeUnit.MILLISECONDS.sleep(timeout * 1000);
+ } catch (InterruptedException e) {
+ }
+
+ continue;
+ }
+
+ Long currentIndex = response.getConsulIndex();
+ if (currentIndex == null || currentIndex <= lastIndex) {
+ continue;
+ }
+ lastIndex = currentIndex;
+
+ GetValue getValue = response.getValue();
+ if (getValue != null) {
+ String value = getValue.getDecodedValue(StandardCharsets.UTF_8);
+
+ consulSubscribeCallback.callback(value);
+ }
+ }
+ }
+
+ public void stop() {
+ running = false;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulOperation.java b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulOperation.java
new file mode 100644
index 0000000000..4db10097cb
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulOperation.java
@@ -0,0 +1,86 @@
+package com.nepxion.discovery.common.consul.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.ExecutorService;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+
+import com.ecwid.consul.v1.ConsulClient;
+import com.ecwid.consul.v1.Response;
+import com.ecwid.consul.v1.kv.model.GetValue;
+import com.nepxion.discovery.common.consul.constant.ConsulConstant;
+
+public class ConsulOperation {
+ @Autowired
+ private ConsulClient consulClient;
+
+ @Autowired
+ private Environment environment;
+
+ public String getConfig(String group, String serviceId) {
+ String token = getToken();
+
+ Response response = consulClient.getKVValue(group + "-" + serviceId, token);
+ if (response == null) {
+ return null;
+ }
+
+ GetValue getValue = response.getValue();
+ if (getValue == null) {
+ return null;
+ }
+
+ return getValue.getDecodedValue(StandardCharsets.UTF_8);
+ }
+
+ public boolean removeConfig(String group, String serviceId) {
+ String token = getToken();
+
+ consulClient.deleteKVValue(group + "-" + serviceId, token);
+
+ return true;
+ }
+
+ public boolean publishConfig(String group, String serviceId, String config) {
+ String token = getToken();
+
+ consulClient.setKVValue(group + "-" + serviceId, config, token, null);
+
+ return true;
+ }
+
+ public ConsulListener subscribeConfig(String group, String serviceId, ExecutorService executorService, ConsulSubscribeCallback consulSubscribeCallback) throws Exception {
+ int timeout = getTimeout();
+ String token = getToken();
+
+ ConsulListener consulListener = new ConsulListener(group, serviceId, timeout, token, consulClient, consulSubscribeCallback);
+ executorService.submit(consulListener);
+
+ return consulListener;
+ }
+
+ public void unsubscribeConfig(String group, String serviceId, ConsulListener consulListener) throws Exception {
+ consulListener.stop();
+ }
+
+ private int getTimeout() {
+ return environment.getProperty(ConsulConstant.CONSUL_TIMEOUT, Integer.class, ConsulConstant.CONSUL_DEFAULT_TIMEOUT);
+ }
+
+ private String getToken() {
+ String token = environment.getProperty(ConsulConstant.CONSUL_TOKEN, String.class);
+
+ return StringUtils.isNotBlank(token) ? token : null;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulSubscribeCallback.java b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulSubscribeCallback.java
new file mode 100644
index 0000000000..9331d918d4
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/operation/ConsulSubscribeCallback.java
@@ -0,0 +1,14 @@
+package com.nepxion.discovery.common.consul.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+public interface ConsulSubscribeCallback {
+ void callback(String config);
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/proccessor/ConsulProcessor.java b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/proccessor/ConsulProcessor.java
new file mode 100644
index 0000000000..52b40ce628
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/src/main/java/com/nepxion/discovery/common/consul/proccessor/ConsulProcessor.java
@@ -0,0 +1,97 @@
+package com.nepxion.discovery.common.consul.proccessor;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.concurrent.ExecutorService;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.nepxion.discovery.common.consul.operation.ConsulListener;
+import com.nepxion.discovery.common.consul.operation.ConsulOperation;
+import com.nepxion.discovery.common.consul.operation.ConsulSubscribeCallback;
+import com.nepxion.discovery.common.entity.ConfigType;
+import com.nepxion.discovery.common.processor.DiscoveryConfigProcessor;
+import com.nepxion.discovery.common.thread.DiscoveryThreadPoolFactory;
+
+public abstract class ConsulProcessor extends DiscoveryConfigProcessor {
+ private ExecutorService executorService = DiscoveryThreadPoolFactory.getExecutorService("consul-config");
+
+ @Autowired
+ private ConsulOperation consulOperation;
+
+ private ConsulListener consulListener;
+
+ @PostConstruct
+ public void initialize() {
+ beforeInitialization();
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logSubscribeStarted();
+
+ try {
+ consulListener = consulOperation.subscribeConfig(group, dataId, executorService, new ConsulSubscribeCallback() {
+ @Override
+ public void callback(String config) {
+ try {
+ callbackConfig(config);
+ } catch (Exception e) {
+ logCallbackFailed(e);
+ }
+ }
+ });
+ } catch (Exception e) {
+ logSubscribeFailed(e);
+ }
+
+ logGetStarted();
+
+ try {
+ String config = consulOperation.getConfig(group, dataId);
+ if (config != null) {
+ callbackConfig(config);
+ } else {
+ logNotFound();
+ }
+ } catch (Exception e) {
+ logGetFailed(e);
+ }
+
+ afterInitialization();
+ }
+
+ @Override
+ public void destroy() {
+ if (consulListener == null) {
+ return;
+ }
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logUnsubscribeStarted();
+
+ try {
+ consulOperation.unsubscribeConfig(group, dataId, consulListener);
+ } catch (Exception e) {
+ logUnsubscribeFailed(e);
+ }
+
+ executorService.shutdownNow();
+ }
+
+ @Override
+ public ConfigType getConfigType() {
+ return ConfigType.CONSUL;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/discovery-commons/discovery-common-consul/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 0000000000..95554f3e2c
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,25 @@
+{
+ "properties": [
+ {
+ "name": "consul.host",
+ "type": "java.lang.String",
+ "description": "Consul host."
+ },
+ {
+ "name": "consul.port",
+ "type": "java.lang.Integer",
+ "description": "Consul port."
+ },
+ {
+ "name": "consul.timeout",
+ "type": "java.lang.Integer",
+ "defaultValue": 1,
+ "description": "Consul timeout, default value is 1 second."
+ },
+ {
+ "name": "consul.token",
+ "type": "java.lang.String",
+ "description": "Consul token."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-consul/src/main/resources/META-INF/spring.factories b/discovery-commons/discovery-common-consul/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..119a08ed9a
--- /dev/null
+++ b/discovery-commons/discovery-common-consul/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.nepxion.discovery.common.consul.configuration.ConsulAutoConfiguration
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-etcd/pom.xml b/discovery-commons/discovery-common-etcd/pom.xml
new file mode 100644
index 0000000000..adceaa382c
--- /dev/null
+++ b/discovery-commons/discovery-common-etcd/pom.xml
@@ -0,0 +1,28 @@
+
+
+ discovery-common-etcd
+ Nepxion Discovery Common Etcd
+ jar
+ 4.0.0
+ Nepxion Discovery is a solution for Spring Cloud with blue green, gray, weight, limitation, circuit breaker, degrade, isolation, monitor, tracing, dye, failover, async agent
+ http://www.nepxion.com
+
+
+ com.nepxion
+ discovery-commons
+ 6.23.0
+
+
+
+
+ ${project.groupId}
+ discovery-common
+
+
+
+ io.etcd
+ jetcd-core
+
+
+
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/configuration/EtcdAutoConfiguration.java b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/configuration/EtcdAutoConfiguration.java
new file mode 100644
index 0000000000..a28d47ff36
--- /dev/null
+++ b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/configuration/EtcdAutoConfiguration.java
@@ -0,0 +1,62 @@
+package com.nepxion.discovery.common.etcd.configuration;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+import io.etcd.jetcd.ByteSequence;
+import io.etcd.jetcd.Client;
+import io.etcd.jetcd.ClientBuilder;
+
+import java.nio.charset.StandardCharsets;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+
+import com.nepxion.discovery.common.etcd.constant.EtcdConstant;
+import com.nepxion.discovery.common.etcd.operation.EtcdOperation;
+import com.nepxion.discovery.common.exception.DiscoveryException;
+
+@Configuration
+public class EtcdAutoConfiguration {
+ @Autowired
+ private Environment environment;
+
+ @Bean
+ public EtcdOperation etcdOperation() {
+ return new EtcdOperation();
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public Client client() {
+ String serverAddr = environment.getProperty(EtcdConstant.ETCD_SERVER_ADDR);
+ if (StringUtils.isBlank(serverAddr)) {
+ throw new DiscoveryException(EtcdConstant.ETCD_SERVER_ADDR + " can't be null or empty");
+ }
+
+ ClientBuilder clientBuilder = Client.builder().endpoints(serverAddr);
+
+ String username = environment.getProperty(EtcdConstant.ETCD_USERNAME);
+ if (StringUtils.isNotBlank(username)) {
+ clientBuilder.user(ByteSequence.from(username, StandardCharsets.UTF_8));
+ }
+
+ String password = environment.getProperty(EtcdConstant.ETCD_PASSWORD);
+ if (StringUtils.isNotBlank(password)) {
+ clientBuilder.password(ByteSequence.from(password, StandardCharsets.UTF_8));
+ }
+ clientBuilder.loadBalancerPolicy(EtcdConstant.ETCD_CLIENT_ROUND_ROBIN);
+
+ return clientBuilder.build();
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/constant/EtcdConstant.java b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/constant/EtcdConstant.java
new file mode 100644
index 0000000000..7114bc5510
--- /dev/null
+++ b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/constant/EtcdConstant.java
@@ -0,0 +1,17 @@
+package com.nepxion.discovery.common.etcd.constant;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+public class EtcdConstant {
+ public static final String ETCD_SERVER_ADDR = "etcd.server.addr";
+ public static final String ETCD_USERNAME = "etcd.username";
+ public static final String ETCD_PASSWORD = "etcd.password";
+ public static final String ETCD_CLIENT_ROUND_ROBIN = "round_robin";
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/operation/EtcdOperation.java b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/operation/EtcdOperation.java
new file mode 100644
index 0000000000..e528fe58f4
--- /dev/null
+++ b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/operation/EtcdOperation.java
@@ -0,0 +1,117 @@
+package com.nepxion.discovery.common.etcd.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+import io.etcd.jetcd.ByteSequence;
+import io.etcd.jetcd.Client;
+import io.etcd.jetcd.KV;
+import io.etcd.jetcd.KeyValue;
+import io.etcd.jetcd.Watch;
+import io.etcd.jetcd.Watch.Listener;
+import io.etcd.jetcd.kv.GetResponse;
+import io.etcd.jetcd.watch.WatchEvent;
+import io.etcd.jetcd.watch.WatchEvent.EventType;
+import io.etcd.jetcd.watch.WatchResponse;
+
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.ExecutionException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class EtcdOperation implements DisposableBean {
+ private static final Logger LOG = LoggerFactory.getLogger(EtcdOperation.class);
+
+ @Autowired
+ private Client client;
+
+ public String getConfig(String group, String serviceId) throws ExecutionException, InterruptedException {
+ ByteSequence byteSequence = ByteSequence.from(group + "-" + serviceId, StandardCharsets.UTF_8);
+
+ KV kvClient = client.getKVClient();
+ GetResponse getResponse = kvClient.get(byteSequence).get();
+ if (getResponse.getKvs().size() > 0) {
+ KeyValue keyValue = getResponse.getKvs().get(0);
+
+ return keyValue.getValue().toString(StandardCharsets.UTF_8);
+ }
+
+ return null;
+ }
+
+ public boolean removeConfig(String group, String serviceId) throws ExecutionException, InterruptedException {
+ ByteSequence byteSequence = ByteSequence.from(group + "-" + serviceId, StandardCharsets.UTF_8);
+
+ KV kvClient = client.getKVClient();
+ kvClient.delete(byteSequence);
+
+ return true;
+ }
+
+ public boolean publishConfig(String group, String serviceId, String config) throws ExecutionException, InterruptedException {
+ ByteSequence keyByteSequence = ByteSequence.from(group + "-" + serviceId, StandardCharsets.UTF_8);
+ ByteSequence valueByteSequence = ByteSequence.from(config, StandardCharsets.UTF_8);
+
+ KV kvClient = client.getKVClient();
+ kvClient.put(keyByteSequence, valueByteSequence);
+
+ return true;
+ }
+
+ public Watch subscribeConfig(String group, String serviceId, EtcdSubscribeCallback etcdSubscribeCallback) throws Exception {
+ ByteSequence byteSequence = ByteSequence.from(group + "-" + serviceId, StandardCharsets.UTF_8);
+
+ Watch watchClient = client.getWatchClient();
+ Listener listener = new Listener() {
+ @Override
+ public void onNext(WatchResponse response) {
+ for (WatchEvent event : response.getEvents()) {
+ EventType eventType = event.getEventType();
+ if (eventType == EventType.PUT) {
+ KeyValue keyValue = event.getKeyValue();
+ if (keyValue != null) {
+ String config = keyValue.getValue().toString(StandardCharsets.UTF_8);
+
+ etcdSubscribeCallback.callback(config);
+ }
+ } else if (eventType == EventType.DELETE) {
+ etcdSubscribeCallback.callback(null);
+ }
+ }
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+
+ }
+
+ @Override
+ public void onCompleted() {
+
+ }
+ };
+ watchClient.watch(byteSequence, listener);
+
+ return watchClient;
+ }
+
+ public void unsubscribeConfig(String group, String serviceId, Watch watchClient) {
+ watchClient.close();
+ }
+
+ @Override
+ public void destroy() throws Exception {
+ client.close();
+
+ LOG.info("Shutting down JEtcd client...");
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/operation/EtcdSubscribeCallback.java b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/operation/EtcdSubscribeCallback.java
new file mode 100644
index 0000000000..0992f7b8d9
--- /dev/null
+++ b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/operation/EtcdSubscribeCallback.java
@@ -0,0 +1,14 @@
+package com.nepxion.discovery.common.etcd.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Congwei Xu
+ * @version 1.0
+ */
+
+public interface EtcdSubscribeCallback {
+ void callback(String config);
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/proccessor/EtcdProcessor.java b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/proccessor/EtcdProcessor.java
new file mode 100644
index 0000000000..d5d926b758
--- /dev/null
+++ b/discovery-commons/discovery-common-etcd/src/main/java/com/nepxion/discovery/common/etcd/proccessor/EtcdProcessor.java
@@ -0,0 +1,91 @@
+package com.nepxion.discovery.common.etcd.proccessor;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import io.etcd.jetcd.Watch;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.nepxion.discovery.common.entity.ConfigType;
+import com.nepxion.discovery.common.etcd.operation.EtcdOperation;
+import com.nepxion.discovery.common.etcd.operation.EtcdSubscribeCallback;
+import com.nepxion.discovery.common.processor.DiscoveryConfigProcessor;
+
+public abstract class EtcdProcessor extends DiscoveryConfigProcessor {
+ @Autowired
+ private EtcdOperation etcdOperation;
+
+ private Watch watchClient;
+
+ @PostConstruct
+ public void initialize() {
+ beforeInitialization();
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logSubscribeStarted();
+
+ try {
+ watchClient = etcdOperation.subscribeConfig(group, dataId, new EtcdSubscribeCallback() {
+ @Override
+ public void callback(String config) {
+ try {
+ callbackConfig(config);
+ } catch (Exception e) {
+ logCallbackFailed(e);
+ }
+ }
+ });
+ } catch (Exception e) {
+ logSubscribeFailed(e);
+ }
+
+ logGetStarted();
+
+ try {
+ String config = etcdOperation.getConfig(group, dataId);
+ if (config != null) {
+ callbackConfig(config);
+ } else {
+ logNotFound();
+ }
+ } catch (Exception e) {
+ logGetFailed(e);
+ }
+
+ afterInitialization();
+ }
+
+ @Override
+ public void destroy() {
+ if (watchClient == null) {
+ return;
+ }
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logUnsubscribeStarted();
+
+ try {
+ etcdOperation.unsubscribeConfig(group, dataId, watchClient);
+ } catch (Exception e) {
+ logUnsubscribeFailed(e);
+ }
+ }
+
+ @Override
+ public ConfigType getConfigType() {
+ return ConfigType.ETCD;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-etcd/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/discovery-commons/discovery-common-etcd/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 0000000000..34a5117897
--- /dev/null
+++ b/discovery-commons/discovery-common-etcd/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,19 @@
+{
+ "properties": [
+ {
+ "name": "etcd.server.addr",
+ "type": "java.lang.String",
+ "description": "Etcd server address."
+ },
+ {
+ "name": "etcd.username",
+ "type": "java.lang.String",
+ "description": "Etcd username."
+ },
+ {
+ "name": "etcd.password",
+ "type": "java.lang.String",
+ "description": "Etcd password."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-etcd/src/main/resources/META-INF/spring.factories b/discovery-commons/discovery-common-etcd/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..c21ff998c1
--- /dev/null
+++ b/discovery-commons/discovery-common-etcd/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.nepxion.discovery.common.etcd.configuration.EtcdAutoConfiguration
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-nacos/pom.xml b/discovery-commons/discovery-common-nacos/pom.xml
new file mode 100644
index 0000000000..6a1b4be49c
--- /dev/null
+++ b/discovery-commons/discovery-common-nacos/pom.xml
@@ -0,0 +1,33 @@
+
+
+ discovery-common-nacos
+ Nepxion Discovery Common Nacos
+ jar
+ 4.0.0
+ Nepxion Discovery is a solution for Spring Cloud with blue green, gray, weight, limitation, circuit breaker, degrade, isolation, monitor, tracing, dye, failover, async agent
+ http://www.nepxion.com
+
+
+ com.nepxion
+ discovery-commons
+ 6.23.0
+
+
+
+
+ ${project.groupId}
+ discovery-common
+
+
+
+ com.alibaba.nacos
+ nacos-client
+
+
+
+ com.alibaba.spring
+ spring-context-support
+
+
+
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/configuration/NacosAutoConfiguration.java b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/configuration/NacosAutoConfiguration.java
new file mode 100644
index 0000000000..70ea074393
--- /dev/null
+++ b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/configuration/NacosAutoConfiguration.java
@@ -0,0 +1,58 @@
+package com.nepxion.discovery.common.nacos.configuration;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.Properties;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+
+import com.alibaba.nacos.api.NacosFactory;
+import com.alibaba.nacos.api.config.ConfigService;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.nepxion.discovery.common.nacos.constant.NacosConstant;
+import com.nepxion.discovery.common.nacos.operation.NacosOperation;
+import com.nepxion.discovery.common.util.PropertiesUtil;
+
+@Configuration
+public class NacosAutoConfiguration {
+ @Autowired
+ private Environment environment;
+
+ @Bean
+ @ConditionalOnMissingBean
+ public ConfigService nacosConfigService() throws NacosException {
+ Properties properties = createNacosProperties(environment, true);
+
+ return NacosFactory.createConfigService(properties);
+ }
+
+ @Bean
+ public NacosOperation nacosOperation() {
+ return new NacosOperation();
+ }
+
+ public static Properties createNacosProperties(Environment environment, boolean enableRemoteSyncConfig) {
+ Properties properties = new Properties();
+
+ // 支持从spring.cloud.nacos.config前缀方式获取
+ PropertiesUtil.enrichProperties(properties, environment, NacosConstant.SPRING_CLOUD_NACOS_CONFIG_PREFIX, true, true);
+
+ // 支持从nacos前缀方式获取
+ PropertiesUtil.enrichProperties(properties, environment, NacosConstant.NACOS_PREFIX, true, true);
+
+ properties.put(NacosConstant.ENABLE_REMOTE_SYNC_CONFIG, Boolean.toString(enableRemoteSyncConfig));
+
+ return properties;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/constant/NacosConstant.java b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/constant/NacosConstant.java
new file mode 100644
index 0000000000..70fcc75176
--- /dev/null
+++ b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/constant/NacosConstant.java
@@ -0,0 +1,22 @@
+package com.nepxion.discovery.common.nacos.constant;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.alibaba.nacos.api.PropertyKeyConst;
+
+public class NacosConstant extends PropertyKeyConst {
+ public static final String NACOS_PREFIX = "nacos";
+ public static final String NACOS_TIMEOUT = "nacos.timout";
+
+ public static final String SPRING_CLOUD_NACOS_CONFIG_PREFIX = "spring.cloud.nacos.config";
+ public static final String SPRING_CLOUD_NACOS_CONFIG_TIMEOUT = "spring.cloud.nacos.config.timout";
+
+ public static final long NACOS_DEFAULT_TIMEOUT = 30000;
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosOperation.java b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosOperation.java
new file mode 100644
index 0000000000..dce569a69e
--- /dev/null
+++ b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosOperation.java
@@ -0,0 +1,85 @@
+package com.nepxion.discovery.common.nacos.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.concurrent.Executor;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+
+import com.alibaba.nacos.api.config.ConfigService;
+import com.alibaba.nacos.api.config.listener.Listener;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.nepxion.discovery.common.entity.FormatType;
+import com.nepxion.discovery.common.nacos.constant.NacosConstant;
+
+public class NacosOperation implements DisposableBean {
+ private static final Logger LOG = LoggerFactory.getLogger(NacosOperation.class);
+
+ @Autowired
+ private ConfigService nacosConfigService;
+
+ @Autowired
+ private Environment environment;
+
+ public String getConfig(String group, String serviceId) throws NacosException {
+ String timeout = environment.getProperty(NacosConstant.NACOS_TIMEOUT);
+ if (StringUtils.isEmpty(timeout)) {
+ timeout = environment.getProperty(NacosConstant.SPRING_CLOUD_NACOS_CONFIG_TIMEOUT);
+ }
+
+ return nacosConfigService.getConfig(serviceId, group, StringUtils.isNotEmpty(timeout) ? Long.valueOf(timeout) : NacosConstant.NACOS_DEFAULT_TIMEOUT);
+ }
+
+ public boolean removeConfig(String group, String serviceId) throws NacosException {
+ return nacosConfigService.removeConfig(serviceId, group);
+ }
+
+ public boolean publishConfig(String group, String serviceId, String config) throws NacosException {
+ return nacosConfigService.publishConfig(serviceId, group, config);
+ }
+
+ public boolean publishConfig(String group, String serviceId, String config, FormatType formatType) throws NacosException {
+ return nacosConfigService.publishConfig(serviceId, group, config, formatType.toString());
+ }
+
+ public Listener subscribeConfig(String group, String serviceId, Executor executor, NacosSubscribeCallback nacosSubscribeCallback) throws NacosException {
+ Listener listener = new Listener() {
+ @Override
+ public void receiveConfigInfo(String config) {
+ nacosSubscribeCallback.callback(config);
+ }
+
+ @Override
+ public Executor getExecutor() {
+ return executor;
+ }
+ };
+
+ nacosConfigService.addListener(serviceId, group, listener);
+
+ return listener;
+ }
+
+ public void unsubscribeConfig(String group, String serviceId, Listener listener) {
+ nacosConfigService.removeListener(serviceId, group, listener);
+ }
+
+ @Override
+ public void destroy() throws Exception {
+ nacosConfigService.shutDown();
+
+ LOG.info("Shutting down Nacos config service...");
+ }
+}
\ No newline at end of file
diff --git a/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosSubscribeCallback.java b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosSubscribeCallback.java
similarity index 100%
rename from discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosSubscribeCallback.java
rename to discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/operation/NacosSubscribeCallback.java
diff --git a/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/proccessor/NacosProcessor.java b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/proccessor/NacosProcessor.java
new file mode 100644
index 0000000000..af14cc6603
--- /dev/null
+++ b/discovery-commons/discovery-common-nacos/src/main/java/com/nepxion/discovery/common/nacos/proccessor/NacosProcessor.java
@@ -0,0 +1,97 @@
+package com.nepxion.discovery.common.nacos.proccessor;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.concurrent.ExecutorService;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.alibaba.nacos.api.config.listener.Listener;
+import com.nepxion.discovery.common.entity.ConfigType;
+import com.nepxion.discovery.common.nacos.operation.NacosOperation;
+import com.nepxion.discovery.common.nacos.operation.NacosSubscribeCallback;
+import com.nepxion.discovery.common.processor.DiscoveryConfigProcessor;
+import com.nepxion.discovery.common.thread.DiscoveryThreadPoolFactory;
+
+public abstract class NacosProcessor extends DiscoveryConfigProcessor {
+ private ExecutorService executorService = DiscoveryThreadPoolFactory.getExecutorService("nacos-config");
+
+ @Autowired
+ private NacosOperation nacosOperation;
+
+ private Listener listener;
+
+ @PostConstruct
+ public void initialize() {
+ beforeInitialization();
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logSubscribeStarted();
+
+ try {
+ listener = nacosOperation.subscribeConfig(group, dataId, executorService, new NacosSubscribeCallback() {
+ @Override
+ public void callback(String config) {
+ try {
+ callbackConfig(config);
+ } catch (Exception e) {
+ logCallbackFailed(e);
+ }
+ }
+ });
+ } catch (Exception e) {
+ logSubscribeFailed(e);
+ }
+
+ logGetStarted();
+
+ try {
+ String config = nacosOperation.getConfig(group, dataId);
+ if (config != null) {
+ callbackConfig(config);
+ } else {
+ logNotFound();
+ }
+ } catch (Exception e) {
+ logGetFailed(e);
+ }
+
+ afterInitialization();
+ }
+
+ @Override
+ public void destroy() {
+ if (listener == null) {
+ return;
+ }
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logUnsubscribeStarted();
+
+ try {
+ nacosOperation.unsubscribeConfig(group, dataId, listener);
+ } catch (Exception e) {
+ logUnsubscribeFailed(e);
+ }
+
+ executorService.shutdownNow();
+ }
+
+ @Override
+ public ConfigType getConfigType() {
+ return ConfigType.NACOS;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-nacos/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/discovery-commons/discovery-common-nacos/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 0000000000..63dbb1455d
--- /dev/null
+++ b/discovery-commons/discovery-common-nacos/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,16 @@
+{
+ "properties": [
+ {
+ "name": "nacos.timout",
+ "type": "java.lang.Integer",
+ "defaultValue": 30000,
+ "description": "Nacos timout."
+ },
+ {
+ "name": "spring.cloud.nacos.config.timout",
+ "type": "java.lang.Integer",
+ "defaultValue": 30000,
+ "description": "Spring Cloud Nacos config timout."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-nacos/src/main/resources/META-INF/spring.factories b/discovery-commons/discovery-common-nacos/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..5dace7e0d9
--- /dev/null
+++ b/discovery-commons/discovery-common-nacos/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.nepxion.discovery.common.nacos.configuration.NacosAutoConfiguration
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-redis/pom.xml b/discovery-commons/discovery-common-redis/pom.xml
new file mode 100644
index 0000000000..1ad9538174
--- /dev/null
+++ b/discovery-commons/discovery-common-redis/pom.xml
@@ -0,0 +1,28 @@
+
+
+ discovery-common-redis
+ Nepxion Discovery Common Redis
+ jar
+ 4.0.0
+ Nepxion Discovery is a solution for Spring Cloud with blue green, gray, weight, limitation, circuit breaker, degrade, isolation, monitor, tracing, dye, failover, async agent
+ http://www.nepxion.com
+
+
+ com.nepxion
+ discovery-commons
+ 6.23.0
+
+
+
+
+ ${project.groupId}
+ discovery-common
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/configuration/RedisAutoConfiguration.java b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/configuration/RedisAutoConfiguration.java
new file mode 100644
index 0000000000..53a44f9890
--- /dev/null
+++ b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/configuration/RedisAutoConfiguration.java
@@ -0,0 +1,48 @@
+package com.nepxion.discovery.common.redis.configuration;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @author JiKai Sun
+ * @version 1.0
+ */
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+
+import com.nepxion.discovery.common.redis.operation.RedisOperation;
+
+@Configuration
+public class RedisAutoConfiguration {
+ @Autowired
+ private StringRedisTemplate stringRedisTemplate;
+
+ @Autowired
+ private RedisConnectionFactory redisConnectionFactory;
+
+ @Bean
+ public RedisMessageListenerContainer configMessageListenerContainer() {
+ RedisMessageListenerContainer configMessageListenerContainer = new RedisMessageListenerContainer();
+ configMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
+
+ return configMessageListenerContainer;
+ }
+
+ @Bean
+ public HashOperations hashOperations() {
+ return stringRedisTemplate.opsForHash();
+ }
+
+ @Bean
+ public RedisOperation redisOperation() {
+ return new RedisOperation();
+ }
+}
\ No newline at end of file
diff --git a/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/constant/RedisConstant.java b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/constant/RedisConstant.java
similarity index 86%
rename from discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/constant/RedisConstant.java
rename to discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/constant/RedisConstant.java
index 84ff9722ef..06ca30bf46 100644
--- a/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/constant/RedisConstant.java
+++ b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/constant/RedisConstant.java
@@ -11,5 +11,5 @@
*/
public class RedisConstant {
- public static final String TYPE = "Redis";
+
}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisOperation.java b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisOperation.java
new file mode 100644
index 0000000000..68c8bf3d74
--- /dev/null
+++ b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisOperation.java
@@ -0,0 +1,76 @@
+package com.nepxion.discovery.common.redis.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @author JiKai Sun
+ * @version 1.0
+ */
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.listener.PatternTopic;
+import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
+
+public class RedisOperation implements DisposableBean {
+ private static final Logger LOG = LoggerFactory.getLogger(RedisOperation.class);
+
+ @Autowired
+ private StringRedisTemplate stringRedisTemplate;
+
+ @Autowired
+ private HashOperations hashOperations;
+
+ @Autowired
+ private RedisMessageListenerContainer configMessageListenerContainer;
+
+ public String getConfig(String group, String serviceId) {
+ return hashOperations.get(group, serviceId);
+ }
+
+ public boolean removeConfig(String group, String serviceId) {
+ publishConfig(group, serviceId, StringUtils.EMPTY);
+
+ return hashOperations.delete(group, serviceId) == 1;
+ }
+
+ public boolean publishConfig(String group, String serviceId, String config) {
+ hashOperations.put(group, serviceId, config);
+ stringRedisTemplate.convertAndSend(group + "-" + serviceId, config);
+
+ return true;
+ }
+
+ public MessageListenerAdapter subscribeConfig(String group, String serviceId, Object delegate, String listenerMethod) {
+ MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(delegate, listenerMethod);
+ messageListenerAdapter.afterPropertiesSet();
+
+ configMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(group + "-" + serviceId));
+
+ return messageListenerAdapter;
+ }
+
+ public void unsubscribeConfig(String group, String serviceId, MessageListenerAdapter messageListenerAdapter) {
+ configMessageListenerContainer.removeMessageListener(messageListenerAdapter, new PatternTopic(group + "-" + serviceId));
+ }
+
+ public void subscribeConfig(String config, RedisSubscribeCallback redisSubscribeCallback) {
+ redisSubscribeCallback.callback(config);
+ }
+
+ @Override
+ public void destroy() throws Exception {
+ configMessageListenerContainer.destroy();
+
+ LOG.info("Shutting down Redis message listener...");
+ }
+}
\ No newline at end of file
diff --git a/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisSubscribeCallback.java b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisSubscribeCallback.java
similarity index 100%
rename from discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisSubscribeCallback.java
rename to discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/operation/RedisSubscribeCallback.java
diff --git a/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/proccessor/RedisProcessor.java b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/proccessor/RedisProcessor.java
new file mode 100644
index 0000000000..435a32c653
--- /dev/null
+++ b/discovery-commons/discovery-common-redis/src/main/java/com/nepxion/discovery/common/redis/proccessor/RedisProcessor.java
@@ -0,0 +1,94 @@
+package com.nepxion.discovery.common.redis.proccessor;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
+
+import com.nepxion.discovery.common.entity.ConfigType;
+import com.nepxion.discovery.common.processor.DiscoveryConfigProcessor;
+import com.nepxion.discovery.common.redis.operation.RedisOperation;
+import com.nepxion.discovery.common.redis.operation.RedisSubscribeCallback;
+
+public abstract class RedisProcessor extends DiscoveryConfigProcessor {
+ @Autowired
+ private RedisOperation redisOperation;
+
+ private MessageListenerAdapter messageListenerAdapter;
+
+ @PostConstruct
+ public void initialize() {
+ beforeInitialization();
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logSubscribeStarted();
+
+ try {
+ messageListenerAdapter = redisOperation.subscribeConfig(group, dataId, this, "subscribeConfig");
+ } catch (Exception e) {
+ logSubscribeFailed(e);
+ }
+
+ logGetStarted();
+
+ try {
+ String config = redisOperation.getConfig(group, dataId);
+ if (config != null) {
+ callbackConfig(config);
+ } else {
+ logNotFound();
+ }
+ } catch (Exception e) {
+ logGetFailed(e);
+ }
+
+ afterInitialization();
+ }
+
+ public void subscribeConfig(String config) {
+ redisOperation.subscribeConfig(config, new RedisSubscribeCallback() {
+ @Override
+ public void callback(String config) {
+ try {
+ callbackConfig(config);
+ } catch (Exception e) {
+ logCallbackFailed(e);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void destroy() {
+ if (messageListenerAdapter == null) {
+ return;
+ }
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logUnsubscribeStarted();
+
+ try {
+ redisOperation.unsubscribeConfig(group, dataId, messageListenerAdapter);
+ } catch (Exception e) {
+ logUnsubscribeFailed(e);
+ }
+ }
+
+ @Override
+ public ConfigType getConfigType() {
+ return ConfigType.REDIS;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-redis/src/main/resources/META-INF/spring.factories b/discovery-commons/discovery-common-redis/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..fcedb94f7b
--- /dev/null
+++ b/discovery-commons/discovery-common-redis/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.nepxion.discovery.common.redis.configuration.RedisAutoConfiguration
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/pom.xml b/discovery-commons/discovery-common-zookeeper/pom.xml
new file mode 100644
index 0000000000..28313bea2c
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/pom.xml
@@ -0,0 +1,33 @@
+
+
+ discovery-common-zookeeper
+ Nepxion Discovery Common Zookeeper
+ jar
+ 4.0.0
+ Nepxion Discovery is a solution for Spring Cloud with blue green, gray, weight, limitation, circuit breaker, degrade, isolation, monitor, tracing, dye, failover, async agent
+ http://www.nepxion.com
+
+
+ com.nepxion
+ discovery-commons
+ 6.23.0
+
+
+
+
+ ${project.groupId}
+ discovery-common
+
+
+
+ org.apache.curator
+ curator-framework
+
+
+
+ org.apache.curator
+ curator-recipes
+
+
+
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/configuration/ZookeeperAutoConfiguration.java b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/configuration/ZookeeperAutoConfiguration.java
new file mode 100644
index 0000000000..acb79e90c6
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/configuration/ZookeeperAutoConfiguration.java
@@ -0,0 +1,52 @@
+package com.nepxion.discovery.common.zookeeper.configuration;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author rotten
+ * @version 1.0
+ */
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.retry.ExponentialBackoffRetry;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+
+import com.nepxion.discovery.common.exception.DiscoveryException;
+import com.nepxion.discovery.common.zookeeper.constant.ZookeeperConstant;
+import com.nepxion.discovery.common.zookeeper.operation.ZookeeperOperation;
+
+@Configuration
+public class ZookeeperAutoConfiguration {
+ @Autowired
+ private Environment environment;
+
+ @Bean
+ public ZookeeperOperation zookeeperOperation() {
+ return new ZookeeperOperation();
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public CuratorFramework curatorFramework() {
+ String connectString = environment.getProperty(ZookeeperConstant.ZOOKEEPER_CONNECT_STRING);
+ if (StringUtils.isEmpty(connectString)) {
+ throw new DiscoveryException(ZookeeperConstant.ZOOKEEPER_CONNECT_STRING + " can't be null or empty");
+ }
+
+ int retryCount = environment.getProperty(ZookeeperConstant.ZOOKEEPER_RETRY_COUNT, Integer.class, ZookeeperConstant.ZOOKEEPER_DEFAULT_RETRY_COUNT_VALUE);
+ int sleepTime = environment.getProperty(ZookeeperConstant.ZOOKEEPER_SLEEP_TIME, Integer.class, ZookeeperConstant.ZOOKEEPER_DEFAULT_SLEEP_TIME_VALUE);
+
+ CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(connectString).retryPolicy(new ExponentialBackoffRetry(sleepTime, retryCount)).build();
+ curatorFramework.start();
+
+ return curatorFramework;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/constant/ZookeeperConstant.java b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/constant/ZookeeperConstant.java
new file mode 100644
index 0000000000..620e5967f2
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/constant/ZookeeperConstant.java
@@ -0,0 +1,18 @@
+package com.nepxion.discovery.common.zookeeper.constant;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author rotten
+ * @version 1.0
+ */
+
+public class ZookeeperConstant {
+ public static final String ZOOKEEPER_CONNECT_STRING = "zookeeper.connect-string";
+ public static final String ZOOKEEPER_RETRY_COUNT = "zookeeper.retry-count";
+ public static final String ZOOKEEPER_SLEEP_TIME = "zookeeper.sleep-time";
+ public static final int ZOOKEEPER_DEFAULT_RETRY_COUNT_VALUE = 3;
+ public static final int ZOOKEEPER_DEFAULT_SLEEP_TIME_VALUE = 3000;
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperListener.java b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperListener.java
new file mode 100644
index 0000000000..a7f5b6f922
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperListener.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.zookeeper.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.IOException;
+
+import org.apache.curator.framework.recipes.cache.NodeCache;
+import org.apache.curator.framework.recipes.cache.NodeCacheListener;
+
+public class ZookeeperListener {
+ private NodeCache nodeCache;
+ private NodeCacheListener nodeCacheListener;
+
+ public ZookeeperListener(NodeCache nodeCache, NodeCacheListener nodeCacheListener) {
+ this.nodeCache = nodeCache;
+ this.nodeCacheListener = nodeCacheListener;
+ }
+
+ public NodeCache getNodeCache() {
+ return nodeCache;
+ }
+
+ public NodeCacheListener getNodeCacheListener() {
+ return nodeCacheListener;
+ }
+
+ public void addListener() {
+ nodeCache.getListenable().addListener(nodeCacheListener);
+ }
+
+ public void removeListener() throws IOException {
+ nodeCache.getListenable().removeListener(nodeCacheListener);
+ nodeCache.close();
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperOperation.java b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperOperation.java
new file mode 100644
index 0000000000..9b1feeabde
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperOperation.java
@@ -0,0 +1,143 @@
+package com.nepxion.discovery.common.zookeeper.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author rotten
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.recipes.cache.ChildData;
+import org.apache.curator.framework.recipes.cache.NodeCache;
+import org.apache.curator.framework.recipes.cache.NodeCacheListener;
+import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.data.Stat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class ZookeeperOperation implements DisposableBean {
+ private static final Logger LOG = LoggerFactory.getLogger(ZookeeperOperation.class);
+
+ @Autowired
+ private CuratorFramework curatorFramework;
+
+ public String getConfig(String group, String serviceId) throws Exception {
+ String path = getPath(group, serviceId);
+
+ boolean hasPath = hasPath(path);
+ if (!hasPath) {
+ return null;
+ }
+
+ return convertConfig(path);
+ }
+
+ public boolean removeConfig(String group, String serviceId) throws Exception {
+ String path = getPath(group, serviceId);
+
+ boolean hasPath = hasPath(path);
+ if (!hasPath) {
+ return false;
+ }
+
+ curatorFramework.delete().forPath(path);
+
+ return true;
+ }
+
+ public boolean publishConfig(String group, String serviceId, String config) throws Exception {
+ byte[] bytes = config.getBytes();
+ if (bytes == null) {
+ return false;
+ }
+
+ String path = getPath(group, serviceId);
+ Stat stat = curatorFramework.checkExists().forPath(path);
+ if (stat == null) {
+ curatorFramework.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path, bytes);
+ } else {
+ curatorFramework.setData().forPath(path, bytes);
+ }
+
+ return true;
+ }
+
+ public ZookeeperListener subscribeConfig(String group, String serviceId, ZookeeperSubscribeCallback zookeeperSubscribeCallback) throws Exception {
+ String path = getPath(group, serviceId);
+
+ NodeCache nodeCache = new NodeCache(curatorFramework, path);
+ nodeCache.start(true);
+
+ NodeCacheListener nodeCacheListener = new NodeCacheListener() {
+ @Override
+ public void nodeChanged() throws Exception {
+ String config = convertConfig(nodeCache);
+
+ zookeeperSubscribeCallback.callback(config);
+ }
+ };
+
+ ZookeeperListener zookeeperListener = new ZookeeperListener(nodeCache, nodeCacheListener);
+ zookeeperListener.addListener();
+
+ return zookeeperListener;
+ }
+
+ public void unsubscribeConfig(String group, String serviceId, ZookeeperListener zookeeperListener) throws Exception {
+ zookeeperListener.removeListener();
+ }
+
+ public String getPath(String group, String serviceId) {
+ return String.format("/%s/%s", group, serviceId);
+ }
+
+ public boolean hasPath(String path) throws Exception {
+ return curatorFramework.checkExists().forPath(path) != null;
+ }
+
+ public boolean hasPath(String group, String serviceId) throws Exception {
+ String path = getPath(group, serviceId);
+
+ return hasPath(path);
+ }
+
+ public String convertConfig(String path) throws Exception {
+ return convertConfig(curatorFramework, path);
+ }
+
+ public String convertConfig(CuratorFramework curatorFramework, String path) throws Exception {
+ byte[] bytes = curatorFramework.getData().forPath(path);
+ if (bytes == null) {
+ return null;
+ }
+
+ return new String(bytes);
+ }
+
+ public String convertConfig(NodeCache nodeCache) throws Exception {
+ ChildData childData = nodeCache.getCurrentData();
+ if (childData == null) {
+ return null;
+ }
+
+ byte[] bytes = childData.getData();
+ if (bytes == null) {
+ return null;
+ }
+
+ return new String(bytes);
+ }
+
+ @Override
+ public void destroy() throws Exception {
+ curatorFramework.close();
+
+ LOG.info("Shutting down Zookeeper CuratorFramework...");
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperSubscribeCallback.java b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperSubscribeCallback.java
new file mode 100644
index 0000000000..34eb40d6e5
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/operation/ZookeeperSubscribeCallback.java
@@ -0,0 +1,14 @@
+package com.nepxion.discovery.common.zookeeper.operation;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author rotten
+ * @version 1.0
+ */
+
+public interface ZookeeperSubscribeCallback {
+ void callback(String config);
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/proccessor/ZookeeperProcessor.java b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/proccessor/ZookeeperProcessor.java
new file mode 100644
index 0000000000..c078418526
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/src/main/java/com/nepxion/discovery/common/zookeeper/proccessor/ZookeeperProcessor.java
@@ -0,0 +1,90 @@
+package com.nepxion.discovery.common.zookeeper.proccessor;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.nepxion.discovery.common.entity.ConfigType;
+import com.nepxion.discovery.common.processor.DiscoveryConfigProcessor;
+import com.nepxion.discovery.common.zookeeper.operation.ZookeeperListener;
+import com.nepxion.discovery.common.zookeeper.operation.ZookeeperOperation;
+import com.nepxion.discovery.common.zookeeper.operation.ZookeeperSubscribeCallback;
+
+public abstract class ZookeeperProcessor extends DiscoveryConfigProcessor {
+ @Autowired
+ private ZookeeperOperation zookeeperOperation;
+
+ private ZookeeperListener zookeeperListener;
+
+ @PostConstruct
+ public void initialize() {
+ beforeInitialization();
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logSubscribeStarted();
+
+ try {
+ zookeeperListener = zookeeperOperation.subscribeConfig(group, dataId, new ZookeeperSubscribeCallback() {
+ @Override
+ public void callback(String config) {
+ try {
+ callbackConfig(config);
+ } catch (Exception e) {
+ logCallbackFailed(e);
+ }
+ }
+ });
+ } catch (Exception e) {
+ logSubscribeFailed(e);
+ }
+
+ logGetStarted();
+
+ try {
+ String config = zookeeperOperation.getConfig(group, dataId);
+ if (config != null) {
+ callbackConfig(config);
+ } else {
+ logNotFound();
+ }
+ } catch (Exception e) {
+ logGetFailed(e);
+ }
+
+ afterInitialization();
+ }
+
+ @Override
+ public void destroy() {
+ if (zookeeperListener == null) {
+ return;
+ }
+
+ String group = getGroup();
+ String dataId = getDataId();
+
+ logUnsubscribeStarted();
+
+ try {
+ zookeeperOperation.unsubscribeConfig(group, dataId, zookeeperListener);
+ } catch (Exception e) {
+ logUnsubscribeFailed(e);
+ }
+ }
+
+ @Override
+ public ConfigType getConfigType() {
+ return ConfigType.ZOOKEEPER;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/discovery-commons/discovery-common-zookeeper/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 0000000000..15ed6c4fb0
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,21 @@
+{
+ "properties": [
+ {
+ "name": "zookeeper.connect-string",
+ "type": "java.lang.String",
+ "description": "Zookeeper connect string."
+ },
+ {
+ "name": "zookeeper.retry-count",
+ "type": "java.lang.Integer",
+ "defaultValue": 3,
+ "description": "Zookeeper retry count."
+ },
+ {
+ "name": "zookeeper.sleep-time",
+ "type": "java.lang.Integer",
+ "defaultValue": 3000,
+ "description": "Zookeeper sleep time."
+ }
+ ]
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common-zookeeper/src/main/resources/META-INF/spring.factories b/discovery-commons/discovery-common-zookeeper/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..4afe740a1d
--- /dev/null
+++ b/discovery-commons/discovery-common-zookeeper/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.nepxion.discovery.common.zookeeper.configuration.ZookeeperAutoConfiguration
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/pom.xml b/discovery-commons/discovery-common/pom.xml
new file mode 100644
index 0000000000..62bc2aae25
--- /dev/null
+++ b/discovery-commons/discovery-common/pom.xml
@@ -0,0 +1,90 @@
+
+
+ discovery-common
+ Nepxion Discovery Common
+ jar
+ 4.0.0
+ Nepxion Discovery is a solution for Spring Cloud with blue green, gray, weight, limitation, circuit breaker, degrade, isolation, monitor, tracing, dye, failover, async agent
+ http://www.nepxion.com
+
+
+ com.nepxion
+ discovery-commons
+ 6.23.0
+
+
+
+
+ javax.annotation
+ javax.annotation-api
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+ org.apache.commons
+ commons-collections4
+
+
+
+ commons-io
+ commons-io
+
+
+
+ org.dom4j
+ dom4j
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+
+ org.yaml
+ snakeyaml
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+
+ org.springframework
+ spring-web
+
+
+
+ org.springframework
+ spring-expression
+
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+
+
+
+ com.alibaba.spring
+ spring-context-support
+ provided
+
+
+
+ ch.qos.logback
+ logback-classic
+ provided
+
+
+
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java
new file mode 100644
index 0000000000..4c6a9e9e11
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryConstant.java
@@ -0,0 +1,262 @@
+package com.nepxion.discovery.common.constant;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public class DiscoveryConstant {
+ public static final String DISCOVERY_VERSION = "6.23.0";
+
+ public static final String NEPXION = "nepxion";
+ public static final String NEPXION_UPPERCASE = "NEPXION";
+ public static final String NEPXION_FIRST_UPPERCASE = "Nepxion";
+ public static final String NEPXION_DISCOVERY = "Nepxion Discovery";
+
+ public static final String SPRING_APPLICATION_DISCOVERY_PLUGIN = "spring.application.discovery.plugin";
+ public static final String SPRING_APPLICATION_DISCOVERY_VERSION = "spring.application.discovery.version";
+ public static final String SPRING_APPLICATION_DISCOVERY_AGENT_VERSION = "spring.application.discovery.agent.version";
+ public static final String SPRING_APPLICATION_WEIGHT_RANDOM_TYPE = "spring.application.weight.random.type";
+ public static final String SPRING_APPLICATION_CONFIG_FORMAT = "spring.application.config.format";
+ public static final String SPRING_APPLICATION_CONFIG_PATH = "spring.application.config.path";
+ public static final String SPRING_APPLICATION_GROUP_KEY = "spring.application.group.key";
+ public static final String SPRING_APPLICATION_CONTEXT_PATH = "spring.application.context-path";
+ public static final String SPRING_APPLICATION_DEFAULT_PROPERTIES_PATH = "spring.application.default.properties.path";
+ public static final String SPRING_APPLICATION_DEFAULT_PROPERTIES_PATH_VALUE = "spring-application-default";
+ public static final String SPRING_APPLICATION_NO_SERVERS_NOTIFY_ENABLED = "spring.application.no.servers.notify.enabled";
+ public static final String SPRING_APPLICATION_PARAMETER_EVENT_ONSTART_ENABLED = "spring.application.parameter.event.onstart.enabled";
+
+ public static final String MAP_WEIGHT_RANDOM = "MapWeightRandom";
+ public static final String ARRAY_WEIGHT_RANDOM = "ArrayWeightRandom";
+
+ public static final String CONTEXT_PATH = "server.servlet.context-path";
+
+ public static final String SPRING_APPLICATION_GROUP_GENERATOR_ENABLED = "spring.application.group.generator.enabled";
+ public static final String SPRING_APPLICATION_GROUP_GENERATOR_LENGTH = "spring.application.group.generator.length";
+ public static final String SPRING_APPLICATION_GROUP_GENERATOR_CHARACTER = "spring.application.group.generator.character";
+
+ public static final String SPRING_APPLICATION_GIT_GENERATOR_ENABLED = "spring.application.git.generator.enabled";
+ public static final String SPRING_APPLICATION_GIT_GENERATOR_PATH = "spring.application.git.generator.path";
+ public static final String SPRING_APPLICATION_GIT_VERSION_KEY = "spring.application.git.version.key";
+ public static final String GIT = "git";
+ public static final String GIT_COMMIT_ID = "git.commit.id";
+ public static final String GIT_COMMIT_ID_ABBREV = "git.commit.id.abbrev";
+ public static final String GIT_COMMIT_TIME = "git.commit.time";
+ public static final String GIT_BUILD_VERSION = "git.build.version";
+ public static final String GIT_TOTAL_COMMIT_COUNT = "git.total.commit.count";
+
+ public static final String APP_ID = "app.id";
+ public static final String SPRING_BOOT_VERSION = "spring.boot.version";
+ public static final String SPRING_APPLICATION_UUID = "spring.application.uuid";
+ public static final String SPRING_APPLICATION_NAME = "spring.application.name";
+ public static final String SPRING_APPLICATION_TYPE = "spring.application.type";
+ public static final String SPRING_APPLICATION_GATEWAY_TYPE = "spring.application.gateway.type";
+ public static final String SPRING_APPLICATION_PROTOCOL = "spring.application.protocol";
+ public static final String GROUP = "group";
+ public static final String SERVICE_ID = "serviceId";
+ public static final String HOST = "host";
+ public static final String PORT = "port";
+ public static final String METADATA = "metadata";
+ public static final String SPRING_CLOUD_DISCOVERY_PREFIX = "spring.cloud.discovery";
+
+ public static final String SERVICE = "service";
+ public static final String GATEWAY = "gateway";
+ public static final String CONSOLE = "console";
+ public static final String TEST = "test";
+
+ public static final String DYNAMIC_VERSION = "dynamic-version";
+ public static final String RULE = "rule";
+ public static final String DYNAMIC_RULE = "dynamic-rule";
+ public static final String DYNAMIC_GLOBAL_RULE = "dynamic-global-rule";
+ public static final String DYNAMIC_PARTIAL_RULE = "dynamic-partial-rule";
+ public static final String REACH_MAX_LIMITED_COUNT = "reach max limited count";
+ public static final String REGISTER_ISOLATION = "register isolation";
+
+ public static final String VERSION = "version";
+ public static final String REGION = "region";
+ public static final String ENVIRONMENT = "env";
+ public static final String ZONE = "zone";
+ public static final String ADDRESS = "address";
+ public static final String VERSION_WEIGHT = "version-weight";
+ public static final String REGION_WEIGHT = "region-weight";
+ public static final String VERSION_PREFER = "version-prefer";
+ public static final String VERSION_FAILOVER = "version-failover";
+ public static final String REGION_TRANSFER = "region-transfer";
+ public static final String REGION_FAILOVER = "region-failover";
+ public static final String ENVIRONMENT_FAILOVER = "env-failover";
+ public static final String ZONE_FAILOVER = "zone-failover";
+ public static final String ADDRESS_FAILOVER = "address-failover";
+ public static final String ID_BLACKLIST = "id-blacklist";
+ public static final String ADDRESS_BLACKLIST = "address-blacklist";
+ public static final String ACTIVE = "active";
+
+ public static final String N_D_PREFIX = "n-d-";
+ public static final String N_D_SERVICE_PREFIX = "n-d-service";
+
+ public static final String N_D_SERVICE_GROUP = "n-d-service-group";
+ public static final String N_D_SERVICE_TYPE = "n-d-service-type";
+ public static final String N_D_SERVICE_APP_ID = "n-d-service-app-id";
+ public static final String N_D_SERVICE_ID = "n-d-service-id";
+ public static final String N_D_SERVICE_ADDRESS = "n-d-service-address";
+ public static final String N_D_SERVICE_VERSION = "n-d-service-version";
+ public static final String N_D_SERVICE_REGION = "n-d-service-region";
+ public static final String N_D_SERVICE_ENVIRONMENT = "n-d-service-env";
+ public static final String N_D_SERVICE_ZONE = "n-d-service-zone";
+
+ public static final String N_D_GROUP = "n-d-group";
+ public static final String N_D_VERSION = "n-d-version";
+ public static final String N_D_REGION = "n-d-region";
+ public static final String N_D_ENVIRONMENT = "n-d-env";
+ public static final String N_D_ADDRESS = "n-d-address";
+ public static final String N_D_VERSION_WEIGHT = "n-d-version-weight";
+ public static final String N_D_REGION_WEIGHT = "n-d-region-weight";
+ public static final String N_D_VERSION_PREFER = "n-d-version-prefer";
+ public static final String N_D_VERSION_FAILOVER = "n-d-version-failover";
+ public static final String N_D_REGION_TRANSFER = "n-d-region-transfer";
+ public static final String N_D_REGION_FAILOVER = "n-d-region-failover";
+ public static final String N_D_ENVIRONMENT_FAILOVER = "n-d-env-failover";
+ public static final String N_D_ZONE_FAILOVER = "n-d-zone-failover";
+ public static final String N_D_ADDRESS_FAILOVER = "n-d-address-failover";
+ public static final String N_D_ID_BLACKLIST = "n-d-id-blacklist";
+ public static final String N_D_ADDRESS_BLACKLIST = "n-d-address-blacklist";
+
+ public static final String N_D_ACCESS_TOKEN = "n-d-access-token";
+ public static final String BEARER = "Bearer";
+
+ public static final String BLUE_GREEN = "blue-green";
+ public static final String BLUE_GREEN_BASIC = "blue-green-basic";
+ public static final String BLUE_BASIC = "blue-basic";
+
+ public static final String PORTAL = "portal";
+ public static final String BLUE = "blue";
+ public static final String GREEN = "green";
+ public static final String BASIC = "basic";
+ public static final String GRAY = "gray";
+ public static final String STABLE = "stable";
+ public static final String UNDEFINED = "undefined";
+
+ public static final String DOMAIN_GATEWAY = "domain-gateway";
+ public static final String NON_DOMAIN_GATEWAY = "non-domain-gateway";
+
+ public static final String SORT_BY_VERSION = "version";
+ public static final String SORT_BY_TIME = "time";
+
+ public static final String BLACKLIST = "blacklist";
+ public static final String WHITELIST = "whitelist";
+
+ public static final String TRACE_ID = "trace-id";
+ public static final String SPAN_ID = "span-id";
+ public static final String SPAN_TAG_PLUGIN_NAME = "plugin";
+
+ public static final String CLASS = "class";
+ public static final String METHOD = "method";
+ public static final String PARAMETER = "parameter";
+ public static final String RETURN = "return";
+ public static final String PARAMETER_MAP = "parameterMap";
+ public static final String EVENT = "event";
+ public static final String ERROR = "error";
+ public static final String ERROR_OBJECT = "error.object";
+
+ public static final String HEADER_TYPE = "Header";
+ public static final String PARAMETER_TYPE = "Parameter";
+ public static final String COOKIE_TYPE = "Cookie";
+
+ public static final String XML_FORMAT = "xml";
+ public static final String JSON_FORMAT = "json";
+ public static final String YAML_FORMAT = "yaml";
+ public static final String PROPERTIES_FORMAT = "properties";
+ public static final String HTML_FORMAT = "html";
+ public static final String TEXT_FORMAT = "text";
+ public static final String PREFIX_CLASSPATH = "classpath:";
+ public static final String PREFIX_FILE = "file:";
+
+ public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
+ public static final String ENCODING_UTF_8 = "UTF-8";
+ public static final String ENCODING_GBK = "GBK";
+ public static final String ENCODING_ISO_8859_1 = "ISO-8859-1";
+ public static final String SEPARATE = ";";
+ public static final String EQUALS = "=";
+ public static final String DASH = "-";
+
+ public static final String ASYNC = "async";
+ public static final String SYNC = "sync";
+ public static final String GLOBAL = "global";
+ public static final String PARTIAL = "partial";
+ public static final String NA = "N/A";
+ public static final String DEFAULT = "default";
+ public static final String UNKNOWN = "unknown";
+ public static final String IGNORED = "ignored";
+
+ public static final String ENDPOINT_SCAN_PACKAGES = "com.nepxion.discovery.plugin.admincenter.endpoint";
+ public static final String INSPECTOR_ENDPOINT_CLASS_NAME = "com.nepxion.discovery.plugin.admincenter.endpoint.InspectorEndpoint";
+ public static final String INSPECTOR_ENDPOINT_METHOD_NAME = "inspect";
+ public static final String INSPECTOR_ENDPOINT_URL = "inspector/inspect";
+ public static final String INSPECTOR_ENDPOINT_HEADER = "endpoint-inspector-inspect";
+
+ public static final String EXPRESSION_PREFIX = "H";
+ public static final String EXPRESSION_REGEX = "\\#" + EXPRESSION_PREFIX + "\\['\\S+'\\]";
+ public static final String EXPRESSION_SUB_PREFIX = "#" + EXPRESSION_PREFIX + "['";
+ public static final String EXPRESSION_SUB_SUFFIX = "']";
+
+ public static final String EXPRESSION_SINGLE_QUOTES_REGEX = "[^\\S\"']+|\"[^\"]*\"|'[^']*'";
+ public static final String EXPRESSION_SINGLE_QUOTES = "'";
+
+ public static final String EMPTY_XML_RULE = "\n\n ";
+ public static final String EMPTY_JSON_RULE_SINGLE = "{}";
+ public static final String EMPTY_JSON_RULE_MULTIPLE = "[]";
+
+ public static final String NACOS = "Nacos";
+ public static final String APOLLO = "Apollo";
+ public static final String REDIS = "Redis";
+ public static final String ZOOKEEPER = "Zookeeper";
+ public static final String CONSUL = "Consul";
+ public static final String ETCD = "Etcd";
+ public static final String EUREKA = "Eureka";
+ public static final String RIBBON = "Ribbon";
+ public static final String SPRING_CLOUD_LOADBALANCER = "Spring Cloud LoadBalancer";
+ public static final String FEIGN = "Feign";
+ public static final String REST_TEMPLATE = "RestTemplate";
+ public static final String WEB_CLIENT = "WebClient";
+ public static final String HYSTRIX = "Hystrix";
+ public static final String SENTINEL = "Sentinel";
+ public static final String OPENTELEMETRY = "OpenTelemetry";
+ public static final String OPENTRACING = "OpenTracing";
+ public static final String SKYWALKING = "SkyWalking";
+
+ public static final String SPRING_CLOUD_GATEWAY = "Spring Cloud Gateway";
+ public static final String SPRING_CLOUD_GATEWAY_TYPE = "spring-cloud-gateway";
+ public static final String SPRING_CLOUD_GATEWAY_DYNAMIC_ROUTE_DESCRIPTION = "Gateway dynamic route";
+
+ public static final String ZUUL = "Zuul";
+ public static final String ZUUL_TYPE = "zuul";
+ public static final String ZUUL_DYNAMIC_ROUTE_DESCRIPTION = "Zuul dynamic route";
+
+ public static final String DYNAMIC_ROUTE_KEY = "dynamic-route";
+
+ public static final String SENTINEL_FLOW = "flow";
+ public static final String SENTINEL_DEGRADE = "degrade";
+ public static final String SENTINEL_AUTHORITY = "authority";
+ public static final String SENTINEL_SYSTEM = "system";
+ public static final String SENTINEL_PARAM_FLOW = "param-flow";
+
+ public static final String SENTINEL_FLOW_KEY = "sentinel-flow";
+ public static final String SENTINEL_DEGRADE_KEY = "sentinel-degrade";
+ public static final String SENTINEL_AUTHORITY_KEY = "sentinel-authority";
+ public static final String SENTINEL_SYSTEM_KEY = "sentinel-system";
+ public static final String SENTINEL_PARAM_FLOW_KEY = "sentinel-param-flow";
+
+ public static final String SENTINEL_FLOW_DESCRIPTION = "Sentinel flow rules";
+ public static final String SENTINEL_DEGRADE_DESCRIPTION = "Sentinel degrade rules";
+ public static final String SENTINEL_AUTHORITY_DESCRIPTION = "Sentinel authority rules";
+ public static final String SENTINEL_SYSTEM_DESCRIPTION = "Sentinel system rules";
+ public static final String SENTINEL_PARAM_FLOW_DESCRIPTION = "Sentinel param flow rules";
+
+ public static final String SENTINEL_PASS_QPS_KEY = "sentinel-pass-qps";
+ public static final String SENTINEL_BLOCK_QPS_KEY = "sentinel-block-qps";
+ public static final String SENTINEL_SUCCESS_QPS_KEY = "sentinel-success-qps";
+ public static final String SENTINEL_EXCEPTION_QPS_KEY = "sentinel-exception-qps";
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryMetaDataConstant.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryMetaDataConstant.java
new file mode 100644
index 0000000000..9c91fea664
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoveryMetaDataConstant.java
@@ -0,0 +1,29 @@
+package com.nepxion.discovery.common.constant;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public class DiscoveryMetaDataConstant {
+ public static final String SPRING_APPLICATION_DISCOVERY_PLUGIN = "spring_application_discovery_plugin";
+ public static final String SPRING_APPLICATION_DISCOVERY_VERSION = "spring_application_discovery_version";
+ public static final String SPRING_APPLICATION_DISCOVERY_AGENT_VERSION = "spring_application_discovery_agent_version";
+
+ public static final String SPRING_APPLICATION_GROUP_KEY = "spring_application_group_key";
+ public static final String SPRING_APPLICATION_CONTEXT_PATH = "spring_application_context-path";
+
+ public static final String SPRING_BOOT_VERSION = "spring_boot_version";
+ public static final String SPRING_APPLICATION_UUID = "spring_application_uuid";
+ public static final String SPRING_APPLICATION_APP_ID = "spring_application_app_id";
+ public static final String SPRING_APPLICATION_NAME = "spring_application_name";
+ public static final String SPRING_APPLICATION_TYPE = "spring_application_type";
+ public static final String SPRING_APPLICATION_GATEWAY_TYPE = "spring_application_gateway_type";
+ public static final String SPRING_APPLICATION_PROTOCOL = "spring_application_protocol";
+
+ public static final String SEPARATE = "_";
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoverySwaggerConstant.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoverySwaggerConstant.java
new file mode 100644
index 0000000000..96d98e4758
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/constant/DiscoverySwaggerConstant.java
@@ -0,0 +1,34 @@
+package com.nepxion.discovery.common.constant;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public class DiscoverySwaggerConstant {
+ public static final String SWAGGER_ENABLED = "swagger.enabled";
+
+ public static final String SWAGGER_SERVICE_GROUP = "swagger.service.group";
+ public static final String SWAGGER_SERVICE_PACKAGES = "swagger.service.packages";
+ public static final String SWAGGER_SERVICE_DESCRIPTION = "swagger.service.description";
+ public static final String SWAGGER_SERVICE_VERSION = "swagger.service.version";
+ public static final String SWAGGER_SERVICE_LICENSE_NAME = "swagger.service.license.name";
+ public static final String SWAGGER_SERVICE_LICENSE_URL = "swagger.service.license.url";
+ public static final String SWAGGER_SERVICE_CONTACT_NAME = "swagger.service.contact.name";
+ public static final String SWAGGER_SERVICE_CONTACT_URL = "swagger.service.contact.url";
+ public static final String SWAGGER_SERVICE_CONTACT_EMAIL = "swagger.service.contact.email";
+ public static final String SWAGGER_SERVICE_TERMSOFSERVICE_URL = "swagger.service.termsOfService.url";
+
+ public static final String SWAGGER_DEFAULT_GROUP_VALUE = DiscoveryConstant.NEPXION_DISCOVERY;
+ public static final String SWAGGER_DEFAULT_VERSION_VALUE = DiscoveryConstant.DISCOVERY_VERSION;
+ public static final String SWAGGER_DEFAULT_LICENSE_NAME_VALUE = "Apache License 2.0";
+ public static final String SWAGGER_DEFAULT_LICENSE_URL_VALUE = "http://www.apache.org/licenses/LICENSE-2.0";
+ public static final String SWAGGER_DEFAULT_CONTACT_NAME_VALUE = DiscoveryConstant.NEPXION_FIRST_UPPERCASE;
+ public static final String SWAGGER_DEFAULT_CONTACT_URL_VALUE = "https://github.com/Nepxion/Discovery";
+ public static final String SWAGGER_DEFAULT_CONTACT_EMAIL_VALUE = "1394997@qq.com";
+ public static final String SWAGGER_DEFAULT_TERMSOFSERVICE_URL_VALUE = "http://nepxion.com/discovery";
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/context/DiscoveryMetaDataPreInstallation.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/context/DiscoveryMetaDataPreInstallation.java
new file mode 100644
index 0000000000..a4b20096b1
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/context/DiscoveryMetaDataPreInstallation.java
@@ -0,0 +1,21 @@
+package com.nepxion.discovery.common.context;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class DiscoveryMetaDataPreInstallation {
+ private static Map metadata = new LinkedHashMap();
+
+ public static Map getMetadata() {
+ return metadata;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/delegate/DiscoveryClientDelegate.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/delegate/DiscoveryClientDelegate.java
new file mode 100644
index 0000000000..4abe572174
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/delegate/DiscoveryClientDelegate.java
@@ -0,0 +1,14 @@
+package com.nepxion.discovery.common.delegate;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public interface DiscoveryClientDelegate {
+ T getDelegate();
+}
\ No newline at end of file
diff --git a/discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JConstant.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JConstant.java
similarity index 83%
rename from discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JConstant.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JConstant.java
index f84490ebfc..db75bfa0c5 100644
--- a/discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JConstant.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JConstant.java
@@ -1,4 +1,4 @@
-package com.nepxion.discovery.plugin.configcenter.parser.xml.dom4j;
+package com.nepxion.discovery.common.dom4j;
/**
* Title: Nepxion Discovery
diff --git a/discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JParser.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JParser.java
similarity index 97%
rename from discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JParser.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JParser.java
index 66637b91e0..6659100759 100644
--- a/discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JParser.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JParser.java
@@ -1,4 +1,4 @@
-package com.nepxion.discovery.plugin.configcenter.parser.xml.dom4j;
+package com.nepxion.discovery.common.dom4j;
/**
* Title: Nepxion Discovery
diff --git a/discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JReader.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JReader.java
similarity index 98%
rename from discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JReader.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JReader.java
index 58b0c055da..efe7b39cf3 100644
--- a/discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JReader.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JReader.java
@@ -1,4 +1,4 @@
-package com.nepxion.discovery.plugin.configcenter.parser.xml.dom4j;
+package com.nepxion.discovery.common.dom4j;
/**
* Title: Nepxion Discovery
diff --git a/discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JWriter.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JWriter.java
similarity index 95%
rename from discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JWriter.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JWriter.java
index adc03d6755..40b5a7b486 100644
--- a/discovery-plugin-config-center/src/main/java/com/nepxion/discovery/plugin/configcenter/parser/xml/dom4j/Dom4JWriter.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/dom4j/Dom4JWriter.java
@@ -1,4 +1,4 @@
-package com.nepxion.discovery.plugin.configcenter.parser.xml.dom4j;
+package com.nepxion.discovery.common.dom4j;
/**
* Title: Nepxion Discovery
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AddressEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AddressEntity.java
new file mode 100644
index 0000000000..f7cee0b217
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AddressEntity.java
@@ -0,0 +1,55 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class AddressEntity implements Serializable {
+ private static final long serialVersionUID = -7878358363389123165L;
+
+ private String host;
+ private int port;
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AddressWeightEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AddressWeightEntity.java
new file mode 100644
index 0000000000..2984a84364
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AddressWeightEntity.java
@@ -0,0 +1,14 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public class AddressWeightEntity extends MapWeightEntity {
+ private static final long serialVersionUID = 8727285274914899508L;
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ArithmeticType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ArithmeticType.java
new file mode 100644
index 0000000000..95cdaf0e0e
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ArithmeticType.java
@@ -0,0 +1,45 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public enum ArithmeticType {
+ EQUAL("=="),
+ NOT_EQUAL("!="),
+ GREATER_THAN(">"),
+ GREATER_THAN_OR_EQUAL(">="),
+ LESS_THAN("<"),
+ LESS_THAN_OR_EQUAL("<="),
+ MATCHES("matches");
+
+ private String value;
+
+ private ArithmeticType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ArithmeticType fromString(String value) {
+ for (ArithmeticType type : ArithmeticType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AuthenticationEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AuthenticationEntity.java
new file mode 100644
index 0000000000..7331df3012
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/AuthenticationEntity.java
@@ -0,0 +1,64 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class AuthenticationEntity implements Serializable {
+ private static final long serialVersionUID = -4809725024485088246L;
+
+ private boolean passed = false;
+ private String error;
+ private String token;
+
+ public boolean isPassed() {
+ return passed;
+ }
+
+ public void setPassed(boolean passed) {
+ this.passed = passed;
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String error) {
+ this.error = error;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/BlueGreenRouteType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/BlueGreenRouteType.java
new file mode 100644
index 0000000000..4415c18bd8
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/BlueGreenRouteType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum BlueGreenRouteType {
+ BLUE_GREEN_BASIC(DiscoveryConstant.BLUE_GREEN_BASIC),
+ BLUE_BASIC(DiscoveryConstant.BLUE_BASIC);
+
+ private String value;
+
+ private BlueGreenRouteType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static BlueGreenRouteType fromString(String value) {
+ for (BlueGreenRouteType type : BlueGreenRouteType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionBlueGreenEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionBlueGreenEntity.java
new file mode 100644
index 0000000000..0247e7b4f6
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionBlueGreenEntity.java
@@ -0,0 +1,44 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class ConditionBlueGreenEntity extends ConditionEntity {
+ private static final long serialVersionUID = -7956080532519640606L;
+
+ private String route;
+
+ public String getRoute() {
+ return route;
+ }
+
+ public void setRoute(String route) {
+ this.route = route;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionBlueGreenRoute.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionBlueGreenRoute.java
new file mode 100644
index 0000000000..352a15ba4a
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionBlueGreenRoute.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum ConditionBlueGreenRoute {
+ GREEN(DiscoveryConstant.GREEN),
+ BLUE(DiscoveryConstant.BLUE);
+
+ private String value;
+
+ private ConditionBlueGreenRoute(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ConditionBlueGreenRoute fromString(String value) {
+ for (ConditionBlueGreenRoute type : ConditionBlueGreenRoute.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionEntity.java
new file mode 100644
index 0000000000..c10dd15b9d
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionEntity.java
@@ -0,0 +1,46 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class ConditionEntity implements Serializable {
+ private static final long serialVersionUID = -248974985112862553L;
+
+ private String expression;
+
+ public String getExpression() {
+ return expression;
+ }
+
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionGrayEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionGrayEntity.java
new file mode 100644
index 0000000000..bcc5d1e66d
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionGrayEntity.java
@@ -0,0 +1,46 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.List;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class ConditionGrayEntity extends ConditionEntity {
+ private static final long serialVersionUID = 676393557437861018L;
+
+ private List weight;
+
+ public List getWeight() {
+ return weight;
+ }
+
+ public void setWeight(List weight) {
+ this.weight = weight;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionRouteStrategy.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionRouteStrategy.java
new file mode 100644
index 0000000000..32be06833e
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionRouteStrategy.java
@@ -0,0 +1,67 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public class ConditionRouteStrategy implements Serializable {
+ private static final long serialVersionUID = -6036447421562945200L;
+
+ private List service;
+ private boolean condition = false;
+ private String sort = DiscoveryConstant.SORT_BY_VERSION;
+
+ public List getService() {
+ return service;
+ }
+
+ public void setService(List service) {
+ this.service = service;
+ }
+
+ public boolean isCondition() {
+ return condition;
+ }
+
+ public void setCondition(boolean condition) {
+ this.condition = condition;
+ }
+
+ public String getSort() {
+ return sort;
+ }
+
+ public void setSort(String sort) {
+ this.sort = sort;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionStrategy.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionStrategy.java
new file mode 100644
index 0000000000..11d0a4509b
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionStrategy.java
@@ -0,0 +1,86 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public class ConditionStrategy implements Serializable {
+ private static final long serialVersionUID = 2137809071409890088L;
+
+ private List service;
+ private List blueGreen;
+ private List gray;
+ private Map header;
+ private String sort = DiscoveryConstant.SORT_BY_VERSION;
+
+ public List getService() {
+ return service;
+ }
+
+ public void setService(List service) {
+ this.service = service;
+ }
+
+ public List getBlueGreen() {
+ return blueGreen;
+ }
+
+ public void setBlueGreen(List blueGreen) {
+ this.blueGreen = blueGreen;
+ }
+
+ public List getGray() {
+ return gray;
+ }
+
+ public void setGray(List gray) {
+ this.gray = gray;
+ }
+
+ public Map getHeader() {
+ return header;
+ }
+
+ public void setHeader(Map header) {
+ this.header = header;
+ }
+
+ public String getSort() {
+ return sort;
+ }
+
+ public void setSort(String sort) {
+ this.sort = sort;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionType.java
new file mode 100644
index 0000000000..878d7b1677
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConditionType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum ConditionType {
+ BLUE_GREEN(DiscoveryConstant.BLUE_GREEN),
+ GRAY(DiscoveryConstant.GRAY);
+
+ private String value;
+
+ private ConditionType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ConditionType fromString(String value) {
+ for (ConditionType type : ConditionType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConfigFormatType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConfigFormatType.java
new file mode 100644
index 0000000000..4719b1391b
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConfigFormatType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum ConfigFormatType {
+ XML_FORMAT(DiscoveryConstant.XML_FORMAT),
+ JSON_FORMAT(DiscoveryConstant.JSON_FORMAT);
+
+ private String value;
+
+ private ConfigFormatType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ConfigFormatType fromString(String value) {
+ for (ConfigFormatType type : ConfigFormatType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConfigType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConfigType.java
new file mode 100644
index 0000000000..78981b4179
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ConfigType.java
@@ -0,0 +1,68 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum ConfigType {
+ NACOS(DiscoveryConstant.NACOS),
+ APOLLO(DiscoveryConstant.APOLLO),
+ REDIS(DiscoveryConstant.REDIS),
+ ZOOKEEPER(DiscoveryConstant.ZOOKEEPER),
+ CONSUL(DiscoveryConstant.CONSUL),
+ ETCD(DiscoveryConstant.ETCD);
+
+ public static final ConfigType[] SINGLE_KEY_CONFIG_TYPES = new ConfigType[] { APOLLO, CONSUL, ETCD };
+ public static final ConfigType[] MULTI_KEY_CONFIG_TYPES = new ConfigType[] { NACOS, REDIS, ZOOKEEPER };
+
+ private String value;
+
+ private ConfigType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ConfigType[] getSingleKeyConfigTypes() {
+ return SINGLE_KEY_CONFIG_TYPES;
+ }
+
+ public static ConfigType[] getMultiKeyConfigTypes() {
+ return MULTI_KEY_CONFIG_TYPES;
+ }
+
+ public static boolean isSingleKey(ConfigType configType) {
+ for (int i = 0; i < SINGLE_KEY_CONFIG_TYPES.length; i++) {
+ ConfigType type = SINGLE_KEY_CONFIG_TYPES[i];
+ if (type == configType) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public static ConfigType fromString(String value) {
+ for (ConfigType type : ConfigType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/CountFilterEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/CountFilterEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/CountFilterEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/CountFilterEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DeployType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DeployType.java
new file mode 100644
index 0000000000..0491ceb15f
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DeployType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum DeployType {
+ DOMAIN_GATEWAY(DiscoveryConstant.DOMAIN_GATEWAY),
+ NON_DOMAIN_GATEWAY(DiscoveryConstant.NON_DOMAIN_GATEWAY);
+
+ private String value;
+
+ private DeployType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static DeployType fromString(String value) {
+ for (DeployType type : DeployType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryEntity.java
similarity index 76%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryEntity.java
index 61ea417951..e23ae4f998 100644
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryEntity.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryEntity.java
@@ -13,6 +13,7 @@ public class DiscoveryEntity extends FilterHolderEntity {
private static final long serialVersionUID = -7417362859952278987L;
private VersionFilterEntity versionFilterEntity;
+ private RegionFilterEntity regionFilterEntity;
private WeightFilterEntity weightFilterEntity;
public VersionFilterEntity getVersionFilterEntity() {
@@ -23,6 +24,14 @@ public void setVersionFilterEntity(VersionFilterEntity versionFilterEntity) {
this.versionFilterEntity = versionFilterEntity;
}
+ public RegionFilterEntity getRegionFilterEntity() {
+ return regionFilterEntity;
+ }
+
+ public void setRegionFilterEntity(RegionFilterEntity regionFilterEntity) {
+ this.regionFilterEntity = regionFilterEntity;
+ }
+
public WeightFilterEntity getWeightFilterEntity() {
return weightFilterEntity;
}
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryType.java
new file mode 100644
index 0000000000..92a8480365
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/DiscoveryType.java
@@ -0,0 +1,44 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum DiscoveryType {
+ NACOS(DiscoveryConstant.NACOS),
+ CONSUL(DiscoveryConstant.CONSUL),
+ EUREKA(DiscoveryConstant.EUREKA),
+ ZOOKEEPER(DiscoveryConstant.ZOOKEEPER);
+
+ private String value;
+
+ private DiscoveryType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static DiscoveryType fromString(String value) {
+ for (DiscoveryType type : DiscoveryType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ElementType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ElementType.java
new file mode 100644
index 0000000000..58b247a1cf
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ElementType.java
@@ -0,0 +1,47 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum ElementType {
+ PORTAL(DiscoveryConstant.PORTAL),
+ BLUE(DiscoveryConstant.BLUE),
+ GREEN(DiscoveryConstant.GREEN),
+ BASIC(DiscoveryConstant.BASIC),
+ GRAY(DiscoveryConstant.GRAY),
+ STABLE(DiscoveryConstant.STABLE),
+ UNDEFINED(DiscoveryConstant.UNDEFINED);
+
+ private String value;
+
+ private ElementType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ElementType fromString(String value) {
+ for (ElementType type : ElementType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/EscapeType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/EscapeType.java
new file mode 100644
index 0000000000..167597076d
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/EscapeType.java
@@ -0,0 +1,53 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public enum EscapeType {
+ AND("&", "&"),
+ LESS_THAN("<", "<"),
+ DOUBLE_QUOTATION("\"", """);
+ // GREATER_THAN(">", ">");
+ // SINGLE_QUOTATION("'", "'");
+
+ private String source;
+ private String target;
+
+ private EscapeType(String source, String target) {
+ this.source = source;
+ this.target = target;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public String getTarget() {
+ return target;
+ }
+
+ @Override
+ public String toString() {
+ return source;
+ }
+
+ public static String escape(String value, boolean escaped) {
+ if (value == null) {
+ return null;
+ }
+
+ EscapeType[] escapeTypes = EscapeType.values();
+ for (int i = 0; i < escapeTypes.length; i++) {
+ EscapeType escapeType = escapeTypes[i];
+ value = value.replace(escaped ? escapeType.getSource() : escapeType.getTarget(), escaped ? escapeType.getTarget() : escapeType.getSource());
+ }
+
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FailoverType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FailoverType.java
new file mode 100644
index 0000000000..30c5fc53cb
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FailoverType.java
@@ -0,0 +1,47 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum FailoverType {
+ VERSION_PREFER(DiscoveryConstant.VERSION_PREFER),
+ VERSION_FAILOVER(DiscoveryConstant.VERSION_FAILOVER),
+ REGION_TRANSFER(DiscoveryConstant.REGION_TRANSFER),
+ REGION_FAILOVER(DiscoveryConstant.REGION_FAILOVER),
+ ENVIRONMENT_FAILOVER(DiscoveryConstant.ENVIRONMENT_FAILOVER),
+ ZONE_FAILOVER(DiscoveryConstant.ZONE_FAILOVER),
+ ADDRESS_FAILOVER(DiscoveryConstant.ADDRESS_FAILOVER);
+
+ private String value;
+
+ private FailoverType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static FailoverType fromString(String value) {
+ for (FailoverType type : FailoverType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterHolderEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterHolderEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterHolderEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterHolderEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterType.java
new file mode 100644
index 0000000000..6b01b4469f
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FilterType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum FilterType {
+ BLACKLIST(DiscoveryConstant.BLACKLIST),
+ WHITELIST(DiscoveryConstant.WHITELIST);
+
+ private String value;
+
+ private FilterType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static FilterType fromString(String value) {
+ for (FilterType type : FilterType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FormatType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FormatType.java
new file mode 100644
index 0000000000..3dc1875d77
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/FormatType.java
@@ -0,0 +1,46 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum FormatType {
+ XML_FORMAT(DiscoveryConstant.XML_FORMAT),
+ JSON_FORMAT(DiscoveryConstant.JSON_FORMAT),
+ YAML_FORMAT(DiscoveryConstant.YAML_FORMAT),
+ PROPERTIES_FORMAT(DiscoveryConstant.PROPERTIES_FORMAT),
+ HTML_FORMAT(DiscoveryConstant.HTML_FORMAT),
+ TEXT_FORMAT(DiscoveryConstant.TEXT_FORMAT);
+
+ private String value;
+
+ private FormatType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static FormatType fromString(String value) {
+ for (FormatType type : FormatType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/GatewayStrategyRouteEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/GatewayStrategyRouteEntity.java
new file mode 100644
index 0000000000..10c310596a
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/GatewayStrategyRouteEntity.java
@@ -0,0 +1,212 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import com.nepxion.discovery.common.util.JsonUtil;
+
+public class GatewayStrategyRouteEntity implements Serializable {
+ private static final long serialVersionUID = 8552414941889295450L;
+
+ private String id;
+ private String uri;
+ private List predicates = new ArrayList();
+ private List userPredicates = new ArrayList();
+ private List filters = new ArrayList();
+ private List userFilters = new ArrayList();
+ private int order = 0;
+ private Map metadata = new HashMap();
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getUri() {
+ return uri;
+ }
+
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+
+ public List getPredicates() {
+ return predicates;
+ }
+
+ public void setPredicates(List predicates) {
+ this.predicates = predicates;
+ }
+
+ public List getUserPredicates() {
+ return userPredicates;
+ }
+
+ public void setUserPredicates(List userPredicates) {
+ this.userPredicates = userPredicates;
+ }
+
+ public List getFilters() {
+ return filters;
+ }
+
+ public void setFilters(List filters) {
+ this.filters = filters;
+ }
+
+ public List getUserFilters() {
+ return userFilters;
+ }
+
+ public void setUserFilters(List userFilters) {
+ this.userFilters = userFilters;
+ }
+
+ public int getOrder() {
+ return order;
+ }
+
+ public void setOrder(int order) {
+ this.order = order;
+ }
+
+ public Map getMetadata() {
+ return metadata;
+ }
+
+ public void setMetadata(Map metadata) {
+ if (metadata != null) {
+ this.metadata = metadata;
+ }
+ }
+
+ public static class Predicate extends Clause {
+ private static final long serialVersionUID = -5113611207453059195L;
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+ }
+
+ public static class Filter extends Clause {
+ private static final long serialVersionUID = 4975847305584873755L;
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+ }
+
+ public static class Clause implements Serializable {
+ private static final long serialVersionUID = -6284675851623689077L;
+
+ private String name;
+ private Map args = new LinkedHashMap<>();
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Map getArgs() {
+ return args;
+ }
+
+ public void setArgs(Map args) {
+ this.args = args;
+ }
+
+ public void addArg(String key, String value) {
+ this.args.put(key, value);
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+ }
+
+ public static String toClausesJson(List clauses) {
+ StringBuilder stringBuilder = new StringBuilder();
+
+ for (Clause clause : clauses) {
+ stringBuilder.append(String.format("%s=%s, ", clause.getName(), JsonUtil.toJson(clause.getArgs())));
+ }
+
+ if (stringBuilder.length() > 0) {
+ stringBuilder.delete(stringBuilder.length() - 2, stringBuilder.length());
+ }
+
+ return stringBuilder.toString();
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/GatewayType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/GatewayType.java
new file mode 100644
index 0000000000..bafae264ad
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/GatewayType.java
@@ -0,0 +1,60 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum GatewayType {
+ SPRING_CLOUD_GATEWAY(DiscoveryConstant.SPRING_CLOUD_GATEWAY_TYPE, DiscoveryConstant.SPRING_CLOUD_GATEWAY),
+ ZUUL(DiscoveryConstant.ZUUL_TYPE, DiscoveryConstant.ZUUL);
+
+ private String value;
+ private String name;
+
+ private GatewayType(String value, String name) {
+ this.value = value;
+ this.name = name;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public static GatewayType fromString(String value) {
+ return fromString(value, true);
+ }
+
+ public static GatewayType fromString(String value, boolean fromValue) {
+ if (fromValue) {
+ for (GatewayType type : GatewayType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+ } else {
+ for (GatewayType type : GatewayType.values()) {
+ if (type.getName().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HeadersInjectorEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HeadersInjectorEntity.java
new file mode 100644
index 0000000000..7a13a43be7
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HeadersInjectorEntity.java
@@ -0,0 +1,65 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class HeadersInjectorEntity implements Serializable {
+ private static final long serialVersionUID = 4754115929939146799L;
+
+ private HeadersInjectorType headersInjectorType;
+ private List headers;
+
+ public HeadersInjectorEntity() {
+
+ }
+
+ public HeadersInjectorEntity(HeadersInjectorType headersInjectorType, List headers) {
+ this.headersInjectorType = headersInjectorType;
+ this.headers = headers;
+ }
+
+ public HeadersInjectorType getHeadersInjectorType() {
+ return headersInjectorType;
+ }
+
+ public void setHeadersInjectorType(HeadersInjectorType headersInjectorType) {
+ this.headersInjectorType = headersInjectorType;
+ }
+
+ public List getHeaders() {
+ return headers;
+ }
+
+ public void setHeaders(List headers) {
+ this.headers = headers;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HeadersInjectorType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HeadersInjectorType.java
new file mode 100644
index 0000000000..fc5fbe876e
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HeadersInjectorType.java
@@ -0,0 +1,16 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public enum HeadersInjectorType {
+ TRANSMISSION,
+ TRACER,
+ ALL;
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HostFilterEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HostFilterEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/HostFilterEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/HostFilterEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InspectorDebugEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InspectorDebugEntity.java
new file mode 100644
index 0000000000..804fee05f1
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InspectorDebugEntity.java
@@ -0,0 +1,93 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class InspectorDebugEntity implements Serializable {
+ private static final long serialVersionUID = 1251618912673295400L;
+
+ private String protocol = "http";
+ private String portal;
+ private String path;
+ private List service;
+ private Map header;
+ private List filter;
+
+ public String getProtocol() {
+ return protocol;
+ }
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+ public String getPortal() {
+ return portal;
+ }
+
+ public void setPortal(String portal) {
+ this.portal = portal;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public List getService() {
+ return service;
+ }
+
+ public void setService(List service) {
+ this.service = service;
+ }
+
+ public Map getHeader() {
+ return header;
+ }
+
+ public void setHeader(Map header) {
+ this.header = header;
+ }
+
+ public List getFilter() {
+ return filter;
+ }
+
+ public void setFilter(List filter) {
+ this.filter = filter;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InspectorEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InspectorEntity.java
new file mode 100644
index 0000000000..7dea545af5
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InspectorEntity.java
@@ -0,0 +1,56 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class InspectorEntity implements Serializable {
+ private static final long serialVersionUID = 2651428583729465720L;
+
+ private List serviceIdList;
+ private String result;
+
+ public List getServiceIdList() {
+ return serviceIdList;
+ }
+
+ public void setServiceIdList(List serviceIdList) {
+ this.serviceIdList = serviceIdList;
+ }
+
+ public String getResult() {
+ return result;
+ }
+
+ public void setResult(String result) {
+ this.result = result;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java
new file mode 100644
index 0000000000..1af346bf6c
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntity.java
@@ -0,0 +1,191 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class InstanceEntity implements Serializable {
+ private static final long serialVersionUID = -3001191508072178378L;
+
+ private String plugin;
+ private String group;
+ private String serviceType;
+ private String serviceId;
+ private String serviceAppId;
+ private String serviceUUId;
+ private String version;
+ private String region;
+ private String environment;
+ private String zone;
+ private boolean active;
+ private String protocol;
+ private String contextPath;
+ private String formatContextPath;
+ private String host;
+ private int port;
+ private Map metadata;
+
+ public String getPlugin() {
+ return plugin;
+ }
+
+ public void setPlugin(String plugin) {
+ this.plugin = plugin;
+ }
+
+ public String getGroup() {
+ return group;
+ }
+
+ public void setGroup(String group) {
+ this.group = group;
+ }
+
+ public String getServiceType() {
+ return serviceType;
+ }
+
+ public void setServiceType(String serviceType) {
+ this.serviceType = serviceType;
+ }
+
+ public String getServiceId() {
+ return serviceId;
+ }
+
+ public void setServiceId(String serviceId) {
+ this.serviceId = serviceId;
+ }
+
+ public String getServiceAppId() {
+ return serviceAppId;
+ }
+
+ public void setServiceAppId(String serviceAppId) {
+ this.serviceAppId = serviceAppId;
+ }
+
+ public String getServiceUUId() {
+ return serviceUUId;
+ }
+
+ public void setServiceUUId(String serviceUUId) {
+ this.serviceUUId = serviceUUId;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getRegion() {
+ return region;
+ }
+
+ public void setRegion(String region) {
+ this.region = region;
+ }
+
+ public String getEnvironment() {
+ return environment;
+ }
+
+ public void setEnvironment(String environment) {
+ this.environment = environment;
+ }
+
+ public String getZone() {
+ return zone;
+ }
+
+ public void setZone(String zone) {
+ this.zone = zone;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ public String getProtocol() {
+ return protocol;
+ }
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+ public String getContextPath() {
+ return contextPath;
+ }
+
+ public void setContextPath(String contextPath) {
+ this.contextPath = contextPath;
+ }
+
+ public String getFormatContextPath() {
+ return formatContextPath;
+ }
+
+ public void setFormatContextPath(String formatContextPath) {
+ this.formatContextPath = formatContextPath;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public Map getMetadata() {
+ return metadata;
+ }
+
+ public void setMetadata(Map metadata) {
+ this.metadata = metadata;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntityWrapper.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntityWrapper.java
new file mode 100644
index 0000000000..9581c54d4d
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InstanceEntityWrapper.java
@@ -0,0 +1,212 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+import com.nepxion.discovery.common.constant.DiscoveryMetaDataConstant;
+import com.nepxion.discovery.common.util.UrlUtil;
+
+public class InstanceEntityWrapper {
+ public static String getPlugin(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getPlugin(metadata);
+ }
+
+ public static String getGroup(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getGroup(metadata);
+ }
+
+ public static String getServiceType(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getServiceType(metadata);
+ }
+
+ public static String getGatewayType(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getGatewayType(metadata);
+ }
+
+ public static String getServiceAppId(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getServiceAppId(metadata);
+ }
+
+ public static String getServiceUUId(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getServiceUUId(metadata);
+ }
+
+ public static String getVersion(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getVersion(metadata);
+ }
+
+ public static String getRegion(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getRegion(metadata);
+ }
+
+ public static String getEnvironment(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getEnvironment(metadata);
+ }
+
+ public static String getZone(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getZone(metadata);
+ }
+
+ public static boolean isActive(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return isActive(metadata);
+ }
+
+ public static String getProtocol(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getProtocol(metadata);
+ }
+
+ public static String getContextPath(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getContextPath(metadata);
+ }
+
+ public static String getFormatContextPath(InstanceEntity instanceEntity) {
+ Map metadata = instanceEntity.getMetadata();
+
+ return getFormatContextPath(metadata);
+ }
+
+ public static String getPlugin(Map metadata) {
+ String plugin = metadata.get(DiscoveryMetaDataConstant.SPRING_APPLICATION_DISCOVERY_PLUGIN);
+ if (StringUtils.isEmpty(plugin)) {
+ return StringUtils.EMPTY;
+ }
+
+ return plugin;
+ }
+
+ public static String getGroup(Map metadata) {
+ String groupKey = metadata.get(DiscoveryMetaDataConstant.SPRING_APPLICATION_GROUP_KEY);
+ if (StringUtils.isEmpty(groupKey)) {
+ groupKey = DiscoveryConstant.GROUP;
+ }
+
+ String group = metadata.get(groupKey);
+ if (StringUtils.isEmpty(group)) {
+ return StringUtils.EMPTY;
+ }
+
+ return group;
+ }
+
+ public static String getServiceType(Map metadata) {
+ return metadata.get(DiscoveryMetaDataConstant.SPRING_APPLICATION_TYPE);
+ }
+
+ public static String getGatewayType(Map metadata) {
+ return metadata.get(DiscoveryMetaDataConstant.SPRING_APPLICATION_GATEWAY_TYPE);
+ }
+
+ public static String getServiceAppId(Map metadata) {
+ return metadata.get(DiscoveryMetaDataConstant.SPRING_APPLICATION_APP_ID);
+ }
+
+ public static String getServiceUUId(Map metadata) {
+ return metadata.get(DiscoveryMetaDataConstant.SPRING_APPLICATION_UUID);
+ }
+
+ public static String getVersion(Map metadata) {
+ String version = metadata.get(DiscoveryConstant.VERSION);
+ if (StringUtils.isEmpty(version)) {
+ version = DiscoveryConstant.DEFAULT;
+ }
+
+ return version;
+ }
+
+ public static String getRegion(Map metadata) {
+ String region = metadata.get(DiscoveryConstant.REGION);
+ if (StringUtils.isEmpty(region)) {
+ region = DiscoveryConstant.DEFAULT;
+ }
+
+ return region;
+ }
+
+ public static String getEnvironment(Map metadata) {
+ String environment = metadata.get(DiscoveryConstant.ENVIRONMENT);
+ if (StringUtils.isEmpty(environment)) {
+ environment = DiscoveryConstant.DEFAULT;
+ }
+
+ return environment;
+ }
+
+ public static String getZone(Map metadata) {
+ String zone = metadata.get(DiscoveryConstant.ZONE);
+ if (StringUtils.isEmpty(zone)) {
+ zone = DiscoveryConstant.DEFAULT;
+ }
+
+ return zone;
+ }
+
+ public static boolean isActive(Map metadata) {
+ String active = metadata.get(DiscoveryConstant.ACTIVE);
+ if (StringUtils.isEmpty(active)) {
+ return false;
+ }
+
+ return Boolean.valueOf(active);
+ }
+
+ public static String getProtocol(Map metadata) {
+ String protocol = metadata.get(DiscoveryMetaDataConstant.SPRING_APPLICATION_PROTOCOL);
+ if (StringUtils.isEmpty(protocol)) {
+ return "http";
+ }
+
+ return protocol;
+ }
+
+ public static String getContextPath(Map metadata) {
+ String contextPath = metadata.get(DiscoveryMetaDataConstant.SPRING_APPLICATION_CONTEXT_PATH);
+ if (StringUtils.isEmpty(contextPath)) {
+ return "/";
+ }
+
+ return contextPath;
+ }
+
+ public static String getFormatContextPath(Map metadata) {
+ String contextPath = getContextPath(metadata);
+
+ return UrlUtil.formatContextPath(contextPath);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InterceptorType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InterceptorType.java
new file mode 100644
index 0000000000..cbedacf53b
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/InterceptorType.java
@@ -0,0 +1,43 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum InterceptorType {
+ FEIGN(DiscoveryConstant.FEIGN),
+ REST_TEMPLATE(DiscoveryConstant.REST_TEMPLATE),
+ WEB_CLIENT(DiscoveryConstant.WEB_CLIENT);
+
+ private String value;
+
+ private InterceptorType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static InterceptorType fromString(String value) {
+ for (InterceptorType type : InterceptorType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/LoadBalancerType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/LoadBalancerType.java
new file mode 100644
index 0000000000..c283f91867
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/LoadBalancerType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum LoadBalancerType {
+ RIBBON(DiscoveryConstant.RIBBON),
+ SPRING_CLOUD_LOADBALANCER(DiscoveryConstant.SPRING_CLOUD_LOADBALANCER);
+
+ private String value;
+
+ private LoadBalancerType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static LoadBalancerType fromString(String value) {
+ for (LoadBalancerType type : LoadBalancerType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/MapWeightEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/MapWeightEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/MapWeightEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/MapWeightEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/MetadataParameter.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/MetadataParameter.java
new file mode 100644
index 0000000000..d158e47f05
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/MetadataParameter.java
@@ -0,0 +1,67 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class MetadataParameter implements Serializable {
+ private static final long serialVersionUID = -8708814947706738426L;
+
+ public static final String SEPARATE = " | ";
+
+ private List metadataKeys;
+ private List serviceIds;
+ private String separate = SEPARATE;
+
+ public List getMetadataKeys() {
+ return metadataKeys;
+ }
+
+ public void setMetadataKeys(List metadataKeys) {
+ this.metadataKeys = metadataKeys;
+ }
+
+ public List getServiceIds() {
+ return serviceIds;
+ }
+
+ public void setServiceIds(List serviceIds) {
+ this.serviceIds = serviceIds;
+ }
+
+ public String getSeparate() {
+ return separate;
+ }
+
+ public void setSeparate(String separate) {
+ this.separate = separate;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PackagesInjectorEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PackagesInjectorEntity.java
new file mode 100644
index 0000000000..c27d91ca43
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PackagesInjectorEntity.java
@@ -0,0 +1,65 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class PackagesInjectorEntity implements Serializable {
+ private static final long serialVersionUID = 5730588860616523887L;
+
+ private PackagesInjectorType packagesInjectorType;
+ private List packages;
+
+ public PackagesInjectorEntity() {
+
+ }
+
+ public PackagesInjectorEntity(PackagesInjectorType packagesInjectorType, List packages) {
+ this.packagesInjectorType = packagesInjectorType;
+ this.packages = packages;
+ }
+
+ public PackagesInjectorType getPackagesInjectorType() {
+ return packagesInjectorType;
+ }
+
+ public void setPackagesInjectorType(PackagesInjectorType packagesInjectorType) {
+ this.packagesInjectorType = packagesInjectorType;
+ }
+
+ public List getPackages() {
+ return packages;
+ }
+
+ public void setPackages(List packages) {
+ this.packages = packages;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PackagesInjectorType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PackagesInjectorType.java
new file mode 100644
index 0000000000..9e7b864616
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PackagesInjectorType.java
@@ -0,0 +1,17 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public enum PackagesInjectorType {
+ RPC,
+ PROVIDER_ISOLATION,
+ TRACER,
+ ALL;
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterEntity.java
new file mode 100644
index 0000000000..4d4fb6b277
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterEntity.java
@@ -0,0 +1,49 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class ParameterEntity implements Serializable {
+ private static final long serialVersionUID = -5135099669922746855L;
+
+ private Map> parameterServiceMap = new LinkedHashMap>();
+
+ public Map> getParameterServiceMap() {
+ return parameterServiceMap;
+ }
+
+ public void setParameterServiceMap(Map> parameterServiceMap) {
+ this.parameterServiceMap = parameterServiceMap;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterServiceEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterServiceEntity.java
new file mode 100644
index 0000000000..e1730f40c7
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterServiceEntity.java
@@ -0,0 +1,48 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class ParameterServiceEntity implements Serializable {
+ private static final long serialVersionUID = 3102584092049806966L;
+
+ private Map parameterMap = new LinkedHashMap();
+
+ public Map getParameterMap() {
+ return parameterMap;
+ }
+
+ public void setParameterMap(Map parameterMap) {
+ this.parameterMap = parameterMap;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterType.java
new file mode 100644
index 0000000000..97857ba51b
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ParameterType.java
@@ -0,0 +1,43 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum ParameterType {
+ HEADER(DiscoveryConstant.HEADER_TYPE),
+ PARAMETER(DiscoveryConstant.PARAMETER_TYPE),
+ COOKIE(DiscoveryConstant.COOKIE_TYPE);
+
+ private String value;
+
+ private ParameterType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ParameterType fromString(String value) {
+ for (ParameterType type : ParameterType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PortalType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PortalType.java
new file mode 100644
index 0000000000..b405b541f4
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/PortalType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum PortalType {
+ GATEWAY(DiscoveryConstant.GATEWAY),
+ SERVICE(DiscoveryConstant.SERVICE);
+
+ private String value;
+
+ private PortalType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static PortalType fromString(String value) {
+ for (PortalType type : PortalType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ProtectorType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ProtectorType.java
new file mode 100644
index 0000000000..82bc310f10
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ProtectorType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum ProtectorType {
+ HYSTRIX(DiscoveryConstant.HYSTRIX),
+ SENTINEL(DiscoveryConstant.SENTINEL);
+
+ private String value;
+
+ private ProtectorType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ProtectorType fromString(String value) {
+ for (ProtectorType type : ProtectorType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionEntity.java
new file mode 100644
index 0000000000..26dde9fdf8
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionEntity.java
@@ -0,0 +1,74 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class RegionEntity implements Serializable {
+ private static final long serialVersionUID = 4242096651626967253L;
+
+ private String consumerServiceName;
+ private String providerServiceName;
+ private List consumerRegionValueList;
+ private List providerRegionValueList;
+
+ public String getConsumerServiceName() {
+ return consumerServiceName;
+ }
+
+ public void setConsumerServiceName(String consumerServiceName) {
+ this.consumerServiceName = consumerServiceName;
+ }
+
+ public String getProviderServiceName() {
+ return providerServiceName;
+ }
+
+ public void setProviderServiceName(String providerServiceName) {
+ this.providerServiceName = providerServiceName;
+ }
+
+ public List getConsumerRegionValueList() {
+ return consumerRegionValueList;
+ }
+
+ public void setConsumerRegionValueList(List consumerRegionValueList) {
+ this.consumerRegionValueList = consumerRegionValueList;
+ }
+
+ public List getProviderRegionValueList() {
+ return providerRegionValueList;
+ }
+
+ public void setProviderRegionValueList(List providerRegionValueList) {
+ this.providerRegionValueList = providerRegionValueList;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionFilterEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionFilterEntity.java
new file mode 100644
index 0000000000..d62f4eee59
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionFilterEntity.java
@@ -0,0 +1,49 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class RegionFilterEntity implements Serializable {
+ private static final long serialVersionUID = 5574079766640689952L;
+
+ private Map> regionEntityMap = new LinkedHashMap>();
+
+ public Map> getRegionEntityMap() {
+ return regionEntityMap;
+ }
+
+ public void setRegionEntityMap(Map> regionEntityMap) {
+ this.regionEntityMap = regionEntityMap;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionWeightEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionWeightEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionWeightEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegionWeightEntity.java
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegisterEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegisterEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegisterEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RegisterEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RelationalType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RelationalType.java
new file mode 100644
index 0000000000..83502abccb
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RelationalType.java
@@ -0,0 +1,40 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public enum RelationalType {
+ AND("and"),
+ OR("or");
+
+ private String value;
+
+ private RelationalType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static RelationalType fromString(String value) {
+ for (RelationalType type : RelationalType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ResultEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ResultEntity.java
new file mode 100644
index 0000000000..98df2039b3
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ResultEntity.java
@@ -0,0 +1,82 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class ResultEntity implements Serializable {
+ private static final long serialVersionUID = -3322655604556025836L;
+
+ private String serviceId;
+ private String host;
+ private int port;
+ private String url;
+ private String result;
+
+ public String getServiceId() {
+ return serviceId;
+ }
+
+ public void setServiceId(String serviceId) {
+ this.serviceId = serviceId;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getResult() {
+ return result;
+ }
+
+ public void setResult(String result) {
+ this.result = result;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java
similarity index 83%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java
index 7d7eda1a03..f6780d0d75 100644
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RouterEntity.java
@@ -25,9 +25,12 @@ public class RouterEntity implements Serializable {
private String serviceId;
private String version;
private String region;
+ private String environment;
+ private String zone;
private String host;
private int port;
private int weight = -1;
+ private String protocol;
private String contextPath;
private List nexts = new ArrayList();
@@ -64,6 +67,22 @@ public void setRegion(String region) {
this.region = region;
}
+ public String getEnvironment() {
+ return environment;
+ }
+
+ public void setEnvironment(String environment) {
+ this.environment = environment;
+ }
+
+ public String getZone() {
+ return zone;
+ }
+
+ public void setZone(String zone) {
+ this.zone = zone;
+ }
+
public String getHost() {
return host;
}
@@ -88,6 +107,14 @@ public void setWeight(int weight) {
this.weight = weight;
}
+ public String getProtocol() {
+ return protocol;
+ }
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
public String getContextPath() {
return contextPath;
}
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntity.java
new file mode 100644
index 0000000000..16a54398c3
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntity.java
@@ -0,0 +1,109 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class RuleEntity implements Serializable {
+ private static final long serialVersionUID = 7079024435084528751L;
+
+ private RegisterEntity registerEntity;
+ private DiscoveryEntity discoveryEntity;
+ private StrategyEntity strategyEntity;
+ private StrategyReleaseEntity strategyReleaseEntity;
+ private StrategyFailoverEntity strategyFailoverEntity;
+ private StrategyBlacklistEntity strategyBlacklistEntity;
+ private ParameterEntity parameterEntity;
+ private String content;
+
+ public RegisterEntity getRegisterEntity() {
+ return registerEntity;
+ }
+
+ public void setRegisterEntity(RegisterEntity registerEntity) {
+ this.registerEntity = registerEntity;
+ }
+
+ public DiscoveryEntity getDiscoveryEntity() {
+ return discoveryEntity;
+ }
+
+ public void setDiscoveryEntity(DiscoveryEntity discoveryEntity) {
+ this.discoveryEntity = discoveryEntity;
+ }
+
+ public StrategyEntity getStrategyEntity() {
+ return strategyEntity;
+ }
+
+ public void setStrategyEntity(StrategyEntity strategyEntity) {
+ this.strategyEntity = strategyEntity;
+ }
+
+ public StrategyReleaseEntity getStrategyReleaseEntity() {
+ return strategyReleaseEntity;
+ }
+
+ public void setStrategyReleaseEntity(StrategyReleaseEntity strategyReleaseEntity) {
+ this.strategyReleaseEntity = strategyReleaseEntity;
+ }
+
+ public StrategyFailoverEntity getStrategyFailoverEntity() {
+ return strategyFailoverEntity;
+ }
+
+ public void setStrategyFailoverEntity(StrategyFailoverEntity strategyFailoverEntity) {
+ this.strategyFailoverEntity = strategyFailoverEntity;
+ }
+
+ public StrategyBlacklistEntity getStrategyBlacklistEntity() {
+ return strategyBlacklistEntity;
+ }
+
+ public void setStrategyBlacklistEntity(StrategyBlacklistEntity strategyBlacklistEntity) {
+ this.strategyBlacklistEntity = strategyBlacklistEntity;
+ }
+
+ public ParameterEntity getParameterEntity() {
+ return parameterEntity;
+ }
+
+ public void setParameterEntity(ParameterEntity parameterEntity) {
+ this.parameterEntity = parameterEntity;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntityWrapper.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntityWrapper.java
new file mode 100644
index 0000000000..5973e346d4
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/RuleEntityWrapper.java
@@ -0,0 +1,83 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public class RuleEntityWrapper {
+ // 以局部规则为准,如果局部规则规则里某些属性没有,而全局规则有,则从全局规则把那些属性复制到局部规则,并合并创建最终的复合规则
+ public static RuleEntity assemble(RuleEntity partialRuleEntity, RuleEntity globalRuleEntity) {
+ RuleEntity ruleEntity = new RuleEntity();
+
+ RegisterEntity registerEntity = null;
+ if (partialRuleEntity != null && partialRuleEntity.getRegisterEntity() != null) {
+ registerEntity = partialRuleEntity.getRegisterEntity();
+ } else if (globalRuleEntity != null && globalRuleEntity.getRegisterEntity() != null) {
+ registerEntity = globalRuleEntity.getRegisterEntity();
+ }
+ ruleEntity.setRegisterEntity(registerEntity);
+
+ DiscoveryEntity discoveryEntity = null;
+ if (partialRuleEntity != null && partialRuleEntity.getDiscoveryEntity() != null) {
+ discoveryEntity = partialRuleEntity.getDiscoveryEntity();
+ } else if (globalRuleEntity != null && globalRuleEntity.getDiscoveryEntity() != null) {
+ discoveryEntity = globalRuleEntity.getDiscoveryEntity();
+ }
+ ruleEntity.setDiscoveryEntity(discoveryEntity);
+
+ StrategyEntity strategyEntity = null;
+ if (partialRuleEntity != null && partialRuleEntity.getStrategyEntity() != null) {
+ strategyEntity = partialRuleEntity.getStrategyEntity();
+ } else if (globalRuleEntity != null && globalRuleEntity.getStrategyEntity() != null) {
+ strategyEntity = globalRuleEntity.getStrategyEntity();
+ }
+ ruleEntity.setStrategyEntity(strategyEntity);
+
+ StrategyReleaseEntity strategyReleaseEntity = null;
+ if (partialRuleEntity != null && partialRuleEntity.getStrategyReleaseEntity() != null) {
+ strategyReleaseEntity = partialRuleEntity.getStrategyReleaseEntity();
+ } else if (globalRuleEntity != null && globalRuleEntity.getStrategyReleaseEntity() != null) {
+ strategyReleaseEntity = globalRuleEntity.getStrategyReleaseEntity();
+ }
+ ruleEntity.setStrategyReleaseEntity(strategyReleaseEntity);
+
+ StrategyFailoverEntity strategyFailoverEntity = null;
+ if (partialRuleEntity != null && partialRuleEntity.getStrategyFailoverEntity() != null) {
+ strategyFailoverEntity = partialRuleEntity.getStrategyFailoverEntity();
+ } else if (globalRuleEntity != null && globalRuleEntity.getStrategyFailoverEntity() != null) {
+ strategyFailoverEntity = globalRuleEntity.getStrategyFailoverEntity();
+ }
+ ruleEntity.setStrategyFailoverEntity(strategyFailoverEntity);
+
+ StrategyBlacklistEntity strategyBlacklistEntity = null;
+ if (partialRuleEntity != null && partialRuleEntity.getStrategyBlacklistEntity() != null) {
+ strategyBlacklistEntity = partialRuleEntity.getStrategyBlacklistEntity();
+ } else if (globalRuleEntity != null && globalRuleEntity.getStrategyBlacklistEntity() != null) {
+ strategyBlacklistEntity = globalRuleEntity.getStrategyBlacklistEntity();
+ }
+ ruleEntity.setStrategyBlacklistEntity(strategyBlacklistEntity);
+
+ ParameterEntity parameterEntity = null;
+ if (partialRuleEntity != null && partialRuleEntity.getParameterEntity() != null) {
+ parameterEntity = partialRuleEntity.getParameterEntity();
+ } else if (globalRuleEntity != null && globalRuleEntity.getParameterEntity() != null) {
+ parameterEntity = globalRuleEntity.getParameterEntity();
+ }
+ ruleEntity.setParameterEntity(parameterEntity);
+
+ String content = null;
+ if (partialRuleEntity != null && partialRuleEntity.getContent() != null) {
+ content = partialRuleEntity.getContent();
+ } else if (globalRuleEntity != null && globalRuleEntity.getContent() != null) {
+ content = globalRuleEntity.getContent();
+ }
+ ruleEntity.setContent(content);
+
+ return ruleEntity;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SentinelMetricType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SentinelMetricType.java
new file mode 100644
index 0000000000..e63f971a6f
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SentinelMetricType.java
@@ -0,0 +1,44 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Tank
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum SentinelMetricType {
+ PASS_QPS(DiscoveryConstant.SENTINEL_PASS_QPS_KEY),
+ BLOCK_QPS(DiscoveryConstant.SENTINEL_BLOCK_QPS_KEY),
+ SUCCESS_QPS(DiscoveryConstant.SENTINEL_SUCCESS_QPS_KEY),
+ EXCEPTION_QPS(DiscoveryConstant.SENTINEL_EXCEPTION_QPS_KEY);
+
+ private String value;
+
+ private SentinelMetricType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static SentinelMetricType fromString(String value) {
+ for (SentinelMetricType type : SentinelMetricType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SentinelRuleType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SentinelRuleType.java
new file mode 100644
index 0000000000..194898cd3b
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SentinelRuleType.java
@@ -0,0 +1,69 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum SentinelRuleType {
+ FLOW(DiscoveryConstant.SENTINEL_FLOW, DiscoveryConstant.SENTINEL_FLOW_KEY, DiscoveryConstant.SENTINEL_FLOW_DESCRIPTION),
+ DEGRADE(DiscoveryConstant.SENTINEL_DEGRADE, DiscoveryConstant.SENTINEL_DEGRADE_KEY, DiscoveryConstant.SENTINEL_DEGRADE_DESCRIPTION),
+ AUTHORITY(DiscoveryConstant.SENTINEL_AUTHORITY, DiscoveryConstant.SENTINEL_AUTHORITY_KEY, DiscoveryConstant.SENTINEL_AUTHORITY_DESCRIPTION),
+ SYSTEM(DiscoveryConstant.SENTINEL_SYSTEM, DiscoveryConstant.SENTINEL_SYSTEM_KEY, DiscoveryConstant.SENTINEL_SYSTEM_DESCRIPTION),
+ PARAM_FLOW(DiscoveryConstant.SENTINEL_PARAM_FLOW, DiscoveryConstant.SENTINEL_PARAM_FLOW_KEY, DiscoveryConstant.SENTINEL_PARAM_FLOW_DESCRIPTION);
+
+ private String value;
+ private String key;
+ private String description;
+
+ private SentinelRuleType(String value, String key, String description) {
+ this.value = value;
+ this.key = key;
+ this.description = description;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public static SentinelRuleType fromString(String value) {
+ return fromString(value, true);
+ }
+
+ public static SentinelRuleType fromString(String value, boolean fromValue) {
+ if (fromValue) {
+ for (SentinelRuleType type : SentinelRuleType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+ } else {
+ for (SentinelRuleType type : SentinelRuleType.values()) {
+ if (type.getKey().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ServiceType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ServiceType.java
new file mode 100644
index 0000000000..86130eeec4
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ServiceType.java
@@ -0,0 +1,44 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum ServiceType {
+ SERVICE(DiscoveryConstant.SERVICE),
+ GATEWAY(DiscoveryConstant.GATEWAY),
+ CONSOLE(DiscoveryConstant.CONSOLE),
+ TEST(DiscoveryConstant.TEST);
+
+ private String value;
+
+ private ServiceType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static ServiceType fromString(String value) {
+ for (ServiceType type : ServiceType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyBlacklistEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyBlacklistEntity.java
new file mode 100644
index 0000000000..de37ed1874
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyBlacklistEntity.java
@@ -0,0 +1,55 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class StrategyBlacklistEntity implements Serializable {
+ private static final long serialVersionUID = -5342596042988530380L;
+
+ private String idValue;
+ private String addressValue;
+
+ public String getIdValue() {
+ return idValue;
+ }
+
+ public void setIdValue(String idValue) {
+ this.idValue = idValue;
+ }
+
+ public String getAddressValue() {
+ return addressValue;
+ }
+
+ public void setAddressValue(String addressValue) {
+ this.addressValue = addressValue;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionBlueGreenEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionBlueGreenEntity.java
new file mode 100644
index 0000000000..4aff4c62ad
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionBlueGreenEntity.java
@@ -0,0 +1,60 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public class StrategyConditionBlueGreenEntity extends StrategyConditionEntity {
+ private static final long serialVersionUID = 7119457349396638259L;
+
+ private String versionId;
+ private String regionId;
+ private String addressId;
+ private String versionWeightId;
+ private String regionWeightId;
+
+ public String getVersionId() {
+ return versionId;
+ }
+
+ public void setVersionId(String versionId) {
+ this.versionId = versionId;
+ }
+
+ public String getRegionId() {
+ return regionId;
+ }
+
+ public void setRegionId(String regionId) {
+ this.regionId = regionId;
+ }
+
+ public String getAddressId() {
+ return addressId;
+ }
+
+ public void setAddressId(String addressId) {
+ this.addressId = addressId;
+ }
+
+ public String getVersionWeightId() {
+ return versionWeightId;
+ }
+
+ public void setVersionWeightId(String versionWeightId) {
+ this.versionWeightId = versionWeightId;
+ }
+
+ public String getRegionWeightId() {
+ return regionWeightId;
+ }
+
+ public void setRegionWeightId(String regionWeightId) {
+ this.regionWeightId = regionWeightId;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionEntity.java
new file mode 100644
index 0000000000..23c5f33a59
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionEntity.java
@@ -0,0 +1,55 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class StrategyConditionEntity implements Serializable {
+ private static final long serialVersionUID = 1249482860170990672L;
+
+ private String id;
+ private String expression;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getExpression() {
+ return expression;
+ }
+
+ public void setExpression(String expression) {
+ this.expression = expression;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionGrayEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionGrayEntity.java
new file mode 100644
index 0000000000..2b63df15f3
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyConditionGrayEntity.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public class StrategyConditionGrayEntity extends StrategyConditionEntity {
+ private static final long serialVersionUID = 4992751531082022953L;
+
+ private VersionWeightEntity versionWeightEntity;
+ private RegionWeightEntity regionWeightEntity;
+ private AddressWeightEntity addressWeightEntity;
+
+ public VersionWeightEntity getVersionWeightEntity() {
+ return versionWeightEntity;
+ }
+
+ public void setVersionWeightEntity(VersionWeightEntity versionWeightEntity) {
+ this.versionWeightEntity = versionWeightEntity;
+ }
+
+ public RegionWeightEntity getRegionWeightEntity() {
+ return regionWeightEntity;
+ }
+
+ public void setRegionWeightEntity(RegionWeightEntity regionWeightEntity) {
+ this.regionWeightEntity = regionWeightEntity;
+ }
+
+ public AddressWeightEntity getAddressWeightEntity() {
+ return addressWeightEntity;
+ }
+
+ public void setAddressWeightEntity(AddressWeightEntity addressWeightEntity) {
+ this.addressWeightEntity = addressWeightEntity;
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyFailoverEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyFailoverEntity.java
new file mode 100644
index 0000000000..6975774125
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyFailoverEntity.java
@@ -0,0 +1,100 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class StrategyFailoverEntity implements Serializable {
+ private static final long serialVersionUID = 5321045298130813301L;
+
+ private String versionPreferValue;
+ private String versionFailoverValue;
+ private String regionTransferValue;
+ private String regionFailoverValue;
+ private String environmentFailoverValue;
+ private String zoneFailoverValue;
+ private String addressFailoverValue;
+
+ public String getVersionPreferValue() {
+ return versionPreferValue;
+ }
+
+ public void setVersionPreferValue(String versionPreferValue) {
+ this.versionPreferValue = versionPreferValue;
+ }
+
+ public String getVersionFailoverValue() {
+ return versionFailoverValue;
+ }
+
+ public void setVersionFailoverValue(String versionFailoverValue) {
+ this.versionFailoverValue = versionFailoverValue;
+ }
+
+ public String getRegionTransferValue() {
+ return regionTransferValue;
+ }
+
+ public void setRegionTransferValue(String regionTransferValue) {
+ this.regionTransferValue = regionTransferValue;
+ }
+
+ public String getRegionFailoverValue() {
+ return regionFailoverValue;
+ }
+
+ public void setRegionFailoverValue(String regionFailoverValue) {
+ this.regionFailoverValue = regionFailoverValue;
+ }
+
+ public String getEnvironmentFailoverValue() {
+ return environmentFailoverValue;
+ }
+
+ public void setEnvironmentFailoverValue(String environmentFailoverValue) {
+ this.environmentFailoverValue = environmentFailoverValue;
+ }
+
+ public String getZoneFailoverValue() {
+ return zoneFailoverValue;
+ }
+
+ public void setZoneFailoverValue(String zoneFailoverValue) {
+ this.zoneFailoverValue = zoneFailoverValue;
+ }
+
+ public String getAddressFailoverValue() {
+ return addressFailoverValue;
+ }
+
+ public void setAddressFailoverValue(String addressFailoverValue) {
+ this.addressFailoverValue = addressFailoverValue;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyHeaderEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyHeaderEntity.java
new file mode 100644
index 0000000000..e462a1da71
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyHeaderEntity.java
@@ -0,0 +1,53 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.springframework.util.LinkedCaseInsensitiveMap;
+
+public class StrategyHeaderEntity implements Serializable {
+ private static final long serialVersionUID = 7784567539151885177L;
+
+ private Map headerMap = new LinkedCaseInsensitiveMap();
+
+ public Map getHeaderMap() {
+ return headerMap;
+ }
+
+ public void setHeaderMap(Map headerMap) {
+ this.headerMap.clear();
+
+ if (MapUtils.isNotEmpty(headerMap)) {
+ this.headerMap.putAll(headerMap);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyReleaseEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyReleaseEntity.java
new file mode 100644
index 0000000000..fc602d4e64
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyReleaseEntity.java
@@ -0,0 +1,104 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+import com.nepxion.discovery.common.util.StringUtil;
+
+public class StrategyReleaseEntity implements Serializable {
+ private static final long serialVersionUID = 4903833660194433964L;
+
+ private List strategyConditionBlueGreenEntityList;
+ private List strategyConditionGrayEntityList;
+ private List strategyRouteEntityList;
+ private StrategyHeaderEntity strategyHeaderEntity;
+
+ public List getStrategyConditionBlueGreenEntityList() {
+ return strategyConditionBlueGreenEntityList;
+ }
+
+ public void setStrategyConditionBlueGreenEntityList(List strategyConditionBlueGreenEntityList) {
+ this.strategyConditionBlueGreenEntityList = strategyConditionBlueGreenEntityList;
+ }
+
+ public List getStrategyConditionGrayEntityList() {
+ return strategyConditionGrayEntityList;
+ }
+
+ public void setStrategyConditionGrayEntityList(List strategyConditionGrayEntityList) {
+ this.strategyConditionGrayEntityList = strategyConditionGrayEntityList;
+ }
+
+ public List getStrategyRouteEntityList() {
+ return strategyRouteEntityList;
+ }
+
+ public void setStrategyRouteEntityList(List strategyRouteEntityList) {
+ this.strategyRouteEntityList = strategyRouteEntityList;
+
+ // Header参数越多,越排在前面
+ if (CollectionUtils.isNotEmpty(strategyConditionBlueGreenEntityList)) {
+ Collections.sort(strategyConditionBlueGreenEntityList, new Comparator() {
+ public int compare(StrategyConditionBlueGreenEntity strategyConditionBlueGreenEntity1, StrategyConditionBlueGreenEntity strategyConditionBlueGreenEntity2) {
+ Integer count1 = StringUtil.count(strategyConditionBlueGreenEntity1.getExpression(), DiscoveryConstant.EXPRESSION_SUB_PREFIX);
+ Integer count2 = StringUtil.count(strategyConditionBlueGreenEntity2.getExpression(), DiscoveryConstant.EXPRESSION_SUB_PREFIX);
+
+ return count2.compareTo(count1);
+ }
+ });
+ }
+
+ // Header参数越多,越排在前面
+ if (CollectionUtils.isNotEmpty(strategyConditionGrayEntityList)) {
+ Collections.sort(strategyConditionGrayEntityList, new Comparator() {
+ public int compare(StrategyConditionGrayEntity strategyConditionGrayEntity1, StrategyConditionGrayEntity strategyConditionGrayEntity2) {
+ Integer count1 = StringUtil.count(strategyConditionGrayEntity1.getExpression(), DiscoveryConstant.EXPRESSION_SUB_PREFIX);
+ Integer count2 = StringUtil.count(strategyConditionGrayEntity2.getExpression(), DiscoveryConstant.EXPRESSION_SUB_PREFIX);
+
+ return count2.compareTo(count1);
+ }
+ });
+ }
+ }
+
+ public StrategyHeaderEntity getStrategyHeaderEntity() {
+ return strategyHeaderEntity;
+ }
+
+ public void setStrategyHeaderEntity(StrategyHeaderEntity strategyHeaderEntity) {
+ this.strategyHeaderEntity = strategyHeaderEntity;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteEntity.java
similarity index 91%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteEntity.java
index 24212dc791..e5c0e51a2f 100644
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteEntity.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteEntity.java
@@ -20,7 +20,7 @@ public class StrategyRouteEntity implements Serializable {
private static final long serialVersionUID = -949309319161395011L;
private String id;
- private StrategyType type;
+ private StrategyRouteType type;
private String value;
public String getId() {
@@ -31,11 +31,11 @@ public void setId(String id) {
this.id = id;
}
- public StrategyType getType() {
+ public StrategyRouteType getType() {
return type;
}
- public void setType(StrategyType type) {
+ public void setType(StrategyRouteType type) {
this.type = type;
}
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteType.java
new file mode 100644
index 0000000000..4836a842bc
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/StrategyRouteType.java
@@ -0,0 +1,47 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum StrategyRouteType {
+ VERSION(DiscoveryConstant.VERSION),
+ REGION(DiscoveryConstant.REGION),
+ ADDRESS(DiscoveryConstant.ADDRESS),
+ VERSION_WEIGHT(DiscoveryConstant.VERSION_WEIGHT),
+ REGION_WEIGHT(DiscoveryConstant.REGION_WEIGHT),
+ ID_BLACKLIST(DiscoveryConstant.ID_BLACKLIST),
+ ADDRESS_BLACKLIST(DiscoveryConstant.ADDRESS_BLACKLIST);
+
+ private String value;
+
+ private StrategyRouteType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static StrategyRouteType fromString(String value) {
+ for (StrategyRouteType type : StrategyRouteType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SubscriptionType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SubscriptionType.java
new file mode 100644
index 0000000000..36fc62a61e
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/SubscriptionType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum SubscriptionType {
+ PARTIAL(DiscoveryConstant.PARTIAL),
+ GLOBAL(DiscoveryConstant.GLOBAL);
+
+ private String value;
+
+ private SubscriptionType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static SubscriptionType fromString(String value) {
+ for (SubscriptionType type : SubscriptionType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/TracingType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/TracingType.java
new file mode 100644
index 0000000000..831d29e3e3
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/TracingType.java
@@ -0,0 +1,43 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum TracingType {
+ OPENTELEMETRY(DiscoveryConstant.OPENTELEMETRY),
+ OPENTRACING(DiscoveryConstant.OPENTRACING),
+ SKYWALKING(DiscoveryConstant.SKYWALKING);
+
+ private String value;
+
+ private TracingType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static TracingType fromString(String value) {
+ for (TracingType type : TracingType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/UserEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/UserEntity.java
similarity index 88%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/UserEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/UserEntity.java
index 34fe4b1eeb..303ace4752 100644
--- a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/UserEntity.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/UserEntity.java
@@ -9,12 +9,16 @@
* @version 1.0
*/
+import java.io.Serializable;
+
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
-public class UserEntity {
+public class UserEntity implements Serializable {
+ private static final long serialVersionUID = 7873578695343188087L;
+
private String userId;
private String password;
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionEntity.java
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionFilterEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionFilterEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionFilterEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionFilterEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionSortEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionSortEntity.java
new file mode 100644
index 0000000000..bf9ab4e0af
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionSortEntity.java
@@ -0,0 +1,55 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class VersionSortEntity implements Serializable {
+ private static final long serialVersionUID = -6333633245983610222L;
+
+ private String version;
+ private String serviceUUId;
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getServiceUUId() {
+ return serviceUUId;
+ }
+
+ public void setServiceUUId(String serviceUUId) {
+ this.serviceUUId = serviceUUId;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionSortType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionSortType.java
new file mode 100644
index 0000000000..7c2761a0dd
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionSortType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum VersionSortType {
+ TIME(DiscoveryConstant.SORT_BY_TIME),
+ VERSION(DiscoveryConstant.SORT_BY_VERSION);
+
+ private String value;
+
+ private VersionSortType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static VersionSortType fromString(String value) {
+ for (VersionSortType type : VersionSortType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionWeightEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionWeightEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionWeightEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/VersionWeightEntity.java
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntityWrapper.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntityWrapper.java
new file mode 100644
index 0000000000..4bed4351b8
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightEntityWrapper.java
@@ -0,0 +1,140 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+import com.nepxion.discovery.common.util.JsonUtil;
+import com.nepxion.discovery.common.util.StringUtil;
+
+public class WeightEntityWrapper {
+ @SuppressWarnings("unchecked")
+ public static List parseWeightEntityList(String weightValue) {
+ List weightEntityList = new ArrayList();
+
+ Map jsonWeightMap = JsonUtil.fromJson(weightValue, Map.class);
+ for (Map.Entry entry : jsonWeightMap.entrySet()) {
+ String providerServiceName = entry.getKey();
+ String providerWeightValue = entry.getValue();
+
+ WeightEntity weightEntity = new WeightEntity();
+ weightEntity.setProviderServiceName(providerServiceName);
+
+ parseWeightEntity(weightEntity, providerWeightValue);
+
+ weightEntityList.add(weightEntity);
+ }
+
+ return weightEntityList;
+ }
+
+ public static void parseWeightEntity(MapWeightEntity weightEntity, String weightValue) {
+ Map weightMap = weightEntity.getWeightMap();
+ List providerWeightValueList = StringUtil.splitToList(weightValue);
+ if (CollectionUtils.isNotEmpty(providerWeightValueList)) {
+ for (String value : providerWeightValueList) {
+ String[] valueArray = StringUtils.split(value, DiscoveryConstant.EQUALS);
+ String key = valueArray[0].trim();
+ int weight = 0;
+ try {
+ weight = Integer.valueOf(valueArray[1].trim());
+ if (weight < 0) {
+ weight = 0;
+ }
+ } catch (Exception e) {
+
+ }
+
+ weightMap.put(key, weight);
+ }
+ }
+ }
+
+ public static int getWeight(String consumerServiceId, String providerServiceId, String providerKey, Map> weightEntityMap) {
+ if (MapUtils.isEmpty(weightEntityMap)) {
+ return -1;
+ }
+
+ List weightEntityList = weightEntityMap.get(consumerServiceId);
+
+ return getWeight(providerServiceId, providerKey, weightEntityList);
+ }
+
+ public static int getWeight(String providerServiceId, String providerKey, List weightEntityList) {
+ if (CollectionUtils.isEmpty(weightEntityList)) {
+ return -1;
+ }
+
+ for (WeightEntity weightEntity : weightEntityList) {
+ String providerServiceName = weightEntity.getProviderServiceName();
+ if (StringUtils.equalsIgnoreCase(providerServiceName, providerServiceId)) {
+ return getWeight(providerKey, weightEntity);
+ }
+ }
+
+ return -1;
+ }
+
+ public static int getWeight(String providerKey, MapWeightEntity weightEntity) {
+ if (weightEntity == null) {
+ return -1;
+ }
+
+ Map weightMap = weightEntity.getWeightMap();
+ if (MapUtils.isEmpty(weightMap)) {
+ return -1;
+ }
+
+ Integer weight = weightMap.get(providerKey);
+ if (weight != null) {
+ return weight;
+ } else {
+ return -1;
+ }
+ }
+
+ public static int getWeight(WeightFilterEntity weightFilterEntity, String providerServiceId, String providerVersion, String providerRegion, String serviceId) {
+ int weight = -1;
+ if (StringUtils.isNotEmpty(serviceId) && weight < 0) {
+ Map> versionWeightEntityMap = weightFilterEntity.getVersionWeightEntityMap();
+ weight = getWeight(serviceId, providerServiceId, providerVersion, versionWeightEntityMap);
+ }
+ if (weight < 0) {
+ List versionWeightEntityList = weightFilterEntity.getVersionWeightEntityList();
+ weight = getWeight(providerServiceId, providerVersion, versionWeightEntityList);
+ }
+ if (weight < 0) {
+ VersionWeightEntity versionWeightEntity = weightFilterEntity.getVersionWeightEntity();
+ weight = getWeight(providerVersion, versionWeightEntity);
+ }
+
+ if (StringUtils.isNotEmpty(serviceId) && weight < 0) {
+ Map> regionWeightEntityMap = weightFilterEntity.getRegionWeightEntityMap();
+ weight = getWeight(serviceId, providerServiceId, providerRegion, regionWeightEntityMap);
+ }
+ if (weight < 0) {
+ List regionWeightEntityList = weightFilterEntity.getRegionWeightEntityList();
+ weight = getWeight(providerServiceId, providerRegion, regionWeightEntityList);
+ }
+ if (weight < 0) {
+ RegionWeightEntity regionWeightEntity = weightFilterEntity.getRegionWeightEntity();
+ weight = getWeight(providerRegion, regionWeightEntity);
+ }
+
+ return weight;
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightFilterEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightFilterEntity.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightFilterEntity.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightFilterEntity.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightRandomType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightRandomType.java
new file mode 100644
index 0000000000..666a19f3a2
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightRandomType.java
@@ -0,0 +1,42 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum WeightRandomType {
+ MAP_WEIGHT_RANDOM(DiscoveryConstant.MAP_WEIGHT_RANDOM),
+ ARRAY_WEIGHT_RANDOM(DiscoveryConstant.ARRAY_WEIGHT_RANDOM);
+
+ private String value;
+
+ private WeightRandomType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static WeightRandomType fromString(String value) {
+ for (WeightRandomType type : WeightRandomType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightType.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightType.java
new file mode 100644
index 0000000000..195599c6c3
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/WeightType.java
@@ -0,0 +1,43 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public enum WeightType {
+ VERSION(DiscoveryConstant.VERSION),
+ REGION(DiscoveryConstant.REGION),
+ ADDRESS(DiscoveryConstant.ADDRESS);
+
+ private String value;
+
+ private WeightType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public static WeightType fromString(String value) {
+ for (WeightType type : WeightType.values()) {
+ if (type.getValue().equalsIgnoreCase(value)) {
+ return type;
+ }
+ }
+
+ throw new IllegalArgumentException("No matched type with value=" + value);
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ZuulStrategyRouteEntity.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ZuulStrategyRouteEntity.java
new file mode 100644
index 0000000000..45dc3d7404
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/entity/ZuulStrategyRouteEntity.java
@@ -0,0 +1,111 @@
+package com.nepxion.discovery.common.entity;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.Serializable;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class ZuulStrategyRouteEntity implements Serializable {
+ private static final long serialVersionUID = 7174491897992085456L;
+
+ private String id;
+ private String serviceId;
+ private String path;
+ private String url;
+ private boolean stripPrefix = true;
+ private Boolean retryable;
+ private Set sensitiveHeaders = new LinkedHashSet<>();
+ private boolean customSensitiveHeaders = false;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getServiceId() {
+ return serviceId;
+ }
+
+ public void setServiceId(String serviceId) {
+ this.serviceId = serviceId;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public boolean isStripPrefix() {
+ return stripPrefix;
+ }
+
+ public void setStripPrefix(boolean stripPrefix) {
+ this.stripPrefix = stripPrefix;
+ }
+
+ public Boolean getRetryable() {
+ return retryable;
+ }
+
+ public void setRetryable(Boolean retryable) {
+ this.retryable = retryable;
+ }
+
+ public Set getSensitiveHeaders() {
+ return sensitiveHeaders;
+ }
+
+ public void setSensitiveHeaders(Set sensitiveHeaders) {
+ this.sensitiveHeaders = sensitiveHeaders;
+ }
+
+ public boolean isCustomSensitiveHeaders() {
+ return customSensitiveHeaders;
+ }
+
+ public void setCustomSensitiveHeaders(boolean customSensitiveHeaders) {
+ this.customSensitiveHeaders = customSensitiveHeaders;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-common/src/main/java/com/nepxion/discovery/common/exception/DiscoveryException.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/exception/DiscoveryException.java
similarity index 100%
rename from discovery-common/src/main/java/com/nepxion/discovery/common/exception/DiscoveryException.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/exception/DiscoveryException.java
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/expression/DiscoveryExpressionResolver.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/expression/DiscoveryExpressionResolver.java
new file mode 100644
index 0000000000..f8660399da
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/expression/DiscoveryExpressionResolver.java
@@ -0,0 +1,95 @@
+package com.nepxion.discovery.common.expression;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.TypeComparator;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public class DiscoveryExpressionResolver {
+ public static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();
+
+ public static boolean eval(String expression, String key, Map map, TypeComparator typeComparator) {
+ StandardEvaluationContext context = new StandardEvaluationContext();
+ context.setTypeComparator(typeComparator);
+ if (map != null) {
+ context.setVariable(key, map);
+ } else {
+ context.setVariable(key, new HashMap());
+ }
+
+ return eval(expression, context);
+ }
+
+ public static boolean eval(String expression, StandardEvaluationContext context) {
+ try {
+ Boolean result = EXPRESSION_PARSER.parseExpression(expression).getValue(context, Boolean.class);
+
+ return result != null ? result.booleanValue() : false;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ public static final Pattern EXPRESSION_PATTERN = Pattern.compile(DiscoveryConstant.EXPRESSION_REGEX);
+
+ public static List extractList(String expression) {
+ List list = new ArrayList();
+
+ Matcher matcher = EXPRESSION_PATTERN.matcher(expression);
+ while (matcher.find()) {
+ String group = matcher.group();
+ String name = StringUtils.substringBetween(group, DiscoveryConstant.EXPRESSION_SUB_PREFIX, DiscoveryConstant.EXPRESSION_SUB_SUFFIX).trim();
+
+ list.add(name);
+ }
+
+ return list;
+ }
+
+ public static final Pattern EXPRESSION_SINGLE_QUOTES_PATTERN = Pattern.compile(DiscoveryConstant.EXPRESSION_SINGLE_QUOTES_REGEX);
+
+ public static Map extractMap(String expression) {
+ Map map = new LinkedHashMap();
+
+ Matcher matcher = EXPRESSION_SINGLE_QUOTES_PATTERN.matcher(expression);
+ int index = 0;
+ String key = null;
+ while (matcher.find()) {
+ String group = matcher.group();
+ if (group.startsWith(DiscoveryConstant.EXPRESSION_SINGLE_QUOTES) && group.endsWith(DiscoveryConstant.EXPRESSION_SINGLE_QUOTES)) {
+ String name = StringUtils.substringBetween(group, DiscoveryConstant.EXPRESSION_SINGLE_QUOTES, DiscoveryConstant.EXPRESSION_SINGLE_QUOTES).trim();
+ if (index % 2 == 0) {
+ // 偶数个元素为Key
+ key = name;
+ } else if (index % 2 == 1) {
+ // 奇数个元素为Value
+ map.put(key, name);
+ }
+
+ index++;
+ }
+ }
+
+ return map;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/expression/DiscoveryTypeComparator.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/expression/DiscoveryTypeComparator.java
new file mode 100644
index 0000000000..5813422c1b
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/expression/DiscoveryTypeComparator.java
@@ -0,0 +1,38 @@
+package com.nepxion.discovery.common.expression;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.math.BigDecimal;
+
+import org.springframework.expression.spel.SpelEvaluationException;
+import org.springframework.expression.spel.support.StandardTypeComparator;
+import org.springframework.lang.Nullable;
+
+public class DiscoveryTypeComparator extends StandardTypeComparator {
+ @Override
+ public int compare(@Nullable Object left, @Nullable Object right) throws SpelEvaluationException {
+ if (left == null) {
+ return right == null ? 0 : -1;
+ } else if (right == null) {
+ return 1;
+ }
+
+ try {
+ BigDecimal leftValue = new BigDecimal(left.toString());
+ BigDecimal rightValue = new BigDecimal(right.toString());
+
+ return super.compare(leftValue, rightValue);
+ } catch (Exception e) {
+
+ }
+
+ return super.compare(left, right);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/future/DiscoveryFutureCallback.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/future/DiscoveryFutureCallback.java
new file mode 100644
index 0000000000..56dc322ca7
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/future/DiscoveryFutureCallback.java
@@ -0,0 +1,14 @@
+package com.nepxion.discovery.common.future;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+public interface DiscoveryFutureCallback {
+ T callback() throws Exception;
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/future/DiscoveryFutureResolver.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/future/DiscoveryFutureResolver.java
new file mode 100644
index 0000000000..0d360c1ac5
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/future/DiscoveryFutureResolver.java
@@ -0,0 +1,28 @@
+package com.nepxion.discovery.common.future;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+public class DiscoveryFutureResolver {
+ public static T call(ExecutorService executorService, DiscoveryFutureCallback discoveryFutureCallback) throws InterruptedException, ExecutionException {
+ Future future = executorService.submit(new Callable() {
+ @Override
+ public T call() throws Exception {
+ return discoveryFutureCallback.callback();
+ }
+ });
+
+ return future.get();
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/handler/DiscoveryResponseErrorContext.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/handler/DiscoveryResponseErrorContext.java
new file mode 100644
index 0000000000..e47157f987
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/handler/DiscoveryResponseErrorContext.java
@@ -0,0 +1,57 @@
+package com.nepxion.discovery.common.handler;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class DiscoveryResponseErrorContext {
+ private static final ThreadLocal THREAD_LOCAL = new ThreadLocal() {
+ @Override
+ protected DiscoveryResponseErrorContext initialValue() {
+ return new DiscoveryResponseErrorContext();
+ }
+ };
+
+ private String error;
+
+ public static DiscoveryResponseErrorContext getCurrentContext() {
+ return THREAD_LOCAL.get();
+ }
+
+ public static void clearCurrentContext() {
+ THREAD_LOCAL.remove();
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String error) {
+ this.error = error;
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeBuilder.reflectionHashCode(this);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return EqualsBuilder.reflectionEquals(this, object);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/handler/DiscoveryResponseErrorHandler.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/handler/DiscoveryResponseErrorHandler.java
new file mode 100644
index 0000000000..2cc9144676
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/handler/DiscoveryResponseErrorHandler.java
@@ -0,0 +1,37 @@
+package com.nepxion.discovery.common.handler;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.web.client.DefaultResponseErrorHandler;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public class DiscoveryResponseErrorHandler extends DefaultResponseErrorHandler {
+ @Override
+ public void handleError(ClientHttpResponse response) throws IOException {
+ InputStream inputStream = response.getBody();
+ String error = IOUtils.toString(inputStream, DiscoveryConstant.ENCODING_UTF_8);
+
+ DiscoveryResponseErrorContext.getCurrentContext().setError(error);
+ }
+
+ public String getError() {
+ String error = DiscoveryResponseErrorContext.getCurrentContext().getError();
+
+ DiscoveryResponseErrorContext.clearCurrentContext();
+
+ return error;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/json/DiscoveryPrettyPrinter.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/json/DiscoveryPrettyPrinter.java
new file mode 100644
index 0000000000..d9d578a1df
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/json/DiscoveryPrettyPrinter.java
@@ -0,0 +1,68 @@
+package com.nepxion.discovery.common.json;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.util.DefaultIndenter;
+import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
+import com.fasterxml.jackson.core.util.Separators;
+
+public class DiscoveryPrettyPrinter extends DefaultPrettyPrinter {
+ private static final long serialVersionUID = 7557042630980590487L;
+
+ public DiscoveryPrettyPrinter() {
+ _arrayIndenter = DefaultIndenter.SYSTEM_LINEFEED_INSTANCE;
+ _objectIndenter = DefaultIndenter.SYSTEM_LINEFEED_INSTANCE;
+ }
+
+ public DiscoveryPrettyPrinter(DefaultPrettyPrinter base) {
+ super(base);
+ }
+
+ @Override
+ public DiscoveryPrettyPrinter createInstance() {
+ if (getClass() != DiscoveryPrettyPrinter.class) {
+ throw new IllegalStateException("Failed `createInstance()`: " + getClass().getName()
+ + " does not override method; it has to");
+ }
+ return new DiscoveryPrettyPrinter(this);
+ }
+
+ @Override
+ public DiscoveryPrettyPrinter withSeparators(Separators separators) {
+ this._separators = separators;
+ this._objectFieldValueSeparatorWithSpaces = separators.getObjectFieldValueSeparator() + " ";
+ return this;
+ }
+
+ @Override
+ public void writeEndArray(JsonGenerator g, int nrOfValues) throws IOException {
+ if (!_arrayIndenter.isInline()) {
+ --_nesting;
+ }
+ if (nrOfValues > 0) {
+ _arrayIndenter.writeIndentation(g, _nesting);
+ }
+ g.writeRaw(']');
+ }
+
+ @Override
+ public void writeEndObject(JsonGenerator g, int nrOfEntries) throws IOException {
+ if (!_objectIndenter.isInline()) {
+ --_nesting;
+ }
+ if (nrOfEntries > 0) {
+ _objectIndenter.writeIndentation(g, _nesting);
+ }
+ g.writeRaw('}');
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/lock/DiscoveryLock.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/lock/DiscoveryLock.java
new file mode 100644
index 0000000000..90125f41b6
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/lock/DiscoveryLock.java
@@ -0,0 +1,29 @@
+package com.nepxion.discovery.common.lock;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.List;
+
+public interface DiscoveryLock {
+ // 尝试获取锁
+ boolean tryLock(String key);
+
+ // 持有锁
+ void lock(String key);
+
+ // 释放锁
+ void unlock(String key);
+
+ // 获取被持有的所有锁名称列表
+ List getHeldLocks();
+
+ // 进程结束时销毁锁
+ void destroy() throws Exception;
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/LevelColorConverter.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/LevelColorConverter.java
new file mode 100644
index 0000000000..ce1bc30513
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/LevelColorConverter.java
@@ -0,0 +1,40 @@
+package com.nepxion.discovery.common.logback;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.pattern.color.ForegroundCompositeConverterBase;
+
+// Refer to color definition with https://logback.qos.ch/manual/layouts.html#coloring
+// Windows终端默认不能显示ANSI颜色,需要在注册表HKEY_CURRENT_USER\Console中新建一个DWORD类型的值VirtualTerminalLevel,数值为1
+public class LevelColorConverter extends ForegroundCompositeConverterBase {
+ @Override
+ protected String getForegroundColorCode(ILoggingEvent event) {
+ Level level = event.getLevel();
+ switch (level.toInt()) {
+ // ERROR等级为红色
+ case Level.ERROR_INT:
+ return LogbackConstant.RED_FG;
+ // WARN等级为黄色
+ case Level.WARN_INT:
+ return LogbackConstant.YELLOW_FG;
+ // INFO等级为蓝色
+ case Level.INFO_INT:
+ return LogbackConstant.GREEN_FG;
+ // DEBUG等级为绿色
+ case Level.DEBUG_INT:
+ return LogbackConstant.BLUE_FG;
+ // 其他为默认颜色
+ default:
+ return LogbackConstant.DEFAULT_FG;
+ }
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/LogbackConstant.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/LogbackConstant.java
new file mode 100644
index 0000000000..4134aafbe3
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/LogbackConstant.java
@@ -0,0 +1,16 @@
+package com.nepxion.discovery.common.logback;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import ch.qos.logback.core.pattern.color.ANSIConstants;
+
+public class LogbackConstant extends ANSIConstants {
+ public static final String ANSI_COLOR = "ansi-color";
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/MdcColorConverter.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/MdcColorConverter.java
new file mode 100644
index 0000000000..2bed434fc2
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/logback/MdcColorConverter.java
@@ -0,0 +1,26 @@
+package com.nepxion.discovery.common.logback;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.pattern.color.ForegroundCompositeConverterBase;
+
+import org.apache.commons.lang3.StringUtils;
+
+// Refer to color definition with https://logback.qos.ch/manual/layouts.html#coloring
+// Windows终端默认不能显示ANSI颜色,需要在注册表HKEY_CURRENT_USER\Console中新建一个DWORD类型的值VirtualTerminalLevel,数值为1
+public class MdcColorConverter extends ForegroundCompositeConverterBase {
+ @Override
+ protected String getForegroundColorCode(ILoggingEvent event) {
+ String ansiColor = event.getMDCPropertyMap().get(LogbackConstant.ANSI_COLOR);
+
+ return StringUtils.isNotEmpty(ansiColor) ? ansiColor : LogbackConstant.DEFAULT_FG;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/processor/DiscoveryConfigProcessor.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/processor/DiscoveryConfigProcessor.java
new file mode 100644
index 0000000000..b72bd69d2e
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/processor/DiscoveryConfigProcessor.java
@@ -0,0 +1,113 @@
+package com.nepxion.discovery.common.processor;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.springframework.beans.factory.DisposableBean;
+
+import com.nepxion.discovery.common.entity.ConfigType;
+
+public abstract class DiscoveryConfigProcessor implements DisposableBean {
+ public void logGetStarted() {
+ String group = getGroup();
+ String dataId = getDataId();
+ String description = getDescription();
+ ConfigType configType = getConfigType();
+ boolean isConfigSingleKey = isConfigSingleKey();
+
+ DiscoveryConfigProcessorLogger.logGetStarted(group, dataId, description, configType, isConfigSingleKey);
+ }
+
+ public void logGetFailed(Exception e) {
+ String group = getGroup();
+ String dataId = getDataId();
+ String description = getDescription();
+ ConfigType configType = getConfigType();
+ boolean isConfigSingleKey = isConfigSingleKey();
+
+ DiscoveryConfigProcessorLogger.logGetFailed(group, dataId, description, configType, isConfigSingleKey, e);
+ }
+
+ public void logNotFound() {
+ String description = getDescription();
+ ConfigType configType = getConfigType();
+
+ DiscoveryConfigProcessorLogger.logNotFound(description, configType);
+ }
+
+ public void logSubscribeStarted() {
+ String group = getGroup();
+ String dataId = getDataId();
+ String description = getDescription();
+ ConfigType configType = getConfigType();
+ boolean isConfigSingleKey = isConfigSingleKey();
+
+ DiscoveryConfigProcessorLogger.logSubscribeStarted(group, dataId, description, configType, isConfigSingleKey);
+ }
+
+ public void logSubscribeFailed(Exception e) {
+ String group = getGroup();
+ String dataId = getDataId();
+ String description = getDescription();
+ ConfigType configType = getConfigType();
+ boolean isConfigSingleKey = isConfigSingleKey();
+
+ DiscoveryConfigProcessorLogger.logSubscribeFailed(group, dataId, description, configType, isConfigSingleKey, e);
+ }
+
+ public void logUnsubscribeStarted() {
+ String group = getGroup();
+ String dataId = getDataId();
+ String description = getDescription();
+ ConfigType configType = getConfigType();
+ boolean isConfigSingleKey = isConfigSingleKey();
+
+ DiscoveryConfigProcessorLogger.logUnsubscribeStarted(group, dataId, description, configType, isConfigSingleKey);
+ }
+
+ public void logUnsubscribeFailed(Exception e) {
+ String group = getGroup();
+ String dataId = getDataId();
+ String description = getDescription();
+ ConfigType configType = getConfigType();
+ boolean isConfigSingleKey = isConfigSingleKey();
+
+ DiscoveryConfigProcessorLogger.logUnsubscribeFailed(group, dataId, description, configType, isConfigSingleKey, e);
+ }
+
+ public void logCallbackFailed(Exception e) {
+ String description = getDescription();
+
+ DiscoveryConfigProcessorLogger.logCallbackFailed(description, e);
+ }
+
+ public boolean isConfigSingleKey() {
+ ConfigType configType = getConfigType();
+
+ return ConfigType.isSingleKey(configType);
+ }
+
+ public void beforeInitialization() {
+
+ }
+
+ public void afterInitialization() {
+
+ }
+
+ public abstract ConfigType getConfigType();
+
+ public abstract String getGroup();
+
+ public abstract String getDataId();
+
+ public abstract String getDescription();
+
+ public abstract void callbackConfig(String config);
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/processor/DiscoveryConfigProcessorLogger.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/processor/DiscoveryConfigProcessorLogger.java
new file mode 100644
index 0000000000..4469d3cd94
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/processor/DiscoveryConfigProcessorLogger.java
@@ -0,0 +1,55 @@
+package com.nepxion.discovery.common.processor;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.nepxion.discovery.common.entity.ConfigType;
+
+public class DiscoveryConfigProcessorLogger {
+ private static final Logger LOG = LoggerFactory.getLogger(DiscoveryConfigProcessorLogger.class);
+
+ public static void logGetStarted(String group, String dataId, String description, ConfigType configType, boolean isConfigSingleKey) {
+ LOG.info("Get {} config from {} server, " + getLogKey(isConfigSingleKey), description, configType, group, dataId);
+ }
+
+ public static void logGetFailed(String group, String dataId, String description, ConfigType configType, boolean isConfigSingleKey, Exception e) {
+ LOG.error("Get {} config from {} server failed, " + getLogKey(isConfigSingleKey), description, configType, group, dataId, e);
+ }
+
+ public static void logNotFound(String description, ConfigType configType) {
+ LOG.info("Not found {} config from {} server", description, configType);
+ }
+
+ public static void logSubscribeStarted(String group, String dataId, String description, ConfigType configType, boolean isConfigSingleKey) {
+ LOG.info("Subscribe {} config from {} server, " + getLogKey(isConfigSingleKey), description, configType, group, dataId);
+ }
+
+ public static void logSubscribeFailed(String group, String dataId, String description, ConfigType configType, boolean isConfigSingleKey, Exception e) {
+ LOG.error("Subscribe {} config from {} server failed, " + getLogKey(isConfigSingleKey), description, configType, group, dataId, e);
+ }
+
+ public static void logUnsubscribeStarted(String group, String dataId, String description, ConfigType configType, boolean isConfigSingleKey) {
+ LOG.info("Unsubscribe {} config from {} server, " + getLogKey(isConfigSingleKey), description, configType, group, dataId);
+ }
+
+ public static void logUnsubscribeFailed(String group, String dataId, String description, ConfigType configType, boolean isConfigSingleKey, Exception e) {
+ LOG.error("Unsubscribe {} config from {} server failed, " + getLogKey(isConfigSingleKey), description, configType, group, dataId, e);
+ }
+
+ public static void logCallbackFailed(String description, Exception e) {
+ LOG.error("Callback {} config failed", description, e);
+ }
+
+ private static String getLogKey(boolean isConfigSingleKey) {
+ return isConfigSingleKey ? "key={}-{}" : "group={}, dataId={}";
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/property/DiscoveryContent.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/property/DiscoveryContent.java
new file mode 100644
index 0000000000..ca46058bb8
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/property/DiscoveryContent.java
@@ -0,0 +1,47 @@
+package com.nepxion.discovery.common.property;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+
+import com.nepxion.discovery.common.util.IOUtil;
+
+public class DiscoveryContent {
+ private String content;
+
+ public DiscoveryContent(String path, String encoding) throws IOException {
+ InputStream inputStream = null;
+ try {
+ inputStream = IOUtil.getInputStream(path);
+ this.content = IOUtils.toString(inputStream, encoding);
+ } finally {
+ if (inputStream != null) {
+ IOUtils.closeQuietly(inputStream);
+ }
+ }
+ }
+
+ public DiscoveryContent(File file, String encoding) throws IOException {
+ this.content = FileUtils.readFileToString(file, encoding);
+ }
+
+ public DiscoveryContent(StringBuilder stringBuilder) throws IOException {
+ this.content = stringBuilder.toString();
+ }
+
+ public String getContent() {
+ return content;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/property/DiscoveryProperties.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/property/DiscoveryProperties.java
new file mode 100644
index 0000000000..c7192e4af1
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/property/DiscoveryProperties.java
@@ -0,0 +1,353 @@
+package com.nepxion.discovery.common.property;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.io.IOUtils;
+
+import com.nepxion.discovery.common.util.MathsUtil;
+
+public class DiscoveryProperties implements Serializable {
+ private static final long serialVersionUID = 7157091468155324287L;
+
+ private final Map map = new LinkedHashMap();
+
+ private String content;
+
+ // 配置文件含中文,stringEncoding必须为GBK,readerEncoding必须为UTF-8,文本文件编码必须为ANSI
+ public DiscoveryProperties(String path, String stringEncoding, String readerEncoding) throws IOException {
+ this(new DiscoveryContent(path, stringEncoding).getContent(), readerEncoding);
+ }
+
+ // 配置文件含中文,stringEncoding必须为UTF-8,readerEncoding必须为UTF-8
+ public DiscoveryProperties(byte[] bytes, String stringEncoding, String readerEncoding) throws IOException {
+ this(new String(bytes, stringEncoding), readerEncoding);
+ }
+
+ // 配置文件含中文,encoding必须为UTF-8
+ public DiscoveryProperties(String content, String encoding) throws IOException {
+ this.content = content;
+
+ InputStream inputStream = null;
+ Reader reader = null;
+ try {
+ inputStream = IOUtils.toInputStream(content, encoding);
+ reader = new InputStreamReader(inputStream, encoding);
+
+ Properties properties = new Properties();
+ properties.load(reader);
+ for (Iterator iterator = properties.keySet().iterator(); iterator.hasNext();) {
+ String key = iterator.next().toString();
+ String value = properties.getProperty(key);
+ put(key, value);
+ }
+ } finally {
+ if (reader != null) {
+ IOUtils.closeQuietly(reader);
+ }
+
+ if (inputStream != null) {
+ IOUtils.closeQuietly(inputStream);
+ }
+ }
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void put(String key, String value) {
+ if (value == null) {
+ throw new IllegalArgumentException("Value is null for key [" + key + "]");
+ }
+
+ Long result = MathsUtil.calculate(value);
+ if (result != null) {
+ map.put(key, String.valueOf(result));
+ } else {
+ map.put(key, value);
+ }
+ }
+
+ public Map getMap() {
+ return map;
+ }
+
+ public String getString(String key) {
+ if (!map.containsKey(key)) {
+ throw new IllegalArgumentException("Key [" + key + "] isn't found in properties");
+ }
+
+ return map.get(key);
+ }
+
+ public String getString(String key, String defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ return value;
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public boolean getBoolean(String key) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Boolean.parseBoolean(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to boolean", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public boolean getBoolean(String key, boolean defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Boolean.parseBoolean(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to boolean", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public int getInteger(String key) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Integer.parseInt(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to int", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public int getInteger(String key, int defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Integer.parseInt(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to int", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public long getLong(String key) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Long.parseLong(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to long", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public long getLong(String key, long defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Long.parseLong(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to long", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public short getShort(String key, short defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Short.parseShort(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to short", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public Short getShort(String key, Short defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Short.parseShort(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to short", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public byte getByte(String key) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Byte.parseByte(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to byte", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public byte getByte(String key, byte defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Byte.parseByte(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to byte", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public double getDouble(String key) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Double.parseDouble(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to double", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public double getDouble(String key, double defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Double.parseDouble(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to double", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public float getFloat(String key) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Float.parseFloat(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to float", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public float getFloat(String key, float defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return Float.parseFloat(value);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to float", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public BigInteger getBigInteger(String key) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return BigInteger.valueOf(Long.parseLong(value));
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to BigInteger", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public BigInteger getBigInteger(String key, BigInteger defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return BigInteger.valueOf(Long.parseLong(value));
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to BigInteger", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public BigDecimal getBigDecimal(String key) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return BigDecimal.valueOf(Double.parseDouble(value));
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to BigDecimal", e);
+ }
+ } else {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] is null");
+ }
+ }
+
+ public BigDecimal getBigDecimal(String key, BigDecimal defaultValue) {
+ String value = getString(key);
+ if (value != null) {
+ try {
+ return BigDecimal.valueOf(Double.parseDouble(value));
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Value [" + value + "] for key [" + key + "] can't be parsed to BigDecimal", e);
+ }
+ } else {
+ return defaultValue;
+ }
+ }
+
+ public void mergeProperties(DiscoveryProperties properties) {
+ map.putAll(properties.getMap());
+ }
+
+ @Override
+ public String toString() {
+ return map.toString();
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/thread/DiscoveryNamedThreadFactory.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/thread/DiscoveryNamedThreadFactory.java
new file mode 100644
index 0000000000..3f9db49b74
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/thread/DiscoveryNamedThreadFactory.java
@@ -0,0 +1,39 @@
+package com.nepxion.discovery.common.thread;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class DiscoveryNamedThreadFactory implements ThreadFactory {
+ private AtomicInteger count = new AtomicInteger(1);
+ private ThreadGroup group;
+ private String namePrefix;
+ private boolean daemon;
+
+ public DiscoveryNamedThreadFactory(String namePrefix) {
+ this(namePrefix, false);
+ }
+
+ public DiscoveryNamedThreadFactory(String namePrefix, boolean daemon) {
+ SecurityManager securityManager = System.getSecurityManager();
+ this.group = securityManager != null ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup();
+ this.namePrefix = namePrefix;
+ this.daemon = daemon;
+ }
+
+ @Override
+ public Thread newThread(Runnable runnable) {
+ Thread thread = new Thread(group, runnable, namePrefix + "-thread-" + count.getAndIncrement(), 0);
+ thread.setDaemon(daemon);
+
+ return thread;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/thread/DiscoveryThreadPoolFactory.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/thread/DiscoveryThreadPoolFactory.java
new file mode 100644
index 0000000000..a15b3b0887
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/thread/DiscoveryThreadPoolFactory.java
@@ -0,0 +1,21 @@
+package com.nepxion.discovery.common.thread;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+public class DiscoveryThreadPoolFactory {
+ public static ExecutorService getExecutorService(String name) {
+ return new ThreadPoolExecutor(2, 4, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(1), new DiscoveryNamedThreadFactory(name), new ThreadPoolExecutor.DiscardOldestPolicy());
+ }
+}
\ No newline at end of file
diff --git a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/util/BeanRegisterUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/BeanRegisterUtil.java
similarity index 96%
rename from discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/util/BeanRegisterUtil.java
rename to discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/BeanRegisterUtil.java
index 411cdfd5c8..478e5c893a 100644
--- a/discovery-plugin-framework/src/main/java/com/nepxion/discovery/plugin/framework/util/BeanRegisterUtil.java
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/BeanRegisterUtil.java
@@ -1,4 +1,4 @@
-package com.nepxion.discovery.plugin.framework.util;
+package com.nepxion.discovery.common.util;
/**
* Title: Nepxion Discovery
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/ClassUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/ClassUtil.java
new file mode 100644
index 0000000000..9061ee1207
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/ClassUtil.java
@@ -0,0 +1,36 @@
+package com.nepxion.discovery.common.util;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+public class ClassUtil {
+ public static Map getParameterMap(String[] methodParameterNames, Object[] arguments) {
+ Map parameterMap = new LinkedHashMap();
+ if (ArrayUtils.isNotEmpty(arguments)) {
+ for (int i = 0; i < arguments.length; i++) {
+ String parameterName = null;
+ if (ArrayUtils.isNotEmpty(methodParameterNames)) {
+ parameterName = methodParameterNames[i];
+ } else {
+ parameterName = String.valueOf(i);
+ }
+ Object argument = arguments[i];
+
+ parameterMap.put(parameterName, argument);
+ }
+ }
+
+ return parameterMap;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/EnvironmentUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/EnvironmentUtil.java
new file mode 100644
index 0000000000..09e1888584
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/EnvironmentUtil.java
@@ -0,0 +1,20 @@
+package com.nepxion.discovery.common.util;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.StandardEnvironment;
+
+public class EnvironmentUtil {
+ public static boolean isStandardEnvironment(ConfigurableEnvironment environment) {
+ return StringUtils.equals(environment.getClass().getName(), StandardEnvironment.class.getName());
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/FileUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/FileUtil.java
new file mode 100644
index 0000000000..a53a9734ab
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/FileUtil.java
@@ -0,0 +1,179 @@
+package com.nepxion.discovery.common.util;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationContext;
+
+import com.nepxion.discovery.common.constant.DiscoveryConstant;
+
+public class FileUtil {
+ private static final Logger LOG = LoggerFactory.getLogger(FileUtil.class);
+
+ public static File getFile(ApplicationContext applicationContext, String path) {
+ if (StringUtils.isEmpty(path)) {
+ throw new IllegalArgumentException("File path doesn't set");
+ }
+
+ try {
+ String filePath = applicationContext.getEnvironment().resolvePlaceholders(path);
+
+ File file = applicationContext.getResource(filePath).getFile();
+
+ LOG.info("File [{}] is found", path);
+
+ return file;
+ } catch (Exception e) {
+ LOG.warn("File [{}] isn't found or valid, ignore to load...", path);
+ }
+
+ return null;
+ }
+
+ public static InputStream getInputStream(ApplicationContext applicationContext, String path) {
+ if (StringUtils.isEmpty(path)) {
+ throw new IllegalArgumentException("File path doesn't set");
+ }
+
+ try {
+ String filePath = applicationContext.getEnvironment().resolvePlaceholders(path);
+
+ InputStream inputStream = applicationContext.getResource(filePath).getInputStream();
+
+ LOG.info("File [{}] is found", path);
+
+ return inputStream;
+ } catch (Exception e) {
+ LOG.warn("File [{}] isn't found or valid, ignore to load...", path);
+ }
+
+ return null;
+ }
+
+ public static String getText(ApplicationContext applicationContext, String path) {
+ InputStream inputStream = null;
+ try {
+ inputStream = getInputStream(applicationContext, path);
+ if (inputStream != null) {
+ try {
+ return IOUtils.toString(inputStream, DiscoveryConstant.ENCODING_UTF_8);
+ } catch (IOException e) {
+ LOG.warn("InputStream to String failed, ignore to load...");
+ }
+ }
+ } finally {
+ if (inputStream != null) {
+ IOUtils.closeQuietly(inputStream);
+ }
+ }
+
+ return null;
+ }
+
+ public static void toFile(String text, String directoryPath, String fileName, String encoding) throws IOException {
+ File directory = new File(directoryPath);
+ if (!directory.exists() || !directory.isDirectory()) {
+ directory.mkdirs();
+ }
+
+ File file = new File(directoryPath + File.separator + fileName);
+ FileUtils.writeStringToFile(file, text, encoding);
+ }
+
+ public static void toFile(byte[] bytes, String directoryPath, String fileName) throws IOException {
+ File directory = new File(directoryPath);
+ if (!directory.exists() || !directory.isDirectory()) {
+ directory.mkdirs();
+ }
+
+ BufferedOutputStream bos = null;
+ FileOutputStream fos = null;
+ try {
+ File file = new File(directoryPath + File.separator + fileName);
+ fos = new FileOutputStream(file);
+ bos = new BufferedOutputStream(fos);
+ bos.write(bytes);
+ } finally {
+ if (bos != null) {
+ IOUtils.closeQuietly(bos);
+ }
+ if (fos != null) {
+ IOUtils.closeQuietly(fos);
+ }
+ }
+ }
+
+ public static byte[] fromFile(String directoryPath, String fileName) throws IOException {
+ File file = new File(directoryPath + File.separator + fileName);
+
+ return FileUtils.readFileToByteArray(file);
+ }
+
+ public static void forceDeleteDirectory(File directory, int forceTimes) {
+ if (directory.isDirectory() && directory.exists()) {
+ try {
+ FileUtils.deleteDirectory(directory);
+ forceTimes--;
+ if (forceTimes > 0) {
+ forceDeleteDirectory(directory, forceTimes);
+ } else {
+ throw new IOException("Force delete directory=" + directory + " failed");
+ }
+ } catch (IOException e) {
+
+ }
+ }
+ }
+
+ public static void forceDeleteFile(File file, int forceTimes) {
+ if (file.isFile() && file.exists()) {
+ try {
+ FileUtils.deleteQuietly(file);
+ forceTimes--;
+ if (forceTimes > 0) {
+ forceDeleteFile(file, forceTimes);
+ } else {
+ throw new IOException("Force delete file=" + file + " failed");
+ }
+ } catch (IOException e) {
+
+ }
+ }
+ }
+
+ public static byte[] getBytes(File file) throws FileNotFoundException, IOException {
+ InputStream inputStream = null;
+ try {
+ inputStream = new FileInputStream(file);
+
+ return IOUtils.toByteArray(inputStream);
+ } catch (FileNotFoundException e) {
+ throw e;
+ } catch (IOException e) {
+ throw e;
+ } finally {
+ if (inputStream != null) {
+ IOUtils.closeQuietly(inputStream);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/FormatUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/FormatUtil.java
new file mode 100644
index 0000000000..869a4c1648
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/FormatUtil.java
@@ -0,0 +1,28 @@
+package com.nepxion.discovery.common.util;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import com.nepxion.discovery.common.entity.FormatType;
+
+public class FormatUtil {
+ public static FormatType getFormatType(String content) {
+ if (XmlUtil.isXmlFormat(content)) {
+ return FormatType.XML_FORMAT;
+ } else if (JsonUtil.isJsonFormat(content)) {
+ return FormatType.JSON_FORMAT;
+ /*} else if (YamlUtil.isYamlFormat(content)) {
+ return FormatType.YAML_FORMAT;
+ } else if (PropertiesUtil.isPropertiesFormat(content)) {
+ return FormatType.PROPERTIES_FORMAT;*/
+ } else {
+ return FormatType.TEXT_FORMAT;
+ }
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/IOUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/IOUtil.java
new file mode 100644
index 0000000000..30d68d869c
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/IOUtil.java
@@ -0,0 +1,27 @@
+package com.nepxion.discovery.common.util;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class IOUtil {
+ public static InputStream getInputStream(String path) throws IOException {
+ // 从Resource路径获取
+ InputStream inputStream = IOUtil.class.getClassLoader().getResourceAsStream(path);
+ if (inputStream == null) {
+ // 从文件路径获取
+ inputStream = new FileInputStream(path);
+ }
+
+ return inputStream;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/JsonUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/JsonUtil.java
new file mode 100644
index 0000000000..0cf33c415f
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/JsonUtil.java
@@ -0,0 +1,136 @@
+package com.nepxion.discovery.common.util;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import com.nepxion.discovery.common.json.DiscoveryPrettyPrinter;
+
+public class JsonUtil {
+ private static ObjectMapper objectMapper;
+ private static DiscoveryPrettyPrinter discoveryPrettyPrinter;
+
+ static {
+ objectMapper = new ObjectMapper();
+ // objectMapper.getSerializerProvider().setNullKeySerializer(new NullKeySerializer());
+ // objectMapper.setDateFormat(new SimpleDateFormat(DiscoveryConstant.DATE_FORMAT));
+
+ discoveryPrettyPrinter = new DiscoveryPrettyPrinter();
+ }
+
+ public static class NullKeySerializer extends StdSerializer {
+ private static final long serialVersionUID = -9176767187240330396L;
+
+ public NullKeySerializer() {
+ this(null);
+ }
+
+ public NullKeySerializer(Class object) {
+ super(object);
+ }
+
+ @Override
+ public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+ gen.writeFieldName(StringUtils.EMPTY);
+ }
+ }
+
+ public static String toJson(T object) {
+ if (object == null) {
+ throw new IllegalArgumentException("Object is null");
+ }
+
+ try {
+ return objectMapper.writeValueAsString(object);
+ } catch (JsonProcessingException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
+ public static String toPrettyJson(T object) {
+ if (object == null) {
+ throw new IllegalArgumentException("Object is null");
+ }
+
+ try {
+ return objectMapper.writer(discoveryPrettyPrinter).writeValueAsString(object);
+ } catch (JsonProcessingException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
+ public static T fromJson(String json, Class clazz) {
+ if (StringUtils.isEmpty(json)) {
+ throw new IllegalArgumentException("Json is null or empty");
+ }
+
+ try {
+ return objectMapper.readValue(json, clazz);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
+ public static T fromJson(String json, TypeReference typeReference) {
+ if (StringUtils.isEmpty(json)) {
+ throw new IllegalArgumentException("Json is null or empty");
+ }
+
+ try {
+ return objectMapper.readValue(json, typeReference);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
+ public static boolean isJsonFormat(String json) {
+ if (StringUtils.isBlank(json)) {
+ return false;
+ }
+
+ try {
+ objectMapper.readTree(json);
+
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public static String fromJsonMap(String json, String key) {
+ if (StringUtils.isEmpty(json)) {
+ return null;
+ }
+
+ String value = null;
+ try {
+ Map map = fromJson(json, Map.class);
+ value = map.get(key);
+ } catch (Exception e) {
+ value = json;
+ }
+
+ return value;
+ }
+
+ public static ObjectMapper getObjectMapper() {
+ return objectMapper;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/MathsUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/MathsUtil.java
new file mode 100644
index 0000000000..c1ccb7e7be
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/MathsUtil.java
@@ -0,0 +1,34 @@
+package com.nepxion.discovery.common.util;
+
+/**
+ * Title: Nepxion Aquarius
+ * Description: Nepxion Aquarius
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import org.apache.commons.lang3.StringUtils;
+
+public class MathsUtil {
+ private static final char ASTERISK = '*';
+
+ public static Long calculate(String value) {
+ if (StringUtils.isEmpty(value)) {
+ return null;
+ }
+
+ long result = 1;
+ try {
+ String[] array = StringUtils.split(value, ASTERISK);
+ for (String data : array) {
+ result *= Long.parseLong(data.trim());
+ }
+ } catch (Exception e) {
+ return null;
+ }
+
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/PluginInfoUtil.java b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/PluginInfoUtil.java
new file mode 100644
index 0000000000..d5d9abe1f7
--- /dev/null
+++ b/discovery-commons/discovery-common/src/main/java/com/nepxion/discovery/common/util/PluginInfoUtil.java
@@ -0,0 +1,104 @@
+package com.nepxion.discovery.common.util;
+
+/**
+ * Title: Nepxion Discovery
+ * Description: Nepxion Discovery
+ * Copyright: Copyright (c) 2017-2050
+ * Company: Nepxion
+ * @author Haojun Ren
+ * @version 1.0
+ */
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+public class PluginInfoUtil {
+ private static Pattern pattern = Pattern.compile("\\[\\S+\\]");
+
+ public static List> assembleAll(String text, String filters) {
+ List filterList = StringUtil.splitToList(filters, ",");
+
+ return assembleAll(text, filterList);
+ }
+
+ public static List> assembleAll(String text, List filterList) {
+ List> list = new ArrayList>();
+
+ List singleList = StringUtil.splitToList(text, " -> ");
+ for (String value : singleList) {
+ Map map = assembleSingle(value, filterList);
+
+ list.add(map);
+ }
+
+ return list;
+ }
+
+ public static Map assembleSingle(String text, String filters) {
+ List