From d383fb4677b3d210521e417b228da2c5be2155a9 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Wed, 22 Apr 2020 22:10:30 +0800 Subject: [PATCH 01/92] judging xid status to avoid repeated processing --- .../seata/web/SeataHandlerInterceptor.java | 69 +++++++++++-------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index dcc0b28c..24ca0622 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -39,47 +39,58 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { private static final Logger log = LoggerFactory .getLogger(SeataHandlerInterceptor.class); + + public static final String BIND_XID = "BIND_XID"; + + public static final String UNBIND_XID = "UNBIND_XID"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + Object xid_status = request.getAttribute(BIND_XID); + if (null == xid_status || !(boolean)xid_status) { + String xid = RootContext.getXID(); + String rpcXid = request.getHeader(RootContext.KEY_XID); + if (log.isDebugEnabled()) { + log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); + } - String xid = RootContext.getXID(); - String rpcXid = request.getHeader(RootContext.KEY_XID); - if (log.isDebugEnabled()) { - log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); - } - - if (xid == null && rpcXid != null) { - RootContext.bind(rpcXid); - if (log.isDebugEnabled()) { - log.debug("bind {} to RootContext", rpcXid); - } - } - return true; + if (xid == null && rpcXid != null) { + RootContext.bind(rpcXid); + request.setAttribute(BIND_XID, true); + if (log.isDebugEnabled()) { + log.debug("bind {} to RootContext", rpcXid); + } + } + } + return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { - String rpcXid = request.getHeader(RootContext.KEY_XID); + String rpcXid = request.getHeader(RootContext.KEY_XID); - if (StringUtils.isEmpty(rpcXid)) { - return; - } + if (StringUtils.isEmpty(rpcXid)) { + return; + } - String unbindXid = RootContext.unbind(); - if (log.isDebugEnabled()) { - log.debug("unbind {} from RootContext", unbindXid); - } - if (!rpcXid.equalsIgnoreCase(unbindXid)) { - log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); - if (unbindXid != null) { - RootContext.bind(unbindXid); - log.warn("bind {} back to RootContext", unbindXid); - } - } - } + Object xid_status = request.getAttribute(UNBIND_XID); + if (null == xid_status || !(boolean)xid_status) { + String unbindXid = RootContext.unbind(); + if (log.isDebugEnabled()) { + log.debug("unbind {} from RootContext", unbindXid); + } + if (!rpcXid.equalsIgnoreCase(unbindXid)) { + log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); + if (unbindXid != null) { + RootContext.bind(unbindXid); + request.setAttribute(UNBIND_XID, true); + log.warn("bind {} back to RootContext", unbindXid); + } + } + } + } } From ea0d1d709d26c502863627473651c145d9365600 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Wed, 22 Apr 2020 22:23:27 +0800 Subject: [PATCH 02/92] fix bug --- .../alibaba/cloud/seata/web/SeataHandlerInterceptor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index 24ca0622..5b83b71f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -39,10 +39,10 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { private static final Logger log = LoggerFactory .getLogger(SeataHandlerInterceptor.class); - - public static final String BIND_XID = "BIND_XID"; - public static final String UNBIND_XID = "UNBIND_XID"; + private static final String BIND_XID = "BIND_XID"; + + private static final String UNBIND_XID = "UNBIND_XID"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, From 8fa763f7d6bf790f80e4b9f78a6a67da9f7afc22 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Wed, 22 Apr 2020 22:26:37 +0800 Subject: [PATCH 03/92] fix bug --- .../alibaba/cloud/seata/web/SeataHandlerInterceptor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index 5b83b71f..14b74876 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -47,8 +47,8 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - Object xid_status = request.getAttribute(BIND_XID); - if (null == xid_status || !(boolean)xid_status) { + Object xidStatus = request.getAttribute(BIND_XID); + if (null == xidStatus || !(boolean)xidStatus) { String xid = RootContext.getXID(); String rpcXid = request.getHeader(RootContext.KEY_XID); if (log.isDebugEnabled()) { @@ -76,8 +76,8 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { return; } - Object xid_status = request.getAttribute(UNBIND_XID); - if (null == xid_status || !(boolean)xid_status) { + Object xidStatus = request.getAttribute(UNBIND_XID); + if (null == xidStatus || !(boolean)xidStatus) { String unbindXid = RootContext.unbind(); if (log.isDebugEnabled()) { log.debug("unbind {} from RootContext", unbindXid); From fa588d65c8245f93c83cb28a3c0a151e05ce0033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=81=A5=E6=96=8C?= <364176773@qq.com> Date: Thu, 23 Apr 2020 13:32:24 +0800 Subject: [PATCH 04/92] optimize code --- .../seata/web/SeataHandlerInterceptor.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index 14b74876..fd064dd4 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -47,20 +47,17 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - Object xidStatus = request.getAttribute(BIND_XID); - if (null == xidStatus || !(boolean)xidStatus) { - String xid = RootContext.getXID(); - String rpcXid = request.getHeader(RootContext.KEY_XID); - if (log.isDebugEnabled()) { - log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); - } + String xid = RootContext.getXID(); + String rpcXid = request.getHeader(RootContext.KEY_XID); + if (log.isDebugEnabled()) { + log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); + } - if (xid == null && rpcXid != null) { - RootContext.bind(rpcXid); - request.setAttribute(BIND_XID, true); - if (log.isDebugEnabled()) { - log.debug("bind {} to RootContext", rpcXid); - } + if (xid == null && rpcXid != null) { + RootContext.bind(rpcXid); + request.setAttribute(BIND_XID, true); + if (log.isDebugEnabled()) { + log.debug("bind {} to RootContext", rpcXid); } } return true; @@ -86,7 +83,6 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); if (unbindXid != null) { RootContext.bind(unbindXid); - request.setAttribute(UNBIND_XID, true); log.warn("bind {} back to RootContext", unbindXid); } } From 29cbc0bfbe5903d89a97781193ff96cde74ae2d3 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Tue, 12 May 2020 20:51:33 +0800 Subject: [PATCH 05/92] optimize code --- .../seata/web/SeataHandlerInterceptor.java | 60 ++++++++----------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index 14b74876..3b2def65 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -19,11 +19,11 @@ package com.alibaba.cloud.seata.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import io.seata.common.util.StringUtils; import io.seata.core.context.RootContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; /** @@ -40,44 +40,33 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { private static final Logger log = LoggerFactory .getLogger(SeataHandlerInterceptor.class); - private static final String BIND_XID = "BIND_XID"; - - private static final String UNBIND_XID = "UNBIND_XID"; - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, - Object handler) { - Object xidStatus = request.getAttribute(BIND_XID); - if (null == xidStatus || !(boolean)xidStatus) { - String xid = RootContext.getXID(); - String rpcXid = request.getHeader(RootContext.KEY_XID); - if (log.isDebugEnabled()) { - log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); - } - - if (xid == null && rpcXid != null) { - RootContext.bind(rpcXid); - request.setAttribute(BIND_XID, true); - if (log.isDebugEnabled()) { - log.debug("bind {} to RootContext", rpcXid); - } - } - } - return true; - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, - Object handler, Exception e) { - + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + String xid = RootContext.getXID(); String rpcXid = request.getHeader(RootContext.KEY_XID); - - if (StringUtils.isEmpty(rpcXid)) { - return; + if (log.isDebugEnabled()) { + log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); } - Object xidStatus = request.getAttribute(UNBIND_XID); - if (null == xidStatus || !(boolean)xidStatus) { + if (StringUtils.isBlank(xid) && rpcXid != null) { + RootContext.bind(rpcXid); + if (log.isDebugEnabled()) { + log.debug("bind {} to RootContext", rpcXid); + } + } + + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { + if (StringUtils.isNotBlank(RootContext.getXID())) { + String rpcXid = request.getHeader(RootContext.KEY_XID); + + if (StringUtils.isEmpty(rpcXid)) { + return; + } + String unbindXid = RootContext.unbind(); if (log.isDebugEnabled()) { log.debug("unbind {} from RootContext", unbindXid); @@ -86,7 +75,6 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); if (unbindXid != null) { RootContext.bind(unbindXid); - request.setAttribute(UNBIND_XID, true); log.warn("bind {} back to RootContext", unbindXid); } } From f8fe4cb9a123f355d5a5ce9b3dd82cefda7213d5 Mon Sep 17 00:00:00 2001 From: FUNKYE <364176773@qq.com> Date: Tue, 12 May 2020 20:57:41 +0800 Subject: [PATCH 06/92] Merge branch 'fix_unbind_xid_null' of github.com:a364176773/spring-cloud-alibaba into fix_unbind_xid_null --- .../com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index 3b2def65..86d331b0 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -58,6 +58,7 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { return true; } + @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { if (StringUtils.isNotBlank(RootContext.getXID())) { From eff43225d629ea943d36e7439d628296a603518e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=B1=E7=B4=A7=E6=88=91=E7=9A=84=E5=B0=8F=E9=B2=A4?= =?UTF-8?q?=E9=B1=BC?= Date: Tue, 26 May 2020 11:22:54 +0800 Subject: [PATCH 07/92] fix(nacos): support group add search instance by group --- .../main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java index db0a6d9c..663b9d56 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java @@ -51,12 +51,13 @@ public class NacosRule extends AbstractLoadBalancerRule { public Server choose(Object key) { try { String clusterName = this.nacosDiscoveryProperties.getClusterName(); + String group = this.nacosDiscoveryProperties.getGroup(); DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer(); String name = loadBalancer.getName(); NamingService namingService = nacosDiscoveryProperties .namingServiceInstance(); - List instances = namingService.selectInstances(name, true); + List instances = namingService.selectInstances(name, group, true); if (CollectionUtils.isEmpty(instances)) { LOGGER.warn("no instance in service {}", name); return null; From 3984336a14feb65fec751dc5ab3bd58e13af1fef Mon Sep 17 00:00:00 2001 From: zkzlx Date: Tue, 26 May 2020 14:51:17 +0800 Subject: [PATCH 08/92] =?UTF-8?q?[issue=20#1418=20]shareIds=E5=92=8C?= =?UTF-8?q?=E6=8B=89=E5=8F=96nacos=E7=9A=84=E9=A1=BA=E5=BA=8F=E4=B8=8D?= =?UTF-8?q?=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/alibaba/cloud/nacos/NacosConfigProperties.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java index 1eae17f4..4827aebf 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/NacosConfigProperties.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -487,8 +486,7 @@ public class NacosConfigProperties { List result = new ArrayList<>(); configList.stream() .collect(Collectors.groupingBy(cfg -> (cfg.getGroup() + cfg.getDataId()), - () -> new ConcurrentHashMap<>(new LinkedHashMap<>()), - Collectors.toList())) + LinkedHashMap::new, Collectors.toList())) .forEach((key, list) -> { list.stream() .reduce((a, b) -> new Config(a.getDataId(), a.getGroup(), From 1ced8d231bc822c9540812539cf9bc67533c98b7 Mon Sep 17 00:00:00 2001 From: Yin Qifang Date: Tue, 26 May 2020 17:19:28 +0800 Subject: [PATCH 09/92] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ”去 name“应该是”取 name“ --- .../src/main/asciidoc-zh/nacos-config.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc index 4827d751..4c6f9b25 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc @@ -415,8 +415,8 @@ Endpoint 暴露的 json 中包含了三种属性: |=== |配置项 |Key |默认值 |说明 |服务端地址|`spring.cloud.nacos.config.server-addr`|| Nacos Server 启动监听的ip地址和端口 -|配置对应的 DataId|`spring.cloud.nacos.config.name`|| 先取 prefix,再去 name,最后取 spring.application.name -|配置对应的 DataId|`spring.cloud.nacos.config.prefix`|| 先取 prefix,再去 name,最后取 spring.application.name +|配置对应的 DataId|`spring.cloud.nacos.config.name`|| 先取 prefix,再取 name,最后取 spring.application.name +|配置对应的 DataId|`spring.cloud.nacos.config.prefix`|| 先取 prefix,再取 name,最后取 spring.application.name |配置内容编码|`spring.cloud.nacos.config.encode`||读取的配置内容对应的编码 |GROUP|`spring.cloud.nacos.config.group`|`DEFAULT_GROUP`|配置对应的组 |文件扩展名|`spring.cloud.nacos.config.fileExtension`|`properties`|配置项对应的文件扩展名,目前支持 properties 和 yaml(yml) From 0a89ad61e19f65a93d4c5d503381da58af3f8867 Mon Sep 17 00:00:00 2001 From: zkzlx Date: Wed, 27 May 2020 17:13:59 +0800 Subject: [PATCH 10/92] =?UTF-8?q?[enhance=20issue=20#1478=20]=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=B3=A8=E5=86=8C=E9=9D=9E=E6=B4=BB=E5=8A=A8=E8=8A=82?= =?UTF-8?q?=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/bootstrap.yaml | 1 + .../cloud/nacos/NacosDiscoveryProperties.java | 13 +++++++++++++ .../nacos/discovery/NacosServiceDiscovery.java | 1 + .../cloud/nacos/registry/NacosServiceRegistry.java | 2 +- .../additional-spring-configuration-metadata.json | 6 ++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml index 8f56b284..7efde94a 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/bootstrap.yaml @@ -33,6 +33,7 @@ spring: enabled: true register-enabled: true server-addr: 127.0.0.1:8848 + ephemeral: false --- diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 7f2ff903..12249df5 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -204,6 +204,11 @@ public class NacosDiscoveryProperties { */ private boolean instanceEnabled = true; + /** + * If instance is ephemeral.The default value is true. + */ + private boolean ephemeral = true; + @Autowired private InetUtils inetUtils; @@ -461,6 +466,14 @@ public class NacosDiscoveryProperties { this.instanceEnabled = instanceEnabled; } + public boolean isEphemeral() { + return ephemeral; + } + + public void setEphemeral(boolean ephemeral) { + this.ephemeral = ephemeral; + } + @Override public String toString() { return "NacosDiscoveryProperties{" + "serverAddr='" + serverAddr + '\'' diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java index ffe73aaf..61c0b818 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java @@ -92,6 +92,7 @@ public class NacosServiceDiscovery { metadata.put("nacos.weight", instance.getWeight() + ""); metadata.put("nacos.healthy", instance.isHealthy() + ""); metadata.put("nacos.cluster", instance.getClusterName() + ""); + metadata.put("nacos.ephemeral",String.valueOf(instance.isEphemeral())); metadata.putAll(instance.getMetadata()); nacosServiceInstance.setMetadata(metadata); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java index 7dee3c35..1877ceae 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java @@ -161,7 +161,7 @@ public class NacosServiceRegistry implements ServiceRegistry { instance.setClusterName(nacosDiscoveryProperties.getClusterName()); instance.setEnabled(nacosDiscoveryProperties.isInstanceEnabled()); instance.setMetadata(registration.getMetadata()); - + instance.setEphemeral(nacosDiscoveryProperties.isEphemeral()); return instance; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json index e0e57dd9..0987e598 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -29,6 +29,12 @@ "defaultValue": true, "description": "If instance is enabled to accept request. The default value is true." }, + { + "name": "spring.cloud.nacos.discovery.ephemeral", + "type": "java.lang.Boolean", + "defaultValue": true, + "description": "If instance is ephemeral.The default value is true." + }, { "name": "spring.cloud.nacos.discovery.namingLoadCacheAtStart", "type": "java.lang.Boolean", From acd7681368cffab48e999e099d4ff7c41e1d6bbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E6=A2=A6=E6=8A=80=E6=9C=AF?= <596392912@qq.com> Date: Sat, 30 May 2020 17:07:43 +0800 Subject: [PATCH 11/92] add NacosRegistrationCustomizer.java --- .../nacos/registry/NacosRegistration.java | 15 ++++++++- .../registry/NacosRegistrationCustomizer.java | 31 +++++++++++++++++++ ...NacosServiceRegistryAutoConfiguration.java | 11 ++++--- 3 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java index aac1b82f..5531d936 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java @@ -17,6 +17,7 @@ package com.alibaba.cloud.nacos.registry; import java.net.URI; +import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; @@ -62,8 +63,11 @@ public class NacosRegistration implements Registration, ServiceInstance { private ApplicationContext context; + private List registrationCustomizers; + public NacosRegistration(NacosDiscoveryProperties nacosDiscoveryProperties, - ApplicationContext context) { + ApplicationContext context, + List registrationCustomizers) { this.nacosDiscoveryProperties = nacosDiscoveryProperties; this.context = context; } @@ -105,6 +109,15 @@ public class NacosRegistration implements Registration, ServiceInstance { metadata.put(PreservedMetadataKeys.IP_DELETE_TIMEOUT, nacosDiscoveryProperties.getIpDeleteTimeout().toString()); } + customize(registrationCustomizers,this); + } + + private static void customize(List registrationCustomizers, NacosRegistration registration) { + if (registrationCustomizers != null) { + for (NacosRegistrationCustomizer customizer : registrationCustomizers) { + customizer.customize(registration); + } + } } @Override diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java new file mode 100644 index 00000000..ebf15c67 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java @@ -0,0 +1,31 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.registry; + +/** + * @author L.cm + */ +public interface NacosRegistrationCustomizer { + + /** + * customize NacosRegistration + * + * @param registration NacosRegistration + */ + void customize(NacosRegistration registration); + +} \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java index 04381401..eb5783aa 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java @@ -20,6 +20,7 @@ import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -31,6 +32,8 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + /** * @author xiaojing * @author Mercy @@ -53,10 +56,10 @@ public class NacosServiceRegistryAutoConfiguration { @Bean @ConditionalOnBean(AutoServiceRegistrationProperties.class) - public NacosRegistration nacosRegistration( - NacosDiscoveryProperties nacosDiscoveryProperties, - ApplicationContext context) { - return new NacosRegistration(nacosDiscoveryProperties, context); + public NacosRegistration nacosRegistration(NacosDiscoveryProperties nacosDiscoveryProperties, + ApplicationContext context, + ObjectProvider> registrationCustomizers) { + return new NacosRegistration(nacosDiscoveryProperties, context, registrationCustomizers.getIfAvailable()); } @Bean From d3d7bc00bb661555f0e31067a445f18627c5fad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E6=A2=A6=E6=8A=80=E6=9C=AF?= <596392912@qq.com> Date: Sat, 30 May 2020 17:35:59 +0800 Subject: [PATCH 12/92] add NacosRegistrationCustomizer.java --- .../cloud/nacos/registry/NacosRegistration.java | 17 ++++++++++------- .../registry/NacosRegistrationCustomizer.java | 5 ++--- .../NacosServiceRegistryAutoConfiguration.java | 14 ++++++++------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java index 5531d936..92f1ca42 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java @@ -59,15 +59,16 @@ public class NacosRegistration implements Registration, ServiceInstance { */ public static final String MANAGEMENT_ENDPOINT_BASE_PATH = "management.endpoints.web.base-path"; + private List registrationCustomizers; + private NacosDiscoveryProperties nacosDiscoveryProperties; private ApplicationContext context; - private List registrationCustomizers; - - public NacosRegistration(NacosDiscoveryProperties nacosDiscoveryProperties, - ApplicationContext context, - List registrationCustomizers) { + public NacosRegistration(List registrationCustomizers, + NacosDiscoveryProperties nacosDiscoveryProperties, + ApplicationContext context) { + this.registrationCustomizers = registrationCustomizers; this.nacosDiscoveryProperties = nacosDiscoveryProperties; this.context = context; } @@ -109,10 +110,12 @@ public class NacosRegistration implements Registration, ServiceInstance { metadata.put(PreservedMetadataKeys.IP_DELETE_TIMEOUT, nacosDiscoveryProperties.getIpDeleteTimeout().toString()); } - customize(registrationCustomizers,this); + customize(registrationCustomizers, this); } - private static void customize(List registrationCustomizers, NacosRegistration registration) { + private static void customize( + List registrationCustomizers, + NacosRegistration registration) { if (registrationCustomizers != null) { for (NacosRegistrationCustomizer customizer : registrationCustomizers) { customizer.customize(registration); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java index ebf15c67..e0437602 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizer.java @@ -22,10 +22,9 @@ package com.alibaba.cloud.nacos.registry; public interface NacosRegistrationCustomizer { /** - * customize NacosRegistration - * + * customize NacosRegistration. * @param registration NacosRegistration */ void customize(NacosRegistration registration); -} \ No newline at end of file +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java index eb5783aa..c51c085e 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java @@ -16,6 +16,8 @@ package com.alibaba.cloud.nacos.registry; +import java.util.List; + import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration; @@ -32,8 +34,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.List; - /** * @author xiaojing * @author Mercy @@ -56,10 +56,12 @@ public class NacosServiceRegistryAutoConfiguration { @Bean @ConditionalOnBean(AutoServiceRegistrationProperties.class) - public NacosRegistration nacosRegistration(NacosDiscoveryProperties nacosDiscoveryProperties, - ApplicationContext context, - ObjectProvider> registrationCustomizers) { - return new NacosRegistration(nacosDiscoveryProperties, context, registrationCustomizers.getIfAvailable()); + public NacosRegistration nacosRegistration( + ObjectProvider> registrationCustomizers, + NacosDiscoveryProperties nacosDiscoveryProperties, + ApplicationContext context) { + return new NacosRegistration(registrationCustomizers.getIfAvailable(), + nacosDiscoveryProperties, context); } @Bean From 1e74332a0a470be983ea09d3484296080e6d35fd Mon Sep 17 00:00:00 2001 From: J-Cod3r Date: Sun, 7 Jun 2020 12:26:32 +0000 Subject: [PATCH 13/92] update nacos-discovery-example readme --- .../nacos-example/nacos-discovery-example/readme-zh.md | 2 +- .../nacos-example/nacos-discovery-example/readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md index 2140c5ea..0ad0d23d 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md @@ -30,7 +30,7 @@ public class ProviderApplication { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(ProviderApplication.class, args); } @RestController diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md index 86469101..656829be 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md @@ -29,7 +29,7 @@ Before we start the demo, let's learn how to connect Nacos Config to a Spring Cl public class ProviderApplication { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(ProviderApplication.class, args); } @RestController From 3af1b5c51c48e3ec8425eb65aafa745e810e04c2 Mon Sep 17 00:00:00 2001 From: guerlab Date: Thu, 18 Jun 2020 23:16:27 +0800 Subject: [PATCH 14/92] fix potential NullPointerException --- .../alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java index ffe73aaf..0ae920f8 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java @@ -17,6 +17,7 @@ package com.alibaba.cloud.nacos.discovery; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -92,7 +93,7 @@ public class NacosServiceDiscovery { metadata.put("nacos.weight", instance.getWeight() + ""); metadata.put("nacos.healthy", instance.isHealthy() + ""); metadata.put("nacos.cluster", instance.getClusterName() + ""); - metadata.putAll(instance.getMetadata()); + metadata.putAll(instance.getMetadata() != null ? instance.getMetadata() : Collections.emptyMap()); nacosServiceInstance.setMetadata(metadata); if (metadata.containsKey("secure")) { From 7667a05aefff18fb14b6c957bf340538e53b1134 Mon Sep 17 00:00:00 2001 From: guerlab Date: Fri, 19 Jun 2020 11:25:57 +0800 Subject: [PATCH 15/92] fix NacosServiceDiscovery NullPointerException --- .../alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java index 0ae920f8..848abde9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java @@ -17,7 +17,6 @@ package com.alibaba.cloud.nacos.discovery; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -93,7 +92,9 @@ public class NacosServiceDiscovery { metadata.put("nacos.weight", instance.getWeight() + ""); metadata.put("nacos.healthy", instance.isHealthy() + ""); metadata.put("nacos.cluster", instance.getClusterName() + ""); - metadata.putAll(instance.getMetadata() != null ? instance.getMetadata() : Collections.emptyMap()); + if (instance.getMetadata() != null) { + metadata.putAll(instance.getMetadata()); + } nacosServiceInstance.setMetadata(metadata); if (metadata.containsKey("secure")) { From 5078f355cab378bfd8fe4bcdf8789fb781fe5a63 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Sun, 28 Jun 2020 10:03:36 +0800 Subject: [PATCH 16/92] fix dependency --- .../spring-cloud-starter-alibaba-sentinel/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/pom.xml index 0bbd4cb6..40dc3596 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/pom.xml @@ -153,6 +153,7 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml + true From 940420b0bf5da69d29cc557d5a3eec62e42dd817 Mon Sep 17 00:00:00 2001 From: zkzlx Date: Thu, 9 Jul 2020 10:49:51 +0800 Subject: [PATCH 17/92] =?UTF-8?q?[enhance=20issue=20#1478=20]=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=B3=A8=E5=86=8C=E9=9D=9E=E6=B4=BB=E5=8A=A8=E8=8A=82?= =?UTF-8?q?=E7=82=B9-merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java index a0373189..7818a295 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java @@ -96,7 +96,6 @@ public class NacosServiceDiscovery { metadata.putAll(instance.getMetadata()); } metadata.put("nacos.ephemeral",String.valueOf(instance.isEphemeral())); - metadata.putAll(instance.getMetadata()); nacosServiceInstance.setMetadata(metadata); if (metadata.containsKey("secure")) { From 7921da5ee63ee4f10084c9a2f55fccc2f3dc9e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=81=E6=99=93=E6=B3=A2?= Date: Wed, 15 Jul 2020 21:26:54 +0800 Subject: [PATCH 18/92] to avoid k8s readinessProbe remove the pod For sentinel , we just no need remove the pod just because of the dashboard unreachable. --- .../cloud/sentinel/endpoint/SentinelHealthIndicator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java index 39b43408..996a483b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicator.java @@ -105,7 +105,7 @@ public class SentinelHealthIndicator extends AbstractHealthIndicator { // If failed to send heartbeat message, means that the Dashboard is DOWN dashboardUp = false; detailMap.put("dashboard", - new Status(Status.DOWN.getCode(), String.format( + new Status(Status.UNKNOWN.getCode(), String.format( "the dashboard servers [%s] one of them can't be connected", consoleServerList))); } @@ -138,7 +138,7 @@ public class SentinelHealthIndicator extends AbstractHealthIndicator { // DOWN dataSourceUp = false; dataSourceDetailMap.put(dataSourceBeanName, - new Status(Status.DOWN.getCode(), e.getMessage())); + new Status(Status.UNKNOWN.getCode(), e.getMessage())); } } @@ -147,7 +147,7 @@ public class SentinelHealthIndicator extends AbstractHealthIndicator { builder.up().withDetails(detailMap); } else { - builder.down().withDetails(detailMap); + builder.unknown().withDetails(detailMap); } } From 2d6aead7eb247afe385a0a0003aae7189b473d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=81=E6=99=93=E6=B3=A2?= Date: Wed, 15 Jul 2020 23:49:50 +0800 Subject: [PATCH 19/92] update SentinelHealthIndicatorTests --- .../cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java index b8d68d52..979fed45 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java @@ -163,7 +163,7 @@ public class SentinelHealthIndicatorTests { Health health = sentinelHealthIndicator.health(); - assertThat(health.getStatus()).isEqualTo(Status.DOWN); + assertThat(health.getStatus()).isEqualTo(Status.UNKNOWN); Map dataSourceDetailMap = (Map) health .getDetails().get("dataSource"); assertThat(dataSourceDetailMap.get("ds1-sentinel-file-datasource")) From eb09c52db57318b764dd3acbc3c09d7f038c9d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=81=E6=99=93=E6=B3=A2?= Date: Thu, 16 Jul 2020 12:56:58 +0800 Subject: [PATCH 20/92] Update SentinelHealthIndicatorTests.java update down status to unknown --- .../sentinel/endpoint/SentinelHealthIndicatorTests.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java index 979fed45..96b7adaa 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java @@ -109,9 +109,9 @@ public class SentinelHealthIndicatorTests { Health health = sentinelHealthIndicator.health(); - assertThat(health.getStatus()).isEqualTo(Status.DOWN); + assertThat(health.getStatus()).isEqualTo(Status.UNKNOWN); assertThat(health.getDetails().get("dashboard")).isEqualTo( - new Status(Status.DOWN.getCode(), "localhost:8080 can't be connected")); + new Status(Status.UNKNOWN.getCode(), "localhost:8080 can't be connected")); } @Test @@ -169,7 +169,7 @@ public class SentinelHealthIndicatorTests { assertThat(dataSourceDetailMap.get("ds1-sentinel-file-datasource")) .isEqualTo(Status.UP); assertThat(dataSourceDetailMap.get("ds2-sentinel-file-datasource")) - .isEqualTo(new Status(Status.DOWN.getCode(), "fileDataSource2 error")); + .isEqualTo(new Status(Status.UNKNOWN.getCode(), "fileDataSource2 error")); } } From 588f72a9339e130128ff6efa6d6f97f9ac63fe3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E6=A2=A6=E6=8A=80=E6=9C=AF?= <596392912@qq.com> Date: Sun, 26 Jul 2020 22:30:35 +0800 Subject: [PATCH 21/92] add NacosRegistrationCustomizer.java --- .../NacosRegistrationCustomizerTest.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java new file mode 100644 index 00000000..2a698046 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java @@ -0,0 +1,103 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.registry; + +import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration; +import com.alibaba.nacos.api.NacosFactory; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Properties; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +/** + * @author L.cm + */ +@RunWith(PowerMockRunner.class) +@PowerMockIgnore("javax.management.*") +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ NacosFactory.class }) +@SpringBootTest( + classes = NacosRegistrationCustomizerTest.TestConfig.class, + properties = { "spring.application.name=myTestService1", + "spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848" }, + webEnvironment = RANDOM_PORT) +public class NacosRegistrationCustomizerTest { + + @Autowired + private NacosAutoServiceRegistration nacosAutoServiceRegistration; + + static { + try { + Method method = PowerMockito.method(NacosFactory.class, "createNamingService", + Properties.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + return new MockNamingService(); + } + }); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void contextLoads() throws Exception { + NacosRegistration registration = nacosAutoServiceRegistration.getRegistration(); + Map metadata = registration.getMetadata(); + Assert.assertEquals("test1", metadata.get("test1")); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AutoServiceRegistrationConfiguration.class, + NacosDiscoveryClientConfiguration.class, + NacosServiceRegistryAutoConfiguration.class }) + public static class TestConfig { + + @Bean + public NacosRegistrationCustomizer nacosRegistrationCustomizer() { + return registration -> { + Map metadata = registration.getMetadata(); + metadata.put("test1", "test1"); + }; + } + } + +} From 20f0e57714cb71d25943ad00ede00db0889840e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E6=A2=A6=E6=8A=80=E6=9C=AF?= <596392912@qq.com> Date: Sun, 26 Jul 2020 22:49:10 +0800 Subject: [PATCH 22/92] add NacosRegistrationCustomizer.java --- .../NacosRegistrationCustomizerTest.java | 97 ++++++++++--------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java index 2a698046..139e9f81 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosRegistrationCustomizerTest.java @@ -16,6 +16,11 @@ package com.alibaba.cloud.nacos.registry; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Properties; + import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration; import com.alibaba.nacos.api.NacosFactory; import org.junit.Assert; @@ -27,6 +32,7 @@ import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -36,11 +42,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.util.Map; -import java.util.Properties; - import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; /** @@ -50,54 +51,54 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen @PowerMockIgnore("javax.management.*") @PowerMockRunnerDelegate(SpringRunner.class) @PrepareForTest({ NacosFactory.class }) -@SpringBootTest( - classes = NacosRegistrationCustomizerTest.TestConfig.class, - properties = { "spring.application.name=myTestService1", - "spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848" }, - webEnvironment = RANDOM_PORT) +@SpringBootTest(classes = NacosRegistrationCustomizerTest.TestConfig.class, + properties = { "spring.application.name=myTestService1", + "spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848" }, + webEnvironment = RANDOM_PORT) public class NacosRegistrationCustomizerTest { - @Autowired - private NacosAutoServiceRegistration nacosAutoServiceRegistration; + @Autowired + private NacosAutoServiceRegistration nacosAutoServiceRegistration; - static { - try { - Method method = PowerMockito.method(NacosFactory.class, "createNamingService", - Properties.class); - MethodProxy.proxy(method, new InvocationHandler() { - @Override - public Object invoke(Object proxy, Method method, Object[] args) - throws Throwable { - return new MockNamingService(); - } - }); - } - catch (Exception e) { - e.printStackTrace(); - } - } + static { + try { + Method method = PowerMockito.method(NacosFactory.class, "createNamingService", + Properties.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + return new MockNamingService(); + } + }); + } + catch (Exception e) { + e.printStackTrace(); + } + } - @Test - public void contextLoads() throws Exception { - NacosRegistration registration = nacosAutoServiceRegistration.getRegistration(); - Map metadata = registration.getMetadata(); - Assert.assertEquals("test1", metadata.get("test1")); - } + @Test + public void contextLoads() throws Exception { + NacosRegistration registration = nacosAutoServiceRegistration.getRegistration(); + Map metadata = registration.getMetadata(); + Assert.assertEquals("test1", metadata.get("test1")); + } - @Configuration - @EnableAutoConfiguration - @ImportAutoConfiguration({ AutoServiceRegistrationConfiguration.class, - NacosDiscoveryClientConfiguration.class, - NacosServiceRegistryAutoConfiguration.class }) - public static class TestConfig { + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AutoServiceRegistrationConfiguration.class, + NacosDiscoveryClientConfiguration.class, + NacosServiceRegistryAutoConfiguration.class }) + public static class TestConfig { - @Bean - public NacosRegistrationCustomizer nacosRegistrationCustomizer() { - return registration -> { - Map metadata = registration.getMetadata(); - metadata.put("test1", "test1"); - }; - } - } + @Bean + public NacosRegistrationCustomizer nacosRegistrationCustomizer() { + return registration -> { + Map metadata = registration.getMetadata(); + metadata.put("test1", "test1"); + }; + } + + } } From cf4fdaa3c8d21c6d4bb48ee33d0f6cf51f936f3b Mon Sep 17 00:00:00 2001 From: jy <977996067@qq.com> Date: Mon, 3 Aug 2020 17:52:34 +0800 Subject: [PATCH 23/92] Fix typo in NacosWatch --- .../main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index d10ef0a5..b5dfc8e3 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -74,7 +74,7 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl private static ThreadPoolTaskScheduler getTaskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); - taskScheduler.setBeanName("Nacso-Watch-Task-Scheduler"); + taskScheduler.setBeanName("Nacos-Watch-Task-Scheduler"); taskScheduler.initialize(); return taskScheduler; } From 5bd3400e36176077c0910b2ebb0ad6ae3a805e22 Mon Sep 17 00:00:00 2001 From: Ahian Zhang Date: Thu, 6 Aug 2020 16:11:28 +0800 Subject: [PATCH 24/92] docs: update nacos-config.adoc --- .../src/main/asciidoc-zh/nacos-config.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc index 4c6f9b25..4f7de312 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-config.adoc @@ -229,7 +229,7 @@ in develop-env enviroment; user name :nacos-config-yaml-update; age: 68 spring.profiles.active=product ---- -同时生产环境上 Nacos 需要添加对应 DataId 的基础配置。例如,在生成环境下的 Naocs 添加了DataId为:nacos-config-product.yaml的配置: +同时生产环境上 Nacos 需要添加对应 DataId 的基础配置。例如,在生产环境下的 Naocs 添加了DataId为:nacos-config-product.yaml的配置: [source,subs="normal"] ---- From 4fd7df8d95a20f649a819c2b84803c9b2512bea2 Mon Sep 17 00:00:00 2001 From: xsjk_chixiangen <18182238772m@sina.cn> Date: Mon, 10 Aug 2020 10:38:54 +0800 Subject: [PATCH 25/92] =?UTF-8?q?'=E4=BF=AE=E5=A4=8D=E5=AD=97=E6=AE=B5mast?= =?UTF-8?q?erId=E5=88=A4=E6=96=ADbug'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sentinel/datasource/config/RedisDataSourceProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/RedisDataSourceProperties.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/RedisDataSourceProperties.java index a5049660..1d73e8ba 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/RedisDataSourceProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/RedisDataSourceProperties.java @@ -93,7 +93,7 @@ public class RedisDataSourceProperties extends AbstractDataSourceProperties { "RedisDataSource channel can not be empty"); } - if (!StringUtils.isEmpty(masterId) && StringUtils.isEmpty(masterId)) { + if (StringUtils.isEmpty(masterId)) { throw new IllegalArgumentException( "RedisDataSource sentinel model,masterId can not be empty"); } From 915db3adec0d5e729dee214d1bac38b40beb0428 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Mon, 10 Aug 2020 16:02:28 +0800 Subject: [PATCH 26/92] Polish alibaba/spring-cloud-alibaba#1624 : Upgrading the Dubbo Spring Boot to be 2.7.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e96ed354..9833feb6 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ 1.7.25 - 2.7.6 + 2.7.8 4.0.1 From 1a368ee6f82e8a04cd8242d0068235338b3ea5de Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Mon, 10 Aug 2020 16:04:01 +0800 Subject: [PATCH 27/92] Polish alibaba/spring-cloud-alibaba#1624 : [Infrastructure] Upgrading Alibaba's Spring Context Support to 1.0.9 --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 5228debe..c7b9ec1e 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -24,7 +24,7 @@ 1.2.0 1.2.1 0.8.0 - 1.0.6 + 1.0.9 2.2.1 From 098919807b3f3c2f68d908184f1a06a5f09e8970 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Mon, 10 Aug 2020 16:07:44 +0800 Subject: [PATCH 28/92] Polish alibaba/spring-cloud-alibaba#1611 : When openfeign and dubbo coexist, DubboServiceAutoConfiguration.primaryPropertyResolver configuration causes openfeign call to fail #728 --- .../DubboServiceAutoConfiguration.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceAutoConfiguration.java index 9de4a27d..77764e90 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceAutoConfiguration.java @@ -24,15 +24,11 @@ import com.alibaba.cloud.dubbo.service.parameter.RequestBodyServiceParameterReso import com.alibaba.cloud.dubbo.service.parameter.RequestHeaderServiceParameterResolver; import com.alibaba.cloud.dubbo.service.parameter.RequestParamServiceParameterResolver; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.core.env.Environment; -import org.springframework.core.env.PropertyResolver; /** * Spring Boot Auto-Configuration class for Dubbo Service. @@ -49,17 +45,6 @@ public class DubboServiceAutoConfiguration { return new DubboGenericServiceFactory(); } - /** - * Build a primary {@link PropertyResolver} bean to {@link Autowired @Autowired}. - * @param environment {@link Environment} - * @return alias bean for {@link Environment} - */ - @Bean - @Primary - public PropertyResolver primaryPropertyResolver(Environment environment) { - return environment; - } - @Configuration(proxyBeanMethods = false) @Import({ DubboGenericServiceExecutionContextFactory.class, RequestParamServiceParameterResolver.class, From e838f471a4b26237bf06962af405ff9c4e9669c4 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 11 Aug 2020 15:18:59 +0800 Subject: [PATCH 29/92] Polish alibaba/spring-cloud-alibaba#1628 : [Infrastructure] Upgrading the dependencies of Nacos --- pom.xml | 2 +- spring-cloud-alibaba-dependencies/pom.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 9833feb6..90fbb265 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ - 2.2.1.RELEASE + 2.2.2-SNAPSHOT 2.2.2.RELEASE diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index c7b9ec1e..c8810146 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -22,8 +22,8 @@ 1.7.2 3.1.0 1.2.0 - 1.2.1 - 0.8.0 + 1.3.2 + 1.3.2 1.0.9 From 824daf5bb6b90d10106e1de9c2432e4114ea5c1b Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 11 Aug 2020 15:55:26 +0800 Subject: [PATCH 30/92] Polish alibaba/spring-cloud-alibaba#1628 : [Infrastructure] Upgrading the dependencies of Nacos --- .../com/alibaba/cloud/nacos/registry/MockNamingService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java index 66753af7..ffca3607 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java @@ -328,4 +328,9 @@ public class MockNamingService implements NamingService { return null; } + @Override + public void shutDown() throws NacosException { + + } + } From 62def5876a2952732025ad0c1577e22f51d99fbb Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 11 Aug 2020 16:09:43 +0800 Subject: [PATCH 31/92] Polish alibaba/spring-cloud-alibaba#1628 : [Infrastructure] Upgrading the dependencies of Nacos --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index c8810146..d5d3ed9a 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -23,7 +23,7 @@ 3.1.0 1.2.0 1.3.2 - 1.3.2 + 0.8.0 1.0.9 From c26ac6fe0f9991cd16e7a1cc7c921cdf65159d82 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 13 Aug 2020 15:37:14 +0800 Subject: [PATCH 32/92] Polish alibaba/spring-cloud-alibaba#1453 : [Nacos] Adding the destroy lifecycle callback for NamingService --- .../cloud/nacos/NacosDiscoveryProperties.java | 47 ++++++------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 12249df5..0882ee08 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -19,7 +19,6 @@ package com.alibaba.cloud.nacos; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; -import java.net.SocketException; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -29,9 +28,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; -import com.alibaba.nacos.api.NacosFactory; -import com.alibaba.nacos.api.naming.NamingMaintainFactory; import com.alibaba.nacos.api.naming.NamingMaintainService; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; @@ -48,6 +46,8 @@ import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; +import static com.alibaba.nacos.api.NacosFactory.createMaintainService; +import static com.alibaba.nacos.api.NacosFactory.createNamingService; import static com.alibaba.nacos.api.PropertyKeyConst.ACCESS_KEY; import static com.alibaba.nacos.api.PropertyKeyConst.CLUSTER_NAME; import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT; @@ -215,13 +215,12 @@ public class NacosDiscoveryProperties { @Autowired private Environment environment; - private static NamingService namingService; + private NamingService namingService; - private static NamingMaintainService namingMaintainService; + private NamingMaintainService namingMaintainService; @PostConstruct - public void init() throws SocketException { - namingService = null; + public void init() throws Exception { metadata.put(PreservedMetadataKeys.REGISTER_SOURCE, "SPRING_CLOUD"); if (secure) { @@ -268,6 +267,15 @@ public class NacosDiscoveryProperties { } this.overrideFromEnv(environment); + + Properties properties = getNacosProperties(); + this.namingService = createNamingService(properties); + this.namingMaintainService = createMaintainService(properties); + } + + @PreDestroy + public void destroy() { + } public String getEndpoint() { @@ -538,36 +546,11 @@ public class NacosDiscoveryProperties { } public NamingService namingServiceInstance() { - - if (null != namingService) { - return namingService; - } - - try { - namingService = NacosFactory.createNamingService(getNacosProperties()); - } - catch (Exception e) { - log.error("create naming service error!properties={},e=,", this, e); - return null; - } return namingService; } @Deprecated public NamingMaintainService namingMaintainServiceInstance() { - - if (null != namingMaintainService) { - return namingMaintainService; - } - - try { - namingMaintainService = NamingMaintainFactory - .createMaintainService(getNacosProperties()); - } - catch (Exception e) { - log.error("create naming service error!properties={},e=,", this, e); - return null; - } return namingMaintainService; } From 5da87d756d5986b5df9ee19c0818f301ad8680a3 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 13 Aug 2020 16:24:01 +0800 Subject: [PATCH 33/92] Polish alibaba/spring-cloud-alibaba#1453 : [Nacos] Adding the destroy lifecycle callback for NamingService --- .../cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java index 705c0d77..1a7a6d87 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryProperties.java @@ -16,8 +16,6 @@ package com.alibaba.cloud.sidecar.nacos; -import java.net.SocketException; - import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.sidecar.SidecarProperties; @@ -35,7 +33,7 @@ public class SidecarNacosDiscoveryProperties extends NacosDiscoveryProperties { } @Override - public void init() throws SocketException { + public void init() throws Exception { super.init(); String ip = sidecarProperties.getIp(); From ad36fd2e95cdb763016e89b8ed56d23a02acca37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E7=BB=A7=E5=B3=B0?= Date: Mon, 17 Aug 2020 20:00:07 +0800 Subject: [PATCH 34/92] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nacos-example/nacos-config-example/readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md index b415bf8c..797c09cc 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme.md @@ -25,6 +25,7 @@ Before we start the demo, let's learn how to connect Nacos Config to a Spring Cl spring.cloud.nacos.config.server-addr=127.0.0.1:8848 3. After completing the above two steps, the application will get the externalized configuration from Nacos Server and put it in the Spring Environment's PropertySources.We use the @Value annotation to inject the corresponding configuration into the userName and age fields of the SampleController, and add @RefreshScope to turn on dynamic refresh . + @RefreshScope class SampleController { From bace42b0488e6a98c5168d866430e3fb49823847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E9=BB=84=E5=BD=AC?= Date: Wed, 19 Aug 2020 10:49:57 +0800 Subject: [PATCH 35/92] Update README-zh.md --- README-zh.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README-zh.md b/README-zh.md index ba208d1e..5b5bdf63 100644 --- a/README-zh.md +++ b/README-zh.md @@ -39,8 +39,6 @@ Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。 **[Seata](https://github.com/seata/seata)**:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。 -**[Alibaba Cloud ACM](https://www.aliyun.com/product/acm)**:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。 - **[Alibaba Cloud OSS](https://www.aliyun.com/product/oss)**: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。 **[Alibaba Cloud SchedulerX](https://help.aliyun.com/document_detail/43136.html)**: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。 @@ -97,13 +95,11 @@ Example 列表: [Seata Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/seata-example/readme-zh.md) -[Alibaba Cloud OSS Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/oss-example/readme-zh.md) +[Alibaba Cloud OSS Example](https://github.com/alibaba/aliyun-spring-boot/tree/master/aliyun-spring-boot-samples/aliyun-oss-spring-boot-sample) -[Alibaba Cloud ANS Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/ans-example/ans-provider-example/readme-zh.md) +[Alibaba Cloud SMS Example](https://github.com/alibaba/aliyun-spring-boot/tree/master/aliyun-spring-boot-samples/aliyun-sms-spring-boot-sample) -[Alibaba Cloud ACM Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/acm-example/acm-local-example/readme-zh.md) - -[Alibaba Cloud SchedulerX Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/readme-zh.md) +[Alibaba Cloud SchedulerX Example](https://github.com/alibaba/aliyun-spring-boot) ## 版本管理规范 From 65a902392afd4382e34bd14bf7594b746023ac87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E9=BB=84=E5=BD=AC?= Date: Wed, 19 Aug 2020 10:53:20 +0800 Subject: [PATCH 36/92] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index f2453c75..4f946dc4 100644 --- a/README.md +++ b/README.md @@ -89,8 +89,6 @@ add the module in `dependencies`. [Nacos Discovery](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc) -[ACM](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/acm.adoc) - ## Examples @@ -106,7 +104,7 @@ Examples: [RocketMQ Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/rocketmq-example/readme.md) -[Alibaba Cloud OSS Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/oss-example/readme.md) +[Alibaba Cloud OSS Example](https://github.com/alibaba/aliyun-spring-boot/tree/master/aliyun-spring-boot-samples/aliyun-oss-spring-boot-sample) [Dubbo Spring Cloud Example](https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/README_CN.md) From c4f5c7d2b2347d2795019883c3eb86d28898c486 Mon Sep 17 00:00:00 2001 From: slievrly Date: Thu, 20 Aug 2020 11:52:53 +0800 Subject: [PATCH 37/92] [Seata]: upgrade seata version to 1.3.0 Signed-off-by: slievrly --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index d5d3ed9a..d4e8ee0e 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -21,7 +21,7 @@ 2.2.1.RELEASE 1.7.2 3.1.0 - 1.2.0 + 1.3.0 1.3.2 0.8.0 1.0.9 From c0bcd523811bf026603aa222ffbed15d9d51a049 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 25 Aug 2020 16:22:12 +0800 Subject: [PATCH 38/92] Polish alibaba/spring-cloud-alibaba#1661 : [Feature] Introducing Dubbo Gateway --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- .../src/main/resources/application.yaml | 5 - spring-cloud-alibaba-starters/pom.xml | 1 + .../pom.xml | 1 + .../discovery/NacosServiceDiscovery.java | 2 +- .../SeataHystrixConcurrencyStrategy.java | 63 ++++--- .../pom.xml | 167 ++++++++++++++++++ .../gateway/DubboCloudGatewayConstants.java | 34 ++++ .../gateway/DubboCloudGatewayExecutor.java | 166 +++++++++++++++++ .../gateway/DubboCloudGatewayProperties.java | 56 ++++++ .../DubboCloudGatewayAutoConfiguration.java | 54 ++++++ ...boSpringCloudGatewayAutoConfiguration.java | 74 ++++++++ .../DubboSpringCloudGatewayFilter.java | 74 ++++++++ .../main/resources/META-INF/spring.factories | 3 + .../DubboSpringCloudGatewayBootstrap.java | 37 ++++ .../src/test/resources/application.yaml | 74 ++++++++ .../cloud/dubbo/env/DubboCloudProperties.java | 3 +- .../cloud/dubbo/util/DubboCloudConstants.java | 31 ++++ 18 files changed, 815 insertions(+), 32 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayAutoConfiguration.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayFilter.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index d4e8ee0e..e385d561 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -18,7 +18,7 @@ Spring Cloud Alibaba Dependencies - 2.2.1.RELEASE + 2.2.2-SNAPSHOT 1.7.2 3.1.0 1.3.0 diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml index 1a7ec7c5..5a855843 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/resources/application.yaml @@ -9,11 +9,6 @@ dubbo: name: rest port: 9090 server: netty - registry: -# The Spring Cloud Dubbo's registry extension - address: spring-cloud://localhost -# The traditional Dubbo's registry -# address: zookeeper://127.0.0.1:2181 feign: hystrix: enabled: true \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/pom.xml b/spring-cloud-alibaba-starters/pom.xml index 1249b019..c3f08398 100644 --- a/spring-cloud-alibaba-starters/pom.xml +++ b/spring-cloud-alibaba-starters/pom.xml @@ -22,6 +22,7 @@ spring-cloud-starter-stream-rocketmq spring-cloud-starter-bus-rocketmq spring-cloud-starter-dubbo + spring-cloud-starter-dubbo-gateway spring-cloud-starter-alibaba-sidecar spring-cloud-circuitbreaker-sentinel spring-cloud-starter-alibaba-sentinel diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/pom.xml index 2461c672..49283a18 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/pom.xml @@ -59,6 +59,7 @@ spring-cloud-starter-gateway true + com.fasterxml.jackson.dataformat jackson-dataformat-xml diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java index 7818a295..e021e34b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java @@ -95,7 +95,7 @@ public class NacosServiceDiscovery { if (instance.getMetadata() != null) { metadata.putAll(instance.getMetadata()); } - metadata.put("nacos.ephemeral",String.valueOf(instance.isEphemeral())); + metadata.put("nacos.ephemeral", String.valueOf(instance.isEphemeral())); nacosServiceInstance.setMetadata(metadata); if (metadata.containsKey("secure")) { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java index 94185c8a..2aa507bd 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java @@ -44,7 +44,9 @@ import org.springframework.web.context.request.RequestContextHolder; */ public class SeataHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy { - private final Logger logger = LoggerFactory.getLogger(SeataHystrixConcurrencyStrategy.class); + private final Logger logger = LoggerFactory + .getLogger(SeataHystrixConcurrencyStrategy.class); + private HystrixConcurrencyStrategy delegate; public SeataHystrixConcurrencyStrategy() { @@ -53,45 +55,54 @@ public class SeataHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy if (this.delegate instanceof SeataHystrixConcurrencyStrategy) { return; } - HystrixCommandExecutionHook commandExecutionHook = HystrixPlugins.getInstance().getCommandExecutionHook(); - HystrixEventNotifier eventNotifier = HystrixPlugins.getInstance().getEventNotifier(); - HystrixMetricsPublisher metricsPublisher = HystrixPlugins.getInstance().getMetricsPublisher(); - HystrixPropertiesStrategy propertiesStrategy = HystrixPlugins.getInstance().getPropertiesStrategy(); - logCurrentStateOfHystrixPlugins(eventNotifier, metricsPublisher, propertiesStrategy); + HystrixCommandExecutionHook commandExecutionHook = HystrixPlugins + .getInstance().getCommandExecutionHook(); + HystrixEventNotifier eventNotifier = HystrixPlugins.getInstance() + .getEventNotifier(); + HystrixMetricsPublisher metricsPublisher = HystrixPlugins.getInstance() + .getMetricsPublisher(); + HystrixPropertiesStrategy propertiesStrategy = HystrixPlugins.getInstance() + .getPropertiesStrategy(); + logCurrentStateOfHystrixPlugins(eventNotifier, metricsPublisher, + propertiesStrategy); HystrixPlugins.reset(); HystrixPlugins.getInstance().registerConcurrencyStrategy(this); - HystrixPlugins.getInstance().registerCommandExecutionHook(commandExecutionHook); + HystrixPlugins.getInstance() + .registerCommandExecutionHook(commandExecutionHook); HystrixPlugins.getInstance().registerEventNotifier(eventNotifier); HystrixPlugins.getInstance().registerMetricsPublisher(metricsPublisher); HystrixPlugins.getInstance().registerPropertiesStrategy(propertiesStrategy); - } catch (Exception ex) { + } + catch (Exception ex) { logger.error("Failed to register Seata Hystrix Concurrency Strategy", ex); } } private void logCurrentStateOfHystrixPlugins(HystrixEventNotifier eventNotifier, - HystrixMetricsPublisher metricsPublisher, - HystrixPropertiesStrategy propertiesStrategy) { + HystrixMetricsPublisher metricsPublisher, + HystrixPropertiesStrategy propertiesStrategy) { if (logger.isDebugEnabled()) { - logger.debug("Current Hystrix plugins configuration is [" + "concurrencyStrategy [" + this.delegate + "]," - + "eventNotifier [" + eventNotifier + "]," + "metricPublisher [" + metricsPublisher + "]," - + "propertiesStrategy [" + propertiesStrategy + "]," + "]"); + logger.debug("Current Hystrix plugins configuration is [" + + "concurrencyStrategy [" + this.delegate + "]," + "eventNotifier [" + + eventNotifier + "]," + "metricPublisher [" + metricsPublisher + "]," + + "propertiesStrategy [" + propertiesStrategy + "]," + "]"); logger.debug("Registering Seata Hystrix Concurrency Strategy."); } } @Override - public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey, HystrixProperty corePoolSize, - HystrixProperty maximumPoolSize, - HystrixProperty keepAliveTime, TimeUnit unit, - BlockingQueue workQueue) { - return this.delegate.getThreadPool(threadPoolKey, corePoolSize, maximumPoolSize, keepAliveTime, unit, - workQueue); + public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey, + HystrixProperty corePoolSize, + HystrixProperty maximumPoolSize, + HystrixProperty keepAliveTime, TimeUnit unit, + BlockingQueue workQueue) { + return this.delegate.getThreadPool(threadPoolKey, corePoolSize, maximumPoolSize, + keepAliveTime, unit, workQueue); } @Override public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey, - HystrixThreadPoolProperties threadPoolProperties) { + HystrixThreadPoolProperties threadPoolProperties) { return this.delegate.getThreadPool(threadPoolKey, threadPoolProperties); } @@ -101,7 +112,8 @@ public class SeataHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy } @Override - public HystrixRequestVariable getRequestVariable(HystrixRequestVariableLifecycle rv) { + public HystrixRequestVariable getRequestVariable( + HystrixRequestVariableLifecycle rv) { return this.delegate.getRequestVariable(rv); } @@ -114,14 +126,16 @@ public class SeataHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy Callable wrappedCallable; if (this.delegate != null) { wrappedCallable = this.delegate.wrapCallable(c); - } else { + } + else { wrappedCallable = c; } if (wrappedCallable instanceof SeataContextCallable) { return wrappedCallable; } - return new SeataContextCallable<>(wrappedCallable, RequestContextHolder.getRequestAttributes()); + return new SeataContextCallable<>(wrappedCallable, + RequestContextHolder.getRequestAttributes()); } private static class SeataContextCallable implements Callable { @@ -144,7 +158,8 @@ public class SeataHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy RequestContextHolder.setRequestAttributes(requestAttributes); RootContext.bind(xid); return actual.call(); - } finally { + } + finally { RootContext.unbind(); RequestContextHolder.resetRequestAttributes(); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml new file mode 100644 index 00000000..224e93e4 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml @@ -0,0 +1,167 @@ + + + + + com.alibaba.cloud + spring-cloud-alibaba-starters + ${revision} + ../pom.xml + + + 4.0.0 + + spring-cloud-starter-dubbo-gateway + Spring Cloud Starter Dubbo Gateway + + + + + + org.springframework.boot + spring-boot-starter + true + + + + org.springframework.boot + spring-boot-actuator + true + + + + org.springframework.boot + spring-boot-actuator-autoconfigure + true + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot + true + + + + org.springframework.boot + spring-boot-autoconfigure + true + + + + + org.springframework.cloud + spring-cloud-commons + true + + + + org.springframework.cloud + spring-cloud-context + true + + + + + + + + + + + + org.springframework.cloud + spring-cloud-starter-gateway + true + + + + + com.alibaba.cloud + spring-cloud-starter-dubbo + + + + org.apache.commons + commons-lang3 + 3.11 + + + + + org.springframework + spring-test + test + + + + org.springframework.boot + spring-boot-test + test + + + + + + + + + + + + org.springframework.cloud + spring-cloud-starter-zookeeper-discovery + ${spring-cloud-zookeeper.version} + test + + + org.apache.zookeeper + zookeeper + + + + + + org.apache.zookeeper + zookeeper + 3.4.14 + test + + + org.slf4j + slf4j-log4j12 + + + + + + org.apache.curator + curator-framework + ${curator.version} + test + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java new file mode 100644 index 00000000..372f0e6f --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.gateway; + +import com.alibaba.cloud.dubbo.util.DubboCloudConstants; + +/** + * The constants of Dubbo Cloud Gateway + * + * @author Mercy + */ +public interface DubboCloudGatewayConstants { + + /** + * The property prefix of Configuration + */ + String CONFIG_PROPERTY_PREFIX = DubboCloudConstants.CONFIG_PROPERTY_PREFIX + + ".gateway"; + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java new file mode 100644 index 00000000..d591e986 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java @@ -0,0 +1,166 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.gateway; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; + +import com.alibaba.cloud.dubbo.http.MutableHttpServerRequest; +import com.alibaba.cloud.dubbo.metadata.DubboRestServiceMetadata; +import com.alibaba.cloud.dubbo.metadata.RequestMetadata; +import com.alibaba.cloud.dubbo.metadata.RestMethodMetadata; +import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContext; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.apache.dubbo.rpc.service.GenericException; +import org.apache.dubbo.rpc.service.GenericService; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.core.convert.ConversionService; +import org.springframework.format.support.DefaultFormattingConversionService; +import org.springframework.http.HttpRequest; + +import static com.alibaba.cloud.dubbo.http.util.HttpUtils.getParameters; +import static org.apache.commons.lang3.StringUtils.substringAfter; +import static org.apache.commons.lang3.StringUtils.substringBetween; +import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR; + +/** + * The executor of Dubbo Cloud Gateway that handles the HTTP request and responses the + * result of execution of the generic invocation to the Dubbo service providers + * + * @author Mercy + * + */ +public class DubboCloudGatewayExecutor { + + private final Log logger = LogFactory.getLog(getClass()); + + private final DubboServiceMetadataRepository repository; + + private final DubboGenericServiceFactory serviceFactory; + + private final DubboGenericServiceExecutionContextFactory contextFactory; + + private final DubboCloudGatewayProperties dubboCloudGatewayProperties; + + private final ConversionService conversionService; + + private final Map dubboTranslatedAttributes = new HashMap<>(); + + public DubboCloudGatewayExecutor(DubboServiceMetadataRepository repository, + DubboGenericServiceFactory serviceFactory, + DubboGenericServiceExecutionContextFactory contextFactory, + DubboCloudGatewayProperties dubboCloudGatewayProperties, + ObjectProvider conversionServices) { + this.repository = repository; + this.serviceFactory = serviceFactory; + this.contextFactory = contextFactory; + this.dubboCloudGatewayProperties = dubboCloudGatewayProperties; + this.conversionService = conversionServices + .getIfAvailable(DefaultFormattingConversionService::new); + // TODO : Replace these hard-code configurations + this.dubboTranslatedAttributes.put("protocol", "dubbo"); + this.dubboTranslatedAttributes.put("cluster", "failover"); + } + + public Object execute(HttpRequest request) { + + String serviceName = resolveServiceName(request); + + String restPath = substringAfter(request.getURI().getPath(), serviceName); + + // 初始化 serviceName 的 REST 请求元数据 + repository.initializeMetadata(serviceName); + // 将 HttpServletRequest 转化为 RequestMetadata + RequestMetadata clientMetadata = buildRequestMetadata(request, restPath); + + DubboRestServiceMetadata dubboRestServiceMetadata = repository.get(serviceName, + clientMetadata); + + Object result = null; + + if (dubboRestServiceMetadata != null) { + + RestMethodMetadata dubboRestMethodMetadata = dubboRestServiceMetadata + .getRestMethodMetadata(); + + GenericService genericService = serviceFactory + .create(dubboRestServiceMetadata, dubboTranslatedAttributes); + + byte[] body = getRequestBody(request); + + MutableHttpServerRequest httpServerRequest = new MutableHttpServerRequest( + request, body); + + DubboGenericServiceExecutionContext context = contextFactory + .create(dubboRestMethodMetadata, httpServerRequest); + + GenericException exception = null; + + try { + result = genericService.$invoke(context.getMethodName(), + context.getParameterTypes(), context.getParameters()); + + String returnType = dubboRestMethodMetadata.getReturnType(); + + logger.info("The result is " + result); + + } + catch (GenericException e) { + exception = e; + } + } + + return result; + + } + + private String resolveServiceName(HttpRequest request) { + URI uri = request.getURI(); + String requestURI = uri.getPath(); + String servletPath = dubboCloudGatewayProperties.getContextPath(); + String part = substringAfter(requestURI, servletPath); + String serviceName = substringBetween(part, PATH_SEPARATOR, PATH_SEPARATOR); + return serviceName; + } + + /** + * TODO : Get the Request Body from HttpRequest + * + * @param request {@link HttpRequest} + * @return + */ + private byte[] getRequestBody(HttpRequest request) { + return new byte[0]; + } + + private RequestMetadata buildRequestMetadata(HttpRequest request, String restPath) { + RequestMetadata requestMetadata = new RequestMetadata(); + requestMetadata.setPath(restPath); + requestMetadata.setMethod(request.getMethod().toString()); + requestMetadata.setParams(getParameters(request)); + requestMetadata.setHeaders(request.getHeaders()); + return requestMetadata; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java new file mode 100644 index 00000000..0582018f --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.gateway; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import static com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayConstants.CONFIG_PROPERTY_PREFIX; + +/** + * The Configuration Properties for Dubbo Cloud Gateway + * + * @author Mercy + */ +@ConfigurationProperties(prefix = CONFIG_PROPERTY_PREFIX) +public class DubboCloudGatewayProperties { + + /** + * Enabled or not + */ + private boolean enabled = true; + + /** + * The context path for the gateway request mapping + */ + private String contextPath = ""; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getContextPath() { + return contextPath; + } + + public void setContextPath(String contextPath) { + this.contextPath = contextPath; + } +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java new file mode 100644 index 00000000..b0cf834e --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.gateway.autoconfigure; + +import com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration; +import com.alibaba.cloud.dubbo.autoconfigure.DubboServiceAutoConfiguration; +import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; +import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayProperties; +import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.ConversionService; + +@Configuration(proxyBeanMethods = false) +@ConditionalOnProperty(prefix = "dubbo.cloud.gateway", name = "enabled", havingValue = "true", matchIfMissing = true) +@AutoConfigureAfter({ DubboServiceAutoConfiguration.class, + DubboMetadataAutoConfiguration.class }) +@EnableConfigurationProperties(DubboCloudGatewayProperties.class) +public class DubboCloudGatewayAutoConfiguration { + + @Bean + @ConditionalOnMissingBean(DubboCloudGatewayExecutor.class) + public DubboCloudGatewayExecutor dubboCloudGatewayExecutor( + DubboServiceMetadataRepository repository, + DubboGenericServiceFactory serviceFactory, + DubboGenericServiceExecutionContextFactory contextFactory, + DubboCloudGatewayProperties dubboCloudGatewayProperties, + ObjectProvider conversionServices) { + return new DubboCloudGatewayExecutor(repository, serviceFactory, contextFactory, + dubboCloudGatewayProperties, conversionServices); + } +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayAutoConfiguration.java new file mode 100644 index 00000000..ef892929 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayAutoConfiguration.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.gateway.standard; + +import com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration; +import com.alibaba.cloud.dubbo.autoconfigure.DubboServiceAutoConfiguration; +import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; +import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayProperties; +import com.alibaba.cloud.dubbo.gateway.autoconfigure.DubboCloudGatewayAutoConfiguration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.http.codec.support.DefaultServerCodecConfigurer; + +/** + * The Auto-{@link Configuration} of Dubbo Spring Cloud Gateway + * + * @author Mercy + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnClass(GlobalFilter.class) +@ConditionalOnProperty(prefix = "dubbo.cloud.gateway", name = "enabled", havingValue = "true", matchIfMissing = true) +@AutoConfigureAfter({ DubboServiceAutoConfiguration.class, + DubboMetadataAutoConfiguration.class, DubboCloudGatewayAutoConfiguration.class }) +@EnableConfigurationProperties(DubboCloudGatewayProperties.class) +public class DubboSpringCloudGatewayAutoConfiguration { + + private final Log logger = LogFactory.getLog(getClass()); + + @Bean + @ConditionalOnMissingBean(ServerCodecConfigurer.class) + public ServerCodecConfigurer serverCodecConfigurer() { + return new DefaultServerCodecConfigurer(); + } + + @Bean + public DubboSpringCloudGatewayFilter dubboSpringCloudGatewayFilter( + DubboCloudGatewayExecutor dubboCloudGatewayExecutor) { + return new DubboSpringCloudGatewayFilter(dubboCloudGatewayExecutor); + } + + @Bean + public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) { + return builder.routes() + .route(r -> r.path("/**").uri("http://localhost:9090").id("first")) + .build(); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayFilter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayFilter.java new file mode 100644 index 00000000..f9911fd9 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayFilter.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.gateway.standard; + +import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import reactor.core.publisher.Mono; + +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.server.ServerWebExchange; + +/** + * The Spring Cloud {@link GatewayFilter Gateway Filter} for Dubbo + * + * @author Mercy + */ +public class DubboSpringCloudGatewayFilter + implements GatewayFilter, GlobalFilter, Ordered { + + private final Log logger = LogFactory.getLog(getClass()); + + private int order; + + private final DubboCloudGatewayExecutor dubboCloudGatewayExecutor; + + public DubboSpringCloudGatewayFilter( + DubboCloudGatewayExecutor dubboCloudGatewayExecutor) { + this.dubboCloudGatewayExecutor = dubboCloudGatewayExecutor; + } + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + + Object result = dubboCloudGatewayExecutor.execute(exchange.getRequest()); + + if (result == null) { + chain.filter(exchange); + } + else { + ServerHttpResponse response = exchange.getResponse(); + } + + return Mono.empty(); + } + + public void setOrder(int order) { + this.order = order; + } + + @Override + public int getOrder() { + return order; + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..463847c1 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.alibaba.cloud.dubbo.gateway.autoconfigure.DubboCloudGatewayAutoConfiguration,\ +com.alibaba.cloud.dubbo.gateway.standard.DubboSpringCloudGatewayAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java new file mode 100644 index 00000000..662a131d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.gateway.standard; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +/** + * The bootstrap class of Dubbo Spring Cloud Gateway + * + * @author Mercy + */ +@SpringBootApplication +@EnableDiscoveryClient +public class DubboSpringCloudGatewayBootstrap { + + public static void main(String[] args) { + new SpringApplicationBuilder(DubboSpringCloudGatewayBootstrap.class) + .properties("spring.profiles.active=zookeeper").run(args); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml new file mode 100644 index 00000000..2f9abf4e --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml @@ -0,0 +1,74 @@ +spring: + application: + name: spring-cloud-alibaba-dubbo-gateway + main: + allow-bean-definition-overriding: true + +dubbo: + protocols: + dubbo: + port: -1 + +server: + port: 9090 + + # default disable all + cloud: + nacos: + discovery: + enabled: false + register-enabled: false + zookeeper: + enabled: false + consul: + enabled: false + +eureka: + client: + enabled: false + + +--- +spring: + profiles: nacos + + cloud: + nacos: + username: nacos + password: nacos + discovery: + enabled: true + register-enabled: true + server-addr: 127.0.0.1:8848 + ephemeral: false + + +--- +spring: + profiles: eureka + +eureka: + client: + enabled: true + service-url: + defaultZone: http://127.0.0.1:8761/eureka/ + + +--- +spring: + profiles: zookeeper + cloud: + zookeeper: + enabled: true + connect-string: 127.0.0.1:2181 + + +--- +spring: + profiles: consul + + cloud: + consul: + enabled: true + host: 127.0.0.1 + port: 8500 \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java index 80a0a072..3c19723f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java @@ -22,6 +22,7 @@ import java.util.Set; import org.springframework.boot.context.properties.ConfigurationProperties; +import static com.alibaba.cloud.dubbo.util.DubboCloudConstants.CONFIG_PROPERTY_PREFIX; import static org.springframework.util.StringUtils.commaDelimitedListToStringArray; import static org.springframework.util.StringUtils.hasText; import static org.springframework.util.StringUtils.trimAllWhitespace; @@ -31,7 +32,7 @@ import static org.springframework.util.StringUtils.trimAllWhitespace; * * @author Mercy */ -@ConfigurationProperties(prefix = "dubbo.cloud") +@ConfigurationProperties(prefix = CONFIG_PROPERTY_PREFIX) public class DubboCloudProperties { /** diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java new file mode 100644 index 00000000..d491b0a1 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.util; + +/** + * The constants for Dubbo Spring Cloud + * + * @author Mercy + */ +public interface DubboCloudConstants { + + /** + * The property prefix of Configuration + */ + String CONFIG_PROPERTY_PREFIX = "dubbo.cloud"; + +} From f34a8a13c66dc4b807d4adcff984e526b3cbbaf3 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 25 Aug 2020 16:50:53 +0800 Subject: [PATCH 39/92] Polish alibaba/spring-cloud-alibaba#1665 : [Sample] Upgrading the Dubbo Sample --- .../bootstrap/DubboSpringCloudClientBootstrap.java | 5 +++-- .../src/main/resources/bootstrap.yaml | 5 +++-- .../bootstrap/DubboSpringCloudConsumerBootstrap.java | 7 ++++--- .../src/main/resources/application.yaml | 11 +++-------- .../cloud/dubbo/service/InMemoryUserService.java | 4 ++-- .../cloud/dubbo/service/StandardRestService.java | 5 +++-- .../cloud/dubbo/service/InMemoryUserService.java | 4 ++-- .../cloud/dubbo/service/SpringRestService.java | 5 +++-- .../src/main/resources/application.yaml | 9 --------- .../bootstrap/DubboSpringCloudServerBootstrap.java | 5 +++-- .../src/main/resources/bootstrap.yaml | 2 -- 11 files changed, 26 insertions(+), 36 deletions(-) diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java index 5171d48f..35e171a0 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java @@ -17,7 +17,8 @@ package com.alibaba.cloud.dubbo.bootstrap; import com.alibaba.cloud.dubbo.service.EchoService; -import org.apache.dubbo.config.annotation.Reference; + +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -33,7 +34,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController public class DubboSpringCloudClientBootstrap { - @Reference + @DubboReference private EchoService echoService; @GetMapping("/echo") diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/resources/bootstrap.yaml index 757a772f..6801b6c4 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/resources/bootstrap.yaml @@ -1,8 +1,9 @@ dubbo: - registry: - address: spring-cloud://localhost cloud: subscribed-services: spring-cloud-alibaba-dubbo-server + protocols: + dubbo: + port: -1 spring: application: diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java index 000859ca..550394c1 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -23,7 +23,8 @@ import com.alibaba.cloud.dubbo.annotation.DubboTransported; import com.alibaba.cloud.dubbo.service.RestService; import com.alibaba.cloud.dubbo.service.User; import com.alibaba.cloud.dubbo.service.UserService; -import org.apache.dubbo.config.annotation.Reference; + +import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -60,10 +61,10 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @EnableCaching public class DubboSpringCloudConsumerBootstrap { - @Reference + @DubboReference private UserService userService; - @Reference(version = "1.0.0", protocol = "dubbo") + @DubboReference(version = "1.0.0", protocol = "dubbo") private RestService restService; @Autowired diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml index c46f7a87..17945be2 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/resources/application.yaml @@ -1,15 +1,10 @@ dubbo: - registry: - # The Spring Cloud Dubbo's registry extension - ## the default value of dubbo-provider-services is "*", that means to subscribe all providers, - ## thus it's optimized if subscriber specifies the required providers. - address: spring-cloud://localhost -# The traditional Dubbo's registry also is supported -# address: zookeeper://127.0.0.1:2181 cloud: # The subscribed services in consumer side subscribed-services: ${provider.application.name} - + protocols: + dubbo: + port: -1 consumer: check: false diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java index bd11c413..b1acd0a0 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java @@ -20,12 +20,12 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; /** * In-Memory {@link UserService} implementation. */ -@Service(protocol = "dubbo") +@DubboService(protocol = "dubbo") public class InMemoryUserService implements UserService { private Map usersRepository = new HashMap<>(); diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java index a71cc193..d39df81d 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java @@ -30,7 +30,8 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +43,7 @@ import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE; * * @author Mercy */ -@Service(version = "1.0.0", protocol = { "dubbo", "rest" }) +@DubboService(version = "1.0.0", protocol = { "dubbo", "rest" }) @Path("/") public class StandardRestService implements RestService { diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java index bd11c413..b1acd0a0 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/InMemoryUserService.java @@ -20,12 +20,12 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; /** * In-Memory {@link UserService} implementation. */ -@Service(protocol = "dubbo") +@DubboService(protocol = "dubbo") public class InMemoryUserService implements UserService { private Map usersRepository = new HashMap<>(); diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java index 0c867538..af9f2c54 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java @@ -19,7 +19,8 @@ package com.alibaba.cloud.dubbo.service; import java.util.HashMap; import java.util.Map; -import org.apache.dubbo.config.annotation.Service; +import org.apache.dubbo.config.annotation.DubboService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +40,7 @@ import static com.alibaba.cloud.dubbo.util.LoggerUtils.log; * * @author Mercy */ -@Service(version = "1.0.0") +@DubboService(version = "1.0.0") @RestController public class SpringRestService implements RestService { diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml index b6858c74..2bc346c8 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/resources/application.yaml @@ -3,16 +3,7 @@ dubbo: base-packages: com.alibaba.cloud.dubbo.service protocols: dubbo: - name: dubbo port: -1 - registries: - new: - address: spring-cloud://localhost -# registry: -# The Spring Cloud Dubbo's registry extension -# address: spring-cloud://localhost -# The traditional Dubbo's registry -# address: nacos://127.0.0.1:8848 feign: hystrix: diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java index bd7e1784..50816edb 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java @@ -17,7 +17,8 @@ package com.alibaba.cloud.dubbo.bootstrap; import com.alibaba.cloud.dubbo.service.EchoService; -import org.apache.dubbo.config.annotation.Service; + +import org.apache.dubbo.config.annotation.DubboService; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -36,7 +37,7 @@ public class DubboSpringCloudServerBootstrap { } -@Service +@DubboService class EchoServiceImpl implements EchoService { @Override diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/resources/bootstrap.yaml b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/resources/bootstrap.yaml index 394df7ec..650b9861 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/resources/bootstrap.yaml +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/resources/bootstrap.yaml @@ -4,8 +4,6 @@ dubbo: protocol: name: dubbo port: -1 - registry: - address: spring-cloud://localhost spring: application: From 8632034126d59fe7f21e4ada4e982a6977b1a62b Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Tue, 25 Aug 2020 17:07:16 +0800 Subject: [PATCH 40/92] Upgrade Sentinel version to 1.8.0 --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- .../sentinel/gateway/scg/SentinelSCGAutoConfiguration.java | 2 +- .../sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java | 2 +- .../cloud/sentinel/custom/SentinelAutoConfiguration.java | 5 ++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index d4e8ee0e..6f7062cd 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -19,7 +19,7 @@ 2.2.1.RELEASE - 1.7.2 + 1.8.0 3.1.0 1.3.0 1.3.2 diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/scg/SentinelSCGAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/scg/SentinelSCGAutoConfiguration.java index 901cde9e..747b614e 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/scg/SentinelSCGAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/scg/SentinelSCGAutoConfiguration.java @@ -91,7 +91,7 @@ public class SentinelSCGAutoConfiguration { } private void initAppType() { - System.setProperty(SentinelConfig.APP_TYPE, ConfigConstants.APP_TYPE_SCG_GATEWAY); + System.setProperty(SentinelConfig.APP_TYPE_PROP_KEY, ConfigConstants.APP_TYPE_SCG_GATEWAY); } private void initFallback() { diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java index 3fa5a7e6..a7b7fcf3 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/zuul/SentinelZuulAutoConfiguration.java @@ -65,7 +65,7 @@ public class SentinelZuulAutoConfiguration { private void init() { requestOriginParserOptional .ifPresent(ZuulGatewayCallbackManager::setOriginParser); - System.setProperty(SentinelConfig.APP_TYPE, + System.setProperty(SentinelConfig.APP_TYPE_PROP_KEY, String.valueOf(ConfigConstants.APP_TYPE_ZUUL_GATEWAY)); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java index b71d9483..c73721ac 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java @@ -31,7 +31,6 @@ import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; import com.alibaba.csp.sentinel.slots.system.SystemRule; import com.alibaba.csp.sentinel.transport.config.TransportConfig; -import com.alibaba.csp.sentinel.util.AppNameUtil; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; @@ -79,9 +78,9 @@ public class SentinelAutoConfiguration { System.setProperty(LogBase.LOG_NAME_USE_PID, String.valueOf(properties.getLog().isSwitchPid())); } - if (StringUtils.isEmpty(System.getProperty(AppNameUtil.APP_NAME)) + if (StringUtils.isEmpty(System.getProperty(SentinelConfig.getAppName())) && StringUtils.hasText(projectName)) { - System.setProperty(AppNameUtil.APP_NAME, projectName); + System.setProperty(SentinelConfig.getAppName(), projectName); } if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT)) && StringUtils.hasText(properties.getTransport().getPort())) { From 8d99fc485489b550f5f6624b0f9413f69c984cae Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Wed, 26 Aug 2020 17:39:37 +0800 Subject: [PATCH 41/92] fix --- .../cloud/sentinel/custom/SentinelAutoConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java index c73721ac..5d80b735 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/custom/SentinelAutoConfiguration.java @@ -78,9 +78,9 @@ public class SentinelAutoConfiguration { System.setProperty(LogBase.LOG_NAME_USE_PID, String.valueOf(properties.getLog().isSwitchPid())); } - if (StringUtils.isEmpty(System.getProperty(SentinelConfig.getAppName())) + if (StringUtils.isEmpty(System.getProperty(SentinelConfig.APP_NAME_PROP_KEY)) && StringUtils.hasText(projectName)) { - System.setProperty(SentinelConfig.getAppName(), projectName); + System.setProperty(SentinelConfig.APP_NAME_PROP_KEY, projectName); } if (StringUtils.isEmpty(System.getProperty(TransportConfig.SERVER_PORT)) && StringUtils.hasText(properties.getTransport().getPort())) { From 67bdfdfeed3414d85b3addf98432ca5f9daa4e17 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Wed, 26 Aug 2020 17:44:54 +0800 Subject: [PATCH 42/92] pom fixed --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 6f7062cd..222576d8 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -18,7 +18,7 @@ Spring Cloud Alibaba Dependencies - 2.2.1.RELEASE + 2.2.2-SNAPSHOT 1.8.0 3.1.0 1.3.0 From 5b2f68e292f7803dc845da552b58044d0659c2fd Mon Sep 17 00:00:00 2001 From: Eric Zhao Date: Wed, 26 Aug 2020 20:36:05 +0800 Subject: [PATCH 43/92] Update test cases of spring-cloud-circuitbreaker-sentinel Signed-off-by: Eric Zhao --- ...SentinelCircuitBreakerIntegrationTest.java | 20 +++++----- ...SentinelCircuitBreakerIntegrationTest.java | 37 +++++++++++-------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/ReactiveSentinelCircuitBreakerIntegrationTest.java b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/ReactiveSentinelCircuitBreakerIntegrationTest.java index 5d2ed989..4e640e7a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/ReactiveSentinelCircuitBreakerIntegrationTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/ReactiveSentinelCircuitBreakerIntegrationTest.java @@ -82,7 +82,7 @@ public class ReactiveSentinelCircuitBreakerIntegrationTest { Thread.sleep(1000); } - // Recovered. + // Half-open recovery (will re-open the circuit breaker). StepVerifier.create(service.slow()).expectNext("slow").verifyComplete(); StepVerifier.create(service.normalFlux()).expectNext("normalflux") @@ -99,7 +99,7 @@ public class ReactiveSentinelCircuitBreakerIntegrationTest { Thread.sleep(1000); } - // Recovered. + // Half-open recovery (will re-open the circuit breaker). StepVerifier.create(service.slowFlux()).expectNext("slowflux").verifyComplete(); } @@ -110,7 +110,7 @@ public class ReactiveSentinelCircuitBreakerIntegrationTest { @GetMapping("/slow") public Mono slow() { - return Mono.just("slow").delayElement(Duration.ofMillis(500)); + return Mono.just("slow").delayElement(Duration.ofMillis(80)); } @GetMapping("/normal") @@ -120,7 +120,7 @@ public class ReactiveSentinelCircuitBreakerIntegrationTest { @GetMapping("/slow_flux") public Flux slowFlux() { - return Flux.just("slow", "flux").delayElements(Duration.ofMillis(500)); + return Flux.just("slow", "flux").delayElements(Duration.ofMillis(80)); } @GetMapping("normal_flux") @@ -133,19 +133,19 @@ public class ReactiveSentinelCircuitBreakerIntegrationTest { return factory -> { factory.configure(builder -> builder .rules(Collections.singletonList(new DegradeRule("slow_mono") - .setGrade(RuleConstant.DEGRADE_GRADE_RT).setCount(100) - .setTimeWindow(5))), + .setCount(50).setSlowRatioThreshold(0.7).setMinRequestAmount(5) + .setStatIntervalMs(30000).setTimeWindow(5))), "slow_mono"); factory.configure(builder -> builder - .rules(Collections.singletonList(new DegradeRule("slow_flux") - .setGrade(RuleConstant.DEGRADE_GRADE_RT).setCount(100) - .setTimeWindow(5))), + .rules(Collections.singletonList(new DegradeRule("slow_mono") + .setCount(50).setSlowRatioThreshold(0.7).setMinRequestAmount(5) + .setStatIntervalMs(30000).setTimeWindow(5))), "slow_flux"); factory.configureDefault(id -> new SentinelConfigBuilder() .resourceName(id) .rules(Collections.singletonList(new DegradeRule(id) .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) - .setCount(0.5).setTimeWindow(10))) + .setCount(5).setTimeWindow(10))) .build()); }; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/SentinelCircuitBreakerIntegrationTest.java b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/SentinelCircuitBreakerIntegrationTest.java index d63abfb5..ebe0d6d5 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/SentinelCircuitBreakerIntegrationTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/SentinelCircuitBreakerIntegrationTest.java @@ -39,6 +39,7 @@ import org.springframework.stereotype.Service; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import static org.assertj.core.api.Assertions.assertThat; @@ -59,21 +60,24 @@ public class SentinelCircuitBreakerIntegrationTest { @Test public void testSlow() throws Exception { - // The first 5 requests should pass. - assertThat(service.slow()).isEqualTo("slow"); - assertThat(service.slow()).isEqualTo("slow"); - assertThat(service.slow()).isEqualTo("slow"); - assertThat(service.slow()).isEqualTo("slow"); - assertThat(service.slow()).isEqualTo("slow"); + assertThat(service.slow(true)).isEqualTo("slow"); + assertThat(service.slow(true)).isEqualTo("slow"); + assertThat(service.slow(true)).isEqualTo("slow"); + assertThat(service.slow(false)).isEqualTo("slow"); + assertThat(service.slow(false)).isEqualTo("slow"); + assertThat(service.slow(true)).isEqualTo("slow"); + assertThat(service.slow(true)).isEqualTo("slow"); // Then in the next 10s, the fallback method should be called. - for (int i = 0; i < 10; i++) { - assertThat(service.slow()).isEqualTo("fallback"); + for (int i = 0; i < 5; i++) { + assertThat(service.slow(true)).isEqualTo("fallback"); Thread.sleep(1000); } + // Try a normal request. + assertThat(service.slow(false)).isEqualTo("slow"); // Recovered. - assertThat(service.slow()).isEqualTo("slow"); + assertThat(service.slow(true)).isEqualTo("slow"); } @Test @@ -97,8 +101,10 @@ public class SentinelCircuitBreakerIntegrationTest { protected static class Application { @GetMapping("/slow") - public String slow() throws InterruptedException { - Thread.sleep(500); + public String slow(@RequestParam(required = false) Boolean slow) throws InterruptedException { + if (slow == null || slow) { + Thread.sleep(80); + } return "slow"; } @@ -112,14 +118,15 @@ public class SentinelCircuitBreakerIntegrationTest { String slowId = "slow"; List rules = Collections.singletonList( new DegradeRule(slowId).setGrade(RuleConstant.DEGRADE_GRADE_RT) - .setCount(100).setTimeWindow(10)); + .setCount(50).setSlowRatioThreshold(0.7).setMinRequestAmount(5) + .setStatIntervalMs(30000).setTimeWindow(5)); return factory -> { factory.configure(builder -> builder.rules(rules), slowId); factory.configureDefault(id -> new SentinelConfigBuilder() .resourceName(id) .rules(Collections.singletonList(new DegradeRule(id) .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) - .setCount(0.5).setTimeWindow(10))) + .setCount(10).setStatIntervalMs(10000).setTimeWindow(10))) .build()); }; } @@ -137,9 +144,9 @@ public class SentinelCircuitBreakerIntegrationTest { this.cbFactory = cbFactory; } - public String slow() { + public String slow(boolean slow) { return cbFactory.create("slow").run( - () -> rest.getForObject("/slow", String.class), t -> "fallback"); + () -> rest.getForObject("/slow?slow=" + slow, String.class), t -> "fallback"); } public String normal() { From 1eec33fb00a72f38e4b27ad0f43fece2e1aa8cba Mon Sep 17 00:00:00 2001 From: Eric Zhao Date: Wed, 26 Aug 2020 22:15:41 +0800 Subject: [PATCH 44/92] Update SentinelAutoConfigurationTests Signed-off-by: Eric Zhao --- .../SentinelAutoConfigurationTests.java | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java index 9406f56d..56c5bf6b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/SentinelAutoConfigurationTests.java @@ -28,8 +28,6 @@ import com.alibaba.csp.sentinel.config.SentinelConfig; import com.alibaba.csp.sentinel.log.LogBase; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.RuleConstant; -import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; -import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager; import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import com.alibaba.csp.sentinel.transport.config.TransportConfig; @@ -116,13 +114,6 @@ public class SentinelAutoConfigurationTests { rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT); rule.setStrategy(RuleConstant.STRATEGY_DIRECT); FlowRuleManager.loadRules(Arrays.asList(rule)); - - DegradeRule degradeRule = new DegradeRule(); - degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT); - degradeRule.setResource("GET:" + degradeUrl); - degradeRule.setCount(0); - degradeRule.setTimeWindow(60); - DegradeRuleManager.loadRules(Arrays.asList(degradeRule)); } @Test @@ -208,7 +199,7 @@ public class SentinelAutoConfigurationTests { } @Test - public void testFlowRestTemplate() { + public void testRestTemplateBlockHandler() { assertThat(restTemplate.getInterceptors().size()).isEqualTo(2); assertThat(restTemplateWithBlockClass.getInterceptors().size()).isEqualTo(1); @@ -236,15 +227,6 @@ public class SentinelAutoConfigurationTests { }).isInstanceOf(RestClientException.class); } - @Test - public void testFallbackRestTemplate() { - ResponseEntity responseEntity = restTemplateWithFallbackClass - .getForEntity(degradeUrl, String.class); - - assertThat(responseEntity.getBody()).isEqualTo("Oops fallback"); - assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); - } - @Configuration static class SentinelTestConfiguration { From 436e608c84d292710d4badbb8382a9c7a0267bc7 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Thu, 27 Aug 2020 20:34:45 +0800 Subject: [PATCH 45/92] fix code style --- .../cloud/dubbo/util/DubboCloudConstants.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java index d491b0a1..1a9d86c6 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,18 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.util; /** - * The constants for Dubbo Spring Cloud + * The constants for Dubbo Spring Cloud. * * @author Mercy */ -public interface DubboCloudConstants { +public final class DubboCloudConstants { + + private DubboCloudConstants() { + throw new AssertionError("Must not instantiate constant utility class"); + } /** - * The property prefix of Configuration + * The property prefix of Configuration. */ - String CONFIG_PROPERTY_PREFIX = "dubbo.cloud"; + public static final String CONFIG_PROPERTY_PREFIX = "dubbo.cloud"; } From 9b4975ad2a6b512f25afe7d2334847d44bb3acd0 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 1 Sep 2020 17:40:07 +0800 Subject: [PATCH 46/92] =?UTF-8?q?Polish=20alibaba/spring-cloud-alibaba#152?= =?UTF-8?q?9=20:=20spring-cloud-starter-dubbo=E6=B6=88=E8=B4=B9=E8=80=85?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E6=9C=8D=E5=8A=A1=E6=97=B6No=20provider=20av?= =?UTF-8?q?ailable=20from=20registry=20localhost:9090?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DubboMetadataAutoConfiguration.java | 24 +- ...ubboServiceDiscoveryAutoConfiguration.java | 21 +- .../cloud/dubbo/env/DubboCloudProperties.java | 10 + .../DubboServiceMetadataRepository.java | 207 ++------ .../RandomServiceInstanceSelector.java | 43 ++ ...ctor.java => ServiceInstanceSelector.java} | 6 +- .../registry/AbstractSpringCloudRegistry.java | 8 +- .../dubbo/registry/DubboCloudRegistry.java | 499 ++++++++++++++++++ .../dubbo/registry/SpringCloudRegistry.java | 3 + .../registry/SpringCloudRegistryFactory.java | 28 +- .../event/ServiceInstancesChangedEvent.java | 12 +- .../service/DubboGenericServiceFactory.java | 15 +- .../service/DubboMetadataServiceProxy.java | 132 ++++- .../cloud/dubbo/util/DubboCloudConstants.java | 15 + .../cloud/dubbo/util/DubboMetadataUtils.java | 118 +++++ 15 files changed, 925 insertions(+), 216 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/RandomServiceInstanceSelector.java rename spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/{MetadataServiceInstanceSelector.java => ServiceInstanceSelector.java} (86%) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboMetadataUtils.java diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java index 2af135e6..1a6b351d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java @@ -17,20 +17,21 @@ package com.alibaba.cloud.dubbo.autoconfigure; import java.util.Collection; -import java.util.Optional; import java.util.function.Supplier; import com.alibaba.cloud.dubbo.metadata.DubboProtocolConfigSupplier; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; -import com.alibaba.cloud.dubbo.metadata.repository.MetadataServiceInstanceSelector; +import com.alibaba.cloud.dubbo.metadata.repository.RandomServiceInstanceSelector; +import com.alibaba.cloud.dubbo.metadata.repository.ServiceInstanceSelector; import com.alibaba.cloud.dubbo.metadata.resolver.DubboServiceBeanMetadataResolver; import com.alibaba.cloud.dubbo.metadata.resolver.MetadataResolver; -import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceExporter; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.service.IntrospectiveDubboMetadataService; +import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; import com.alibaba.cloud.dubbo.util.JSONUtils; import feign.Contract; + import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.spring.ServiceBean; import org.apache.dubbo.config.spring.context.event.ServiceBeanExportedEvent; @@ -44,7 +45,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.event.EventListener; -import org.springframework.util.CollectionUtils; /** * Spring Boot Auto-Configuration class for Dubbo Metadata. @@ -53,7 +53,8 @@ import org.springframework.util.CollectionUtils; */ @Configuration(proxyBeanMethods = false) @Import({ DubboServiceMetadataRepository.class, IntrospectiveDubboMetadataService.class, - DubboMetadataServiceExporter.class, JSONUtils.class }) + DubboMetadataServiceExporter.class, JSONUtils.class, + DubboMetadataServiceProxy.class, DubboMetadataUtils.class }) public class DubboMetadataAutoConfiguration { @Autowired @@ -73,9 +74,8 @@ public class DubboMetadataAutoConfiguration { @Bean @ConditionalOnMissingBean - public MetadataServiceInstanceSelector metadataServiceInstanceSelector() { - return serviceInstances -> CollectionUtils.isEmpty(serviceInstances) - ? Optional.empty() : serviceInstances.stream().findAny(); + public ServiceInstanceSelector metadataServiceInstanceSelector() { + return new RandomServiceInstanceSelector(); } @Bean @@ -84,15 +84,7 @@ public class DubboMetadataAutoConfiguration { return new DubboProtocolConfigSupplier(protocols); } - @Bean - @ConditionalOnMissingBean - public DubboMetadataServiceProxy dubboMetadataConfigServiceProxy( - DubboGenericServiceFactory factory) { - return new DubboMetadataServiceProxy(factory); - } - // Event-Handling - @EventListener(ServiceBeanExportedEvent.class) public void onServiceBeanExported(ServiceBeanExportedEvent event) { ServiceBean serviceBean = event.getServiceBean(); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java index de8fb254..ba70c57c 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java @@ -56,6 +56,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -97,12 +98,11 @@ import static org.springframework.util.StringUtils.hasText; @Configuration(proxyBeanMethods = false) @ConditionalOnClass(name = "org.springframework.cloud.client.discovery.DiscoveryClient") @ConditionalOnProperty(name = "spring.cloud.discovery.enabled", matchIfMissing = true) -@AutoConfigureAfter( - name = { EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME, - ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME, - CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME, - NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME }, - value = { DubboServiceRegistrationAutoConfiguration.class }) +@AutoConfigureAfter(name = { EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME, + ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME, + CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME, + NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME }, value = { + DubboServiceRegistrationAutoConfiguration.class }) public class DubboServiceDiscoveryAutoConfiguration { /** @@ -135,6 +135,9 @@ public class DubboServiceDiscoveryAutoConfiguration { */ private final ObjectProvider> heartbeatEventChangedPredicate; + @Value("${spring.application.name:${dubbo.application.name:application}}") + private String currentApplicationName; + public DubboServiceDiscoveryAutoConfiguration( DubboServiceMetadataRepository dubboServiceMetadataRepository, ApplicationEventPublisher applicationEventPublisher, @@ -154,10 +157,12 @@ public class DubboServiceDiscoveryAutoConfiguration { * NotifyListener) */ private void dispatchServiceInstancesChangedEvent(String serviceName, - Collection serviceInstances) { - if (!hasText(serviceName) || serviceInstances == null) { + List serviceInstances) { + if (!hasText(serviceName) || Objects.equals(currentApplicationName, serviceName) + || serviceInstances == null) { return; } + ServiceInstancesChangedEvent event = new ServiceInstancesChangedEvent(serviceName, serviceInstances); if (logger.isInfoEnabled()) { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java index 3c19723f..8b8919e4 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java @@ -23,6 +23,7 @@ import java.util.Set; import org.springframework.boot.context.properties.ConfigurationProperties; import static com.alibaba.cloud.dubbo.util.DubboCloudConstants.CONFIG_PROPERTY_PREFIX; +import static com.alibaba.cloud.dubbo.util.DubboCloudConstants.DUBBO_CLOUD_REGISTRY_PROPERTY_VALUE; import static org.springframework.util.StringUtils.commaDelimitedListToStringArray; import static org.springframework.util.StringUtils.hasText; import static org.springframework.util.StringUtils.trimAllWhitespace; @@ -48,6 +49,8 @@ public class DubboCloudProperties { */ private String subscribedServices = ALL_DUBBO_SERVICES; + private String registryType = DUBBO_CLOUD_REGISTRY_PROPERTY_VALUE; + public String getSubscribedServices() { return subscribedServices; } @@ -80,4 +83,11 @@ public class DubboCloudProperties { return Collections.unmodifiableSet(subscribedServices); } + public String getRegistryType() { + return registryType; + } + + public void setRegistryType(String registryType) { + this.registryType = registryType; + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java index 9089919e..398e09fa 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java @@ -22,9 +22,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; import javax.annotation.PostConstruct; @@ -38,10 +36,13 @@ import com.alibaba.cloud.dubbo.registry.event.SubscribedServicesChangedEvent; import com.alibaba.cloud.dubbo.service.DubboMetadataService; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceExporter; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; +import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; import com.alibaba.cloud.dubbo.util.JSONUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; + import org.apache.dubbo.common.URL; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,15 +62,15 @@ import org.springframework.util.MultiValueMap; import static com.alibaba.cloud.dubbo.env.DubboCloudProperties.ALL_DUBBO_SERVICES; import static com.alibaba.cloud.dubbo.http.DefaultHttpRequest.builder; -import static java.lang.String.format; import static java.lang.String.valueOf; -import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; -import static java.util.Collections.unmodifiableList; import static java.util.Collections.unmodifiableMap; import static java.util.Collections.unmodifiableSet; -import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY; import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; +import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_PREFIX; +import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME; import static org.springframework.util.CollectionUtils.isEmpty; import static org.springframework.util.StringUtils.hasText; @@ -85,14 +86,15 @@ public class DubboServiceMetadataRepository /** * The prefix of {@link DubboMetadataService} : "dubbo.metadata-service.". */ - public static final String DUBBO_METADATA_SERVICE_PREFIX = "dubbo.metadata-service."; + @Deprecated + public static final String DUBBO_METADATA_SERVICE_PREFIX = METADATA_SERVICE_PREFIX; /** * The {@link URL URLs} property name of {@link DubboMetadataService} : * "dubbo.metadata-service.urls". */ - public static final String DUBBO_METADATA_SERVICE_URLS_PROPERTY_NAME = DUBBO_METADATA_SERVICE_PREFIX - + "urls"; + @Deprecated + public static final String DUBBO_METADATA_SERVICE_URLS_PROPERTY_NAME = METADATA_SERVICE_URLS_PROPERTY_NAME; /** * The {@link String#format(String, Object...) pattern} of dubbo protocols port. @@ -108,11 +110,6 @@ public class DubboServiceMetadataRepository */ private final Object monitor = new Object(); - /** - * A {@link Set} of service names that had been initialized. - */ - private final Set initializedServices = new LinkedHashSet<>(); - /** * All exported {@link URL urls} {@link Map} whose key is the return value of * {@link URL#getServiceKey()} method and value is the {@link List} of {@link URL @@ -122,12 +119,6 @@ public class DubboServiceMetadataRepository // =================================== Registration // =================================== // - /** - * The subscribed {@link URL urls} {@link Map} of {@link DubboMetadataService}, whose - * key is the return value of {@link URL#getServiceKey()} method and value is the - * {@link List} of {@link URL URLs}. - */ - private final MultiValueMap subscribedDubboMetadataServiceURLs = new LinkedMultiValueMap<>(); // ==================================================================================== // // @@ -172,7 +163,7 @@ public class DubboServiceMetadataRepository private DiscoveryClient discoveryClient; @Autowired - private MetadataServiceInstanceSelector metadataServiceInstanceSelector; + private ServiceInstanceSelector serviceInstanceSelector; @Autowired private JSONUtils jsonUtils; @@ -180,6 +171,9 @@ public class DubboServiceMetadataRepository @Autowired private InetUtils inetUtils; + @Autowired + private DubboMetadataUtils dubboMetadataUtils; + @Value("${spring.application.name}") private String currentApplicationName; @@ -275,28 +269,11 @@ public class DubboServiceMetadataRepository * @param serviceName service of name */ public void initializeMetadata(String serviceName) { - synchronized (monitor) { - if (initializedServices.contains(serviceName)) { - if (logger.isDebugEnabled()) { - logger.debug( - "The metadata of Dubbo service[name : {}] has been initialized", - serviceName); - } - } - else { - if (logger.isInfoEnabled()) { - logger.info( - "The metadata of Dubbo service[name : {}] is about to be initialized", - serviceName); - } + initDubboRestServiceMetadataRepository(serviceName); + } - if (initSubscribedDubboMetadataService(serviceName)) { - // mark this service name having been initialized - initializedServices.add(serviceName); - } - - } - } + private DubboMetadataService getProxy(String serviceName) { + return dubboMetadataConfigServiceProxy.getProxy(serviceName); } /** @@ -307,15 +284,8 @@ public class DubboServiceMetadataRepository */ public void removeMetadataAndInitializedService(String serviceName, URL url) { synchronized (monitor) { - initializedServices.remove(serviceName); + dubboMetadataConfigServiceProxy.removeProxy(serviceName); dubboRestServiceMetadataRepository.remove(serviceName); - // fix #1260 if the subscribedDubboMetadataServiceURLs removed fail,old meta - // information will be retained - if (DubboMetadataService.class.getName().equals(url.getServiceInterface())) { - String serviceKey = url.getServiceKey(); - subscribedDubboMetadataServiceURLs.remove(serviceKey); - } - } } @@ -345,8 +315,7 @@ public class DubboServiceMetadataRepository private void addDubboMetadataServiceURLsMetadata(Map metadata, List dubboMetadataServiceURLs) { String dubboMetadataServiceURLsJSON = jsonUtils.toJSON(dubboMetadataServiceURLs); - metadata.put(DUBBO_METADATA_SERVICE_URLS_PROPERTY_NAME, - dubboMetadataServiceURLsJSON); + metadata.put(METADATA_SERVICE_URLS_PROPERTY_NAME, dubboMetadataServiceURLsJSON); } private void addDubboProtocolsPortMetadata(Map metadata) { @@ -359,15 +328,6 @@ public class DubboServiceMetadataRepository }); } - /** - * Get the property name of Dubbo Protocol. - * @param protocol Dubbo Protocol - * @return non-null - */ - public String getDubboProtocolPropertyName(String protocol) { - return format(DUBBO_PROTOCOLS_PORT_PROPERTY_NAME_PATTERN, protocol); - } - /** * Publish the {@link Set} of {@link ServiceRestMetadata}. * @param serviceRestMetadataSet the {@link Set} of {@link ServiceRestMetadata} @@ -389,25 +349,6 @@ public class DubboServiceMetadataRepository return unmodifiableSet(serviceRestMetadata); } - public List findSubscribedDubboMetadataServiceURLs(String serviceName, - String group, String version, String protocol) { - String serviceKey = URL.buildKey(serviceName, group, version); - - List urls = null; - - synchronized (monitor) { - urls = subscribedDubboMetadataServiceURLs.get(serviceKey); - } - - if (isEmpty(urls)) { - return emptyList(); - } - - return hasText(protocol) ? urls.stream() - .filter(url -> url.getProtocol().equalsIgnoreCase(protocol)) - .collect(Collectors.toList()) : unmodifiableList(urls); - } - /** * The specified service is subscribe or not. * @param serviceName the service name @@ -457,24 +398,13 @@ public class DubboServiceMetadataRepository return allExportedURLs.keySet(); } - /** - * Get the {@link URL urls} that {@link DubboMetadataService} exported by the - * specified {@link ServiceInstance}. - * @param serviceInstance {@link ServiceInstance} - * @return the mutable {@link URL urls} - */ - public List getDubboMetadataServiceURLs(ServiceInstance serviceInstance) { - Map metadata = serviceInstance.getMetadata(); - String dubboURLsJSON = metadata.get(DUBBO_METADATA_SERVICE_URLS_PROPERTY_NAME); - return jsonUtils.toURLs(dubboURLsJSON); - } - public Integer getDubboProtocolPort(ServiceInstance serviceInstance, String protocol) { - String protocolProperty = getDubboProtocolPropertyName(protocol); - Map metadata = serviceInstance.getMetadata(); - String protocolPort = metadata.get(protocolProperty); - return hasText(protocolPort) ? Integer.valueOf(protocolPort) : null; + return dubboMetadataUtils.getDubboProtocolPort(serviceInstance, protocol); + } + + private String getDubboProtocolPropertyName(String protocol) { + return dubboMetadataUtils.getDubboProtocolPropertyName(protocol); } public List getExportedURLs(String serviceInterface, String group, @@ -490,6 +420,11 @@ public class DubboServiceMetadataRepository protected void initDubboRestServiceMetadataRepository(String serviceName) { if (dubboRestServiceMetadataRepository.containsKey(serviceName)) { + if (logger.isDebugEnabled()) { + logger.debug( + "The metadata of Dubbo service[name : {}] has been initialized", + serviceName); + } return; } @@ -598,8 +533,7 @@ public class DubboServiceMetadataRepository Set metadata = emptySet(); - DubboMetadataService dubboMetadataService = dubboMetadataConfigServiceProxy - .getProxy(serviceName); + DubboMetadataService dubboMetadataService = getProxy(serviceName); if (dubboMetadataService != null) { try { @@ -624,68 +558,29 @@ public class DubboServiceMetadataRepository subscribedServices.remove(currentApplicationName); } - protected Boolean initSubscribedDubboMetadataService(String serviceName) { - // this need to judge whether the initialization is successful or not. The failed - // initialization will not change the initializedServices - Optional optionalServiceInstance = metadataServiceInstanceSelector - .choose(discoveryClient.getInstances(serviceName)); - if (!((Optional) optionalServiceInstance).isPresent()) { - return false; - } - ServiceInstance serviceInstance = optionalServiceInstance.get(); - if (null == serviceInstance) { - return false; - } - List dubboMetadataServiceURLs = getDubboMetadataServiceURLs(serviceInstance); - if (dubboMetadataServiceURLs.isEmpty()) { - return false; - } - for (URL dubboMetadataServiceURL : dubboMetadataServiceURLs) { - try { - initSubscribedDubboMetadataServiceURL(dubboMetadataServiceURL); - DubboMetadataService dubboMetadataService = dubboMetadataConfigServiceProxy - .getProxy(serviceName); - if (dubboMetadataService == null) { - dubboMetadataService = initDubboMetadataServiceProxy( - dubboMetadataServiceURL); - } - - if (dubboMetadataService == null) { - removeMetadataAndInitializedService(serviceName, - dubboMetadataServiceURL); - return false; - } - } - catch (Throwable e) { - if (logger.isErrorEnabled()) { - logger.error(e.getMessage(), e); - } - return false; - } - } - initDubboRestServiceMetadataRepository(serviceName); - return true; - } - - private void initSubscribedDubboMetadataServiceURL(URL dubboMetadataServiceURL) { - // add subscriptions - String serviceKey = dubboMetadataServiceURL.getServiceKey(); - subscribedDubboMetadataServiceURLs.add(serviceKey, dubboMetadataServiceURL); - } - - private DubboMetadataService initDubboMetadataServiceProxy( - URL dubboMetadataServiceURL) { - String serviceName = dubboMetadataServiceURL.getParameter(APPLICATION_KEY); - String version = dubboMetadataServiceURL.getParameter(VERSION_KEY); - // Initialize DubboMetadataService with right version - return dubboMetadataConfigServiceProxy.initProxy(serviceName, version); - - } - @Override public void setApplicationEventPublisher( ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } + public List findSubscribedDubboMetadataServiceURLs(URL subscribedURL) { + // The parameter of "group" as the service name + String serviceInterface = subscribedURL.getServiceInterface(); + String group = subscribedURL.getParameter(GROUP_KEY); + String version = subscribedURL.getParameter(VERSION_KEY); + String protocol = subscribedURL.getParameter(PROTOCOL_KEY); + List serviceInstances = discoveryClient.getInstances(group); + List urls = dubboMetadataUtils.getDubboMetadataServiceURLs(serviceInstances, + serviceInterface, version, protocol); + + if (logger.isInfoEnabled()) { + logger.info( + "The DubboMetadataService of service [name : {} , instances : {}] URLs[protocol : {} , size : {}] has been subscribed.", + group, serviceInstances.size(), protocol, urls.size()); + } + + return urls; + } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/RandomServiceInstanceSelector.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/RandomServiceInstanceSelector.java new file mode 100644 index 00000000..90f0cc3f --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/RandomServiceInstanceSelector.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.metadata.repository; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; + +import org.springframework.cloud.client.ServiceInstance; + +import static java.util.Optional.of; +import static org.springframework.util.CollectionUtils.isEmpty; + +/** + * Random {@link ServiceInstanceSelector} + * + * @author Mercy + */ +public class RandomServiceInstanceSelector implements ServiceInstanceSelector { + + @Override + public Optional select(List serviceInstances) { + if (isEmpty(serviceInstances)) { + return Optional.empty(); + } + ThreadLocalRandom random = ThreadLocalRandom.current(); + return of(serviceInstances.get(random.nextInt(serviceInstances.size()))); + } +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/MetadataServiceInstanceSelector.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/ServiceInstanceSelector.java similarity index 86% rename from spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/MetadataServiceInstanceSelector.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/ServiceInstanceSelector.java index 821e3043..575cdcf0 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/MetadataServiceInstanceSelector.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/ServiceInstanceSelector.java @@ -26,13 +26,13 @@ import org.springframework.cloud.client.ServiceInstance; * * @author liuxx */ -public interface MetadataServiceInstanceSelector { +public interface ServiceInstanceSelector { /** - * choose a service instance to get metadata. + * Select a service instance to get metadata. * @param serviceInstances all service instance * @return the service instance to get metadata */ - Optional choose(List serviceInstances); + Optional select(List serviceInstances); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java index 8676085c..f6434f3c 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java @@ -63,6 +63,7 @@ import static org.springframework.util.StringUtils.hasText; * * @author Mercy */ +@Deprecated public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { /** @@ -370,12 +371,7 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { } private void subscribeDubboMetadataServiceURLs(URL url, NotifyListener listener) { - String serviceInterface = url.getServiceInterface(); - String group = url.getParameter(GROUP_KEY); - String version = url.getParameter(VERSION_KEY); - String protocol = url.getParameter(PROTOCOL_KEY); - List urls = repository.findSubscribedDubboMetadataServiceURLs( - serviceInterface, group, version, protocol); + List urls = repository.findSubscribedDubboMetadataServiceURLs(url); listener.notify(urls); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java new file mode 100644 index 00000000..311dd268 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java @@ -0,0 +1,499 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.registry; + +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; +import com.alibaba.cloud.dubbo.registry.event.ServiceInstancesChangedEvent; +import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; +import com.alibaba.cloud.dubbo.service.DubboMetadataService; +import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; +import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; +import com.alibaba.cloud.dubbo.util.JSONUtils; + +import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.URLBuilder; +import org.apache.dubbo.metadata.MetadataService; +import org.apache.dubbo.registry.NotifyListener; +import org.apache.dubbo.registry.support.FailbackRegistry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.ApplicationListener; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.util.CollectionUtils; + +import static java.lang.String.format; +import static java.util.Collections.emptyList; +import static java.util.Collections.singleton; +import static java.util.stream.StreamSupport.stream; +import static org.apache.dubbo.common.URLBuilder.from; +import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER; +import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE; +import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; +import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY; +import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL; +import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty; +import static org.apache.dubbo.registry.Constants.ADMIN_PROTOCOL; +import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME; +import static org.springframework.util.StringUtils.hasText; + +/** + * Dubbo Cloud {@link FailbackRegistry} is based on Spring Cloud {@link DiscoveryClient} + * @author Mercy + */ +public class DubboCloudRegistry extends FailbackRegistry { + + /** + * The parameter name of {@link #servicesLookupInterval}. + */ + public static final String SERVICES_LOOKUP_INTERVAL_PARAM_NAME = "dubbo.services.lookup.interval"; + + protected static final String DUBBO_METADATA_SERVICE_CLASS_NAME = DubboMetadataService.class + .getName(); + + /** + * Caches the IDs of {@link ApplicationListener}. + */ + private static final Set registerListeners = new HashSet<>(); + + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + private final DiscoveryClient discoveryClient; + + private final DubboServiceMetadataRepository repository; + + private final DubboMetadataServiceProxy dubboMetadataConfigServiceProxy; + + private final JSONUtils jsonUtils; + + private final DubboGenericServiceFactory dubboGenericServiceFactory; + + private final DubboMetadataUtils dubboMetadataUtils; + + /** + * The interval in second of lookup service names(only for Dubbo-OPS). + */ + private final long servicesLookupInterval; + + private final ConfigurableApplicationContext applicationContext; + + private final String currentApplicationName; + + public DubboCloudRegistry(URL url, DiscoveryClient discoveryClient, + DubboServiceMetadataRepository repository, + DubboMetadataServiceProxy dubboMetadataConfigServiceProxy, + JSONUtils jsonUtils, DubboGenericServiceFactory dubboGenericServiceFactory, + ConfigurableApplicationContext applicationContext) { + + super(url); + this.servicesLookupInterval = url + .getParameter(SERVICES_LOOKUP_INTERVAL_PARAM_NAME, 60L); + this.discoveryClient = discoveryClient; + this.repository = repository; + this.dubboMetadataConfigServiceProxy = dubboMetadataConfigServiceProxy; + this.jsonUtils = jsonUtils; + this.dubboGenericServiceFactory = dubboGenericServiceFactory; + this.applicationContext = applicationContext; + this.dubboMetadataUtils = getBean(DubboMetadataUtils.class); + this.currentApplicationName = dubboMetadataUtils.getCurrentApplicationName(); + } + + private T getBean(Class beanClass) { + return this.applicationContext.getBean(beanClass); + } + + protected boolean shouldRegister(URL url) { + String side = url.getParameter(SIDE_KEY); + + boolean should = PROVIDER_SIDE.equals(side); // Only register the Provider. + + if (!should) { + if (logger.isDebugEnabled()) { + logger.debug("The URL[{}] should not be registered.", url.toString()); + } + } + + return should; + } + + @Override + public final void doRegister(URL url) { + if (!shouldRegister(url)) { + return; + } + repository.exportURL(url); + } + + @Override + public final void doUnregister(URL url) { + if (!shouldRegister(url)) { + return; + } + repository.unexportURL(url); + } + + @Override + public final void doSubscribe(URL url, NotifyListener listener) { + + if (isAdminURL(url)) { + // TODO in future + if (logger.isWarnEnabled()) { + logger.warn("This feature about admin will be supported in the future."); + } + } + else if (isDubboMetadataServiceURL(url)) { // for DubboMetadataService + subscribeDubboMetadataServiceURLs(url, listener); + } + else { // for general Dubbo Services + subscribeURLs(url, listener); + } + } + + private void subscribeURLs(URL url, NotifyListener listener) { + + // Sync subscription + subscribeURLs(url, getServices(url), listener); + + // Async subscription + registerServiceInstancesChangedListener(url, event -> { + + Set serviceNames = getServices(url); + + String serviceName = event.getServiceName(); + + if (serviceNames.contains(serviceName)) { + subscribeURLs(url, serviceNames, listener); + } + }); + } + + private void subscribeURLs(URL url, Set serviceNames, + NotifyListener listener) { + + List subscribedURLs = new LinkedList<>(); + + serviceNames.forEach(serviceName -> { + + subscribeURLs(url, subscribedURLs, serviceName, + () -> getServiceInstances(serviceName)); + + }); + + // Notify all + notifyAllSubscribedURLs(url, subscribedURLs, listener); + } + + private void registerServiceInstancesChangedListener(URL url, + ApplicationListener listener) { + String listenerId = generateId(url); + if (registerListeners.add(listenerId)) { + applicationContext.addApplicationListener(listener); + } + } + + private void subscribeURLs(URL subscribedURL, List subscribedURLs, + String serviceName, + Supplier> serviceInstancesSupplier) { + List serviceInstances = serviceInstancesSupplier.get(); + subscribeURLs(subscribedURL, subscribedURLs, serviceName, serviceInstances); + } + + private void subscribeURLs(URL subscribedURL, List subscribedURLs, + String serviceName, List serviceInstances) { + + if (CollectionUtils.isEmpty(serviceInstances)) { + if (logger.isWarnEnabled()) { + logger.warn(format("There is no instance in service[name : %s]", + serviceName)); + } + } + + List exportedURLs = getExportedURLs(subscribedURL, serviceName, + serviceInstances); + + /** + * Add the exported URLs from {@link MetadataService} + */ + subscribedURLs.addAll(exportedURLs); + } + + private List getExportedURLs(URL subscribedURL, String serviceName, + List serviceInstances) { + + List validServiceInstances = filter(serviceInstances); + + // If there is no valid ServiceInstance, return empty result + if (isEmpty(validServiceInstances)) { + if (logger.isWarnEnabled()) { + logger.warn( + "There is no instance from service[name : {}], and then Dubbo Service[key : {}] will not be " + + "available , please make sure the further impact", + serviceName, subscribedURL.getServiceKey()); + } + return emptyList(); + } + + List subscribedURLs = cloneExportedURLs(subscribedURL, serviceInstances); + + // clear local service instances, help GC + validServiceInstances.clear(); + + return subscribedURLs; + } + + /** + * Clone the subscribed URLs based on the template URLs + * @param subscribedURL the URL to be subscribed + * @param serviceInstances the list of {@link ServiceInstance service instances} + * @return non-null + */ + private List cloneExportedURLs(URL subscribedURL, + List serviceInstances) { + + List clonedExportedURLs = new LinkedList<>(); + + serviceInstances.forEach(serviceInstance -> { + + String host = serviceInstance.getHost(); + + getTemplateExportedURLs(subscribedURL, serviceInstances).stream() + .map(templateURL -> templateURL.removeParameter(TIMESTAMP_KEY)) + .map(templateURL -> templateURL.removeParameter(PID_KEY)) + .map(templateURL -> { + String protocol = templateURL.getProtocol(); + int port = repository.getDubboProtocolPort(serviceInstance, + protocol); + if (Objects.equals(templateURL.getHost(), host) + && Objects.equals(templateURL.getPort(), port)) { // use + // templateURL + // if + // equals + return templateURL; + } + + URLBuilder clonedURLBuilder = from(templateURL) // remove the + // parameters from + // the template + // URL + .setHost(host) // reset the host + .setPort(port); // reset the port + + return clonedURLBuilder.build(); + }).forEach(clonedExportedURLs::add); + }); + return clonedExportedURLs; + } + + private List getTemplateExportedURLs(URL subscribedURL, + List serviceInstances) { + + DubboMetadataService dubboMetadataService = getProxy(serviceInstances); + + List templateExportedURLs = emptyList(); + + if (dubboMetadataService != null) { + templateExportedURLs = getExportedURLs(dubboMetadataService, subscribedURL); + } + else { + if (logger.isWarnEnabled()) { + logger.warn( + "The metadata of Dubbo service[key : {}] still can't be found, it could effect the further " + + "Dubbo service invocation", + subscribedURL.getServiceKey()); + } + + } + + return templateExportedURLs; + } + + private DubboMetadataService getProxy(List serviceInstances) { + return dubboMetadataConfigServiceProxy.getProxy(serviceInstances); + } + + private List filter(Collection serviceInstances) { + return serviceInstances.stream().filter(this::isDubboServiceInstance) + .collect(Collectors.toList()); + } + + private boolean isDubboServiceInstance(ServiceInstance serviceInstance) { + Map metadata = serviceInstance.getMetadata(); + return metadata.containsKey(METADATA_SERVICE_URLS_PROPERTY_NAME); + } + + private Set getServices(URL url) { + Set subscribedServices = repository.getSubscribedServices(); + // TODO Add the filter feature + return subscribedServices; + } + + private void notifyAllSubscribedURLs(URL url, List subscribedURLs, + NotifyListener listener) { + + if (isEmpty(subscribedURLs)) { + // Add the EMPTY_PROTOCOL URL + subscribedURLs.add(emptyURL(url)); + + if (isDubboMetadataServiceURL(url)) { + // if meta service change, and serviceInstances is zero, will clean up + // information about this client + String serviceName = url.getParameter(GROUP_KEY); + repository.removeMetadataAndInitializedService(serviceName, url); + } + } + + if (logger.isDebugEnabled()) { + logger.debug("The subscribed URL[{}] will notify all URLs : {}", url, + subscribedURLs); + } + + // Notify all + listener.notify(subscribedURLs); + } + + private List getServiceInstances(Iterable serviceNames) { + return stream(serviceNames.spliterator(), false).map(this::getServiceInstances) + .flatMap(Collection::stream).collect(Collectors.toList()); + } + + private List getServiceInstances(String serviceName) { + return hasText(serviceName) ? doGetServiceInstances(serviceName) : emptyList(); + } + + private List doGetServiceInstances(String serviceName) { + List serviceInstances = emptyList(); + try { + serviceInstances = discoveryClient.getInstances(serviceName); + } + catch (Exception e) { + if (logger.isErrorEnabled()) { + logger.error(e.getMessage(), e); + } + } + return serviceInstances; + } + + private String generateId(URL url) { + return url.getServiceKey(); + } + + private URL emptyURL(URL url) { + // issue : When the last service provider is closed, the client still periodically + // connects to the last provider.n + // fix https://github.com/alibaba/spring-cloud-alibaba/issues/1259 + return from(url).setProtocol(EMPTY_PROTOCOL).removeParameter(CATEGORY_KEY) + .build(); + } + + private List getExportedURLs(DubboMetadataService dubboMetadataService, + URL subscribedURL) { + String serviceInterface = subscribedURL.getServiceInterface(); + String group = subscribedURL.getParameter(GROUP_KEY); + String version = subscribedURL.getParameter(VERSION_KEY); + // The subscribed protocol may be null + String subscribedProtocol = subscribedURL.getParameter(PROTOCOL_KEY); + String exportedURLsJSON = dubboMetadataService.getExportedURLs(serviceInterface, + group, version); + return jsonUtils.toURLs(exportedURLsJSON).stream() + .filter(exportedURL -> subscribedProtocol == null + || subscribedProtocol.equalsIgnoreCase(exportedURL.getProtocol())) + .collect(Collectors.toList()); + } + + private void subscribeDubboMetadataServiceURLs(URL subscribedURL, + NotifyListener listener) { + + // Sync subscription + subscribeDubboMetadataServiceURLs(subscribedURL, listener, + singleton(getServiceName(subscribedURL))); + + // Sync subscription + if (containsProviderCategory(subscribedURL)) { + registerServiceInstancesChangedListener(subscribedURL, event -> { + + Set serviceNames = getServices(subscribedURL); + + if (!serviceNames.contains(event.getServiceName())) { + return; + } + + subscribeDubboMetadataServiceURLs(subscribedURL, listener, serviceNames); + }); + } + } + + private String getServiceName(URL subscribedURL) { + return subscribedURL.getParameter(GROUP_KEY); + } + + private void subscribeDubboMetadataServiceURLs(URL subscribedURL, + NotifyListener listener, Set serviceNames) { + + String serviceInterface = subscribedURL.getServiceInterface(); + String version = subscribedURL.getParameter(VERSION_KEY); + String protocol = subscribedURL.getParameter(PROTOCOL_KEY); + + List serviceInstances = getServiceInstances(serviceNames); + + List urls = dubboMetadataUtils.getDubboMetadataServiceURLs(serviceInstances, + serviceInterface, version, protocol); + + notifyAllSubscribedURLs(subscribedURL, urls, listener); + } + + private boolean containsProviderCategory(URL subscribedURL) { + String category = subscribedURL.getParameter(CATEGORY_KEY); + return category == null ? false : category.contains(PROVIDER); + } + + @Override + public final void doUnsubscribe(URL url, NotifyListener listener) { + // TODO + } + + @Override + public boolean isAvailable() { + return !discoveryClient.getServices().isEmpty(); + } + + protected boolean isAdminURL(URL url) { + return ADMIN_PROTOCOL.equals(url.getProtocol()); + } + + protected boolean isDubboMetadataServiceURL(URL url) { + return DUBBO_METADATA_SERVICE_CLASS_NAME.equals(url.getServiceInterface()); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistry.java index 3e4a1a5c..07afb6fc 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistry.java @@ -31,7 +31,10 @@ import org.springframework.context.ConfigurableApplicationContext; * protocol is "spring-cloud". * * @author Mercy + * @deprecated It's a legacy and not recommended implementation, being replacing to be + * {@link DubboCloudRegistry} */ +@Deprecated public class SpringCloudRegistry extends AbstractSpringCloudRegistry { private final DubboServiceMetadataRepository dubboServiceMetadataRepository; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java index 975b076f..f78c9346 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java @@ -16,10 +16,12 @@ package com.alibaba.cloud.dubbo.registry; +import com.alibaba.cloud.dubbo.env.DubboCloudProperties; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.util.JSONUtils; + import org.apache.dubbo.common.URL; import org.apache.dubbo.registry.Registry; import org.apache.dubbo.registry.RegistryFactory; @@ -28,6 +30,7 @@ import org.apache.dubbo.registry.support.AbstractRegistryFactory; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.context.ConfigurableApplicationContext; +import static com.alibaba.cloud.dubbo.util.DubboCloudConstants.SPRING_CLOUD_REGISTRY_PROPERTY_VALUE; import static java.lang.System.getProperty; /** @@ -50,6 +53,8 @@ public class SpringCloudRegistryFactory extends AbstractRegistryFactory { */ public static String ADDRESS = "localhost"; + public static String MODE = "dubbo.cloud."; + private static String SERVICES_LOOKUP_SCHEDULER_THREAD_NAME_PREFIX = getProperty( "dubbo.services.lookup.scheduler.thread.name.prefix ", "dubbo-services-lookup-"); @@ -88,9 +93,26 @@ public class SpringCloudRegistryFactory extends AbstractRegistryFactory { @Override public Registry createRegistry(URL url) { init(); - return new SpringCloudRegistry(url, discoveryClient, - dubboServiceMetadataRepository, dubboMetadataConfigServiceProxy, - jsonUtils, dubboGenericServiceFactory, applicationContext); + + DubboCloudProperties dubboCloudProperties = applicationContext + .getBean(DubboCloudProperties.class); + + Registry registry = null; + + switch (dubboCloudProperties.getRegistryType()) { + case SPRING_CLOUD_REGISTRY_PROPERTY_VALUE: + registry = new SpringCloudRegistry(url, discoveryClient, + dubboServiceMetadataRepository, dubboMetadataConfigServiceProxy, + jsonUtils, dubboGenericServiceFactory, applicationContext); + break; + default: + registry = new DubboCloudRegistry(url, discoveryClient, + dubboServiceMetadataRepository, dubboMetadataConfigServiceProxy, + jsonUtils, dubboGenericServiceFactory, applicationContext); + break; + } + + return registry; } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancesChangedEvent.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancesChangedEvent.java index f69954b3..0f778f82 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancesChangedEvent.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancesChangedEvent.java @@ -16,14 +16,14 @@ package com.alibaba.cloud.dubbo.registry.event; -import java.util.Collection; +import java.util.List; import org.springframework.cloud.client.ServiceInstance; import org.springframework.context.ApplicationEvent; import org.springframework.context.event.ApplicationEventMulticaster; import org.springframework.context.event.SimpleApplicationEventMulticaster; -import static java.util.Collections.unmodifiableCollection; +import static java.util.Collections.unmodifiableList; /** * An event raised after the {@link ServiceInstance instances} of one service has been @@ -35,7 +35,7 @@ public class ServiceInstancesChangedEvent extends ApplicationEvent { private final String serviceName; - private final Collection serviceInstances; + private final List serviceInstances; /** * Current event has been processed or not. Typically, Spring Event was based on sync @@ -51,10 +51,10 @@ public class ServiceInstancesChangedEvent extends ApplicationEvent { * @throws IllegalArgumentException if source is null. */ public ServiceInstancesChangedEvent(String serviceName, - Collection serviceInstances) { + List serviceInstances) { super(serviceName); this.serviceName = serviceName; - this.serviceInstances = unmodifiableCollection(serviceInstances); + this.serviceInstances = unmodifiableList(serviceInstances); } /** @@ -67,7 +67,7 @@ public class ServiceInstancesChangedEvent extends ApplicationEvent { /** * @return all {@link ServiceInstance service instances}. */ - public Collection getServiceInstances() { + public List getServiceInstances() { return serviceInstances; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java index 9ddee6b3..f426ce1d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java @@ -30,11 +30,13 @@ import javax.annotation.PreDestroy; import com.alibaba.cloud.dubbo.metadata.DubboRestServiceMetadata; import com.alibaba.cloud.dubbo.metadata.ServiceRestMetadata; + import org.apache.dubbo.common.URL; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.spring.ReferenceBean; import org.apache.dubbo.rpc.service.GenericService; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,10 +97,9 @@ public class DubboGenericServiceFactory { private ReferenceBean build(String interfaceName, String version, String group, Map dubboTranslatedAttributes) { - Integer key = Objects.hash(interfaceName, version, group, - dubboTranslatedAttributes); + String key = createKey(interfaceName, version, group, dubboTranslatedAttributes); - return cache.computeIfAbsent(group + key, k -> { + return cache.computeIfAbsent(key, k -> { ReferenceBean referenceBean = new ReferenceBean<>(); referenceBean.setGeneric(true); referenceBean.setInterface(interfaceName); @@ -110,6 +111,12 @@ public class DubboGenericServiceFactory { }); } + private String createKey(String interfaceName, String version, String group, + Map dubboTranslatedAttributes) { + return group + "#" + + Objects.hash(interfaceName, version, group, dubboTranslatedAttributes); + } + private void bindReferenceBean(ReferenceBean referenceBean, Map dubboTranslatedAttributes) { DataBinder dataBinder = new DataBinder(referenceBean); @@ -155,7 +162,7 @@ public class DubboGenericServiceFactory { cache.clear(); } - public synchronized void destroy(String serviceName) { + public void destroy(String serviceName) { Set removeGroups = new HashSet<>(cache.keySet()); for (String key : removeGroups) { if (key.contains(serviceName)) { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java index 359ee5e0..1e99df3a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java @@ -16,13 +16,28 @@ package com.alibaba.cloud.dubbo.service; +import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; +import com.alibaba.cloud.dubbo.metadata.repository.ServiceInstanceSelector; +import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; + +import org.apache.dubbo.common.URL; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.DisposableBean; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; import static java.lang.reflect.Proxy.newProxyInstance; +import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; /** * The proxy of {@link DubboMetadataService}. @@ -31,26 +46,30 @@ import static java.lang.reflect.Proxy.newProxyInstance; */ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, DisposableBean { + private final Logger logger = LoggerFactory.getLogger(getClass()); + private final DubboGenericServiceFactory dubboGenericServiceFactory; + private final DubboMetadataUtils dubboMetadataUtils; + + private final ServiceInstanceSelector serviceInstanceSelector; + + private final DiscoveryClient discoveryClient; + private final Map dubboMetadataServiceCache = new ConcurrentHashMap<>(); private ClassLoader classLoader; public DubboMetadataServiceProxy( - DubboGenericServiceFactory dubboGenericServiceFactory) { + DubboGenericServiceFactory dubboGenericServiceFactory, + DubboServiceMetadataRepository dubboServiceMetadataRepository, + DubboMetadataUtils dubboMetadataUtils, + ServiceInstanceSelector serviceInstanceSelector, + DiscoveryClient discoveryClient) { this.dubboGenericServiceFactory = dubboGenericServiceFactory; - } - - /** - * Initializes {@link DubboMetadataService}'s Proxy. - * @param serviceName the service name - * @param version the service version - * @return a {@link DubboMetadataService} proxy - */ - public DubboMetadataService initProxy(String serviceName, String version) { - return dubboMetadataServiceCache.computeIfAbsent(serviceName, - name -> newProxy(name, version)); + this.dubboMetadataUtils = dubboMetadataUtils; + this.serviceInstanceSelector = serviceInstanceSelector; + this.discoveryClient = discoveryClient; } /** @@ -59,6 +78,79 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab */ public void removeProxy(String serviceName) { dubboMetadataServiceCache.remove(serviceName); + dubboGenericServiceFactory.destroy(serviceName); + } + + /** + * Get the proxy of {@link DubboMetadataService} if possible + * @param serviceInstances the instances of {@link DubboMetadataService} + * @return null if initialization can't be done + */ + public DubboMetadataService getProxy(List serviceInstances) { + + DubboMetadataService dubboMetadataService = null; + + // attempt to get the proxy of DubboMetadataService in maximum times + int attempts = serviceInstances.size(); + + for (int i = 0; i < attempts; i++) { + Optional serviceInstance = select(serviceInstances); + + if (serviceInstance.isPresent()) { + + List dubboMetadataServiceURLs = getDubboMetadataServiceURLs( + serviceInstance.get()); + + for (URL dubboMetadataServiceURL : dubboMetadataServiceURLs) { + dubboMetadataService = createProxyIfAbsent(dubboMetadataServiceURL); + if (dubboMetadataService != null) { + return dubboMetadataService; + } + } + } + } + + return dubboMetadataService; + } + + /** + * Is the {@link DubboMetadataService}'s Proxy initialized or not + * @param serviceName the service name + * @return true if initialized , or return false + */ + public boolean isInitialized(String serviceName) { + return dubboMetadataServiceCache.containsKey(serviceName); + } + + /** + * Create a {@link DubboMetadataService}'s Proxy If abstract. + * @param dubboMetadataServiceURL the {@link URL} of {@link DubboMetadataService} + * @return a {@link DubboMetadataService} proxy + */ + private DubboMetadataService createProxyIfAbsent(URL dubboMetadataServiceURL) { + String serviceName = dubboMetadataServiceURL.getParameter(APPLICATION_KEY); + String version = dubboMetadataServiceURL.getParameter(VERSION_KEY); + // Initialize DubboMetadataService with right version + return createProxyIfAbsent(serviceName, version); + } + + /** + * Initializes {@link DubboMetadataService}'s Proxy. + * @param serviceName the service name + * @param version the service version + * @return a {@link DubboMetadataService} proxy + */ + private DubboMetadataService createProxyIfAbsent(String serviceName, String version) { + return dubboMetadataServiceCache.computeIfAbsent(serviceName, + name -> createProxy(name, version)); + } + + private Optional select(List serviceInstances) { + return serviceInstanceSelector.select(serviceInstances); + } + + private List getDubboMetadataServiceURLs(ServiceInstance serviceInstance) { + return dubboMetadataUtils.getDubboMetadataServiceURLs(serviceInstance); } /** @@ -68,7 +160,12 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab * @return a {@link DubboMetadataService} proxy */ public DubboMetadataService getProxy(String serviceName) { - return dubboMetadataServiceCache.get(serviceName); + return dubboMetadataServiceCache.getOrDefault(serviceName, + getProxy0(serviceName)); + } + + private DubboMetadataService getProxy0(String serviceName) { + return getProxy(discoveryClient.getInstances(serviceName)); } @Override @@ -88,7 +185,14 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab * @param version the service version * @return a {@link DubboMetadataService} proxy */ - protected DubboMetadataService newProxy(String serviceName, String version) { + protected DubboMetadataService createProxy(String serviceName, String version) { + + if (logger.isInfoEnabled()) { + logger.info( + "The metadata of Dubbo service[name : {}] is about to be initialized", + serviceName); + } + return (DubboMetadataService) newProxyInstance(classLoader, new Class[] { DubboMetadataService.class }, new DubboMetadataServiceInvocationHandler(serviceName, version, diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java index d491b0a1..bba5c1ad 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java @@ -28,4 +28,19 @@ public interface DubboCloudConstants { */ String CONFIG_PROPERTY_PREFIX = "dubbo.cloud"; + /** + * The property name of Registry type + */ + String REGISTRY_TYPE_PROPERTY_NAME = CONFIG_PROPERTY_PREFIX + ".registry-type"; + + /** + * The property value of Spring Cloud Registry + */ + String SPRING_CLOUD_REGISTRY_PROPERTY_VALUE = "spring-cloud"; + + /** + * The property value of Dubbo Cloud Registry + */ + String DUBBO_CLOUD_REGISTRY_PROPERTY_VALUE = "dubbo-cloud"; + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboMetadataUtils.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboMetadataUtils.java new file mode 100644 index 00000000..fb8e3539 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboMetadataUtils.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.cloud.dubbo.util; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import com.alibaba.cloud.dubbo.service.DubboMetadataService; + +import org.apache.dubbo.common.URL; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.core.env.Environment; + +import static java.lang.String.format; +import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; +import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME; +import static org.springframework.util.StringUtils.hasText; + +/** + * The utilities class of Dubbo Metadata + * + * @author Mercy + */ +public class DubboMetadataUtils { + + /** + * The {@link String#format(String, Object...) pattern} of dubbo protocols port. + */ + public static final String DUBBO_PROTOCOLS_PORT_PROPERTY_NAME_PATTERN = "dubbo.protocols.%s.port"; + + private final JSONUtils jsonUtils; + + private final Environment environment; + + private final String currentApplicationName; + + public DubboMetadataUtils(JSONUtils jsonUtils, Environment environment) { + this.jsonUtils = jsonUtils; + this.environment = environment; + this.currentApplicationName = environment.getProperty("spring.application.name", + environment.getProperty("dubbo.application.name", "application")); + } + + /** + * Get the current application name + * @return non-null + */ + public String getCurrentApplicationName() { + return currentApplicationName; + } + + /** + * Get the {@link URL urls} that {@link DubboMetadataService} exported by the + * specified {@link ServiceInstance}. + * @param serviceInstance {@link ServiceInstance} + * @return the mutable {@link URL urls} + */ + public List getDubboMetadataServiceURLs(ServiceInstance serviceInstance) { + Map metadata = serviceInstance.getMetadata(); + String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME); + return jsonUtils.toURLs(dubboURLsJSON); + } + + /** + * Get the {@link URL urls} that {@link DubboMetadataService} exported by the + * specified {@link ServiceInstance ServiceInstances}. + * @param serviceInstances the list of {@link ServiceInstance ServiceInstances} + * @param serviceInterface the interface name of Dubbo service + * @param version the version of Dubbo service + * @param protocol the protocol that Dubbo Service exports + * @return the mutable {@link URL urls} + */ + public List getDubboMetadataServiceURLs(List serviceInstances, + String serviceInterface, String version, String protocol) { + return serviceInstances.stream().map(this::getDubboMetadataServiceURLs) + .flatMap(List::stream) + .filter(url -> protocol == null + || Objects.equals(protocol, url.getProtocol())) + .filter(url -> Objects.equals(serviceInterface, + url.getServiceInterface())) + .filter(url -> Objects.equals(version, url.getParameter(VERSION_KEY))) + .collect(Collectors.toList()); + } + + /** + * Get the property name of Dubbo Protocol. + * @param protocol Dubbo Protocol + * @return non-null + */ + public String getDubboProtocolPropertyName(String protocol) { + return format(DUBBO_PROTOCOLS_PORT_PROPERTY_NAME_PATTERN, protocol); + } + + public Integer getDubboProtocolPort(ServiceInstance serviceInstance, + String protocol) { + String protocolProperty = getDubboProtocolPropertyName(protocol); + Map metadata = serviceInstance.getMetadata(); + String protocolPort = metadata.get(protocolProperty); + return hasText(protocolPort) ? Integer.valueOf(protocolPort) : null; + } +} From c419c1ef5d65b9247044836cdb3455e7fe8c8588 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Wed, 2 Sep 2020 10:48:44 +0800 Subject: [PATCH 47/92] =?UTF-8?q?Polish=20alibaba/spring-cloud-alibaba#152?= =?UTF-8?q?9=20:=20spring-cloud-starter-dubbo=E6=B6=88=E8=B4=B9=E8=80=85?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E6=9C=8D=E5=8A=A1=E6=97=B6No=20provider=20av?= =?UTF-8?q?ailable=20from=20registry=20localhost:9090?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dubbo/registry/DubboCloudRegistry.java | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java index 311dd268..9cfdccd9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java @@ -51,7 +51,6 @@ import org.springframework.util.CollectionUtils; import static java.lang.String.format; import static java.util.Collections.emptyList; -import static java.util.Collections.singleton; import static java.util.stream.StreamSupport.stream; import static org.apache.dubbo.common.URLBuilder.from; import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; @@ -437,19 +436,19 @@ public class DubboCloudRegistry extends FailbackRegistry { // Sync subscription subscribeDubboMetadataServiceURLs(subscribedURL, listener, - singleton(getServiceName(subscribedURL))); + getServiceName(subscribedURL)); // Sync subscription if (containsProviderCategory(subscribedURL)) { registerServiceInstancesChangedListener(subscribedURL, event -> { - Set serviceNames = getServices(subscribedURL); + String sourceServiceName = event.getServiceName(); + String serviceName = getServiceName(subscribedURL); - if (!serviceNames.contains(event.getServiceName())) { - return; + if (Objects.equals(sourceServiceName, serviceName)) { + subscribeDubboMetadataServiceURLs(subscribedURL, listener, + sourceServiceName); } - - subscribeDubboMetadataServiceURLs(subscribedURL, listener, serviceNames); }); } } @@ -459,13 +458,13 @@ public class DubboCloudRegistry extends FailbackRegistry { } private void subscribeDubboMetadataServiceURLs(URL subscribedURL, - NotifyListener listener, Set serviceNames) { + NotifyListener listener, String serviceName) { String serviceInterface = subscribedURL.getServiceInterface(); String version = subscribedURL.getParameter(VERSION_KEY); String protocol = subscribedURL.getParameter(PROTOCOL_KEY); - List serviceInstances = getServiceInstances(serviceNames); + List serviceInstances = getServiceInstances(serviceName); List urls = dubboMetadataUtils.getDubboMetadataServiceURLs(serviceInstances, serviceInterface, version, protocol); @@ -473,6 +472,21 @@ public class DubboCloudRegistry extends FailbackRegistry { notifyAllSubscribedURLs(subscribedURL, urls, listener); } + // private void subscribeDubboMetadataServiceURLs(URL subscribedURL, + // NotifyListener listener, Set serviceNames) { + // + // String serviceInterface = subscribedURL.getServiceInterface(); + // String version = subscribedURL.getParameter(VERSION_KEY); + // String protocol = subscribedURL.getParameter(PROTOCOL_KEY); + // + // List serviceInstances = getServiceInstances(serviceNames); + // + // List urls = dubboMetadataUtils.getDubboMetadataServiceURLs(serviceInstances, + // serviceInterface, version, protocol); + // + // notifyAllSubscribedURLs(subscribedURL, urls, listener); + // } + private boolean containsProviderCategory(URL subscribedURL) { String category = subscribedURL.getParameter(CATEGORY_KEY); return category == null ? false : category.contains(PROVIDER); From c3173465ea53f6004cb74ca2993941689b8c44b9 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Wed, 2 Sep 2020 10:59:14 +0800 Subject: [PATCH 48/92] Polish alibaba/spring-cloud-alibaba#1661 : [Feature] Introducing Dubbo Gateway --- .../pom.xml | 38 +++++----- .../gateway/DubboCloudGatewayExecutor.java | 4 +- ...boSpringCloudGatewayAutoConfiguration.java | 4 +- .../main/resources/META-INF/spring.factories | 2 +- .../DubboSpringCloudGatewayBootstrap.java | 2 +- .../src/test/resources/application.yaml | 69 +------------------ .../src/test/resources/bootstrap.yaml | 66 ++++++++++++++++++ 7 files changed, 92 insertions(+), 93 deletions(-) rename spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/{standard => autoconfigure}/DubboSpringCloudGatewayAutoConfiguration.java (95%) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/bootstrap.yaml diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml index 224e93e4..2b94e06c 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml @@ -106,12 +106,12 @@ test - - - - - - + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + test + @@ -147,20 +147,20 @@ test - - - - - - - + + + org.springframework.cloud + spring-cloud-starter-consul-discovery + ${spring-cloud-consul.version} + test + - - - - - - + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + test + diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java index d591e986..d066831a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java @@ -71,12 +71,12 @@ public class DubboCloudGatewayExecutor { DubboGenericServiceFactory serviceFactory, DubboGenericServiceExecutionContextFactory contextFactory, DubboCloudGatewayProperties dubboCloudGatewayProperties, - ObjectProvider conversionServices) { + ObjectProvider conversionService) { this.repository = repository; this.serviceFactory = serviceFactory; this.contextFactory = contextFactory; this.dubboCloudGatewayProperties = dubboCloudGatewayProperties; - this.conversionService = conversionServices + this.conversionService = conversionService .getIfAvailable(DefaultFormattingConversionService::new); // TODO : Replace these hard-code configurations this.dubboTranslatedAttributes.put("protocol", "dubbo"); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java similarity index 95% rename from spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayAutoConfiguration.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java index ef892929..09b184e1 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.cloud.dubbo.gateway.standard; +package com.alibaba.cloud.dubbo.gateway.autoconfigure; import com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration; import com.alibaba.cloud.dubbo.autoconfigure.DubboServiceAutoConfiguration; import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayProperties; -import com.alibaba.cloud.dubbo.gateway.autoconfigure.DubboCloudGatewayAutoConfiguration; +import com.alibaba.cloud.dubbo.gateway.standard.DubboSpringCloudGatewayFilter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories index 463847c1..915e8fa2 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories @@ -1,3 +1,3 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.alibaba.cloud.dubbo.gateway.autoconfigure.DubboCloudGatewayAutoConfiguration,\ -com.alibaba.cloud.dubbo.gateway.standard.DubboSpringCloudGatewayAutoConfiguration \ No newline at end of file +com.alibaba.cloud.dubbo.gateway.autoconfigure.DubboSpringCloudGatewayAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java index 662a131d..30807e2f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java @@ -31,7 +31,7 @@ public class DubboSpringCloudGatewayBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudGatewayBootstrap.class) - .properties("spring.profiles.active=zookeeper").run(args); + .properties("spring.profiles.active=nacos").run(args); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml index 2f9abf4e..ef0a53a4 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml @@ -1,74 +1,7 @@ -spring: - application: - name: spring-cloud-alibaba-dubbo-gateway - main: - allow-bean-definition-overriding: true - dubbo: protocols: dubbo: port: -1 server: - port: 9090 - - # default disable all - cloud: - nacos: - discovery: - enabled: false - register-enabled: false - zookeeper: - enabled: false - consul: - enabled: false - -eureka: - client: - enabled: false - - ---- -spring: - profiles: nacos - - cloud: - nacos: - username: nacos - password: nacos - discovery: - enabled: true - register-enabled: true - server-addr: 127.0.0.1:8848 - ephemeral: false - - ---- -spring: - profiles: eureka - -eureka: - client: - enabled: true - service-url: - defaultZone: http://127.0.0.1:8761/eureka/ - - ---- -spring: - profiles: zookeeper - cloud: - zookeeper: - enabled: true - connect-string: 127.0.0.1:2181 - - ---- -spring: - profiles: consul - - cloud: - consul: - enabled: true - host: 127.0.0.1 - port: 8500 \ No newline at end of file + port: 9090 \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/bootstrap.yaml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/bootstrap.yaml new file mode 100644 index 00000000..f4743867 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/bootstrap.yaml @@ -0,0 +1,66 @@ +spring: + application: + name: spring-cloud-alibaba-dubbo-gateway + main: + allow-bean-definition-overriding: true + + + # default disable all + cloud: + nacos: + username: nacos + password: nacos + discovery: + enabled: false + register-enabled: false + zookeeper: + enabled: false + consul: + enabled: false + +eureka: + client: + enabled: false + + +--- +spring: + profiles: nacos + + cloud: + nacos: + discovery: + enabled: true + register-enabled: true + server-addr: 127.0.0.1:8848 + + +--- +spring: + profiles: eureka + +eureka: + client: + enabled: true + service-url: + defaultZone: http://127.0.0.1:8761/eureka/ + + +--- +spring: + profiles: zookeeper + cloud: + zookeeper: + enabled: true + connect-string: 127.0.0.1:2181 + + +--- +spring: + profiles: consul + + cloud: + consul: + enabled: true + host: 127.0.0.1 + port: 8500 \ No newline at end of file From 5cd6c0f1e73ca9cf7435173d146bf09ae473a012 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 3 Sep 2020 10:06:57 +0800 Subject: [PATCH 49/92] Fix the code style issues --- .../DubboSpringCloudClientBootstrap.java | 3 +- .../DubboSpringCloudConsumerBootstrap.java | 3 +- .../DubboSpringCloudProviderBootstrap.java | 2 + .../dubbo/service/StandardRestService.java | 1 - .../DubboSpringCloudWebProviderBootstrap.java | 2 + .../dubbo/service/SpringRestService.java | 1 - .../DubboSpringCloudServerBootstrap.java | 3 +- ...bboSpringCloudServletGatewayBootstrap.java | 2 + .../config/ConsulDataSourceProperties.java | 108 +++++++++--------- .../ConsulDataSourceFactoryBean.java | 92 +++++++-------- .../scg/SentinelSCGAutoConfiguration.java | 3 +- ...SentinelCircuitBreakerIntegrationTest.java | 18 +-- ...SentinelCircuitBreakerIntegrationTest.java | 14 ++- .../gateway/DubboCloudGatewayConstants.java | 22 ++-- .../gateway/DubboCloudGatewayExecutor.java | 22 ++-- .../gateway/DubboCloudGatewayProperties.java | 21 ++-- .../DubboCloudGatewayAutoConfiguration.java | 18 +-- ...boSpringCloudGatewayAutoConfiguration.java | 21 ++-- .../DubboSpringCloudGatewayFilter.java | 18 +-- .../DubboSpringCloudGatewayBootstrap.java | 27 +++-- .../spring-cloud-starter-dubbo/pom.xml | 4 +- .../DubboMetadataAutoConfiguration.java | 1 - ...ubboServiceDiscoveryAutoConfiguration.java | 11 +- .../cloud/dubbo/env/DubboCloudProperties.java | 1 + .../DubboServiceMetadataRepository.java | 2 - .../RandomServiceInstanceSelector.java | 17 +-- .../dubbo/registry/DubboCloudRegistry.java | 22 ++-- .../registry/SpringCloudRegistryFactory.java | 8 -- .../service/DubboGenericServiceFactory.java | 2 - .../service/DubboMetadataServiceProxy.java | 6 +- .../cloud/dubbo/util/DubboCloudConstants.java | 21 ++-- .../cloud/dubbo/util/DubboMetadataUtils.java | 22 ++-- .../default/actuator-endpoints.properties | 5 +- .../main/resources/META-INF/spring.factories | 3 - .../RocketMQMessageChannelBinder.java | 4 +- 35 files changed, 263 insertions(+), 267 deletions(-) rename spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/{standard => bootstrap}/DubboSpringCloudGatewayFilter.java (78%) rename spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/{standard => bootstrap}/DubboSpringCloudGatewayBootstrap.java (51%) diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java index 35e171a0..ec7f585a 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-client-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudClientBootstrap.java @@ -17,7 +17,6 @@ package com.alibaba.cloud.dubbo.bootstrap; import com.alibaba.cloud.dubbo.service.EchoService; - import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.boot.SpringApplication; @@ -28,6 +27,8 @@ import org.springframework.web.bind.annotation.RestController; /** * Dubbo Spring Cloud Client Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java index 550394c1..de9cf76b 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-consumer-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudConsumerBootstrap.java @@ -23,7 +23,6 @@ import com.alibaba.cloud.dubbo.annotation.DubboTransported; import com.alibaba.cloud.dubbo.service.RestService; import com.alibaba.cloud.dubbo.service.User; import com.alibaba.cloud.dubbo.service.UserService; - import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; @@ -53,6 +52,8 @@ import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** * Dubbo Spring Cloud Consumer Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java index 286e2d2b..2421c755 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudProviderBootstrap.java @@ -23,6 +23,8 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * Dubbo Spring Cloud Provider Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java index d39df81d..24f34f46 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-sample/src/main/java/com/alibaba/cloud/dubbo/service/StandardRestService.java @@ -31,7 +31,6 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import org.apache.dubbo.config.annotation.DubboService; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java index ab456ccc..d13733c3 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudWebProviderBootstrap.java @@ -22,6 +22,8 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * Dubbo Spring Cloud Provider Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java index af9f2c54..8aa2fed0 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-provider-web-sample/src/main/java/com/alibaba/cloud/dubbo/service/SpringRestService.java @@ -20,7 +20,6 @@ import java.util.HashMap; import java.util.Map; import org.apache.dubbo.config.annotation.DubboService; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java index 50816edb..d54597cc 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-server-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServerBootstrap.java @@ -17,7 +17,6 @@ package com.alibaba.cloud.dubbo.bootstrap; import com.alibaba.cloud.dubbo.service.EchoService; - import org.apache.dubbo.config.annotation.DubboService; import org.springframework.boot.SpringApplication; @@ -26,6 +25,8 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * Dubbo Spring Cloud Server Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServletGatewayBootstrap.java b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServletGatewayBootstrap.java index face2b41..9aaab1fe 100644 --- a/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServletGatewayBootstrap.java +++ b/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/spring-cloud-dubbo-servlet-gateway-sample/src/main/java/com/alibaba/cloud/dubbo/bootstrap/DubboSpringCloudServletGatewayBootstrap.java @@ -24,6 +24,8 @@ import org.springframework.cloud.openfeign.EnableFeignClients; /** * Dubbo Spring Cloud Servlet Gateway Bootstrap. + * + * @author Mercy */ @EnableDiscoveryClient @EnableAutoConfiguration diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/ConsulDataSourceProperties.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/ConsulDataSourceProperties.java index d8176f5b..e09d10b2 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/ConsulDataSourceProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/config/ConsulDataSourceProperties.java @@ -28,71 +28,71 @@ import org.springframework.util.StringUtils; */ public class ConsulDataSourceProperties extends AbstractDataSourceProperties { - public ConsulDataSourceProperties(){ - super(ConsulDataSourceFactoryBean.class.getName()); - } + public ConsulDataSourceProperties() { + super(ConsulDataSourceFactoryBean.class.getName()); + } - /** - * consul server host. - */ - private String host; + /** + * consul server host. + */ + private String host; - /** - * consul server port. - */ - private int port=8500; + /** + * consul server port. + */ + private int port = 8500; - /** - * data key in Redis. - */ - private String ruleKey; + /** + * data key in Redis. + */ + private String ruleKey; - /** - * Request of query will hang until timeout (in second) or get updated value. - */ - private int waitTimeoutInSecond = 1; + /** + * Request of query will hang until timeout (in second) or get updated value. + */ + private int waitTimeoutInSecond = 1; - @Override - public void preCheck(String dataSourceName) { - if(StringUtils.isEmpty(host)){ - throw new IllegalArgumentException( - "ConsulDataSource server-host is empty"); - } - if(StringUtils.isEmpty(ruleKey)){ - throw new IllegalArgumentException( - "ConsulDataSource ruleKey can not be empty"); - } - } + @Override + public void preCheck(String dataSourceName) { + if (StringUtils.isEmpty(host)) { + throw new IllegalArgumentException("ConsulDataSource server-host is empty"); + } + if (StringUtils.isEmpty(ruleKey)) { + throw new IllegalArgumentException( + "ConsulDataSource ruleKey can not be empty"); + } + } - public String getHost() { - return host; - } + public String getHost() { + return host; + } - public void setHost(String host) { - this.host = host; - } + public void setHost(String host) { + this.host = host; + } - public int getPort() { - return port; - } + public int getPort() { + return port; + } - public void setPort(int port) { - this.port = port; - } + public void setPort(int port) { + this.port = port; + } - public String getRuleKey() { - return ruleKey; - } + public String getRuleKey() { + return ruleKey; + } - public void setRuleKey(String ruleKey) { - this.ruleKey = ruleKey; - } + public void setRuleKey(String ruleKey) { + this.ruleKey = ruleKey; + } - public int getWaitTimeoutInSecond() { - return waitTimeoutInSecond; - } + public int getWaitTimeoutInSecond() { + return waitTimeoutInSecond; + } + + public void setWaitTimeoutInSecond(int waitTimeoutInSecond) { + this.waitTimeoutInSecond = waitTimeoutInSecond; + } - public void setWaitTimeoutInSecond(int waitTimeoutInSecond) { - this.waitTimeoutInSecond = waitTimeoutInSecond; - } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ConsulDataSourceFactoryBean.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ConsulDataSourceFactoryBean.java index a8fc172d..d314076e 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ConsulDataSourceFactoryBean.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/ConsulDataSourceFactoryBean.java @@ -29,68 +29,64 @@ import org.springframework.beans.factory.FactoryBean; */ public class ConsulDataSourceFactoryBean implements FactoryBean { - private String host; + private String host; - private int port; + private int port; - private String ruleKey; + private String ruleKey; - private int waitTimeoutInSecond; + private int waitTimeoutInSecond; - private Converter converter; + private Converter converter; - @Override - public ConsulDataSource getObject() throws Exception { - return new ConsulDataSource( - host, - port, - ruleKey, - waitTimeoutInSecond, - converter); - } + @Override + public ConsulDataSource getObject() throws Exception { + return new ConsulDataSource(host, port, ruleKey, waitTimeoutInSecond, converter); + } - @Override - public Class getObjectType() { - return ConsulDataSource.class; - } + @Override + public Class getObjectType() { + return ConsulDataSource.class; + } - public String getHost() { - return host; - } + public String getHost() { + return host; + } - public void setHost(String host) { - this.host = host; - } + public void setHost(String host) { + this.host = host; + } - public int getPort() { - return port; - } + public int getPort() { + return port; + } - public void setPort(int port) { - this.port = port; - } + public void setPort(int port) { + this.port = port; + } - public String getRuleKey() { - return ruleKey; - } + public String getRuleKey() { + return ruleKey; + } - public void setRuleKey(String ruleKey) { - this.ruleKey = ruleKey; - } + public void setRuleKey(String ruleKey) { + this.ruleKey = ruleKey; + } - public int getWaitTimeoutInSecond() { - return waitTimeoutInSecond; - } + public int getWaitTimeoutInSecond() { + return waitTimeoutInSecond; + } - public void setWaitTimeoutInSecond(int waitTimeoutInSecond) { - this.waitTimeoutInSecond = waitTimeoutInSecond; - } + public void setWaitTimeoutInSecond(int waitTimeoutInSecond) { + this.waitTimeoutInSecond = waitTimeoutInSecond; + } - public Converter getConverter() { - return converter; - } + public Converter getConverter() { + return converter; + } + + public void setConverter(Converter converter) { + this.converter = converter; + } - public void setConverter(Converter converter) { - this.converter = converter; - } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/scg/SentinelSCGAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/scg/SentinelSCGAutoConfiguration.java index 747b614e..315bafe1 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/scg/SentinelSCGAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-gateway/src/main/java/com/alibaba/cloud/sentinel/gateway/scg/SentinelSCGAutoConfiguration.java @@ -91,7 +91,8 @@ public class SentinelSCGAutoConfiguration { } private void initAppType() { - System.setProperty(SentinelConfig.APP_TYPE_PROP_KEY, ConfigConstants.APP_TYPE_SCG_GATEWAY); + System.setProperty(SentinelConfig.APP_TYPE_PROP_KEY, + ConfigConstants.APP_TYPE_SCG_GATEWAY); } private void initFallback() { diff --git a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/ReactiveSentinelCircuitBreakerIntegrationTest.java b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/ReactiveSentinelCircuitBreakerIntegrationTest.java index 4e640e7a..247b7efb 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/ReactiveSentinelCircuitBreakerIntegrationTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/ReactiveSentinelCircuitBreakerIntegrationTest.java @@ -131,15 +131,17 @@ public class ReactiveSentinelCircuitBreakerIntegrationTest { @Bean public Customizer slowCustomizer() { return factory -> { - factory.configure(builder -> builder - .rules(Collections.singletonList(new DegradeRule("slow_mono") - .setCount(50).setSlowRatioThreshold(0.7).setMinRequestAmount(5) - .setStatIntervalMs(30000).setTimeWindow(5))), + factory.configure( + builder -> builder.rules(Collections + .singletonList(new DegradeRule("slow_mono").setCount(50) + .setSlowRatioThreshold(0.7).setMinRequestAmount(5) + .setStatIntervalMs(30000).setTimeWindow(5))), "slow_mono"); - factory.configure(builder -> builder - .rules(Collections.singletonList(new DegradeRule("slow_mono") - .setCount(50).setSlowRatioThreshold(0.7).setMinRequestAmount(5) - .setStatIntervalMs(30000).setTimeWindow(5))), + factory.configure( + builder -> builder.rules(Collections + .singletonList(new DegradeRule("slow_mono").setCount(50) + .setSlowRatioThreshold(0.7).setMinRequestAmount(5) + .setStatIntervalMs(30000).setTimeWindow(5))), "slow_flux"); factory.configureDefault(id -> new SentinelConfigBuilder() .resourceName(id) diff --git a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/SentinelCircuitBreakerIntegrationTest.java b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/SentinelCircuitBreakerIntegrationTest.java index ebe0d6d5..1fe2e0d3 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/SentinelCircuitBreakerIntegrationTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/SentinelCircuitBreakerIntegrationTest.java @@ -101,7 +101,8 @@ public class SentinelCircuitBreakerIntegrationTest { protected static class Application { @GetMapping("/slow") - public String slow(@RequestParam(required = false) Boolean slow) throws InterruptedException { + public String slow(@RequestParam(required = false) Boolean slow) + throws InterruptedException { if (slow == null || slow) { Thread.sleep(80); } @@ -116,10 +117,10 @@ public class SentinelCircuitBreakerIntegrationTest { @Bean public Customizer slowCustomizer() { String slowId = "slow"; - List rules = Collections.singletonList( - new DegradeRule(slowId).setGrade(RuleConstant.DEGRADE_GRADE_RT) - .setCount(50).setSlowRatioThreshold(0.7).setMinRequestAmount(5) - .setStatIntervalMs(30000).setTimeWindow(5)); + List rules = Collections.singletonList(new DegradeRule(slowId) + .setGrade(RuleConstant.DEGRADE_GRADE_RT).setCount(50) + .setSlowRatioThreshold(0.7).setMinRequestAmount(5) + .setStatIntervalMs(30000).setTimeWindow(5)); return factory -> { factory.configure(builder -> builder.rules(rules), slowId); factory.configureDefault(id -> new SentinelConfigBuilder() @@ -146,7 +147,8 @@ public class SentinelCircuitBreakerIntegrationTest { public String slow(boolean slow) { return cbFactory.create("slow").run( - () -> rest.getForObject("/slow?slow=" + slow, String.class), t -> "fallback"); + () -> rest.getForObject("/slow?slow=" + slow, String.class), + t -> "fallback"); } public String normal() { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java index 372f0e6f..e60e8663 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,21 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.gateway; import com.alibaba.cloud.dubbo.util.DubboCloudConstants; /** - * The constants of Dubbo Cloud Gateway + * The constants of Dubbo Cloud Gateway. * * @author Mercy */ -public interface DubboCloudGatewayConstants { +public abstract class DubboCloudGatewayConstants { /** - * The property prefix of Configuration + * The property prefix of Configuration. */ - String CONFIG_PROPERTY_PREFIX = DubboCloudConstants.CONFIG_PROPERTY_PREFIX + public static final String CONFIG_PROPERTY_PREFIX = DubboCloudConstants.CONFIG_PROPERTY_PREFIX + ".gateway"; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java index d066831a..016c7e61 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.gateway; import java.net.URI; @@ -30,7 +30,6 @@ import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactor import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.apache.dubbo.rpc.service.GenericException; import org.apache.dubbo.rpc.service.GenericService; @@ -46,10 +45,10 @@ import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR; /** * The executor of Dubbo Cloud Gateway that handles the HTTP request and responses the - * result of execution of the generic invocation to the Dubbo service providers + * result of execution of the generic invocation to the Dubbo service providers. * * @author Mercy - * + * */ public class DubboCloudGatewayExecutor { @@ -145,8 +144,7 @@ public class DubboCloudGatewayExecutor { } /** - * TODO : Get the Request Body from HttpRequest - * + * TODO : Get the Request Body from HttpRequest. * @param request {@link HttpRequest} * @return */ diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java index 0582018f..6ac47759 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.gateway; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -21,7 +21,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import static com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayConstants.CONFIG_PROPERTY_PREFIX; /** - * The Configuration Properties for Dubbo Cloud Gateway + * The Configuration Properties for Dubbo Cloud Gateway. * * @author Mercy */ @@ -29,12 +29,12 @@ import static com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayConstants.CONFIG_ public class DubboCloudGatewayProperties { /** - * Enabled or not + * Enabled or not. */ private boolean enabled = true; /** - * The context path for the gateway request mapping + * The context path for the gateway request mapping. */ private String contextPath = ""; @@ -53,4 +53,5 @@ public class DubboCloudGatewayProperties { public void setContextPath(String contextPath) { this.contextPath = contextPath; } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java index b0cf834e..81fdf2b5 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.gateway.autoconfigure; import com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration; @@ -34,7 +34,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.ConversionService; @Configuration(proxyBeanMethods = false) -@ConditionalOnProperty(prefix = "dubbo.cloud.gateway", name = "enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = "dubbo.cloud.gateway", name = "enabled", + havingValue = "true", matchIfMissing = true) @AutoConfigureAfter({ DubboServiceAutoConfiguration.class, DubboMetadataAutoConfiguration.class }) @EnableConfigurationProperties(DubboCloudGatewayProperties.class) @@ -51,4 +52,5 @@ public class DubboCloudGatewayAutoConfiguration { return new DubboCloudGatewayExecutor(repository, serviceFactory, contextFactory, dubboCloudGatewayProperties, conversionServices); } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java index 09b184e1..3865a69a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.gateway.autoconfigure; import com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration; import com.alibaba.cloud.dubbo.autoconfigure.DubboServiceAutoConfiguration; import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayProperties; -import com.alibaba.cloud.dubbo.gateway.standard.DubboSpringCloudGatewayFilter; +import com.alibaba.cloud.dubbo.gateway.bootstrap.DubboSpringCloudGatewayFilter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -38,13 +38,14 @@ import org.springframework.http.codec.ServerCodecConfigurer; import org.springframework.http.codec.support.DefaultServerCodecConfigurer; /** - * The Auto-{@link Configuration} of Dubbo Spring Cloud Gateway + * The Auto-{@link Configuration} of Dubbo Spring Cloud Gateway. * * @author Mercy */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(GlobalFilter.class) -@ConditionalOnProperty(prefix = "dubbo.cloud.gateway", name = "enabled", havingValue = "true", matchIfMissing = true) +@ConditionalOnProperty(prefix = "dubbo.cloud.gateway", name = "enabled", + havingValue = "true", matchIfMissing = true) @AutoConfigureAfter({ DubboServiceAutoConfiguration.class, DubboMetadataAutoConfiguration.class, DubboCloudGatewayAutoConfiguration.class }) @EnableConfigurationProperties(DubboCloudGatewayProperties.class) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayFilter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayFilter.java similarity index 78% rename from spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayFilter.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayFilter.java index f9911fd9..4c352c25 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayFilter.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayFilter.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.cloud.dubbo.gateway.standard; + +package com.alibaba.cloud.dubbo.gateway.bootstrap; import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; import org.apache.commons.logging.Log; @@ -29,7 +29,7 @@ import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.server.ServerWebExchange; /** - * The Spring Cloud {@link GatewayFilter Gateway Filter} for Dubbo + * The Spring Cloud {@link GatewayFilter Gateway Filter} for Dubbo. * * @author Mercy */ diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayBootstrap.java similarity index 51% rename from spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayBootstrap.java index 30807e2f..b62180a7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/standard/DubboSpringCloudGatewayBootstrap.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayBootstrap.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,20 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.cloud.dubbo.gateway.standard; -import org.springframework.boot.autoconfigure.SpringBootApplication; +package com.alibaba.cloud.dubbo.gateway.bootstrap; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** - * The bootstrap class of Dubbo Spring Cloud Gateway + * The bootstrap class of Dubbo Spring Cloud Gateway. * * @author Mercy */ -@SpringBootApplication +@EnableAutoConfiguration @EnableDiscoveryClient -public class DubboSpringCloudGatewayBootstrap { +public final class DubboSpringCloudGatewayBootstrap { + + private DubboSpringCloudGatewayBootstrap() { + } public static void main(String[] args) { new SpringApplicationBuilder(DubboSpringCloudGatewayBootstrap.class) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/pom.xml index 713378ea..34b013b7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/pom.xml @@ -1,6 +1,6 @@ - diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java index 1a6b351d..98d2d959 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboMetadataAutoConfiguration.java @@ -31,7 +31,6 @@ import com.alibaba.cloud.dubbo.service.IntrospectiveDubboMetadataService; import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; import com.alibaba.cloud.dubbo.util.JSONUtils; import feign.Contract; - import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.spring.ServiceBean; import org.apache.dubbo.config.spring.context.event.ServiceBeanExportedEvent; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java index ba70c57c..04ffb4d1 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java @@ -98,11 +98,12 @@ import static org.springframework.util.StringUtils.hasText; @Configuration(proxyBeanMethods = false) @ConditionalOnClass(name = "org.springframework.cloud.client.discovery.DiscoveryClient") @ConditionalOnProperty(name = "spring.cloud.discovery.enabled", matchIfMissing = true) -@AutoConfigureAfter(name = { EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME, - ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME, - CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME, - NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME }, value = { - DubboServiceRegistrationAutoConfiguration.class }) +@AutoConfigureAfter( + name = { EUREKA_CLIENT_AUTO_CONFIGURATION_CLASS_NAME, + ZOOKEEPER_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME, + CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME, + NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME }, + value = { DubboServiceRegistrationAutoConfiguration.class }) public class DubboServiceDiscoveryAutoConfiguration { /** diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java index 8b8919e4..577d19e5 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/env/DubboCloudProperties.java @@ -90,4 +90,5 @@ public class DubboCloudProperties { public void setRegistryType(String registryType) { this.registryType = registryType; } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java index 398e09fa..a5be34df 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/DubboServiceMetadataRepository.java @@ -40,9 +40,7 @@ import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; import com.alibaba.cloud.dubbo.util.JSONUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; - import org.apache.dubbo.common.URL; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/RandomServiceInstanceSelector.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/RandomServiceInstanceSelector.java index 90f0cc3f..3cc911c4 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/RandomServiceInstanceSelector.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/metadata/repository/RandomServiceInstanceSelector.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.metadata.repository; import java.util.List; @@ -26,7 +26,7 @@ import static java.util.Optional.of; import static org.springframework.util.CollectionUtils.isEmpty; /** - * Random {@link ServiceInstanceSelector} + * Random {@link ServiceInstanceSelector}. * * @author Mercy */ @@ -40,4 +40,5 @@ public class RandomServiceInstanceSelector implements ServiceInstanceSelector { ThreadLocalRandom random = ThreadLocalRandom.current(); return of(serviceInstances.get(random.nextInt(serviceInstances.size()))); } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java index 9cfdccd9..dbede698 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/DubboCloudRegistry.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.registry; import java.util.Collection; @@ -33,13 +33,10 @@ import com.alibaba.cloud.dubbo.service.DubboMetadataService; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; import com.alibaba.cloud.dubbo.util.JSONUtils; - import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URLBuilder; -import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.registry.NotifyListener; import org.apache.dubbo.registry.support.FailbackRegistry; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,7 +66,8 @@ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataU import static org.springframework.util.StringUtils.hasText; /** - * Dubbo Cloud {@link FailbackRegistry} is based on Spring Cloud {@link DiscoveryClient} + * Dubbo Cloud {@link FailbackRegistry} is based on Spring Cloud {@link DiscoveryClient}. + * * @author Mercy */ public class DubboCloudRegistry extends FailbackRegistry { @@ -273,7 +271,7 @@ public class DubboCloudRegistry extends FailbackRegistry { } /** - * Clone the subscribed URLs based on the template URLs + * Clone the subscribed URLs based on the template URLs. * @param subscribedURL the URL to be subscribed * @param serviceInstances the list of {@link ServiceInstance service instances} * @return non-null diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java index f78c9346..f8b7896d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/SpringCloudRegistryFactory.java @@ -21,7 +21,6 @@ import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepositor import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; import com.alibaba.cloud.dubbo.service.DubboMetadataServiceProxy; import com.alibaba.cloud.dubbo.util.JSONUtils; - import org.apache.dubbo.common.URL; import org.apache.dubbo.registry.Registry; import org.apache.dubbo.registry.RegistryFactory; @@ -31,7 +30,6 @@ import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.context.ConfigurableApplicationContext; import static com.alibaba.cloud.dubbo.util.DubboCloudConstants.SPRING_CLOUD_REGISTRY_PROPERTY_VALUE; -import static java.lang.System.getProperty; /** * Dubbo {@link RegistryFactory} uses Spring Cloud Service Registration abstraction, whose @@ -53,12 +51,6 @@ public class SpringCloudRegistryFactory extends AbstractRegistryFactory { */ public static String ADDRESS = "localhost"; - public static String MODE = "dubbo.cloud."; - - private static String SERVICES_LOOKUP_SCHEDULER_THREAD_NAME_PREFIX = getProperty( - "dubbo.services.lookup.scheduler.thread.name.prefix ", - "dubbo-services-lookup-"); - private static ConfigurableApplicationContext applicationContext; private DiscoveryClient discoveryClient; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java index f426ce1d..d1a68c5f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboGenericServiceFactory.java @@ -30,13 +30,11 @@ import javax.annotation.PreDestroy; import com.alibaba.cloud.dubbo.metadata.DubboRestServiceMetadata; import com.alibaba.cloud.dubbo.metadata.ServiceRestMetadata; - import org.apache.dubbo.common.URL; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.spring.ReferenceBean; import org.apache.dubbo.rpc.service.GenericService; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java index 1e99df3a..34468b09 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java @@ -24,9 +24,7 @@ import java.util.concurrent.ConcurrentHashMap; import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; import com.alibaba.cloud.dubbo.metadata.repository.ServiceInstanceSelector; import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; - import org.apache.dubbo.common.URL; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,7 +80,7 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab } /** - * Get the proxy of {@link DubboMetadataService} if possible + * Get the proxy of {@link DubboMetadataService} if possible. * @param serviceInstances the instances of {@link DubboMetadataService} * @return null if initialization can't be done */ @@ -114,7 +112,7 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab } /** - * Is the {@link DubboMetadataService}'s Proxy initialized or not + * Is the {@link DubboMetadataService}'s Proxy initialized or not. * @param serviceName the service name * @return true if initialized , or return false */ diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java index ccbcf22c..34641697 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboCloudConstants.java @@ -23,28 +23,29 @@ package com.alibaba.cloud.dubbo.util; */ public final class DubboCloudConstants { - private DubboCloudConstants() { - throw new AssertionError("Must not instantiate constant utility class"); - } - /** * The property prefix of Configuration. */ public static final String CONFIG_PROPERTY_PREFIX = "dubbo.cloud"; /** - * The property name of Registry type + * The property name of Registry type. */ - String REGISTRY_TYPE_PROPERTY_NAME = CONFIG_PROPERTY_PREFIX + ".registry-type"; + public static final String REGISTRY_TYPE_PROPERTY_NAME = CONFIG_PROPERTY_PREFIX + + ".registry-type"; /** - * The property value of Spring Cloud Registry + * The property value of Spring Cloud Registry. */ - String SPRING_CLOUD_REGISTRY_PROPERTY_VALUE = "spring-cloud"; + public static final String SPRING_CLOUD_REGISTRY_PROPERTY_VALUE = "spring-cloud"; /** - * The property value of Dubbo Cloud Registry + * The property value of Dubbo Cloud Registry. */ - String DUBBO_CLOUD_REGISTRY_PROPERTY_VALUE = "dubbo-cloud"; + public static final String DUBBO_CLOUD_REGISTRY_PROPERTY_VALUE = "dubbo-cloud"; + + private DubboCloudConstants() { + throw new AssertionError("Must not instantiate constant utility class"); + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboMetadataUtils.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboMetadataUtils.java index fb8e3539..af3c5946 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboMetadataUtils.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/util/DubboMetadataUtils.java @@ -1,12 +1,11 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at + * Copyright 2013-2018 the original author or authors. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.alibaba.cloud.dubbo.util; import java.util.List; @@ -22,7 +22,6 @@ import java.util.Objects; import java.util.stream.Collectors; import com.alibaba.cloud.dubbo.service.DubboMetadataService; - import org.apache.dubbo.common.URL; import org.springframework.cloud.client.ServiceInstance; @@ -34,8 +33,8 @@ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataU import static org.springframework.util.StringUtils.hasText; /** - * The utilities class of Dubbo Metadata - * + * The utilities class of Dubbo Metadata. + * * @author Mercy */ public class DubboMetadataUtils { @@ -59,7 +58,7 @@ public class DubboMetadataUtils { } /** - * Get the current application name + * Get the current application name. * @return non-null */ public String getCurrentApplicationName() { @@ -115,4 +114,5 @@ public class DubboMetadataUtils { String protocolPort = metadata.get(protocolProperty); return hasText(protocolPort) ? Integer.valueOf(protocolPort) : null; } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/dubbo/default/actuator-endpoints.properties b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/dubbo/default/actuator-endpoints.properties index 19c4bb44..04d894e7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/dubbo/default/actuator-endpoints.properties +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/dubbo/default/actuator-endpoints.properties @@ -1,7 +1,6 @@ # Dubbo Endpoints Default Properties is loaded by @PropertySource with low order, # Set enabled for Dubbo Endpoints -management.endpoint.dubborestmetadata.enabled = true - +management.endpoint.dubborestmetadata.enabled=true # "management.endpoints.web.base-path" should not be configured in this file # Re-defines path-mapping of Dubbo Web Endpoints -management.endpoints.web.path-mapping.dubborestmetadata = dubbo/rest/metadata +management.endpoints.web.path-mapping.dubborestmetadata=dubbo/rest/metadata diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/spring.factories index 5969971e..06c5b592 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/resources/META-INF/spring.factories @@ -6,12 +6,9 @@ com.alibaba.cloud.dubbo.autoconfigure.DubboServiceRegistrationNonWebApplicationA com.alibaba.cloud.dubbo.autoconfigure.DubboLoadBalancedRestTemplateAutoConfiguration,\ com.alibaba.cloud.dubbo.autoconfigure.DubboServiceAutoConfiguration,\ com.alibaba.cloud.dubbo.autoconfigure.DubboServiceDiscoveryAutoConfiguration - org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration=\ com.alibaba.cloud.dubbo.actuate.DubboMetadataEndpointAutoConfiguration - org.springframework.context.ApplicationContextInitializer=\ com.alibaba.cloud.dubbo.context.DubboServiceRegistrationApplicationContextInitializer - org.springframework.boot.env.EnvironmentPostProcessor=\ com.alibaba.cloud.dubbo.env.DubboNonWebApplicationEnvironmentPostProcessor \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-stream-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java b/spring-cloud-alibaba-starters/spring-cloud-starter-stream-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java index 01860e05..e5a2e24b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-stream-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-stream-rocketmq/src/main/java/com/alibaba/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java @@ -169,8 +169,8 @@ public class RocketMQMessageChannelBinder extends rocketMQTemplate, destination.getName(), producerGroup, producerProperties.getExtension().getTransactional(), instrumentationManager, producerProperties, - ((AbstractMessageChannel) channel).getInterceptors().stream() - .filter(channelInterceptor -> channelInterceptor instanceof MessageConverterConfigurer.PartitioningInterceptor) + ((AbstractMessageChannel) channel).getInterceptors().stream().filter( + channelInterceptor -> channelInterceptor instanceof MessageConverterConfigurer.PartitioningInterceptor) .map(channelInterceptor -> ((MessageConverterConfigurer.PartitioningInterceptor) channelInterceptor)) .findFirst().orElse(null)); messageHandler.setBeanFactory(this.getApplicationContext().getBeanFactory()); From 59b272c0054b666c176b846197032ace25e09c0b Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Fri, 4 Sep 2020 18:47:27 +0800 Subject: [PATCH 50/92] sidecar enhance --- .../cloud/nacos/NacosDiscoveryProperties.java | 9 ++- .../cloud/sidecar/SidecarHealthChecker.java | 50 ++++++++++-- .../cloud/sidecar/SidecarInstanceCache.java | 76 +++++++++++++++++++ 3 files changed, 126 insertions(+), 9 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarInstanceCache.java diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 0882ee08..52fedfe6 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -30,6 +30,7 @@ import java.util.regex.Pattern; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; +import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingMaintainService; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; @@ -273,10 +274,10 @@ public class NacosDiscoveryProperties { this.namingMaintainService = createMaintainService(properties); } - @PreDestroy - public void destroy() { - - } + @PreDestroy + public void destroy() throws NacosException { + namingService.shutDown(); + } public String getEndpoint() { return endpoint; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarHealthChecker.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarHealthChecker.java index 2976e875..eaf42639 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarHealthChecker.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarHealthChecker.java @@ -16,6 +16,9 @@ package com.alibaba.cloud.sidecar; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; @@ -28,11 +31,14 @@ import org.springframework.core.env.ConfigurableEnvironment; /** * @author www.itmuch.com + * @author yuhuangbin */ public class SidecarHealthChecker { private static final Logger log = LoggerFactory.getLogger(SidecarHealthChecker.class); + private final Map sidecarInstanceCacheMap = new ConcurrentHashMap<>(); + private final SidecarDiscoveryClient sidecarDiscoveryClient; private final HealthIndicator healthIndicator; @@ -52,26 +58,60 @@ public class SidecarHealthChecker { public void check() { Schedulers.single().schedulePeriodically(() -> { + String applicationName = environment.getProperty("spring.application.name"); String ip = sidecarProperties.getIp(); Integer port = sidecarProperties.getPort(); Status status = healthIndicator.health().getStatus(); - String applicationName = environment.getProperty("spring.application.name"); + instanceCache(applicationName, ip, port, status); if (status.equals(Status.UP)) { - this.sidecarDiscoveryClient.registerInstance(applicationName, ip, port); - log.debug( - "Health check success. register this instance. applicationName = {}, ip = {}, port = {}, status = {}", - applicationName, ip, port, status); + if (needRegister(applicationName, ip, port, status)) { + this.sidecarDiscoveryClient.registerInstance(applicationName, ip, + port); + log.info( + "Polyglot service changed and Health check success. register the new instance. applicationName = {}, ip = {}, port = {}, status = {}", + applicationName, ip, port, status); + } } else { log.warn( "Health check failed. unregister this instance. applicationName = {}, ip = {}, port = {}, status = {}", applicationName, ip, port, status); this.sidecarDiscoveryClient.deregisterInstance(applicationName, ip, port); + + sidecarInstanceCacheMap.put(applicationName, + buildCache(ip, port, status)); } }, 0, sidecarProperties.getHealthCheckInterval(), TimeUnit.MILLISECONDS); } + private void instanceCache(String applicationName, String ip, Integer port, + Status status) { + sidecarInstanceCacheMap.putIfAbsent(applicationName, + buildCache(ip, port, status)); + } + + private boolean needRegister(String applicationName, String ip, Integer port, + Status status) { + SidecarInstanceCache cacheRecord = sidecarInstanceCacheMap.get(applicationName); + SidecarInstanceCache cache = buildCache(ip, port, status); + + if (!Objects.equals(cache, cacheRecord)) { + // modify the cache info + sidecarInstanceCacheMap.put(applicationName, cache); + return true; + } + return false; + } + + private SidecarInstanceCache buildCache(String ip, Integer port, Status status) { + SidecarInstanceCache cache = new SidecarInstanceCache(); + cache.setIp(ip); + cache.setPort(port); + cache.setStatus(status); + return cache; + } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarInstanceCache.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarInstanceCache.java new file mode 100644 index 00000000..0c18f1aa --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/SidecarInstanceCache.java @@ -0,0 +1,76 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.sidecar; + +import java.util.Objects; + +import org.springframework.boot.actuate.health.Status; + +/** + * @author yuhuangbin + */ +public class SidecarInstanceCache { + + private String ip; + + private Integer port; + + private Status status; + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SidecarInstanceCache that = (SidecarInstanceCache) o; + return Objects.equals(ip, that.ip) && Objects.equals(port, that.port) + && Objects.equals(status, that.status); + } + + @Override + public int hashCode() { + return Objects.hash(ip, port, status); + } + +} From 8941c175ed126eb504bb87e4a29c872368c2fd1d Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Mon, 7 Sep 2020 14:31:09 +0800 Subject: [PATCH 51/92] Remove useless dependency --- .../cloud/dubbo/service/DubboMetadataServiceProxy.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java index 34468b09..2d0bbc06 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java @@ -21,10 +21,11 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; -import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; import com.alibaba.cloud.dubbo.metadata.repository.ServiceInstanceSelector; import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; + import org.apache.dubbo.common.URL; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,7 +61,6 @@ public class DubboMetadataServiceProxy implements BeanClassLoaderAware, Disposab public DubboMetadataServiceProxy( DubboGenericServiceFactory dubboGenericServiceFactory, - DubboServiceMetadataRepository dubboServiceMetadataRepository, DubboMetadataUtils dubboMetadataUtils, ServiceInstanceSelector serviceInstanceSelector, DiscoveryClient discoveryClient) { From cea5be4bb677fe87abe74e5c9b5f69ad95c1ac04 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Mon, 7 Sep 2020 18:20:54 +0800 Subject: [PATCH 52/92] Remove spring-cloud-starter-dubbo-gateway --- spring-cloud-alibaba-starters/pom.xml | 1 - .../pom.xml | 167 ------------------ .../gateway/DubboCloudGatewayConstants.java | 34 ---- .../gateway/DubboCloudGatewayExecutor.java | 164 ----------------- .../gateway/DubboCloudGatewayProperties.java | 57 ------ .../DubboCloudGatewayAutoConfiguration.java | 56 ------ ...boSpringCloudGatewayAutoConfiguration.java | 75 -------- .../DubboSpringCloudGatewayFilter.java | 74 -------- .../main/resources/META-INF/spring.factories | 3 - .../DubboSpringCloudGatewayBootstrap.java | 40 ----- .../src/test/resources/application.yaml | 7 - .../src/test/resources/bootstrap.yaml | 66 ------- 12 files changed, 744 deletions(-) delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayFilter.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayBootstrap.java delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml delete mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/bootstrap.yaml diff --git a/spring-cloud-alibaba-starters/pom.xml b/spring-cloud-alibaba-starters/pom.xml index c3f08398..1249b019 100644 --- a/spring-cloud-alibaba-starters/pom.xml +++ b/spring-cloud-alibaba-starters/pom.xml @@ -22,7 +22,6 @@ spring-cloud-starter-stream-rocketmq spring-cloud-starter-bus-rocketmq spring-cloud-starter-dubbo - spring-cloud-starter-dubbo-gateway spring-cloud-starter-alibaba-sidecar spring-cloud-circuitbreaker-sentinel spring-cloud-starter-alibaba-sentinel diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml deleted file mode 100644 index 2b94e06c..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/pom.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - com.alibaba.cloud - spring-cloud-alibaba-starters - ${revision} - ../pom.xml - - - 4.0.0 - - spring-cloud-starter-dubbo-gateway - Spring Cloud Starter Dubbo Gateway - - - - - - org.springframework.boot - spring-boot-starter - true - - - - org.springframework.boot - spring-boot-actuator - true - - - - org.springframework.boot - spring-boot-actuator-autoconfigure - true - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot - true - - - - org.springframework.boot - spring-boot-autoconfigure - true - - - - - org.springframework.cloud - spring-cloud-commons - true - - - - org.springframework.cloud - spring-cloud-context - true - - - - - - - - - - - - org.springframework.cloud - spring-cloud-starter-gateway - true - - - - - com.alibaba.cloud - spring-cloud-starter-dubbo - - - - org.apache.commons - commons-lang3 - 3.11 - - - - - org.springframework - spring-test - test - - - - org.springframework.boot - spring-boot-test - test - - - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - test - - - - - org.springframework.cloud - spring-cloud-starter-zookeeper-discovery - ${spring-cloud-zookeeper.version} - test - - - org.apache.zookeeper - zookeeper - - - - - - org.apache.zookeeper - zookeeper - 3.4.14 - test - - - org.slf4j - slf4j-log4j12 - - - - - - org.apache.curator - curator-framework - ${curator.version} - test - - - - - org.springframework.cloud - spring-cloud-starter-consul-discovery - ${spring-cloud-consul.version} - test - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - test - - - - - \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java deleted file mode 100644 index e60e8663..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayConstants.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.cloud.dubbo.gateway; - -import com.alibaba.cloud.dubbo.util.DubboCloudConstants; - -/** - * The constants of Dubbo Cloud Gateway. - * - * @author Mercy - */ -public abstract class DubboCloudGatewayConstants { - - /** - * The property prefix of Configuration. - */ - public static final String CONFIG_PROPERTY_PREFIX = DubboCloudConstants.CONFIG_PROPERTY_PREFIX - + ".gateway"; - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java deleted file mode 100644 index 016c7e61..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayExecutor.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.cloud.dubbo.gateway; - -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -import com.alibaba.cloud.dubbo.http.MutableHttpServerRequest; -import com.alibaba.cloud.dubbo.metadata.DubboRestServiceMetadata; -import com.alibaba.cloud.dubbo.metadata.RequestMetadata; -import com.alibaba.cloud.dubbo.metadata.RestMethodMetadata; -import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; -import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContext; -import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory; -import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.dubbo.rpc.service.GenericException; -import org.apache.dubbo.rpc.service.GenericService; - -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.core.convert.ConversionService; -import org.springframework.format.support.DefaultFormattingConversionService; -import org.springframework.http.HttpRequest; - -import static com.alibaba.cloud.dubbo.http.util.HttpUtils.getParameters; -import static org.apache.commons.lang3.StringUtils.substringAfter; -import static org.apache.commons.lang3.StringUtils.substringBetween; -import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR; - -/** - * The executor of Dubbo Cloud Gateway that handles the HTTP request and responses the - * result of execution of the generic invocation to the Dubbo service providers. - * - * @author Mercy - * - */ -public class DubboCloudGatewayExecutor { - - private final Log logger = LogFactory.getLog(getClass()); - - private final DubboServiceMetadataRepository repository; - - private final DubboGenericServiceFactory serviceFactory; - - private final DubboGenericServiceExecutionContextFactory contextFactory; - - private final DubboCloudGatewayProperties dubboCloudGatewayProperties; - - private final ConversionService conversionService; - - private final Map dubboTranslatedAttributes = new HashMap<>(); - - public DubboCloudGatewayExecutor(DubboServiceMetadataRepository repository, - DubboGenericServiceFactory serviceFactory, - DubboGenericServiceExecutionContextFactory contextFactory, - DubboCloudGatewayProperties dubboCloudGatewayProperties, - ObjectProvider conversionService) { - this.repository = repository; - this.serviceFactory = serviceFactory; - this.contextFactory = contextFactory; - this.dubboCloudGatewayProperties = dubboCloudGatewayProperties; - this.conversionService = conversionService - .getIfAvailable(DefaultFormattingConversionService::new); - // TODO : Replace these hard-code configurations - this.dubboTranslatedAttributes.put("protocol", "dubbo"); - this.dubboTranslatedAttributes.put("cluster", "failover"); - } - - public Object execute(HttpRequest request) { - - String serviceName = resolveServiceName(request); - - String restPath = substringAfter(request.getURI().getPath(), serviceName); - - // 初始化 serviceName 的 REST 请求元数据 - repository.initializeMetadata(serviceName); - // 将 HttpServletRequest 转化为 RequestMetadata - RequestMetadata clientMetadata = buildRequestMetadata(request, restPath); - - DubboRestServiceMetadata dubboRestServiceMetadata = repository.get(serviceName, - clientMetadata); - - Object result = null; - - if (dubboRestServiceMetadata != null) { - - RestMethodMetadata dubboRestMethodMetadata = dubboRestServiceMetadata - .getRestMethodMetadata(); - - GenericService genericService = serviceFactory - .create(dubboRestServiceMetadata, dubboTranslatedAttributes); - - byte[] body = getRequestBody(request); - - MutableHttpServerRequest httpServerRequest = new MutableHttpServerRequest( - request, body); - - DubboGenericServiceExecutionContext context = contextFactory - .create(dubboRestMethodMetadata, httpServerRequest); - - GenericException exception = null; - - try { - result = genericService.$invoke(context.getMethodName(), - context.getParameterTypes(), context.getParameters()); - - String returnType = dubboRestMethodMetadata.getReturnType(); - - logger.info("The result is " + result); - - } - catch (GenericException e) { - exception = e; - } - } - - return result; - - } - - private String resolveServiceName(HttpRequest request) { - URI uri = request.getURI(); - String requestURI = uri.getPath(); - String servletPath = dubboCloudGatewayProperties.getContextPath(); - String part = substringAfter(requestURI, servletPath); - String serviceName = substringBetween(part, PATH_SEPARATOR, PATH_SEPARATOR); - return serviceName; - } - - /** - * TODO : Get the Request Body from HttpRequest. - * @param request {@link HttpRequest} - * @return - */ - private byte[] getRequestBody(HttpRequest request) { - return new byte[0]; - } - - private RequestMetadata buildRequestMetadata(HttpRequest request, String restPath) { - RequestMetadata requestMetadata = new RequestMetadata(); - requestMetadata.setPath(restPath); - requestMetadata.setMethod(request.getMethod().toString()); - requestMetadata.setParams(getParameters(request)); - requestMetadata.setHeaders(request.getHeaders()); - return requestMetadata; - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java deleted file mode 100644 index 6ac47759..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/DubboCloudGatewayProperties.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.cloud.dubbo.gateway; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -import static com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayConstants.CONFIG_PROPERTY_PREFIX; - -/** - * The Configuration Properties for Dubbo Cloud Gateway. - * - * @author Mercy - */ -@ConfigurationProperties(prefix = CONFIG_PROPERTY_PREFIX) -public class DubboCloudGatewayProperties { - - /** - * Enabled or not. - */ - private boolean enabled = true; - - /** - * The context path for the gateway request mapping. - */ - private String contextPath = ""; - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public String getContextPath() { - return contextPath; - } - - public void setContextPath(String contextPath) { - this.contextPath = contextPath; - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java deleted file mode 100644 index 81fdf2b5..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboCloudGatewayAutoConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.cloud.dubbo.gateway.autoconfigure; - -import com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration; -import com.alibaba.cloud.dubbo.autoconfigure.DubboServiceAutoConfiguration; -import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; -import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayProperties; -import com.alibaba.cloud.dubbo.metadata.repository.DubboServiceMetadataRepository; -import com.alibaba.cloud.dubbo.service.DubboGenericServiceExecutionContextFactory; -import com.alibaba.cloud.dubbo.service.DubboGenericServiceFactory; - -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.convert.ConversionService; - -@Configuration(proxyBeanMethods = false) -@ConditionalOnProperty(prefix = "dubbo.cloud.gateway", name = "enabled", - havingValue = "true", matchIfMissing = true) -@AutoConfigureAfter({ DubboServiceAutoConfiguration.class, - DubboMetadataAutoConfiguration.class }) -@EnableConfigurationProperties(DubboCloudGatewayProperties.class) -public class DubboCloudGatewayAutoConfiguration { - - @Bean - @ConditionalOnMissingBean(DubboCloudGatewayExecutor.class) - public DubboCloudGatewayExecutor dubboCloudGatewayExecutor( - DubboServiceMetadataRepository repository, - DubboGenericServiceFactory serviceFactory, - DubboGenericServiceExecutionContextFactory contextFactory, - DubboCloudGatewayProperties dubboCloudGatewayProperties, - ObjectProvider conversionServices) { - return new DubboCloudGatewayExecutor(repository, serviceFactory, contextFactory, - dubboCloudGatewayProperties, conversionServices); - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java deleted file mode 100644 index 3865a69a..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/autoconfigure/DubboSpringCloudGatewayAutoConfiguration.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.cloud.dubbo.gateway.autoconfigure; - -import com.alibaba.cloud.dubbo.autoconfigure.DubboMetadataAutoConfiguration; -import com.alibaba.cloud.dubbo.autoconfigure.DubboServiceAutoConfiguration; -import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; -import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayProperties; -import com.alibaba.cloud.dubbo.gateway.bootstrap.DubboSpringCloudGatewayFilter; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.gateway.filter.GlobalFilter; -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.codec.ServerCodecConfigurer; -import org.springframework.http.codec.support.DefaultServerCodecConfigurer; - -/** - * The Auto-{@link Configuration} of Dubbo Spring Cloud Gateway. - * - * @author Mercy - */ -@Configuration(proxyBeanMethods = false) -@ConditionalOnClass(GlobalFilter.class) -@ConditionalOnProperty(prefix = "dubbo.cloud.gateway", name = "enabled", - havingValue = "true", matchIfMissing = true) -@AutoConfigureAfter({ DubboServiceAutoConfiguration.class, - DubboMetadataAutoConfiguration.class, DubboCloudGatewayAutoConfiguration.class }) -@EnableConfigurationProperties(DubboCloudGatewayProperties.class) -public class DubboSpringCloudGatewayAutoConfiguration { - - private final Log logger = LogFactory.getLog(getClass()); - - @Bean - @ConditionalOnMissingBean(ServerCodecConfigurer.class) - public ServerCodecConfigurer serverCodecConfigurer() { - return new DefaultServerCodecConfigurer(); - } - - @Bean - public DubboSpringCloudGatewayFilter dubboSpringCloudGatewayFilter( - DubboCloudGatewayExecutor dubboCloudGatewayExecutor) { - return new DubboSpringCloudGatewayFilter(dubboCloudGatewayExecutor); - } - - @Bean - public RouteLocator gatewayRoutes(RouteLocatorBuilder builder) { - return builder.routes() - .route(r -> r.path("/**").uri("http://localhost:9090").id("first")) - .build(); - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayFilter.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayFilter.java deleted file mode 100644 index 4c352c25..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayFilter.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.cloud.dubbo.gateway.bootstrap; - -import com.alibaba.cloud.dubbo.gateway.DubboCloudGatewayExecutor; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import reactor.core.publisher.Mono; - -import org.springframework.cloud.gateway.filter.GatewayFilter; -import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.GlobalFilter; -import org.springframework.core.Ordered; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.web.server.ServerWebExchange; - -/** - * The Spring Cloud {@link GatewayFilter Gateway Filter} for Dubbo. - * - * @author Mercy - */ -public class DubboSpringCloudGatewayFilter - implements GatewayFilter, GlobalFilter, Ordered { - - private final Log logger = LogFactory.getLog(getClass()); - - private int order; - - private final DubboCloudGatewayExecutor dubboCloudGatewayExecutor; - - public DubboSpringCloudGatewayFilter( - DubboCloudGatewayExecutor dubboCloudGatewayExecutor) { - this.dubboCloudGatewayExecutor = dubboCloudGatewayExecutor; - } - - @Override - public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - - Object result = dubboCloudGatewayExecutor.execute(exchange.getRequest()); - - if (result == null) { - chain.filter(exchange); - } - else { - ServerHttpResponse response = exchange.getResponse(); - } - - return Mono.empty(); - } - - public void setOrder(int order) { - this.order = order; - } - - @Override - public int getOrder() { - return order; - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 915e8fa2..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -com.alibaba.cloud.dubbo.gateway.autoconfigure.DubboCloudGatewayAutoConfiguration,\ -com.alibaba.cloud.dubbo.gateway.autoconfigure.DubboSpringCloudGatewayAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayBootstrap.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayBootstrap.java deleted file mode 100644 index b62180a7..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/java/com/alibaba/cloud/dubbo/gateway/bootstrap/DubboSpringCloudGatewayBootstrap.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.alibaba.cloud.dubbo.gateway.bootstrap; - -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - -/** - * The bootstrap class of Dubbo Spring Cloud Gateway. - * - * @author Mercy - */ -@EnableAutoConfiguration -@EnableDiscoveryClient -public final class DubboSpringCloudGatewayBootstrap { - - private DubboSpringCloudGatewayBootstrap() { - } - - public static void main(String[] args) { - new SpringApplicationBuilder(DubboSpringCloudGatewayBootstrap.class) - .properties("spring.profiles.active=nacos").run(args); - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml deleted file mode 100644 index ef0a53a4..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/application.yaml +++ /dev/null @@ -1,7 +0,0 @@ -dubbo: - protocols: - dubbo: - port: -1 - -server: - port: 9090 \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/bootstrap.yaml b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/bootstrap.yaml deleted file mode 100644 index f4743867..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo-gateway/src/test/resources/bootstrap.yaml +++ /dev/null @@ -1,66 +0,0 @@ -spring: - application: - name: spring-cloud-alibaba-dubbo-gateway - main: - allow-bean-definition-overriding: true - - - # default disable all - cloud: - nacos: - username: nacos - password: nacos - discovery: - enabled: false - register-enabled: false - zookeeper: - enabled: false - consul: - enabled: false - -eureka: - client: - enabled: false - - ---- -spring: - profiles: nacos - - cloud: - nacos: - discovery: - enabled: true - register-enabled: true - server-addr: 127.0.0.1:8848 - - ---- -spring: - profiles: eureka - -eureka: - client: - enabled: true - service-url: - defaultZone: http://127.0.0.1:8761/eureka/ - - ---- -spring: - profiles: zookeeper - cloud: - zookeeper: - enabled: true - connect-string: 127.0.0.1:2181 - - ---- -spring: - profiles: consul - - cloud: - consul: - enabled: true - host: 127.0.0.1 - port: 8500 \ No newline at end of file From 307935a5d9638f81165c8ecae75e38ff56cf03b0 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Mon, 7 Sep 2020 21:52:16 +0800 Subject: [PATCH 53/92] nacos re-register enhance --- .../cloud/nacos/NacosDiscoveryProperties.java | 26 ++++++++++++++++--- .../nacos/registry/NacosServiceRegistry.java | 8 +++++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 52fedfe6..78096d2e 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -30,6 +30,7 @@ import java.util.regex.Pattern; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; +import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingMaintainService; import com.alibaba.nacos.api.naming.NamingService; @@ -210,12 +211,20 @@ public class NacosDiscoveryProperties { */ private boolean ephemeral = true; + /** + * If the instance needs to be re-registered. The default value is false. + */ + private boolean needNewlyRegister = false; + @Autowired private InetUtils inetUtils; @Autowired private Environment environment; + @Autowired + private NacosAutoServiceRegistration nacosAutoServiceRegistration; + private NamingService namingService; private NamingMaintainService namingMaintainService; @@ -272,12 +281,16 @@ public class NacosDiscoveryProperties { Properties properties = getNacosProperties(); this.namingService = createNamingService(properties); this.namingMaintainService = createMaintainService(properties); + + if (needNewlyRegister) { + nacosAutoServiceRegistration.start(); + } } - @PreDestroy - public void destroy() throws NacosException { - namingService.shutDown(); - } + @PreDestroy + public void destroy() throws NacosException { + shutdownNacosService(); + } public String getEndpoint() { return endpoint; @@ -598,4 +611,9 @@ public class NacosDiscoveryProperties { return sb.toString(); } + private void shutdownNacosService() throws NacosException { + nacosAutoServiceRegistration.stop(); + needNewlyRegister = true; + } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java index 1877ceae..5e0abcb5 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java @@ -19,6 +19,7 @@ package com.alibaba.cloud.nacos.registry; import java.util.List; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; import org.slf4j.Logger; @@ -101,7 +102,12 @@ public class NacosServiceRegistry implements ServiceRegistry { @Override public void close() { - + try { + nacosDiscoveryProperties.namingServiceInstance().shutDown(); + } + catch (NacosException e) { + log.error("Nacos namingService shutDown failed", e); + } } @Override From a192c17ede5c14d08217c98379e38974537d95fc Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Tue, 8 Sep 2020 09:27:44 +0800 Subject: [PATCH 54/92] Remove spring-cloud-starter-dubbo-gateway --- .../com/alibaba/cloud/nacos/NacosDiscoveryProperties.java | 8 ++++---- .../sentinel/endpoint/SentinelHealthIndicatorTests.java | 4 ++-- .../cloud/dubbo/service/DubboMetadataServiceProxy.java | 2 -- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 52fedfe6..acc8b258 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -274,10 +274,10 @@ public class NacosDiscoveryProperties { this.namingMaintainService = createMaintainService(properties); } - @PreDestroy - public void destroy() throws NacosException { - namingService.shutDown(); - } + @PreDestroy + public void destroy() throws NacosException { + namingService.shutDown(); + } public String getEndpoint() { return endpoint; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java index 96b7adaa..71ddb799 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/test/java/com/alibaba/cloud/sentinel/endpoint/SentinelHealthIndicatorTests.java @@ -110,8 +110,8 @@ public class SentinelHealthIndicatorTests { Health health = sentinelHealthIndicator.health(); assertThat(health.getStatus()).isEqualTo(Status.UNKNOWN); - assertThat(health.getDetails().get("dashboard")).isEqualTo( - new Status(Status.UNKNOWN.getCode(), "localhost:8080 can't be connected")); + assertThat(health.getDetails().get("dashboard")).isEqualTo(new Status( + Status.UNKNOWN.getCode(), "localhost:8080 can't be connected")); } @Test diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java index 2d0bbc06..ff70950d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/service/DubboMetadataServiceProxy.java @@ -23,9 +23,7 @@ import java.util.concurrent.ConcurrentHashMap; import com.alibaba.cloud.dubbo.metadata.repository.ServiceInstanceSelector; import com.alibaba.cloud.dubbo.util.DubboMetadataUtils; - import org.apache.dubbo.common.URL; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 4c43240bc100409c1e5d1f77104896411426562f Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Tue, 8 Sep 2020 21:59:15 +0800 Subject: [PATCH 55/92] nacos discovery enhance --- .../cloud/nacos/NacosDiscoveryProperties.java | 83 +++++++------ .../nacos/NacosServiceAutoConfiguration.java | 36 ++++++ .../cloud/nacos/NacosServiceManager.java | 114 ++++++++++++++++++ .../NacosDiscoveryAutoConfiguration.java | 6 +- .../discovery/NacosServiceDiscovery.java | 16 ++- .../endpoint/NacosDiscoveryEndpoint.java | 10 +- ...cosDiscoveryEndpointAutoConfiguration.java | 10 +- .../nacos/registry/NacosRegistration.java | 5 - .../nacos/registry/NacosServiceRegistry.java | 19 ++- ...NacosServiceRegistryAutoConfiguration.java | 6 +- .../NacosRibbonClientConfiguration.java | 7 +- .../alibaba/cloud/nacos/ribbon/NacosRule.java | 8 +- .../cloud/nacos/ribbon/NacosServerList.java | 10 +- .../main/resources/META-INF/spring.factories | 3 +- .../discovery/NacosServiceDiscoveryTest.java | 15 ++- .../NacosAutoServiceRegistrationTests.java | 6 +- .../nacos/ribbon/NacosServerListTests.java | 33 +++-- .../nacos/SidecarNacosAutoConfiguration.java | 5 +- .../nacos/SidecarNacosDiscoveryClient.java | 22 ++-- ...ubboServiceDiscoveryAutoConfiguration.java | 7 +- 20 files changed, 327 insertions(+), 94 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceAutoConfiguration.java create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 78096d2e..9b350990 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -28,12 +28,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; -import com.alibaba.nacos.api.exception.NacosException; -import com.alibaba.nacos.api.naming.NamingMaintainService; -import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; import com.alibaba.nacos.client.naming.utils.UtilAndComs; import com.alibaba.spring.util.PropertySourcesUtils; @@ -48,8 +44,6 @@ import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; -import static com.alibaba.nacos.api.NacosFactory.createMaintainService; -import static com.alibaba.nacos.api.NacosFactory.createNamingService; import static com.alibaba.nacos.api.PropertyKeyConst.ACCESS_KEY; import static com.alibaba.nacos.api.PropertyKeyConst.CLUSTER_NAME; import static com.alibaba.nacos.api.PropertyKeyConst.ENDPOINT; @@ -211,24 +205,18 @@ public class NacosDiscoveryProperties { */ private boolean ephemeral = true; - /** - * If the instance needs to be re-registered. The default value is false. - */ - private boolean needNewlyRegister = false; - @Autowired private InetUtils inetUtils; @Autowired private Environment environment; + @Autowired + private NacosServiceManager nacosServiceManager; + @Autowired private NacosAutoServiceRegistration nacosAutoServiceRegistration; - private NamingService namingService; - - private NamingMaintainService namingMaintainService; - @PostConstruct public void init() throws Exception { @@ -278,20 +266,13 @@ public class NacosDiscoveryProperties { this.overrideFromEnv(environment); - Properties properties = getNacosProperties(); - this.namingService = createNamingService(properties); - this.namingMaintainService = createMaintainService(properties); - - if (needNewlyRegister) { + if (nacosServiceManager.isNacosDiscoveryInfoChanged(this)) { + nacosAutoServiceRegistration.stop(); + nacosServiceManager.reBuildNacosService(getNacosProperties()); nacosAutoServiceRegistration.start(); } } - @PreDestroy - public void destroy() throws NacosException { - shutdownNacosService(); - } - public String getEndpoint() { return endpoint; } @@ -496,6 +477,42 @@ public class NacosDiscoveryProperties { this.ephemeral = ephemeral; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NacosDiscoveryProperties that = (NacosDiscoveryProperties) o; + return Objects.equals(serverAddr, that.serverAddr) + && Objects.equals(username, that.username) + && Objects.equals(password, that.password) + && Objects.equals(endpoint, that.endpoint) + && Objects.equals(namespace, that.namespace) + && Objects.equals(logName, that.logName) + && Objects.equals(service, that.service) + && Objects.equals(clusterName, that.clusterName) + && Objects.equals(group, that.group) && Objects.equals(ip, that.ip) + && Objects.equals(port, that.port) + && Objects.equals(networkInterface, that.networkInterface) + && Objects.equals(accessKey, that.accessKey) + && Objects.equals(secretKey, that.secretKey) + && Objects.equals(heartBeatInterval, that.heartBeatInterval) + && Objects.equals(heartBeatTimeout, that.heartBeatTimeout) + && Objects.equals(ipDeleteTimeout, that.ipDeleteTimeout); + } + + @Override + public int hashCode() { + return Objects.hash(serverAddr, username, password, endpoint, namespace, + watchDelay, logName, service, weight, clusterName, group, + namingLoadCacheAtStart, registerEnabled, ip, networkInterface, port, + secure, accessKey, secretKey, heartBeatInterval, heartBeatTimeout, + ipDeleteTimeout, instanceEnabled, ephemeral); + } + @Override public String toString() { return "NacosDiscoveryProperties{" + "serverAddr='" + serverAddr + '\'' @@ -559,16 +576,7 @@ public class NacosDiscoveryProperties { } } - public NamingService namingServiceInstance() { - return namingService; - } - - @Deprecated - public NamingMaintainService namingMaintainServiceInstance() { - return namingMaintainService; - } - - private Properties getNacosProperties() { + public Properties getNacosProperties() { Properties properties = new Properties(); properties.put(SERVER_ADDR, serverAddr); properties.put(USERNAME, Objects.toString(username, "")); @@ -611,9 +619,4 @@ public class NacosDiscoveryProperties { return sb.toString(); } - private void shutdownNacosService() throws NacosException { - nacosAutoServiceRegistration.stop(); - needNewlyRegister = true; - } - } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceAutoConfiguration.java new file mode 100644 index 00000000..6a315d87 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceAutoConfiguration.java @@ -0,0 +1,36 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos; + +import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author yuhuangbin + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnDiscoveryEnabled +@ConditionalOnNacosDiscoveryEnabled +public class NacosServiceAutoConfiguration { + + @Bean + public NacosServiceManager nacosServiceManager() { + return new NacosServiceManager(); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java new file mode 100644 index 00000000..95a6cd82 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java @@ -0,0 +1,114 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos; + +import java.util.Objects; +import java.util.Properties; + +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.naming.NamingMaintainService; +import com.alibaba.nacos.api.naming.NamingService; + +import static com.alibaba.nacos.api.NacosFactory.createMaintainService; +import static com.alibaba.nacos.api.NacosFactory.createNamingService; +import static org.springframework.beans.BeanUtils.copyProperties; + +/** + * @author yuhuangbin + */ +public class NacosServiceManager { + + private NacosDiscoveryProperties nacosDiscoveryPropertiesCache; + + private NamingService namingService; + + private NamingMaintainService namingMaintainService; + + public NamingService getNamingService(Properties properties) { + if (Objects.isNull(this.namingService)) { + buildNamingService(properties); + } + return namingService; + } + + public NamingMaintainService getNamingMaintainService(Properties properties) { + if (Objects.isNull(namingMaintainService)) { + buildNamingMaintainService(properties); + } + return namingMaintainService; + } + + public boolean isNacosDiscoveryInfoChanged( + NacosDiscoveryProperties nacosDiscoveryProperties) { + if (Objects.isNull(nacosDiscoveryPropertiesCache)) { + nacosDiscoveryPropertiesCache = new NacosDiscoveryProperties(); + copyProperties(nacosDiscoveryProperties, nacosDiscoveryPropertiesCache); + return false; + } + if (this.nacosDiscoveryPropertiesCache.equals(nacosDiscoveryProperties)) { + return false; + } + copyProperties(nacosDiscoveryProperties, nacosDiscoveryPropertiesCache); + return true; + } + + private NamingMaintainService buildNamingMaintainService(Properties properties) { + if (Objects.isNull(namingMaintainService)) { + synchronized (NacosServiceManager.class) { + if (Objects.isNull(namingMaintainService)) { + namingMaintainService = createNamingMaintainService(properties); + } + } + } + return namingMaintainService; + } + + private NamingService buildNamingService(Properties properties) { + if (Objects.isNull(namingService)) { + synchronized (NacosServiceManager.class) { + if (Objects.isNull(namingService)) { + namingService = createNewNamingService(properties); + } + } + } + return namingService; + } + + private NamingService createNewNamingService(Properties properties) { + try { + return createNamingService(properties); + } + catch (NacosException e) { + throw new RuntimeException(e); + } + } + + private NamingMaintainService createNamingMaintainService(Properties properties) { + try { + return createMaintainService(properties); + } + catch (NacosException e) { + throw new RuntimeException(e); + } + } + + public void reBuildNacosService(Properties nacosProperties) { + namingService = createNewNamingService(nacosProperties); + namingMaintainService = createNamingMaintainService(nacosProperties); + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.java index 0a76fc0b..7bd711e9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryAutoConfiguration.java @@ -18,6 +18,7 @@ package com.alibaba.cloud.nacos.discovery; import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; @@ -41,8 +42,9 @@ public class NacosDiscoveryAutoConfiguration { @Bean @ConditionalOnMissingBean public NacosServiceDiscovery nacosServiceDiscovery( - NacosDiscoveryProperties discoveryProperties) { - return new NacosServiceDiscovery(discoveryProperties); + NacosDiscoveryProperties discoveryProperties, + NacosServiceManager nacosServiceManager) { + return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java index e021e34b..af39fce3 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java @@ -23,7 +23,9 @@ import java.util.Map; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceInstance; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.ListView; @@ -36,8 +38,13 @@ public class NacosServiceDiscovery { private NacosDiscoveryProperties discoveryProperties; - public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties) { + private NamingService namingService; + + public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties, + NacosServiceManager nacosServiceManager) { this.discoveryProperties = discoveryProperties; + this.namingService = nacosServiceManager + .getNamingService(discoveryProperties.getNacosProperties()); } /** @@ -48,8 +55,7 @@ public class NacosServiceDiscovery { */ public List getInstances(String serviceId) throws NacosException { String group = discoveryProperties.getGroup(); - List instances = discoveryProperties.namingServiceInstance() - .selectInstances(serviceId, group, true); + List instances = namingService.selectInstances(serviceId, group, true); return hostToServiceInstanceList(instances, serviceId); } @@ -60,8 +66,8 @@ public class NacosServiceDiscovery { */ public List getServices() throws NacosException { String group = discoveryProperties.getGroup(); - ListView services = discoveryProperties.namingServiceInstance() - .getServicesOfServer(1, Integer.MAX_VALUE, group); + ListView services = namingService.getServicesOfServer(1, + Integer.MAX_VALUE, group); return services.getData(); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java index a824675e..9f88830e 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.ServiceInfo; import org.slf4j.Logger; @@ -41,9 +42,13 @@ public class NacosDiscoveryEndpoint { private static final Logger log = LoggerFactory .getLogger(NacosDiscoveryEndpoint.class); + private NacosServiceManager nacosServiceManager; + private NacosDiscoveryProperties nacosDiscoveryProperties; - public NacosDiscoveryEndpoint(NacosDiscoveryProperties nacosDiscoveryProperties) { + public NacosDiscoveryEndpoint(NacosServiceManager nacosServiceManager, + NacosDiscoveryProperties nacosDiscoveryProperties) { + this.nacosServiceManager = nacosServiceManager; this.nacosDiscoveryProperties = nacosDiscoveryProperties; } @@ -55,7 +60,8 @@ public class NacosDiscoveryEndpoint { Map result = new HashMap<>(); result.put("NacosDiscoveryProperties", nacosDiscoveryProperties); - NamingService namingService = nacosDiscoveryProperties.namingServiceInstance(); + NamingService namingService = nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties()); List subscribe = Collections.emptyList(); try { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java index e5a4b515..ede3cb4b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java @@ -16,8 +16,11 @@ package com.alibaba.cloud.nacos.endpoint; +import java.util.Properties; + import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.discovery.actuate.health.NacosDiscoveryHealthIndicator; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; @@ -44,16 +47,19 @@ public class NacosDiscoveryEndpointAutoConfiguration { @ConditionalOnMissingBean @ConditionalOnEnabledEndpoint public NacosDiscoveryEndpoint nacosDiscoveryEndpoint( + NacosServiceManager nacosServiceManager, NacosDiscoveryProperties nacosDiscoveryProperties) { - return new NacosDiscoveryEndpoint(nacosDiscoveryProperties); + return new NacosDiscoveryEndpoint(nacosServiceManager, nacosDiscoveryProperties); } @Bean @ConditionalOnEnabledHealthIndicator("nacos-discovery") public HealthIndicator nacosDiscoveryHealthIndicator( + NacosServiceManager nacosServiceManager, NacosDiscoveryProperties nacosDiscoveryProperties) { + Properties nacosProperties = nacosDiscoveryProperties.getNacosProperties(); return new NacosDiscoveryHealthIndicator( - nacosDiscoveryProperties.namingServiceInstance()); + nacosServiceManager.getNamingService(nacosProperties)); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java index aac1b82f..27f6fe7f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosRegistration.java @@ -22,7 +22,6 @@ import java.util.Map; import javax.annotation.PostConstruct; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; import org.springframework.cloud.client.DefaultServiceInstance; @@ -157,10 +156,6 @@ public class NacosRegistration implements Registration, ServiceInstance { return nacosDiscoveryProperties; } - public NamingService getNacosNamingService() { - return nacosDiscoveryProperties.namingServiceInstance(); - } - @Override public String toString() { return "NacosRegistration{" + "nacosDiscoveryProperties=" diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java index 5e0abcb5..19cf6deb 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java @@ -17,8 +17,10 @@ package com.alibaba.cloud.nacos.registry; import java.util.List; +import java.util.Properties; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; @@ -42,8 +44,12 @@ public class NacosServiceRegistry implements ServiceRegistry { private final NacosDiscoveryProperties nacosDiscoveryProperties; - public NacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties) { + private NacosServiceManager nacosServiceManager; + + public NacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties, + NacosServiceManager nacosServiceManager) { this.nacosDiscoveryProperties = nacosDiscoveryProperties; + this.nacosServiceManager = nacosServiceManager; } @Override @@ -103,7 +109,7 @@ public class NacosServiceRegistry implements ServiceRegistry { @Override public void close() { try { - nacosDiscoveryProperties.namingServiceInstance().shutDown(); + namingService().shutDown(); } catch (NacosException e) { log.error("Nacos namingService shutDown failed", e); @@ -130,7 +136,8 @@ public class NacosServiceRegistry implements ServiceRegistry { } try { - nacosDiscoveryProperties.namingMaintainServiceInstance() + Properties nacosProperties = nacosDiscoveryProperties.getNacosProperties(); + nacosServiceManager.getNamingMaintainService(nacosProperties) .updateInstance(serviceId, instance); } catch (Exception e) { @@ -144,8 +151,7 @@ public class NacosServiceRegistry implements ServiceRegistry { String serviceName = registration.getServiceId(); try { - List instances = nacosDiscoveryProperties.namingServiceInstance() - .getAllInstances(serviceName); + List instances = namingService().getAllInstances(serviceName); for (Instance instance : instances) { if (instance.getIp().equalsIgnoreCase(nacosDiscoveryProperties.getIp()) && instance.getPort() == nacosDiscoveryProperties.getPort()) { @@ -172,7 +178,8 @@ public class NacosServiceRegistry implements ServiceRegistry { } private NamingService namingService() { - return nacosDiscoveryProperties.namingServiceInstance(); + return nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties()); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java index 04381401..2bfdfb25 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java @@ -18,6 +18,7 @@ package com.alibaba.cloud.nacos.registry; import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -47,8 +48,9 @@ public class NacosServiceRegistryAutoConfiguration { @Bean public NacosServiceRegistry nacosServiceRegistry( - NacosDiscoveryProperties nacosDiscoveryProperties) { - return new NacosServiceRegistry(nacosDiscoveryProperties); + NacosDiscoveryProperties nacosDiscoveryProperties, + NacosServiceManager nacosServiceManager) { + return new NacosServiceRegistry(nacosDiscoveryProperties, nacosServiceManager); } @Bean diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java index a6294e87..712e6a42 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java @@ -17,6 +17,7 @@ package com.alibaba.cloud.nacos.ribbon; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.ServerList; @@ -42,13 +43,15 @@ public class NacosRibbonClientConfiguration { @Bean @ConditionalOnMissingBean public ServerList ribbonServerList(IClientConfig config, - NacosDiscoveryProperties nacosDiscoveryProperties) { + NacosDiscoveryProperties nacosDiscoveryProperties, + NacosServiceManager nacosServiceManager) { if (this.propertiesFactory.isSet(ServerList.class, config.getClientName())) { ServerList serverList = this.propertiesFactory.get(ServerList.class, config, config.getClientName()); return serverList; } - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, + nacosServiceManager); serverList.initWithNiwsConfig(config); return serverList; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java index 663b9d56..8d705b04 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRule.java @@ -21,6 +21,7 @@ import java.util.Objects; import java.util.stream.Collectors; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; import com.netflix.client.config.IClientConfig; @@ -47,6 +48,9 @@ public class NacosRule extends AbstractLoadBalancerRule { @Autowired private NacosDiscoveryProperties nacosDiscoveryProperties; + @Autowired + private NacosServiceManager nacosServiceManager; + @Override public Server choose(Object key) { try { @@ -55,8 +59,8 @@ public class NacosRule extends AbstractLoadBalancerRule { DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer(); String name = loadBalancer.getName(); - NamingService namingService = nacosDiscoveryProperties - .namingServiceInstance(); + NamingService namingService = nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties()); List instances = namingService.selectInstances(name, group, true); if (CollectionUtils.isEmpty(instances)) { LOGGER.warn("no instance in service {}", name); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java index 55928f26..1b975881 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.client.naming.utils.CollectionUtils; import com.netflix.client.config.IClientConfig; @@ -33,10 +34,14 @@ public class NacosServerList extends AbstractServerList { private NacosDiscoveryProperties discoveryProperties; + private NacosServiceManager nacosServiceManager; + private String serviceId; - public NacosServerList(NacosDiscoveryProperties discoveryProperties) { + public NacosServerList(NacosDiscoveryProperties discoveryProperties, + NacosServiceManager nacosServiceManager) { this.discoveryProperties = discoveryProperties; + this.nacosServiceManager = nacosServiceManager; } @Override @@ -52,7 +57,8 @@ public class NacosServerList extends AbstractServerList { private List getServers() { try { String group = discoveryProperties.getGroup(); - List instances = discoveryProperties.namingServiceInstance() + List instances = nacosServiceManager + .getNamingService(discoveryProperties.getNacosProperties()) .selectInstances(serviceId, group, true); return instancesToServerList(instances); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories index 6189df59..80befe75 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/resources/META-INF/spring.factories @@ -5,6 +5,7 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\ com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\ com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\ - com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration + com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\ + com.alibaba.cloud.nacos.NacosServiceAutoConfiguration org.springframework.cloud.bootstrap.BootstrapConfiguration=\ com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscoveryTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscoveryTest.java index 74404079..97ecc683 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscoveryTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscoveryTest.java @@ -22,6 +22,7 @@ import java.util.LinkedList; import java.util.List; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; @@ -60,16 +61,19 @@ public class NacosServiceDiscoveryTest { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); + when(nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties())) + .thenReturn(namingService); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(namingService.selectInstances(eq(serviceName), eq("DEFAULT"), eq(true))) .thenReturn(instances); NacosServiceDiscovery serviceDiscovery = new NacosServiceDiscovery( - nacosDiscoveryProperties); + nacosDiscoveryProperties, nacosServiceManager); List serviceInstances = serviceDiscovery .getInstances(serviceName); @@ -99,16 +103,19 @@ public class NacosServiceDiscoveryTest { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); + when(nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties())) + .thenReturn(namingService); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(namingService.getServicesOfServer(eq(1), eq(Integer.MAX_VALUE), eq("DEFAULT"))).thenReturn(nacosServices); NacosServiceDiscovery serviceDiscovery = new NacosServiceDiscovery( - nacosDiscoveryProperties); + nacosDiscoveryProperties, nacosServiceManager); List services = serviceDiscovery.getServices(); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java index 926afb17..9ae2cff9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistrationTests.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Properties; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration; import com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpoint; import com.alibaba.nacos.api.NacosFactory; @@ -86,6 +87,9 @@ public class NacosAutoServiceRegistrationTests { @Autowired private NacosDiscoveryProperties properties; + @Autowired + private NacosServiceManager nacosServiceManager; + @Autowired private InetUtils inetUtils; @@ -207,7 +211,7 @@ public class NacosAutoServiceRegistrationTests { private void checkoutEndpoint() throws Exception { NacosDiscoveryEndpoint nacosDiscoveryEndpoint = new NacosDiscoveryEndpoint( - properties); + nacosServiceManager, properties); Map map = nacosDiscoveryEndpoint.nacosDiscovery(); assertThat(properties).isEqualTo(map.get("NacosDiscoveryProperties")); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java index 1c6e65d9..7e56fb8b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.stream.Collectors; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.test.NacosMockTest; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; @@ -48,12 +49,16 @@ public class NacosServerListTests { NacosDiscoveryProperties.class); NamingService namingService = mock(NamingService.class); + NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); + when(nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties())) + .thenReturn(namingService); when(namingService.selectInstances(anyString(), eq("DEFAULT"), eq(true))) .thenReturn(null); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, + nacosServiceManager); List servers = serverList.getInitialListOfServers(); assertThat(servers).isEmpty(); } @@ -68,10 +73,13 @@ public class NacosServerListTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); + when(nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties())) + .thenReturn(namingService); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) @@ -79,7 +87,8 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, + nacosServiceManager); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getInitialListOfServers(); assertThat(servers).hasSize(1); @@ -102,10 +111,13 @@ public class NacosServerListTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); + when(nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties())) + .thenReturn(namingService); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) .thenReturn(instances.stream().filter(Instance::isHealthy) @@ -113,7 +125,8 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, + nacosServiceManager); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getInitialListOfServers(); assertThat(servers).hasSize(1); @@ -140,10 +153,13 @@ public class NacosServerListTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); + NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); NamingService namingService = mock(NamingService.class); - when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); + when(nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties())) + .thenReturn(namingService); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) .thenReturn(instances.stream().filter(Instance::isHealthy) @@ -151,7 +167,8 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, + nacosServiceManager); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getUpdatedListOfServers(); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosAutoConfiguration.java index 06448562..69ca5aa5 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosAutoConfiguration.java @@ -17,6 +17,7 @@ package com.alibaba.cloud.sidecar.nacos; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration; import com.alibaba.cloud.sidecar.SidecarAutoConfiguration; import com.alibaba.cloud.sidecar.SidecarDiscoveryClient; @@ -49,8 +50,10 @@ public class SidecarNacosAutoConfiguration { @Bean @ConditionalOnMissingBean public SidecarDiscoveryClient sidecarDiscoveryClient( + NacosServiceManager nacosServiceManager, SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties) { - return new SidecarNacosDiscoveryClient(sidecarNacosDiscoveryProperties); + return new SidecarNacosDiscoveryClient(nacosServiceManager, + sidecarNacosDiscoveryProperties); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryClient.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryClient.java index 76d4e280..d8229478 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryClient.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sidecar/src/main/java/com/alibaba/cloud/sidecar/nacos/SidecarNacosDiscoveryClient.java @@ -16,8 +16,10 @@ package com.alibaba.cloud.sidecar.nacos; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.sidecar.SidecarDiscoveryClient; import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.naming.NamingService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,19 +31,21 @@ public class SidecarNacosDiscoveryClient implements SidecarDiscoveryClient { private static final Logger log = LoggerFactory .getLogger(SidecarNacosDiscoveryClient.class); + private NacosServiceManager nacosServiceManager; + private final SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties; - public SidecarNacosDiscoveryClient( + public SidecarNacosDiscoveryClient(NacosServiceManager nacosServiceManager, SidecarNacosDiscoveryProperties sidecarNacosDiscoveryProperties) { + this.nacosServiceManager = nacosServiceManager; this.sidecarNacosDiscoveryProperties = sidecarNacosDiscoveryProperties; } @Override public void registerInstance(String applicationName, String ip, Integer port) { try { - this.sidecarNacosDiscoveryProperties.namingServiceInstance().registerInstance( - applicationName, sidecarNacosDiscoveryProperties.getGroup(), ip, - port); + this.namingService().registerInstance(applicationName, + sidecarNacosDiscoveryProperties.getGroup(), ip, port); } catch (NacosException e) { log.warn("nacos exception happens", e); @@ -51,13 +55,17 @@ public class SidecarNacosDiscoveryClient implements SidecarDiscoveryClient { @Override public void deregisterInstance(String applicationName, String ip, Integer port) { try { - this.sidecarNacosDiscoveryProperties.namingServiceInstance() - .deregisterInstance(applicationName, - sidecarNacosDiscoveryProperties.getGroup(), ip, port); + this.namingService().deregisterInstance(applicationName, + sidecarNacosDiscoveryProperties.getGroup(), ip, port); } catch (NacosException e) { log.warn("nacos exception happens", e); } } + private NamingService namingService() { + return nacosServiceManager + .getNamingService(sidecarNacosDiscoveryProperties.getNacosProperties()); + } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java index 04ffb4d1..a3c34ad8 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java @@ -33,6 +33,7 @@ import com.alibaba.cloud.dubbo.registry.AbstractSpringCloudRegistry; import com.alibaba.cloud.dubbo.registry.event.ServiceInstancesChangedEvent; import com.alibaba.cloud.dubbo.registry.event.SubscribedServicesChangedEvent; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.discovery.NacosWatch; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; @@ -518,8 +519,10 @@ public class DubboServiceDiscoveryAutoConfiguration { */ private final Set listeningServices; - NacosConfiguration(NacosDiscoveryProperties nacosDiscoveryProperties) { - this.namingService = nacosDiscoveryProperties.namingServiceInstance(); + NacosConfiguration(NacosServiceManager nacosServiceManager, + NacosDiscoveryProperties nacosDiscoveryProperties) { + this.namingService = nacosServiceManager + .getNamingService(nacosDiscoveryProperties.getNacosProperties()); this.nacosDiscoveryProperties = nacosDiscoveryProperties; this.listeningServices = new ConcurrentSkipListSet<>(); } From 170edfa73ee4bcbc5f1077717950f5b97048d297 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Tue, 8 Sep 2020 22:11:16 +0800 Subject: [PATCH 56/92] fix --- .../main/java/com/alibaba/cloud/nacos/NacosServiceManager.java | 3 +++ .../com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java index 95a6cd82..79448d53 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java @@ -111,4 +111,7 @@ public class NacosServiceManager { namingMaintainService = createNamingMaintainService(nacosProperties); } + public void nacosServiceShutDown() throws NacosException { + this.namingService.shutDown(); + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java index 19cf6deb..280648e3 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java @@ -109,7 +109,7 @@ public class NacosServiceRegistry implements ServiceRegistry { @Override public void close() { try { - namingService().shutDown(); + nacosServiceManager.nacosServiceShutDown(); } catch (NacosException e) { log.error("Nacos namingService shutDown failed", e); From da9a57ddf8612262da1032200e4d5b298025e645 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Wed, 9 Sep 2020 11:44:49 +0800 Subject: [PATCH 57/92] cache onRegister --- .../cloud/nacos/NacosServiceManager.java | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java index 79448d53..bedb4e2c 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java @@ -19,10 +19,15 @@ package com.alibaba.cloud.nacos; import java.util.Objects; import java.util.Properties; +import com.alibaba.cloud.nacos.registry.NacosRegistration; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingMaintainService; import com.alibaba.nacos.api.naming.NamingService; +import org.springframework.cloud.client.discovery.event.InstancePreRegisteredEvent; +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.context.event.EventListener; + import static com.alibaba.nacos.api.NacosFactory.createMaintainService; import static com.alibaba.nacos.api.NacosFactory.createNamingService; import static org.springframework.beans.BeanUtils.copyProperties; @@ -54,12 +59,8 @@ public class NacosServiceManager { public boolean isNacosDiscoveryInfoChanged( NacosDiscoveryProperties nacosDiscoveryProperties) { - if (Objects.isNull(nacosDiscoveryPropertiesCache)) { - nacosDiscoveryPropertiesCache = new NacosDiscoveryProperties(); - copyProperties(nacosDiscoveryProperties, nacosDiscoveryPropertiesCache); - return false; - } - if (this.nacosDiscoveryPropertiesCache.equals(nacosDiscoveryProperties)) { + if (Objects.isNull(nacosDiscoveryPropertiesCache) + || this.nacosDiscoveryPropertiesCache.equals(nacosDiscoveryProperties)) { return false; } copyProperties(nacosDiscoveryProperties, nacosDiscoveryPropertiesCache); @@ -111,7 +112,22 @@ public class NacosServiceManager { namingMaintainService = createNamingMaintainService(nacosProperties); } - public void nacosServiceShutDown() throws NacosException { - this.namingService.shutDown(); - } + public void nacosServiceShutDown() throws NacosException { + this.namingService.shutDown(); + } + + @EventListener + public void onInstancePreRegisteredEvent( + InstancePreRegisteredEvent instancePreRegisteredEvent) { + Registration registration = instancePreRegisteredEvent.getRegistration(); + if (Objects.isNull(nacosDiscoveryPropertiesCache) + && registration instanceof NacosRegistration) { + NacosDiscoveryProperties nacosDiscoveryProperties = ((NacosRegistration) registration) + .getNacosDiscoveryProperties(); + + nacosDiscoveryPropertiesCache = new NacosDiscoveryProperties(); + copyProperties(nacosDiscoveryProperties, nacosDiscoveryPropertiesCache); + } + } + } From b81f998f40a320082ead489b1609a4fb0622eb31 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Wed, 9 Sep 2020 14:55:39 +0800 Subject: [PATCH 58/92] fix --- .../cloud/nacos/NacosDiscoveryProperties.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 9b350990..f3297e8a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -23,6 +23,7 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -215,7 +216,7 @@ public class NacosDiscoveryProperties { private NacosServiceManager nacosServiceManager; @Autowired - private NacosAutoServiceRegistration nacosAutoServiceRegistration; + private Optional nacosAutoServiceRegistrationOptional; @PostConstruct public void init() throws Exception { @@ -266,11 +267,13 @@ public class NacosDiscoveryProperties { this.overrideFromEnv(environment); - if (nacosServiceManager.isNacosDiscoveryInfoChanged(this)) { - nacosAutoServiceRegistration.stop(); - nacosServiceManager.reBuildNacosService(getNacosProperties()); - nacosAutoServiceRegistration.start(); - } + nacosAutoServiceRegistrationOptional.ifPresent(nacosAutoServiceRegistration -> { + if (nacosServiceManager.isNacosDiscoveryInfoChanged(this)) { + nacosAutoServiceRegistration.stop(); + nacosServiceManager.reBuildNacosService(getNacosProperties()); + nacosAutoServiceRegistration.start(); + } + }); } public String getEndpoint() { From 56e07c6d2b7f7a5a9b4e242536796be9d40936ea Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Wed, 9 Sep 2020 15:21:37 +0800 Subject: [PATCH 59/92] fix issue#1701 --- .../NacosDiscoveryClientConfiguration.java | 9 +- .../cloud/nacos/discovery/NacosWatch.java | 125 +++++++++++------- 2 files changed, 78 insertions(+), 56 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java index 61234516..af722dda 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java @@ -18,8 +18,8 @@ package com.alibaba.cloud.nacos.discovery; import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; -import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -31,7 +31,6 @@ import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.TaskScheduler; /** * @author xiaojing @@ -56,9 +55,9 @@ public class NacosDiscoveryClientConfiguration { @ConditionalOnMissingBean @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", matchIfMissing = true) - public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties, - ObjectProvider taskScheduler) { - return new NacosWatch(nacosDiscoveryProperties, taskScheduler); + public NacosWatch nacosWatch(NacosServiceManager nacosServiceManager, + NacosDiscoveryProperties nacosDiscoveryProperties) { + return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index b5dfc8e3..46019113 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -16,21 +16,28 @@ package com.alibaba.cloud.nacos.discovery; -import java.util.concurrent.ScheduledFuture; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; +import com.alibaba.cloud.nacos.NacosServiceManager; +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.naming.NamingService; +import com.alibaba.nacos.api.naming.listener.Event; +import com.alibaba.nacos.api.naming.listener.EventListener; +import com.alibaba.nacos.api.naming.listener.NamingEvent; +import com.alibaba.nacos.api.naming.pojo.Instance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.ObjectProvider; import org.springframework.cloud.client.discovery.event.HeartbeatEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.context.SmartLifecycle; -import org.springframework.scheduling.TaskScheduler; -import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; /** * @author xiaojing @@ -39,44 +46,20 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl private static final Logger log = LoggerFactory.getLogger(NacosWatch.class); - private final NacosDiscoveryProperties properties; - - private final TaskScheduler taskScheduler; - - private final AtomicLong nacosWatchIndex = new AtomicLong(0); + private Map listenerMap = new ConcurrentHashMap<>(16); private final AtomicBoolean running = new AtomicBoolean(false); private ApplicationEventPublisher publisher; - private ScheduledFuture watchFuture; + private NacosServiceManager nacosServiceManager; - public NacosWatch(NacosDiscoveryProperties properties) { - this(properties, getTaskScheduler()); - } + private final NacosDiscoveryProperties properties; - public NacosWatch(NacosDiscoveryProperties properties, TaskScheduler taskScheduler) { + public NacosWatch(NacosServiceManager nacosServiceManager, + NacosDiscoveryProperties properties) { + this.nacosServiceManager = nacosServiceManager; this.properties = properties; - this.taskScheduler = taskScheduler; - } - - /** - * The constructor with {@link NacosDiscoveryProperties} bean and the optional. - * {@link TaskScheduler} bean - * @param properties {@link NacosDiscoveryProperties} bean - * @param taskScheduler the optional {@link TaskScheduler} bean - * @since 2.2.0 - */ - public NacosWatch(NacosDiscoveryProperties properties, - ObjectProvider taskScheduler) { - this(properties, taskScheduler.getIfAvailable(NacosWatch::getTaskScheduler)); - } - - private static ThreadPoolTaskScheduler getTaskScheduler() { - ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); - taskScheduler.setBeanName("Nacos-Watch-Task-Scheduler"); - taskScheduler.initialize(); - return taskScheduler; } @Override @@ -98,19 +81,67 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl @Override public void start() { if (this.running.compareAndSet(false, true)) { - this.watchFuture = this.taskScheduler.scheduleWithFixedDelay( - this::nacosServicesWatch, this.properties.getWatchDelay()); + EventListener eventListener = listenerMap.computeIfAbsent(buildKey(), + event -> new EventListener() { + @Override + public void onEvent(Event event) { + if (event instanceof NamingEvent) { + List instances = ((NamingEvent) event) + .getInstances(); + Instance currentInstance = selectCurrentInstance( + instances); + if (Objects.nonNull(currentInstance)) { + resetIfNeeded(currentInstance); + publisher.publishEvent( + new HeartbeatEvent(this, currentInstance)); + } + } + } + }); + + NamingService namingService = nacosServiceManager + .getNamingService(properties.getNacosProperties()); + try { + namingService.subscribe(properties.getService(), properties.getGroup(), + Arrays.asList(properties.getClusterName()), eventListener); + } + catch (Exception e) { + log.error("namingService subscribe failed, properties:{}", properties, e); + } } } + private String buildKey() { + return String.join(":", properties.getService(), properties.getGroup()); + } + + private void resetIfNeeded(Instance instance) { + if (!properties.getMetadata().equals(instance.getMetadata())) { + properties.setMetadata(instance.getMetadata()); + } + } + + private Instance selectCurrentInstance(List instances) { + return instances.stream() + .filter(instance -> properties.getIp().equals(instance.getIp()) + && properties.getPort() == instance.getPort()) + .findFirst().orElse(null); + } + @Override public void stop() { - if (this.running.compareAndSet(true, false) && this.watchFuture != null) { - // shutdown current user-thread, - // then the other daemon-threads will terminate automatic. - ((ThreadPoolTaskScheduler) this.taskScheduler).shutdown(); - - this.watchFuture.cancel(true); + if (this.running.compareAndSet(true, false)) { + EventListener eventListener = listenerMap.get(buildKey()); + NamingService namingService = nacosServiceManager + .getNamingService(properties.getNacosProperties()); + try { + namingService.unsubscribe(properties.getService(), properties.getGroup(), + Arrays.asList(properties.getClusterName()), eventListener); + } + catch (NacosException e) { + log.error("namingService unsubscribe failed, properties:{}", properties, + e); + } } } @@ -124,12 +155,4 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl return 0; } - public void nacosServicesWatch() { - - // nacos doesn't support watch now , publish an event every 30 seconds. - this.publisher.publishEvent( - new HeartbeatEvent(this, nacosWatchIndex.getAndIncrement())); - - } - } From 5fe709436f23922907dd6901c14fefd723a4fb40 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Wed, 9 Sep 2020 17:08:15 +0800 Subject: [PATCH 60/92] Adapt to Spring Cloud version Hoxton.SR8 --- pom.xml | 18 +++++++++--------- .../NacosConfigEndpointAutoConfiguration.java | 4 ++-- ...acosDiscoveryEndpointAutoConfiguration.java | 4 ++-- .../SentinelEndpointAutoConfiguration.java | 4 ++-- ...DubboMetadataEndpointAutoConfiguration.java | 4 ++-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index 90fbb265..13b06fdd 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.springframework.cloud spring-cloud-build - 2.2.3.RELEASE + 2.3.1.RELEASE @@ -83,15 +83,15 @@ 2.2.2-SNAPSHOT - 2.2.2.RELEASE - 2.2.2.RELEASE - 2.2.2.RELEASE - 2.2.1.RELEASE - 2.2.2.RELEASE + 2.2.5.RELEASE + 2.2.5.RELEASE + 2.2.5.RELEASE + 2.2.3.RELEASE + 2.2.5.RELEASE Horsham.SR3 - 2.2.2.RELEASE - 2.2.2.RELEASE - 2.2.1.RELEASE + 2.2.4.RELEASE + 2.2.5.RELEASE + 2.2.3.RELEASE 4.12 3.0 diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointAutoConfiguration.java index 42908218..833750d7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpointAutoConfiguration.java @@ -20,7 +20,7 @@ import com.alibaba.cloud.nacos.NacosConfigManager; import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -44,7 +44,7 @@ public class NacosConfigEndpointAutoConfiguration { private NacosRefreshHistory nacosRefreshHistory; @ConditionalOnMissingBean - @ConditionalOnEnabledEndpoint + @ConditionalOnAvailableEndpoint @Bean public NacosConfigEndpoint nacosConfigEndpoint() { return new NacosConfigEndpoint(nacosConfigManager.getNacosConfigProperties(), diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java index ede3cb4b..fea6db7b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpointAutoConfiguration.java @@ -23,7 +23,7 @@ import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.discovery.actuate.health.NacosDiscoveryHealthIndicator; -import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.health.HealthIndicator; @@ -45,7 +45,7 @@ public class NacosDiscoveryEndpointAutoConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnEnabledEndpoint + @ConditionalOnAvailableEndpoint public NacosDiscoveryEndpoint nacosDiscoveryEndpoint( NacosServiceManager nacosServiceManager, NacosDiscoveryProperties nacosDiscoveryProperties) { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java index caa5afd2..5f7de0f7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/endpoint/SentinelEndpointAutoConfiguration.java @@ -19,7 +19,7 @@ package com.alibaba.cloud.sentinel.endpoint; import com.alibaba.cloud.sentinel.SentinelProperties; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -36,7 +36,7 @@ public class SentinelEndpointAutoConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnEnabledEndpoint + @ConditionalOnAvailableEndpoint public SentinelEndpoint sentinelEndPoint(SentinelProperties sentinelProperties) { return new SentinelEndpoint(sentinelProperties); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java index d260f5d1..bfcc87c7 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-dubbo/src/main/java/com/alibaba/cloud/dubbo/actuate/DubboMetadataEndpointAutoConfiguration.java @@ -18,7 +18,7 @@ package com.alibaba.cloud.dubbo.actuate; import com.alibaba.cloud.dubbo.actuate.endpoint.DubboRestMetadataEndpoint; -import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -39,7 +39,7 @@ public class DubboMetadataEndpointAutoConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnEnabledEndpoint + @ConditionalOnAvailableEndpoint public DubboRestMetadataEndpoint dubboRestMetadataEndpoint() { return new DubboRestMetadataEndpoint(); } From bd2cd3f39468cae824d2b1a65e6882eae9f58cdd Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Wed, 9 Sep 2020 19:18:45 +0800 Subject: [PATCH 61/92] nacos watch enhance --- .../alibaba/cloud/nacos/discovery/NacosWatch.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index 46019113..d01089eb 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -19,7 +19,7 @@ package com.alibaba.cloud.nacos.discovery; import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.Objects; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; @@ -41,6 +41,7 @@ import org.springframework.context.SmartLifecycle; /** * @author xiaojing + * @author yuhuangbin */ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycle { @@ -88,13 +89,13 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl if (event instanceof NamingEvent) { List instances = ((NamingEvent) event) .getInstances(); - Instance currentInstance = selectCurrentInstance( + Optional instanceOptional = selectCurrentInstance( instances); - if (Objects.nonNull(currentInstance)) { + instanceOptional.ifPresent(currentInstance -> { resetIfNeeded(currentInstance); publisher.publishEvent( new HeartbeatEvent(this, currentInstance)); - } + }); } } }); @@ -121,11 +122,11 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl } } - private Instance selectCurrentInstance(List instances) { + private Optional selectCurrentInstance(List instances) { return instances.stream() .filter(instance -> properties.getIp().equals(instance.getIp()) && properties.getPort() == instance.getPort()) - .findFirst().orElse(null); + .findFirst(); } @Override From 6d0a80ab0e1cce84d13883e67b36c1e07247d2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E9=BB=84=E5=BD=AC?= Date: Wed, 9 Sep 2020 19:31:44 +0800 Subject: [PATCH 62/92] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f946dc4..cea175e9 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ For more features, please refer to [Roadmap](https://github.com/alibaba/spring-c **[Alibaba Cloud SMS](https://www.aliyun.com/product/sms)**: A messaging service that covers the globe, Alibaba SMS provides convenient, efficient, and intelligent communication capabilities that help businesses quickly contact their customers. -**[Alibaba Cloud SchedulerX](https://www.aliyun.com/product/SchedulerX)**:accurate, highly reliable, and highly available scheduled job scheduling services with response time within seconds.. +**[Alibaba Cloud SchedulerX](https://www.aliyun.com/aliware/schedulerx?spm=5176.10695662.784137.1.4b07363dej23L3)**:accurate, highly reliable, and highly available scheduled job scheduling services with response time within seconds.. For more features please refer to [Roadmap](https://github.com/alibaba/spring-cloud-alibaba/blob/master/Roadmap.md). From fec6c6554c8782e952905da8c37cb6864d361ef8 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Thu, 10 Sep 2020 09:54:30 +0800 Subject: [PATCH 63/92] fix --- .../java/com/alibaba/cloud/nacos/discovery/NacosWatch.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index d01089eb..3371e51d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceManager; @@ -51,6 +52,8 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl private final AtomicBoolean running = new AtomicBoolean(false); + private final AtomicLong nacosWatchIndex = new AtomicLong(0); + private ApplicationEventPublisher publisher; private NacosServiceManager nacosServiceManager; @@ -93,9 +96,9 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl instances); instanceOptional.ifPresent(currentInstance -> { resetIfNeeded(currentInstance); - publisher.publishEvent( - new HeartbeatEvent(this, currentInstance)); }); + publisher.publishEvent( + new HeartbeatEvent(this, nacosWatchIndex.getAndIncrement())); } } }); From d7edf9f8ee1c3a541276702f6722b13e5de5a726 Mon Sep 17 00:00:00 2001 From: jacky Date: Thu, 10 Sep 2020 17:30:26 +0800 Subject: [PATCH 64/92] correct spelling --- .../examples/{OderApplication.java => OrderApplication.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/{OderApplication.java => OrderApplication.java} (92%) diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OderApplication.java b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderApplication.java similarity index 92% rename from spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OderApplication.java rename to spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderApplication.java index b1233273..33e31a71 100644 --- a/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OderApplication.java +++ b/spring-cloud-alibaba-examples/seata-example/order-service/src/main/java/com/alibaba/cloud/examples/OrderApplication.java @@ -25,10 +25,10 @@ import org.springframework.web.client.RestTemplate; * @author xiaojing */ @SpringBootApplication -public class OderApplication { +public class OrderApplication { public static void main(String[] args) { - SpringApplication.run(OderApplication.class, args); + SpringApplication.run(OrderApplication.class, args); } @Bean From f60cb805c8217c10d0b036d6c425bc591f441f90 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Fri, 11 Sep 2020 15:32:40 +0800 Subject: [PATCH 65/92] fix --- .../java/com/alibaba/cloud/nacos/discovery/NacosWatch.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index 3371e51d..d01089eb 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceManager; @@ -52,8 +51,6 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl private final AtomicBoolean running = new AtomicBoolean(false); - private final AtomicLong nacosWatchIndex = new AtomicLong(0); - private ApplicationEventPublisher publisher; private NacosServiceManager nacosServiceManager; @@ -96,9 +93,9 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl instances); instanceOptional.ifPresent(currentInstance -> { resetIfNeeded(currentInstance); + publisher.publishEvent( + new HeartbeatEvent(this, currentInstance)); }); - publisher.publishEvent( - new HeartbeatEvent(this, nacosWatchIndex.getAndIncrement())); } } }); From b35c05e4fc8affca02891d40de6ffe56b74477c8 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Fri, 11 Sep 2020 16:23:02 +0800 Subject: [PATCH 66/92] fix --- .../java/com/alibaba/cloud/nacos/discovery/NacosWatch.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index d01089eb..e572549a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceManager; @@ -51,6 +52,8 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl private final AtomicBoolean running = new AtomicBoolean(false); + private final AtomicLong nacosWatchIndex = new AtomicLong(0); + private ApplicationEventPublisher publisher; private NacosServiceManager nacosServiceManager; @@ -93,9 +96,9 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl instances); instanceOptional.ifPresent(currentInstance -> { resetIfNeeded(currentInstance); - publisher.publishEvent( - new HeartbeatEvent(this, currentInstance)); }); + publisher.publishEvent( + new HeartbeatEvent(NacosWatch.this, nacosWatchIndex.getAndIncrement())); } } }); From 35c4eac150a4fcb3b59b3fda7e8b7edf87eb9807 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Fri, 11 Sep 2020 23:08:30 +0800 Subject: [PATCH 67/92] Upgrade the version to be 2.2.2.RELEASE --- pom.xml | 2 +- spring-cloud-alibaba-dependencies/pom.xml | 2 +- .../asciidoc-zh/dependency-management.adoc | 2 +- .../main/asciidoc/dependency-management.adoc | 2 +- .../seata/web/SeataHandlerInterceptor.java | 71 ++++++++++--------- 5 files changed, 40 insertions(+), 39 deletions(-) diff --git a/pom.xml b/pom.xml index 13b06fdd..64b45518 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ - 2.2.2-SNAPSHOT + 2.2.2.RELEASE 2.2.5.RELEASE diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 222576d8..7a1870ce 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -18,7 +18,7 @@ Spring Cloud Alibaba Dependencies - 2.2.2-SNAPSHOT + 2.2.2.RELEASE 1.8.0 3.1.0 1.3.0 diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc index 834bf75c..5a3dc333 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc @@ -10,7 +10,7 @@ Spring Cloud Alibaba BOM 包含了它所使用的所有依赖的版本。 com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.0.RELEASE + 2.2.2.RELEASE pom import diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc index ee22c0e4..789d1aed 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc @@ -8,7 +8,7 @@ If you’re a Maven Central user, add our BOM to your pom.xml com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.0.RELEASE + 2.2.2.RELEASE pom import diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java index 86d331b0..f7ec7659 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/web/SeataHandlerInterceptor.java @@ -41,45 +41,46 @@ public class SeataHandlerInterceptor implements HandlerInterceptor { .getLogger(SeataHandlerInterceptor.class); @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - String xid = RootContext.getXID(); - String rpcXid = request.getHeader(RootContext.KEY_XID); - if (log.isDebugEnabled()) { - log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); - } + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, + Object handler) { + String xid = RootContext.getXID(); + String rpcXid = request.getHeader(RootContext.KEY_XID); + if (log.isDebugEnabled()) { + log.debug("xid in RootContext {} xid in RpcContext {}", xid, rpcXid); + } - if (StringUtils.isBlank(xid) && rpcXid != null) { - RootContext.bind(rpcXid); - if (log.isDebugEnabled()) { - log.debug("bind {} to RootContext", rpcXid); - } - } + if (StringUtils.isBlank(xid) && rpcXid != null) { + RootContext.bind(rpcXid); + if (log.isDebugEnabled()) { + log.debug("bind {} to RootContext", rpcXid); + } + } - return true; - } + return true; + } + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, + Object handler, Exception e) { + if (StringUtils.isNotBlank(RootContext.getXID())) { + String rpcXid = request.getHeader(RootContext.KEY_XID); - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) { - if (StringUtils.isNotBlank(RootContext.getXID())) { - String rpcXid = request.getHeader(RootContext.KEY_XID); + if (StringUtils.isEmpty(rpcXid)) { + return; + } - if (StringUtils.isEmpty(rpcXid)) { - return; - } - - String unbindXid = RootContext.unbind(); - if (log.isDebugEnabled()) { - log.debug("unbind {} from RootContext", unbindXid); - } - if (!rpcXid.equalsIgnoreCase(unbindXid)) { - log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); - if (unbindXid != null) { - RootContext.bind(unbindXid); - log.warn("bind {} back to RootContext", unbindXid); - } - } - } - } + String unbindXid = RootContext.unbind(); + if (log.isDebugEnabled()) { + log.debug("unbind {} from RootContext", unbindXid); + } + if (!rpcXid.equalsIgnoreCase(unbindXid)) { + log.warn("xid in change during RPC from {} to {}", rpcXid, unbindXid); + if (unbindXid != null) { + RootContext.bind(unbindXid); + log.warn("bind {} back to RootContext", unbindXid); + } + } + } + } } From 96c3d2e8adbcdf8e7910a879a22a6ec6292b430d Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Sat, 12 Sep 2020 16:13:18 +0800 Subject: [PATCH 68/92] Upgrade the version to be 2.2.2.RELEASE --- README-zh.md | 2 +- README.md | 2 +- .../java/com/alibaba/cloud/nacos/discovery/NacosWatch.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README-zh.md b/README-zh.md index 5b5bdf63..ca01258e 100644 --- a/README-zh.md +++ b/README-zh.md @@ -70,7 +70,7 @@ Spring Cloud 使用 Maven 来构建,最快的使用方式是将本项目 clone com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.0.RELEASE + 2.2.2.RELEASE pom import diff --git a/README.md b/README.md index cea175e9..7dd069c5 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ These artifacts are available from Maven Central and Spring Release repository v com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.1.RELEASE + 2.2.2.RELEASE pom import diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index e572549a..ff9040ae 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -97,8 +97,8 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl instanceOptional.ifPresent(currentInstance -> { resetIfNeeded(currentInstance); }); - publisher.publishEvent( - new HeartbeatEvent(NacosWatch.this, nacosWatchIndex.getAndIncrement())); + publisher.publishEvent(new HeartbeatEvent(NacosWatch.this, + nacosWatchIndex.getAndIncrement())); } } }); From 702831cb8fea9520db6890ad5a1e5f4b7c52cc0c Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Sun, 13 Sep 2020 18:02:36 +0800 Subject: [PATCH 69/92] fix --- .../cloud/nacos/NacosDiscoveryProperties.java | 18 +++------ .../cloud/nacos/NacosServiceManager.java | 24 +++++++++++- .../NacosDiscoveryInfoInitializedEvent.java | 38 +++++++++++++++++++ 3 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index f3297e8a..3c8c01c8 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -23,14 +23,13 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.annotation.PostConstruct; -import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; +import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoInitializedEvent; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; import com.alibaba.nacos.client.naming.utils.UtilAndComs; import com.alibaba.spring.util.PropertySourcesUtils; @@ -41,6 +40,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; @@ -213,10 +213,7 @@ public class NacosDiscoveryProperties { private Environment environment; @Autowired - private NacosServiceManager nacosServiceManager; - - @Autowired - private Optional nacosAutoServiceRegistrationOptional; + private ApplicationEventPublisher applicationEventPublisher; @PostConstruct public void init() throws Exception { @@ -267,13 +264,8 @@ public class NacosDiscoveryProperties { this.overrideFromEnv(environment); - nacosAutoServiceRegistrationOptional.ifPresent(nacosAutoServiceRegistration -> { - if (nacosServiceManager.isNacosDiscoveryInfoChanged(this)) { - nacosAutoServiceRegistration.stop(); - nacosServiceManager.reBuildNacosService(getNacosProperties()); - nacosAutoServiceRegistration.start(); - } - }); + applicationEventPublisher + .publishEvent(new NacosDiscoveryInfoInitializedEvent(this)); } public String getEndpoint() { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java index bedb4e2c..9dfc8323 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java @@ -17,13 +17,17 @@ package com.alibaba.cloud.nacos; import java.util.Objects; +import java.util.Optional; import java.util.Properties; +import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoInitializedEvent; +import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; import com.alibaba.cloud.nacos.registry.NacosRegistration; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingMaintainService; import com.alibaba.nacos.api.naming.NamingService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.event.InstancePreRegisteredEvent; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.event.EventListener; @@ -43,6 +47,9 @@ public class NacosServiceManager { private NamingMaintainService namingMaintainService; + @Autowired + private Optional nacosAutoServiceRegistrationOptional; + public NamingService getNamingService(Properties properties) { if (Objects.isNull(this.namingService)) { buildNamingService(properties); @@ -107,7 +114,7 @@ public class NacosServiceManager { } } - public void reBuildNacosService(Properties nacosProperties) { + private void reBuildNacosService(Properties nacosProperties) { namingService = createNewNamingService(nacosProperties); namingMaintainService = createNamingMaintainService(nacosProperties); } @@ -130,4 +137,19 @@ public class NacosServiceManager { } } + @EventListener + public void onNacosDiscoveryInfoInitializedEvent( + NacosDiscoveryInfoInitializedEvent nacosDiscoveryInfoInitializedEvent) { + NacosDiscoveryProperties nacosDiscoveryProperties = nacosDiscoveryInfoInitializedEvent + .getSource(); + if (isNacosDiscoveryInfoChanged(nacosDiscoveryProperties) + && nacosAutoServiceRegistrationOptional.isPresent()) { + NacosAutoServiceRegistration nacosAutoServiceRegistration = nacosAutoServiceRegistrationOptional + .get(); + nacosAutoServiceRegistration.stop(); + reBuildNacosService(nacosDiscoveryProperties.getNacosProperties()); + nacosAutoServiceRegistration.start(); + } + } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java new file mode 100644 index 00000000..0cca5718 --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java @@ -0,0 +1,38 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.alibaba.cloud.nacos.event; + +import com.alibaba.cloud.nacos.NacosDiscoveryProperties; + +import org.springframework.context.ApplicationEvent; + +/** + * @author yuhuangbin + */ +public class NacosDiscoveryInfoInitializedEvent extends ApplicationEvent { + + public NacosDiscoveryInfoInitializedEvent( + NacosDiscoveryProperties nacosDiscoveryProperties) { + super(nacosDiscoveryProperties); + } + + @Override + public NacosDiscoveryProperties getSource() { + return (NacosDiscoveryProperties) super.getSource(); + } + +} From e9a6eaa0259aaeebea6d5432d90a53ea6cc07259 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Sun, 13 Sep 2020 19:24:25 +0800 Subject: [PATCH 70/92] fix --- .../cloud/nacos/NacosDiscoveryProperties.java | 20 +++++++++-- .../cloud/nacos/NacosServiceManager.java | 33 ++++--------------- ...va => NacosDiscoveryInfoChangedEvent.java} | 4 +-- .../NacosAutoServiceRegistration.java | 12 +++++++ .../NacosRibbonClientConfiguration.java | 7 ++-- .../cloud/nacos/ribbon/NacosServerList.java | 10 ++---- .../nacos/ribbon/NacosServerListTests.java | 12 +++---- 7 files changed, 45 insertions(+), 53 deletions(-) rename spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/{NacosDiscoveryInfoInitializedEvent.java => NacosDiscoveryInfoChangedEvent.java} (89%) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java index 3c8c01c8..3ee047b4 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosDiscoveryProperties.java @@ -29,7 +29,8 @@ import java.util.regex.Pattern; import javax.annotation.PostConstruct; -import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoInitializedEvent; +import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoChangedEvent; +import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.PreservedMetadataKeys; import com.alibaba.nacos.client.naming.utils.UtilAndComs; import com.alibaba.spring.util.PropertySourcesUtils; @@ -212,6 +213,9 @@ public class NacosDiscoveryProperties { @Autowired private Environment environment; + @Autowired + private NacosServiceManager nacosServiceManager; + @Autowired private ApplicationEventPublisher applicationEventPublisher; @@ -263,9 +267,19 @@ public class NacosDiscoveryProperties { } this.overrideFromEnv(environment); + if (nacosServiceManager.isNacosDiscoveryInfoChanged(this)) { + applicationEventPublisher + .publishEvent(new NacosDiscoveryInfoChangedEvent(this)); + } + } - applicationEventPublisher - .publishEvent(new NacosDiscoveryInfoInitializedEvent(this)); + /** + * recommend to use {@link NacosServiceManager#getNamingService(Properties)}. + * @return NamingService + */ + @Deprecated + public NamingService namingServiceInstance() { + return nacosServiceManager.getNamingService(this.getNacosProperties()); } public String getEndpoint() { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java index 9dfc8323..c672bbac 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/NacosServiceManager.java @@ -17,17 +17,15 @@ package com.alibaba.cloud.nacos; import java.util.Objects; -import java.util.Optional; import java.util.Properties; -import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoInitializedEvent; -import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration; import com.alibaba.cloud.nacos.registry.NacosRegistration; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingMaintainService; import com.alibaba.nacos.api.naming.NamingService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.event.InstancePreRegisteredEvent; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.event.EventListener; @@ -41,15 +39,14 @@ import static org.springframework.beans.BeanUtils.copyProperties; */ public class NacosServiceManager { + private static final Logger log = LoggerFactory.getLogger(NacosServiceManager.class); + private NacosDiscoveryProperties nacosDiscoveryPropertiesCache; private NamingService namingService; private NamingMaintainService namingMaintainService; - @Autowired - private Optional nacosAutoServiceRegistrationOptional; - public NamingService getNamingService(Properties properties) { if (Objects.isNull(this.namingService)) { buildNamingService(properties); @@ -114,13 +111,10 @@ public class NacosServiceManager { } } - private void reBuildNacosService(Properties nacosProperties) { - namingService = createNewNamingService(nacosProperties); - namingMaintainService = createNamingMaintainService(nacosProperties); - } - public void nacosServiceShutDown() throws NacosException { this.namingService.shutDown(); + namingService = null; + namingMaintainService = null; } @EventListener @@ -137,19 +131,4 @@ public class NacosServiceManager { } } - @EventListener - public void onNacosDiscoveryInfoInitializedEvent( - NacosDiscoveryInfoInitializedEvent nacosDiscoveryInfoInitializedEvent) { - NacosDiscoveryProperties nacosDiscoveryProperties = nacosDiscoveryInfoInitializedEvent - .getSource(); - if (isNacosDiscoveryInfoChanged(nacosDiscoveryProperties) - && nacosAutoServiceRegistrationOptional.isPresent()) { - NacosAutoServiceRegistration nacosAutoServiceRegistration = nacosAutoServiceRegistrationOptional - .get(); - nacosAutoServiceRegistration.stop(); - reBuildNacosService(nacosDiscoveryProperties.getNacosProperties()); - nacosAutoServiceRegistration.start(); - } - } - } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java similarity index 89% rename from spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java rename to spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java index 0cca5718..4e922e81 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoInitializedEvent.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/event/NacosDiscoveryInfoChangedEvent.java @@ -23,9 +23,9 @@ import org.springframework.context.ApplicationEvent; /** * @author yuhuangbin */ -public class NacosDiscoveryInfoInitializedEvent extends ApplicationEvent { +public class NacosDiscoveryInfoChangedEvent extends ApplicationEvent { - public NacosDiscoveryInfoInitializedEvent( + public NacosDiscoveryInfoChangedEvent( NacosDiscoveryProperties nacosDiscoveryProperties) { super(nacosDiscoveryProperties); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java index 649ddd67..097ddc85 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosAutoServiceRegistration.java @@ -16,6 +16,7 @@ package com.alibaba.cloud.nacos.registry; +import com.alibaba.cloud.nacos.event.NacosDiscoveryInfoChangedEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +24,7 @@ import org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegis import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; +import org.springframework.context.event.EventListener; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -102,4 +104,14 @@ public class NacosAutoServiceRegistration return StringUtils.isEmpty(appName) ? super.getAppName() : appName; } + @EventListener + public void onNacosDiscoveryInfoChangedEvent(NacosDiscoveryInfoChangedEvent event) { + restart(); + } + + private void restart() { + this.stop(); + this.start(); + } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java index 712e6a42..a6294e87 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosRibbonClientConfiguration.java @@ -17,7 +17,6 @@ package com.alibaba.cloud.nacos.ribbon; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.NacosServiceManager; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.ServerList; @@ -43,15 +42,13 @@ public class NacosRibbonClientConfiguration { @Bean @ConditionalOnMissingBean public ServerList ribbonServerList(IClientConfig config, - NacosDiscoveryProperties nacosDiscoveryProperties, - NacosServiceManager nacosServiceManager) { + NacosDiscoveryProperties nacosDiscoveryProperties) { if (this.propertiesFactory.isSet(ServerList.class, config.getClientName())) { ServerList serverList = this.propertiesFactory.get(ServerList.class, config, config.getClientName()); return serverList; } - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); serverList.initWithNiwsConfig(config); return serverList; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java index 1b975881..55928f26 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/ribbon/NacosServerList.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.client.naming.utils.CollectionUtils; import com.netflix.client.config.IClientConfig; @@ -34,14 +33,10 @@ public class NacosServerList extends AbstractServerList { private NacosDiscoveryProperties discoveryProperties; - private NacosServiceManager nacosServiceManager; - private String serviceId; - public NacosServerList(NacosDiscoveryProperties discoveryProperties, - NacosServiceManager nacosServiceManager) { + public NacosServerList(NacosDiscoveryProperties discoveryProperties) { this.discoveryProperties = discoveryProperties; - this.nacosServiceManager = nacosServiceManager; } @Override @@ -57,8 +52,7 @@ public class NacosServerList extends AbstractServerList { private List getServers() { try { String group = discoveryProperties.getGroup(); - List instances = nacosServiceManager - .getNamingService(discoveryProperties.getNacosProperties()) + List instances = discoveryProperties.namingServiceInstance() .selectInstances(serviceId, group, true); return instancesToServerList(instances); } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java index 7e56fb8b..16887def 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java @@ -57,8 +57,7 @@ public class NacosServerListTests { when(namingService.selectInstances(anyString(), eq("DEFAULT"), eq(true))) .thenReturn(null); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); List servers = serverList.getInitialListOfServers(); assertThat(servers).isEmpty(); } @@ -87,8 +86,7 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getInitialListOfServers(); assertThat(servers).hasSize(1); @@ -125,8 +123,7 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getInitialListOfServers(); assertThat(servers).hasSize(1); @@ -167,8 +164,7 @@ public class NacosServerListTests { IClientConfig clientConfig = mock(IClientConfig.class); when(clientConfig.getClientName()).thenReturn("test-service"); - NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties, - nacosServiceManager); + NacosServerList serverList = new NacosServerList(nacosDiscoveryProperties); serverList.initWithNiwsConfig(clientConfig); List servers = serverList.getUpdatedListOfServers(); From df156d4fa2d4524fcd208dda1b5e6468e44b7b4a Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Sun, 13 Sep 2020 21:57:54 +0800 Subject: [PATCH 71/92] fix --- .../alibaba/cloud/nacos/registry/NacosServiceRegistry.java | 6 +++--- .../registry/NacosServiceRegistryAutoConfiguration.java | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java index 280648e3..0efd8642 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistry.java @@ -27,6 +27,7 @@ import com.alibaba.nacos.api.naming.pojo.Instance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.client.serviceregistry.ServiceRegistry; import org.springframework.util.StringUtils; @@ -44,12 +45,11 @@ public class NacosServiceRegistry implements ServiceRegistry { private final NacosDiscoveryProperties nacosDiscoveryProperties; + @Autowired private NacosServiceManager nacosServiceManager; - public NacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties, - NacosServiceManager nacosServiceManager) { + public NacosServiceRegistry(NacosDiscoveryProperties nacosDiscoveryProperties) { this.nacosDiscoveryProperties = nacosDiscoveryProperties; - this.nacosServiceManager = nacosServiceManager; } @Override diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java index 854b7772..c51c085e 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/registry/NacosServiceRegistryAutoConfiguration.java @@ -20,7 +20,6 @@ import java.util.List; import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration; import org.springframework.beans.factory.ObjectProvider; @@ -51,9 +50,8 @@ public class NacosServiceRegistryAutoConfiguration { @Bean public NacosServiceRegistry nacosServiceRegistry( - NacosDiscoveryProperties nacosDiscoveryProperties, - NacosServiceManager nacosServiceManager) { - return new NacosServiceRegistry(nacosDiscoveryProperties, nacosServiceManager); + NacosDiscoveryProperties nacosDiscoveryProperties) { + return new NacosServiceRegistry(nacosDiscoveryProperties); } @Bean From 5b0d53388bfcbf8ea45638219c8cd3b4dd19f17f Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Mon, 14 Sep 2020 08:57:08 +0800 Subject: [PATCH 72/92] sentinel NacosDataSourceFactoryBean enhance --- .../factorybean/NacosDataSourceFactoryBean.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/NacosDataSourceFactoryBean.java b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/NacosDataSourceFactoryBean.java index a0eda74e..6d70e710 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/NacosDataSourceFactoryBean.java +++ b/spring-cloud-alibaba-starters/spring-cloud-alibaba-sentinel-datasource/src/main/java/com/alibaba/cloud/sentinel/datasource/factorybean/NacosDataSourceFactoryBean.java @@ -67,8 +67,12 @@ public class NacosDataSourceFactoryBean implements FactoryBean if (!StringUtils.isEmpty(this.namespace)) { properties.setProperty(PropertyKeyConst.NAMESPACE, this.namespace); } - properties.setProperty(PropertyKeyConst.USERNAME, this.username); - properties.setProperty(PropertyKeyConst.PASSWORD, this.password); + if (!StringUtils.isEmpty(this.username)) { + properties.setProperty(PropertyKeyConst.USERNAME, this.username); + } + if (!StringUtils.isEmpty(this.password)) { + properties.setProperty(PropertyKeyConst.PASSWORD, this.password); + } return new NacosDataSource(properties, groupId, dataId, converter); } From b638480cf7a5fac11f408c2f507f33e4e41047e2 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Mon, 14 Sep 2020 09:40:19 +0800 Subject: [PATCH 73/92] fix test --- .../nacos/ribbon/NacosServerListTests.java | 21 ++++--------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java index 16887def..1c6e65d9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/ribbon/NacosServerListTests.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.stream.Collectors; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; -import com.alibaba.cloud.nacos.NacosServiceManager; import com.alibaba.cloud.nacos.test.NacosMockTest; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.pojo.Instance; @@ -49,11 +48,8 @@ public class NacosServerListTests { NacosDiscoveryProperties.class); NamingService namingService = mock(NamingService.class); - NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); - when(nacosServiceManager - .getNamingService(nacosDiscoveryProperties.getNacosProperties())) - .thenReturn(namingService); + when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); when(namingService.selectInstances(anyString(), eq("DEFAULT"), eq(true))) .thenReturn(null); @@ -72,13 +68,10 @@ public class NacosServerListTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); - NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); NamingService namingService = mock(NamingService.class); - when(nacosServiceManager - .getNamingService(nacosDiscoveryProperties.getNacosProperties())) - .thenReturn(namingService); + when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) @@ -109,13 +102,10 @@ public class NacosServerListTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); - NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); NamingService namingService = mock(NamingService.class); - when(nacosServiceManager - .getNamingService(nacosDiscoveryProperties.getNacosProperties())) - .thenReturn(namingService); + when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) .thenReturn(instances.stream().filter(Instance::isHealthy) @@ -150,13 +140,10 @@ public class NacosServerListTests { NacosDiscoveryProperties nacosDiscoveryProperties = mock( NacosDiscoveryProperties.class); - NacosServiceManager nacosServiceManager = mock(NacosServiceManager.class); NamingService namingService = mock(NamingService.class); - when(nacosServiceManager - .getNamingService(nacosDiscoveryProperties.getNacosProperties())) - .thenReturn(namingService); + when(nacosDiscoveryProperties.namingServiceInstance()).thenReturn(namingService); when(nacosDiscoveryProperties.getGroup()).thenReturn("DEFAULT"); when(namingService.selectInstances(eq("test-service"), eq("DEFAULT"), eq(true))) .thenReturn(instances.stream().filter(Instance::isHealthy) From c5d68bb60fea07ec44c600e0a55990666ba33327 Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Mon, 14 Sep 2020 13:03:25 +0800 Subject: [PATCH 74/92] enhance --- .../nacos/discovery/NacosServiceDiscovery.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java index af39fce3..7d5d1858 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java @@ -38,13 +38,12 @@ public class NacosServiceDiscovery { private NacosDiscoveryProperties discoveryProperties; - private NamingService namingService; + private NacosServiceManager nacosServiceManager; public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties, NacosServiceManager nacosServiceManager) { this.discoveryProperties = discoveryProperties; - this.namingService = nacosServiceManager - .getNamingService(discoveryProperties.getNacosProperties()); + this.nacosServiceManager = nacosServiceManager; } /** @@ -55,7 +54,7 @@ public class NacosServiceDiscovery { */ public List getInstances(String serviceId) throws NacosException { String group = discoveryProperties.getGroup(); - List instances = namingService.selectInstances(serviceId, group, true); + List instances = namingService().selectInstances(serviceId, group, true); return hostToServiceInstanceList(instances, serviceId); } @@ -66,7 +65,7 @@ public class NacosServiceDiscovery { */ public List getServices() throws NacosException { String group = discoveryProperties.getGroup(); - ListView services = namingService.getServicesOfServer(1, + ListView services = namingService().getServicesOfServer(1, Integer.MAX_VALUE, group); return services.getData(); } @@ -111,4 +110,8 @@ public class NacosServiceDiscovery { return nacosServiceInstance; } + private NamingService namingService() { + return nacosServiceManager.getNamingService(discoveryProperties.getNacosProperties()); + } + } From 15ffaccc752bb2c8ede048b959c889623c25713e Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Mon, 14 Sep 2020 15:30:10 +0800 Subject: [PATCH 75/92] enhance --- .../NacosDiscoveryClientConfiguration.java | 8 +++- .../discovery/NacosServiceDiscovery.java | 6 ++- .../cloud/nacos/discovery/NacosWatch.java | 41 +++++++++++++++++-- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java index af722dda..b1021eef 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosDiscoveryClientConfiguration.java @@ -20,6 +20,7 @@ import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.NacosServiceManager; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -31,6 +32,7 @@ import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.TaskScheduler; /** * @author xiaojing @@ -56,8 +58,10 @@ public class NacosDiscoveryClientConfiguration { @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", matchIfMissing = true) public NacosWatch nacosWatch(NacosServiceManager nacosServiceManager, - NacosDiscoveryProperties nacosDiscoveryProperties) { - return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties); + NacosDiscoveryProperties nacosDiscoveryProperties, + ObjectProvider taskExecutorObjectProvider) { + return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties, + taskExecutorObjectProvider); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java index 7d5d1858..a58f4612 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosServiceDiscovery.java @@ -54,7 +54,8 @@ public class NacosServiceDiscovery { */ public List getInstances(String serviceId) throws NacosException { String group = discoveryProperties.getGroup(); - List instances = namingService().selectInstances(serviceId, group, true); + List instances = namingService().selectInstances(serviceId, group, + true); return hostToServiceInstanceList(instances, serviceId); } @@ -111,7 +112,8 @@ public class NacosServiceDiscovery { } private NamingService namingService() { - return nacosServiceManager.getNamingService(discoveryProperties.getNacosProperties()); + return nacosServiceManager + .getNamingService(discoveryProperties.getNacosProperties()); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index ff9040ae..caaf5c4e 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; @@ -35,10 +36,13 @@ import com.alibaba.nacos.api.naming.pojo.Instance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.cloud.client.discovery.event.HeartbeatEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.context.SmartLifecycle; +import org.springframework.scheduling.TaskScheduler; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; /** * @author xiaojing @@ -56,14 +60,27 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl private ApplicationEventPublisher publisher; + private ScheduledFuture watchFuture; + private NacosServiceManager nacosServiceManager; private final NacosDiscoveryProperties properties; + private final TaskScheduler taskScheduler; + public NacosWatch(NacosServiceManager nacosServiceManager, - NacosDiscoveryProperties properties) { + NacosDiscoveryProperties properties, + ObjectProvider taskScheduler) { this.nacosServiceManager = nacosServiceManager; this.properties = properties; + this.taskScheduler = taskScheduler.getIfAvailable(NacosWatch::getTaskScheduler); + } + + private static ThreadPoolTaskScheduler getTaskScheduler() { + ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); + taskScheduler.setBeanName("Nacos-Watch-Task-Scheduler"); + taskScheduler.initialize(); + return taskScheduler; } @Override @@ -112,6 +129,9 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl catch (Exception e) { log.error("namingService subscribe failed, properties:{}", properties, e); } + + this.watchFuture = this.taskScheduler.scheduleWithFixedDelay( + this::nacosServicesWatch, this.properties.getWatchDelay()); } } @@ -135,10 +155,17 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl @Override public void stop() { if (this.running.compareAndSet(true, false)) { + if (this.watchFuture != null) { + // shutdown current user-thread, + // then the other daemon-threads will terminate automatic. + ((ThreadPoolTaskScheduler) this.taskScheduler).shutdown(); + this.watchFuture.cancel(true); + } + EventListener eventListener = listenerMap.get(buildKey()); - NamingService namingService = nacosServiceManager - .getNamingService(properties.getNacosProperties()); try { + NamingService namingService = nacosServiceManager + .getNamingService(properties.getNacosProperties()); namingService.unsubscribe(properties.getService(), properties.getGroup(), Arrays.asList(properties.getClusterName()), eventListener); } @@ -159,4 +186,12 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl return 0; } + public void nacosServicesWatch() { + + // nacos doesn't support watch now , publish an event every 30 seconds. + this.publisher.publishEvent( + new HeartbeatEvent(this, nacosWatchIndex.getAndIncrement())); + + } + } From f284172fbb4b0679b4b2f2ac272173890701955d Mon Sep 17 00:00:00 2001 From: yuhuangbin Date: Mon, 14 Sep 2020 21:31:54 +0800 Subject: [PATCH 76/92] fix --- .../main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java index caaf5c4e..4a78238f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/discovery/NacosWatch.java @@ -114,8 +114,6 @@ public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycl instanceOptional.ifPresent(currentInstance -> { resetIfNeeded(currentInstance); }); - publisher.publishEvent(new HeartbeatEvent(NacosWatch.this, - nacosWatchIndex.getAndIncrement())); } } }); From 8c5e745d1bb24113a9ec5cb1eb2beb2e44dde9f9 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 17 Sep 2020 14:37:43 +0800 Subject: [PATCH 77/92] Upgrade the version to be 2.2.3-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 64b45518..92bf32ae 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ - 2.2.2.RELEASE + 2.2.3-SNAPSHOT 2.2.5.RELEASE From b23dd033fbd269a0d00e2e27a8163a866c1baf9f Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 17 Sep 2020 14:43:30 +0800 Subject: [PATCH 78/92] Polish alibaba/spring-cloud-alibaba#1723 : 2.2.2.RELEASE undertow stop shows "Failed to stop bean 'nacosWatch'" --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 7a1870ce..98d2b4e6 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -24,7 +24,7 @@ 1.3.0 1.3.2 0.8.0 - 1.0.9 + 1.0.10 2.2.1 From c3afdad2b1eaf40b983b619bbe292f5065888962 Mon Sep 17 00:00:00 2001 From: K Date: Thu, 17 Sep 2020 15:00:25 +0800 Subject: [PATCH 79/92] remove useless properties remove useless properties --- pom.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 64b45518..5ed30fe3 100644 --- a/pom.xml +++ b/pom.xml @@ -93,10 +93,6 @@ 2.2.5.RELEASE 2.2.3.RELEASE - 4.12 - 3.0 - 1.7.25 - 2.7.8 4.0.1 @@ -449,4 +445,4 @@ - \ No newline at end of file + From 64c8ebf536457c01e323e569eecdac527837cdd6 Mon Sep 17 00:00:00 2001 From: K Date: Thu, 17 Sep 2020 15:01:15 +0800 Subject: [PATCH 80/92] update spring-cloud-dependencies-parent version update spring-cloud-dependencies-parent version --- spring-cloud-alibaba-dependencies/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 7a1870ce..22f8de02 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-cloud-dependencies-parent org.springframework.cloud - 2.2.0.RELEASE + spring-cloud-dependencies-parent + 2.3.1.RELEASE From 0e77fce0129e62baaab3e5689f416b32a3a2b77f Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 17 Sep 2020 15:09:33 +0800 Subject: [PATCH 81/92] Polish alibaba/spring-cloud-alibaba#1727 : upgrade rocketmq-spring-boot-starter --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 92bf32ae..5ffc8f04 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ 4.0.1 - 2.0.2 + 2.1.1 3.7.0 From bb9dbba7d16d0a9fd5cde903e08bc199b1ba8667 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 17 Sep 2020 16:41:07 +0800 Subject: [PATCH 82/92] Polish alibaba/spring-cloud-alibaba#1741 : [Infrastructure] Upgrading the Nacos Client --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 98d2b4e6..d5d4a47f 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -22,7 +22,7 @@ 1.8.0 3.1.0 1.3.0 - 1.3.2 + 1.3.3 0.8.0 1.0.10 From 24de18a00c65a9c5d315e563eee17d2ce06b92fc Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 17 Sep 2020 17:27:33 +0800 Subject: [PATCH 83/92] Polish alibaba/spring-cloud-alibaba#1727 : rollback rocketmq-spring-boot-starter --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1885f6c0..9a6d9682 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ 4.0.1 - 2.1.1 + 2.0.2 3.7.0 From ea3f76c77f99552572123187a9e5aff19dba776f Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 17 Sep 2020 17:41:33 +0800 Subject: [PATCH 84/92] Remove the useless properties --- spring-cloud-alibaba-dependencies/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 0593f893..fbd53213 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -20,7 +20,6 @@ 2.2.2.RELEASE 1.8.0 - 3.1.0 1.3.0 1.3.3 0.8.0 From b4abf6db15198b62daf9bc71485821ed6efb6fc6 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 17 Sep 2020 21:31:59 +0800 Subject: [PATCH 85/92] Update the version to be 2.2.3.RELEASE --- spring-cloud-alibaba-dependencies/pom.xml | 2 +- .../src/main/asciidoc-zh/dependency-management.adoc | 2 +- .../src/main/asciidoc/dependency-management.adoc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index fbd53213..f6c66b95 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -18,7 +18,7 @@ Spring Cloud Alibaba Dependencies - 2.2.2.RELEASE + 2.2.3.RELEASE 1.8.0 1.3.0 1.3.3 diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc index 5a3dc333..5300db70 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/dependency-management.adoc @@ -10,7 +10,7 @@ Spring Cloud Alibaba BOM 包含了它所使用的所有依赖的版本。 com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.2.RELEASE + 2.2.3.RELEASE pom import diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc index 789d1aed..9601c509 100644 --- a/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc +++ b/spring-cloud-alibaba-docs/src/main/asciidoc/dependency-management.adoc @@ -8,7 +8,7 @@ If you’re a Maven Central user, add our BOM to your pom.xml com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.2.RELEASE + 2.2.3.RELEASE pom import From 6617c9aef8824fb18c89c4ee339f7ca2bd75e538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E9=BB=84=E5=BD=AC?= Date: Fri, 18 Sep 2020 11:26:32 +0800 Subject: [PATCH 86/92] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7dd069c5..cc75f59c 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ These artifacts are available from Maven Central and Spring Release repository v com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.2.RELEASE + 2.2.3.RELEASE pom import From 29b955fffb1edbef552ed8a44b1b72dde7318a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=99=E9=BB=84=E5=BD=AC?= Date: Fri, 18 Sep 2020 11:27:20 +0800 Subject: [PATCH 87/92] Update README-zh.md --- README-zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-zh.md b/README-zh.md index ca01258e..43856826 100644 --- a/README-zh.md +++ b/README-zh.md @@ -70,7 +70,7 @@ Spring Cloud 使用 Maven 来构建,最快的使用方式是将本项目 clone com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.2.RELEASE + 2.2.3.RELEASE pom import From 11f8f02de694bb52acd28302a01e3a381f9b7419 Mon Sep 17 00:00:00 2001 From: Flyfoxs Date: Fri, 9 Oct 2020 11:12:54 +0800 Subject: [PATCH 88/92] Timeout exception in feign first time calling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第一次Feign调用时, 由于初始化懒加载, 可能会有timeout异常. 之前会被mock异常掩盖了. --- .../business-service/src/main/resources/application.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties index e1fc1c85..bc40bece 100644 --- a/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties +++ b/spring-cloud-alibaba-examples/seata-example/business-service/src/main/resources/application.properties @@ -5,6 +5,8 @@ spring.cloud.nacos.discovery.server-addr=localhost:8848 #feign.hystrix.enabled=true #feign.sentinel.enabled=true +feign.client.config.default.connectTimeout=10000 +feign.client.config.default.readTimeout=10000 logging.level.io.seata=debug From 25689b800e275be9754fb273e853927f4f96bb34 Mon Sep 17 00:00:00 2001 From: Roger3581321 Date: Fri, 9 Oct 2020 14:54:30 +0800 Subject: [PATCH 89/92] Add one missing configuration item Since there is an important, yet missing option spring.cloud.nacos.discovery.enabled, I have added its description by following the "More configuration items" format. --- .../nacos-example/nacos-discovery-example/readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md index 656829be..0946cf9a 100644 --- a/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md +++ b/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md @@ -207,6 +207,7 @@ Metadata|spring.cloud.nacos.discovery.metadata||Extended data, Configure using M log name|spring.cloud.nacos.discovery.log-name|| endpoint|spring.cloud.nacos.discovery.endpoint||The domain name of a service, through which the server address can be dynamically obtained. Integration Ribbon|ribbon.nacos.enabled|true| +enabled|spring.cloud.nacos.discovery.enabled|true|The switch to enable or disable nacos service discovery From 1934c4760d0ed240f356881af1f6944ffbf7ea8e Mon Sep 17 00:00:00 2001 From: zhongguangxi <32933432@qq.com> Date: Sun, 11 Oct 2020 23:31:37 +0800 Subject: [PATCH 90/92] maven project name change --- .../seata-example/order-service/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-examples/seata-example/order-service/pom.xml b/spring-cloud-alibaba-examples/seata-example/order-service/pom.xml index a856310d..8555554f 100644 --- a/spring-cloud-alibaba-examples/seata-example/order-service/pom.xml +++ b/spring-cloud-alibaba-examples/seata-example/order-service/pom.xml @@ -10,7 +10,7 @@ 4.0.0 order-service - Spring Cloud Starter Alibaba Seata Example - Business Service + Spring Cloud Starter Alibaba Seata Example - Order Service jar @@ -53,4 +53,4 @@ - \ No newline at end of file + From 6540555920bad2f72cf7dadf46699f7de08b14aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= Date: Thu, 15 Oct 2020 13:33:48 +0800 Subject: [PATCH 91/92] fix EndpointId logWarning --- .../com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java | 2 +- .../alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java index d5b51660..d00dfe63 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosConfigEndpoint.java @@ -36,7 +36,7 @@ import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; * * @author xiaojing */ -@Endpoint(id = "nacos-config") +@Endpoint(id = "nacosconfig") public class NacosConfigEndpoint { private final NacosConfigProperties properties; diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java index 9f88830e..b1aea417 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/endpoint/NacosDiscoveryEndpoint.java @@ -36,7 +36,7 @@ import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; * * @author xiaojing */ -@Endpoint(id = "nacos-discovery") +@Endpoint(id = "nacosdiscovery") public class NacosDiscoveryEndpoint { private static final Logger log = LoggerFactory From fa49d5f03c1f5649b58d94a1445eaced650e5180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com> Date: Tue, 3 Nov 2020 11:42:27 +0800 Subject: [PATCH 92/92] bugfix: fix compatibility issues with 'seata-all-1.4.0' --- .../feign/hystrix/SeataHystrixConcurrencyStrategy.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java index 2aa507bd..d0a1528b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-seata/src/main/java/com/alibaba/cloud/seata/feign/hystrix/SeataHystrixConcurrencyStrategy.java @@ -36,6 +36,7 @@ import io.seata.core.context.RootContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -156,11 +157,15 @@ public class SeataHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy public K call() throws Exception { try { RequestContextHolder.setRequestAttributes(requestAttributes); - RootContext.bind(xid); + if (!StringUtils.isEmpty(xid)) { + RootContext.bind(xid); + } return actual.call(); } finally { - RootContext.unbind(); + if (!StringUtils.isEmpty(xid)) { + RootContext.unbind(); + } RequestContextHolder.resetRequestAttributes(); } }