diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java index df2aae2c2..ea5dc00eb 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java @@ -21,6 +21,7 @@ import java.util.List; import com.tencent.polaris.api.pojo.Instance; +import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.assembly.api.pojo.GetOneInstanceRequest; import com.tencent.polaris.assembly.api.pojo.GetReachableInstancesRequest; @@ -28,6 +29,12 @@ public interface AssemblyAPI extends AutoCloseable, Closeable { + /** + * 初始化服务实例列表,避免在服务调用的时候进行拉取,可有效减少调用时延。 + * @param serviceKey 服务名和命名空间 + */ + void initService(ServiceKey serviceKey); + /** * 获取路由后的服务实例列表,贯穿服务发现、服务路由的逻辑 * @param request 多个符合路由条件的服务实例 diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java index d216149a8..49faa1254 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java @@ -20,6 +20,7 @@ import com.tencent.polaris.api.exception.ErrorCode; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.RetStatus; +import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.client.util.CommonValidator; @@ -36,6 +37,16 @@ public static void validateGetOneInstanceRequest(GetOneInstanceRequest request) CommonValidator.validateNamespaceService(request.getNamespace(), request.getService()); } + /** + * 校验服务名和命名空间 + * + * @param serviceKey 请求对象 + * @throws PolarisException 校验失败会抛出异常 + */ + public static void validateServiceKey(ServiceKey serviceKey) throws PolarisException { + CommonValidator.validateNamespaceService(serviceKey.getNamespace(), serviceKey.getService()); + } + /** * 校验获取批量服务实例的请求 * diff --git a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java index ac74e830d..1c3a8ebf1 100644 --- a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java +++ b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java @@ -21,6 +21,7 @@ import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.Instance; +import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.assembly.api.AssemblyAPI; @@ -45,6 +46,13 @@ protected void subInit() throws PolarisException { assemblyFlow = sdkContext.getOrInitFlow(AssemblyFlow.class); } + @Override + public void initService(ServiceKey serviceKey) { + checkAvailable("AssemblyAPI"); + Validator.validateServiceKey(serviceKey); + assemblyFlow.initService(serviceKey); + } + @Override public List getReachableInstances(GetReachableInstancesRequest request) { checkAvailable("AssemblyAPI"); diff --git a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java index 395255bbd..6cbb6db47 100644 --- a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java +++ b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java @@ -32,6 +32,7 @@ import com.tencent.polaris.api.pojo.ServiceInstances; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.pojo.SourceService; +import com.tencent.polaris.api.rpc.RequestBaseEntity; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.api.utils.StringUtils; @@ -65,6 +66,27 @@ public void setSDKContext(SDKContext sdkContext) { serviceCallResultListeners = ServiceCallResultListener.getServiceCallResultListeners(sdkContext); } + @Override + public void initService(ServiceKey serviceKey) { + CommonInstancesRequest commonInstancesRequest = buildCommonInstancesRequest(serviceKey, sdkContext.getConfig()); + BaseFlow.syncGetResources(extensions, false, commonInstancesRequest, commonInstancesRequest); + } + + private static CommonInstancesRequest buildCommonInstancesRequest(ServiceKey serviceKey, Configuration configuration) { + ServiceKey dstSvcKey = new ServiceKey(serviceKey.getNamespace(), serviceKey.getService()); + ServiceEventKey dstInstanceEventKey = new ServiceEventKey(dstSvcKey, ServiceEventKey.EventType.INSTANCE); + ServiceEventKey dstRuleEventKey = new ServiceEventKey(dstSvcKey, ServiceEventKey.EventType.ROUTING); + ServiceInfo dstServiceInfo = new ServiceInfo(); + dstServiceInfo.setNamespace(serviceKey.getNamespace()); + dstServiceInfo.setService(serviceKey.getService()); + RequestBaseEntity requestBaseEntity = new RequestBaseEntity(); + requestBaseEntity.setService(serviceKey.getService()); + requestBaseEntity.setNamespace(serviceKey.getNamespace()); + RouteInfo routeInfo = new RouteInfo(null, dstServiceInfo, "", configuration.getProvider().getService()); + return new CommonInstancesRequest(dstInstanceEventKey, dstRuleEventKey, null, routeInfo, + null, requestBaseEntity, configuration); + } + @Override public List getReachableInstances(GetReachableInstancesRequest request) { CommonInstancesRequest commonInstancesRequest = buildCommonInstancesRequest(request, sdkContext.getConfig()); diff --git a/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java b/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java index a47bffa0f..1c3d2d4f1 100644 --- a/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java +++ b/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java @@ -168,6 +168,20 @@ public void testSyncGetReachableInstancesAbnormal() { commonTestSyncGetReachableInstances(Operation.HAS_UNHEALTHY); } + @Test + public void testInitService() { + ValidParam validParam = validParams.get(Operation.ALL_HEALTHY); + Configuration configuration = TestUtils.configWithEnvAddress(); + try (AssemblyAPI assemblyAPI = AssemblyAPIFactory.createAssemblyAPIByConfig(configuration)) { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + LOG.error("test fail: testInitService", e); + } + assemblyAPI.initService(new ServiceKey(NAMESPACE_TEST, validParam.getServiceName())); + } + } + private void commonTestSyncGetOneInstance(Operation operation) { ValidParam validParam = validParams.get(operation); Configuration configuration = TestUtils.configWithEnvAddress(); diff --git a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java index d377c651c..8d4244f7e 100644 --- a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java +++ b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java @@ -117,7 +117,7 @@ public StatReporterConfigImpl getStatReporter() { } @Override - public TraceReporterConfig getTraceReporter() { + public TraceReporterConfigImpl getTraceReporter() { return traceReporter; } diff --git a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java index ba4ad3b85..f2274057e 100644 --- a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java +++ b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java @@ -43,11 +43,11 @@ public String getReporter() { return reporter; } - void setEnable(Boolean enable) { + public void setEnable(Boolean enable) { this.enable = enable; } - void setReporter(String reporter) { + public void setReporter(String reporter) { this.reporter = reporter; }