diff --git a/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistry.java b/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistry.java index 474cb26..8a7a85e 100644 --- a/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistry.java +++ b/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistry.java @@ -40,6 +40,9 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; + +import com.tencent.polaris.dubbo.servicealias.RegistryServiceAliasOperator; +import com.tencent.polaris.dubbo.servicealias.ServiceAlias; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.constants.RegistryConstants; @@ -121,8 +124,11 @@ public void doRegister(URL url) { if (port > 0) { int weight = url.getParameter(Constants.WEIGHT_KEY, Constants.DEFAULT_WEIGHT); String version = url.getParameter(CommonConstants.VERSION_KEY, ""); - polarisOperator.register(url.getServiceInterface(), url.getHost(), port, url.getProtocol(), version, weight, - metadata); + polarisOperator.register(RegistryServiceAliasOperator.getService(url), url.getHost(), port, + url.getProtocol(), version, weight, metadata); + if (RegistryServiceAliasOperator.enabled()) { + RegistryServiceAliasOperator.saveServiceAlias(new ServiceAlias(url)); + } registeredInstances.add(url); } else { LOGGER.warn("[POLARIS] skip register url {} for zero port value", url); @@ -141,7 +147,7 @@ public void doUnregister(URL url) { LOGGER.info("[POLARIS] unregister service from polaris: {}", url.toString()); int port = url.getPort(); if (port > 0) { - polarisOperator.deregister(url.getServiceInterface(), url.getHost(), url.getPort()); + polarisOperator.deregister(RegistryServiceAliasOperator.getService(url), url.getHost(), url.getPort()); registeredInstances.remove(url); } } diff --git a/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistryFactory.java b/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistryFactory.java index 4c6466a..171597e 100644 --- a/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistryFactory.java +++ b/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/registry/PolarisRegistryFactory.java @@ -17,6 +17,7 @@ package com.tencent.polaris.dubbo.registry; +import com.tencent.polaris.dubbo.servicealias.RegistryServiceAliasOperator; import org.apache.dubbo.common.URL; import org.apache.dubbo.registry.Registry; import org.apache.dubbo.registry.support.AbstractRegistryFactory; @@ -25,6 +26,7 @@ public class PolarisRegistryFactory extends AbstractRegistryFactory { @Override protected Registry createRegistry(URL url) { + url = RegistryServiceAliasOperator.setup(url); PolarisRegistry polarisRegistry = new PolarisRegistry(url); return polarisRegistry; } diff --git a/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/servicealias/RegistryServiceAliasOperator.java b/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/servicealias/RegistryServiceAliasOperator.java new file mode 100644 index 0000000..18d7922 --- /dev/null +++ b/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/servicealias/RegistryServiceAliasOperator.java @@ -0,0 +1,90 @@ +package com.tencent.polaris.dubbo.servicealias; + +import org.apache.dubbo.common.URL; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.URLConnection; +import java.net.URLDecoder; +import java.util.concurrent.TimeUnit; + +/** + * @author amyson + */ +public class RegistryServiceAliasOperator { + public static String KEY_Polaris_Rest_Token = "token"; + public static String KEY_Polaris_Rest_Port = "port"; + + private static final Logger LOGGER = LoggerFactory.getLogger(RegistryServiceAliasOperator.class); + static String aliasUrl = null; + static String token = null; + + public static URL setup(URL registryUrl) { + token = registryUrl.getParameter(KEY_Polaris_Rest_Token); + if (token == null) + return registryUrl; + + String port = registryUrl.getParameter(KEY_Polaris_Rest_Port, "8090"); + token = URLDecoder.decode(token); + aliasUrl = String.format("http://%s:%s/naming/v1/service/alias", registryUrl.getHost(), port); + LOGGER.info("[POLARIS] register dubbo service with alias enabled"); + return registryUrl.removeParameter(KEY_Polaris_Rest_Token); + } + + public static boolean enabled() { + return token != null; + } + + public static String getService(URL svrUrl) { + return enabled() ? ServiceAlias.getApplication(svrUrl) : svrUrl.getServiceInterface(); + } + + public static void saveServiceAlias(ServiceAlias alias) { + if (!enabled()) + return; + + try { + post(aliasUrl, token, alias.toJson()); + } catch (Exception ex) { + LOGGER.error("[POLARIS] save dubbo service alias %s error", alias.getAlias(), ex); + } + } + + public static void post(String polarisUrl, String token, String body) throws Exception { + PrintWriter out = null; + BufferedReader in = null; + try { + java.net.URL url = new java.net.URL(polarisUrl); + URLConnection conn = url.openConnection(); + + conn.setRequestProperty("X-Polaris-Token", token); + conn.setConnectTimeout(3 * 1000); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible;)"); + conn.setRequestProperty("Content-Type", "application/json"); // 设置内容类型 + + conn.setDoOutput(true); + conn.setDoInput(true); + + out = new PrintWriter(conn.getOutputStream()); + out.print(body); + out.flush(); + + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + in.readLine(); + } finally { + if (out != null) + out.close(); + if (in != null) { + try { + in.close(); + } catch (IOException ignore) {} + } + } + } +} diff --git a/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/servicealias/ServiceAlias.java b/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/servicealias/ServiceAlias.java new file mode 100644 index 0000000..3b07c21 --- /dev/null +++ b/dubbo/dubbo-plugins/dubbo-registry-polaris/src/main/java/com/tencent/polaris/dubbo/servicealias/ServiceAlias.java @@ -0,0 +1,55 @@ +package com.tencent.polaris.dubbo.servicealias; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.annotation.JSONField; +import org.apache.dubbo.common.URL; + +/** + * @author amyson + */ +public class ServiceAlias { + private String service; + private String namespace; + private String alias; + @JSONField(name = "alias_namespace") + private String aliasNamespace; + + public ServiceAlias(URL url) { + this(url, "default"); + } + + public ServiceAlias(URL url, String namespace) { + this(url, namespace, namespace); + } + + public ServiceAlias(URL url, String namespace, String aliasNamespace) { + this.service = getApplication(url); + this.namespace = namespace; + this.alias = url.getServiceInterface(); + this.aliasNamespace = aliasNamespace; + } + + public static String getApplication(URL url) { + return url.getParameter("application"); + } + + public String toJson() { + return JSON.toJSONString(this); + } + + public String getService() { + return service; + } + + public String getNamespace() { + return namespace; + } + + public String getAlias() { + return alias; + } + + public String getAliasNamespace() { + return aliasNamespace; + } +} diff --git a/dubbo/dubbo-plugins/dubbo-router-polaris/pom.xml b/dubbo/dubbo-plugins/dubbo-router-polaris/pom.xml index 8948d1d..36939aa 100644 --- a/dubbo/dubbo-plugins/dubbo-router-polaris/pom.xml +++ b/dubbo/dubbo-plugins/dubbo-router-polaris/pom.xml @@ -13,6 +13,11 @@ dubbo-router-polaris + + com.tencent.polaris + polaris-all + ${polaris.version} + com.tencent.polaris dubbo-registry-polaris diff --git a/dubbo/dubbo-plugins/dubbo-router-polaris/src/main/java/com/tencent/polaris/dubbo/router/PolarisRouter.java b/dubbo/dubbo-plugins/dubbo-router-polaris/src/main/java/com/tencent/polaris/dubbo/router/PolarisRouter.java index 882eddd..0c88156 100644 --- a/dubbo/dubbo-plugins/dubbo-router-polaris/src/main/java/com/tencent/polaris/dubbo/router/PolarisRouter.java +++ b/dubbo/dubbo-plugins/dubbo-router-polaris/src/main/java/com/tencent/polaris/dubbo/router/PolarisRouter.java @@ -59,7 +59,7 @@ public PolarisRouter(URL url) { url.getParameters()); this.priority = url.getParameter(Constants.PRIORITY_KEY, 0); routeRuleHandler = new RuleHandler(); - polarisOperator = PolarisOperators.INSTANCE.getPolarisOperator(url.getHost(), url.getPort()); + polarisOperator = PolarisOperators.INSTANCE.getFirstPolarisOperator(); //这里url是provider,根据地址信息是获取不到的 parser = QueryParser.load(); } diff --git a/polaris-adapter-dubbo/pom.xml b/polaris-adapter-dubbo/pom.xml index 7a0f9c9..6dadd22 100644 --- a/polaris-adapter-dubbo/pom.xml +++ b/polaris-adapter-dubbo/pom.xml @@ -16,6 +16,13 @@ com.tencent.polaris polaris-all + ${polaris.version} + + + com.google.protobuf + protobuf-java + 3.21.7 + compile org.slf4j diff --git a/polaris-adapter-dubbo/src/main/java/com/tencent/polaris/common/parser/QueryParser.java b/polaris-adapter-dubbo/src/main/java/com/tencent/polaris/common/parser/QueryParser.java index f272101..468e1ff 100644 --- a/polaris-adapter-dubbo/src/main/java/com/tencent/polaris/common/parser/QueryParser.java +++ b/polaris-adapter-dubbo/src/main/java/com/tencent/polaris/common/parser/QueryParser.java @@ -17,6 +17,7 @@ package com.tencent.polaris.common.parser; +import java.util.Iterator; import java.util.Objects; import java.util.Optional; import java.util.ServiceLoader; @@ -28,13 +29,13 @@ public interface QueryParser { String name(); static QueryParser load() { - ServiceLoader loader = ServiceLoader.load(QueryParser.class); - QueryParser instance = loader.iterator().next(); + Iterator queryParserIter = ServiceLoader.load(QueryParser.class).iterator(); + QueryParser instance = queryParserIter.hasNext() ? queryParserIter.next() : null; if (Objects.nonNull(instance)) { return instance; } String parser = System.getProperty("dubbo.polaris.query_parser"); - if (parser.equals("JsonPath")) { + if ("JsonPath".equals(parser)) { return new JsonPathQueryParser(); } return new JavaObjectQueryParser(); diff --git a/polaris-adapter-dubbo/src/main/java/com/tencent/polaris/common/router/RuleHandler.java b/polaris-adapter-dubbo/src/main/java/com/tencent/polaris/common/router/RuleHandler.java index 7abc2ba..55f6a22 100644 --- a/polaris-adapter-dubbo/src/main/java/com/tencent/polaris/common/router/RuleHandler.java +++ b/polaris-adapter-dubbo/src/main/java/com/tencent/polaris/common/router/RuleHandler.java @@ -23,7 +23,9 @@ import com.tencent.polaris.specification.api.v1.model.ModelProto; import com.tencent.polaris.specification.api.v1.traffic.manage.RateLimitProto; import com.tencent.polaris.specification.api.v1.traffic.manage.RoutingProto; +import com.google.protobuf.StringValue; +import java.lang.reflect.Method; import java.util.Collection; import java.util.HashSet; import java.util.List; @@ -39,18 +41,43 @@ public class RuleHandler { private final Object lock = new Object(); + + static Method getRevision; + static { + /* 直接调用 getRevision() 方法会抛出异常: + java.lang.NoSuchMethodError: com.tencent.polaris.specification.api.v1.traffic.manage.RoutingProto$Routing.getRevision()Lshade/polaris/com/google/protobuf/StringValue; + 暂时通过反射调用方法. + */ + try { + getRevision = RoutingProto.Routing.class.getMethod("getRevision"); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + public static String getRevision(RoutingProto.Routing routing) { + try { + Object revision = getRevision.invoke(routing); + if (revision instanceof StringValue) + return ((StringValue) revision).getValue(); + return revision.toString(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + public Set getRouteLabels(RoutingProto.Routing routing) { - TimedCache> setTimedCache = routeRuleMatchLabels.get(routing.getRevision().getValue()); + String revision = getRevision(routing); + TimedCache> setTimedCache = routeRuleMatchLabels.get(revision); if (null != setTimedCache && !setTimedCache.isExpired()) { return setTimedCache.getValue(); } synchronized (lock) { - setTimedCache = routeRuleMatchLabels.get(routing.getRevision().getValue()); + setTimedCache = routeRuleMatchLabels.get(revision); if (null != setTimedCache && !setTimedCache.isExpired()) { return setTimedCache.getValue(); } TimedCache> timedCache = new TimedCache<>(buildRouteLabels(routing)); - routeRuleMatchLabels.put(routing.getRevision().getValue(), timedCache); + routeRuleMatchLabels.put(revision, timedCache); return timedCache.getValue(); } } diff --git a/pom.xml b/pom.xml index cddf8bb..ec4e479 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,7 @@ - 0.2.2 + 0.3.0-20230901 ${maven.build.timestamp} yyyy-MM-dd HH:mm UTF-8 @@ -52,7 +52,7 @@ 3.0.1 3.0.0-M1 1.2.5 - 1.12.10 + 1.13.0 1.7.25 2.8.0