diff --git a/pom.xml b/pom.xml index efba570c8..576f340ce 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-build - 2.3.4.RELEASE + 3.0.1 4.0.0 @@ -71,10 +71,10 @@ - 1.1.4.Hoxton.SR9-SNAPSHOT + 2020.0.1-SNAPSHOT - Hoxton.SR9 + 2020.0.1 0.8.3 diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 7922fa66d..a3d57f40a 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-dependencies-parent - 2.3.1.RELEASE + 3.0.1 4.0.0 @@ -62,7 +62,8 @@ - 1.1.4.Hoxton.SR9-SNAPSHOT + 2020.0.1-SNAPSHOT + 23.0 1.2.0 10.0.0-M6 2.0.0 diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml index 5bf16820e..162294685 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml @@ -20,7 +20,7 @@ ch.qos.logback logback-core - 1.2.3 + 1.2.6 compile @@ -53,12 +53,6 @@ feign-okhttp - - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - - org.springframework.retry diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b/pom.xml index 2c56070ed..c2651bb25 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b/pom.xml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b/pom.xml @@ -20,7 +20,7 @@ ch.qos.logback logback-core - 1.2.3 + 1.2.6 compile @@ -51,12 +51,6 @@ feign-okhttp - - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - - org.springframework.retry diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/pom.xml index d337185ec..f5591f58c 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/pom.xml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/pom.xml @@ -42,18 +42,6 @@ spring-cloud-starter-openfeign - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - - - - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - - org.springframework.retry diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/pom.xml index f4f0add80..ac9e8971f 100644 --- a/spring-cloud-tencent-examples/polaris-discovery-example/pom.xml +++ b/spring-cloud-tencent-examples/polaris-discovery-example/pom.xml @@ -43,18 +43,6 @@ spring-cloud-starter-openfeign - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - - - - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - - org.springframework.retry diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/pom.xml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/pom.xml deleted file mode 100644 index 0c149c8d4..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - polaris-gateway-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - gateway-zuul-service - Spring Cloud Starter Tencent Polaris Gateway Zuul Example - - - - spring-cloud-starter-tencent-polaris-discovery - com.tencent.cloud - - - - com.tencent.cloud - spring-cloud-tencent-polaris-gateway - - - - org.springframework.cloud - spring-cloud-starter-netflix-zuul - - - - org.springframework.boot - spring-boot-starter-web - - - - \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/src/main/resources/application.yml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/src/main/resources/application.yml deleted file mode 100644 index c191c5e4b..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/src/main/resources/application.yml +++ /dev/null @@ -1,20 +0,0 @@ -server: - session-timeout: 1800 - port: 48082 -spring: - application: - name: GatewayZuulService - cloud: - polaris: - address: grpc://127.0.0.1:8091 - tencent: - metadata: - content: - a: 1 - transitive: - - a -zuul: - routes: - GatewayCalleeService: - serviceId: GatewayCalleeService - path: /GatewayCalleeService/** diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/pom.xml b/spring-cloud-tencent-examples/polaris-gateway-example/pom.xml index 073bd0e6b..f3815f60d 100644 --- a/spring-cloud-tencent-examples/polaris-gateway-example/pom.xml +++ b/spring-cloud-tencent-examples/polaris-gateway-example/pom.xml @@ -15,7 +15,6 @@ Spring Cloud Starter Tencent Polaris Gateway Example - gateway-zuul-service gateway-scg-service gateway-callee-service @@ -32,19 +31,6 @@ org.springframework.cloud spring-cloud-starter-openfeign - - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - - - - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - - org.springframework.retry diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml index 632fde33f..c0697f5ad 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml @@ -52,11 +52,5 @@ spring-boot-starter-test test - - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - test - \ No newline at end of file diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/pom.xml b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/pom.xml index fa2cabb05..d96db3d21 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/pom.xml @@ -50,11 +50,6 @@ - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - - org.springframework.boot spring-boot-starter-web @@ -67,6 +62,12 @@ true + + org.springframework.cloud + spring-cloud-loadbalancer + true + + org.springframework.boot spring-boot-starter-test @@ -90,5 +91,11 @@ powermock-api-mockito2 test + + org.springframework.cloud + spring-cloud-loadbalancer + 3.0.1 + compile + \ No newline at end of file diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/ConditionalOnLoadBalancerPolaris.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/ConditionalOnLoadBalancerPolaris.java new file mode 100644 index 000000000..e85b3de52 --- /dev/null +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/ConditionalOnLoadBalancerPolaris.java @@ -0,0 +1,34 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.polaris.loadbalancer; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; + +/** + * @author liaochuntao + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +@ConditionalOnProperty(value = "spring.cloud.loadbalancer.polaris.enabled", havingValue = "true") +public @interface ConditionalOnLoadBalancerPolaris { + +} diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisDiscoveryRibbonAutoConfiguration.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/LoadBalancerPolarisAutoConfiguration.java similarity index 69% rename from spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisDiscoveryRibbonAutoConfiguration.java rename to spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/LoadBalancerPolarisAutoConfiguration.java index 869c73281..3b6bc537a 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisDiscoveryRibbonAutoConfiguration.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/LoadBalancerPolarisAutoConfiguration.java @@ -15,23 +15,21 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.ribbon; +package com.tencent.cloud.polaris.loadbalancer; import com.tencent.cloud.polaris.discovery.ConditionalOnPolarisDiscoveryEnabled; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; -import org.springframework.cloud.netflix.ribbon.RibbonClients; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.context.annotation.Configuration; /** - * @author Haotian Zhang, Andrew Shan, Jie Cheng + * @author liaochuntao */ @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties +@ConditionalOnLoadBalancerPolaris @ConditionalOnPolarisDiscoveryEnabled -@AutoConfigureAfter(RibbonAutoConfiguration.class) -@RibbonClients(defaultConfiguration = PolarisRibbonServerListConfiguration.class) -public class PolarisDiscoveryRibbonAutoConfiguration { +@LoadBalancerClients(defaultConfiguration = PolarisLoadBalancerClientConfiguration.class) +public class LoadBalancerPolarisAutoConfiguration { } diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/src/main/java/com/tencent/cloud/polaris/gateway/example/zuul/GatewayZuulApplication.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java similarity index 62% rename from spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/src/main/java/com/tencent/cloud/polaris/gateway/example/zuul/GatewayZuulApplication.java rename to spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java index b748b986e..ea5a82b1b 100644 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-zuul-service/src/main/java/com/tencent/cloud/polaris/gateway/example/zuul/GatewayZuulApplication.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java @@ -15,21 +15,16 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.gateway.example.zuul; +package com.tencent.cloud.polaris.loadbalancer; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.netflix.zuul.EnableZuulProxy; +import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; +import org.springframework.context.annotation.Configuration; /** - * @author Haotian Zhang + * @author liaochuntao */ -@SpringBootApplication -@EnableZuulProxy -public class GatewayZuulApplication { - - public static void main(String[] args) { - SpringApplication.run(GatewayZuulApplication.class, args); - } +@Configuration(proxyBeanMethods = false) +@ConditionalOnDiscoveryEnabled +public class PolarisLoadBalancerClientConfiguration { } diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadbalancer.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadbalancer.java new file mode 100644 index 000000000..710805e4c --- /dev/null +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadbalancer.java @@ -0,0 +1,80 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.cloud.polaris.loadbalancer; + +import com.tencent.cloud.polaris.PolarisProperties; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.DefaultResponse; +import org.springframework.cloud.client.loadbalancer.EmptyResponse; +import org.springframework.cloud.client.loadbalancer.Request; +import org.springframework.cloud.client.loadbalancer.Response; +import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer; +import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; +import reactor.core.publisher.Mono; + +/** + * @author liaochuntao + */ +public class PolarisLoadbalancer implements ReactorServiceInstanceLoadBalancer { + + private static final Logger log = LoggerFactory.getLogger(PolarisLoadbalancer.class); + + private final String serviceId; + + private ObjectProvider supplierObjectProvider; + + private final PolarisProperties discoveryProperties; + + public PolarisLoadbalancer(String serviceId, + ObjectProvider supplierObjectProvider, + PolarisProperties discoveryProperties) { + this.serviceId = serviceId; + this.supplierObjectProvider = supplierObjectProvider; + this.discoveryProperties = discoveryProperties; + } + + @Override + public Mono> choose(Request request) { + ServiceInstanceListSupplier supplier = supplierObjectProvider.getIfAvailable(NoopServiceInstanceListSupplier::new); + return supplier.get().next().map(this::getInstanceResponse); + } + + private Response getInstanceResponse(List serviceInstances) { + if (serviceInstances.isEmpty()) { + log.warn("No servers available for service: " + this.serviceId); + return new EmptyResponse(); + } + + try { + ServiceInstance instance = NacosBalancer.getHostByRandomWeight3(serviceInstances); + return new DefaultResponse(instance); + } + catch (Exception e) { + log.warn("NacosLoadBalancer error", e); + return new EmptyResponse(); + } + + } + +} diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisServerList.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisServerList.java deleted file mode 100644 index 7ae86665b..000000000 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisServerList.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.cloud.polaris.ribbon; - -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.AbstractServerList; -import com.netflix.loadbalancer.Server; -import com.tencent.cloud.polaris.pojo.PolarisServer; -import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.ServiceInstances; -import com.tencent.polaris.api.rpc.InstancesResponse; -import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Haotian Zhang, Andrew Shan, Jie Cheng - */ -public class PolarisServerList extends AbstractServerList { - - private String serviceId; - - private PolarisDiscoveryHandler polarisDiscoveryHandler; - - public PolarisServerList(PolarisDiscoveryHandler polarisDiscoveryHandler) { - this.polarisDiscoveryHandler = polarisDiscoveryHandler; - } - - @Override - public List getInitialListOfServers() { - return getServers(); - } - - @Override - public List getUpdatedListOfServers() { - return getServers(); - } - - private List getServers() { - InstancesResponse filteredInstances = polarisDiscoveryHandler.getInstances(serviceId); - ServiceInstances serviceInstances = filteredInstances.toServiceInstances(); - List polarisServers = new ArrayList<>(); - for (Instance instance : serviceInstances.getInstances()) { - polarisServers.add(new PolarisServer(serviceInstances, instance)); - } - return polarisServers; - } - - public String getServiceId() { - return serviceId; - } - - @Override - public void initWithNiwsConfig(IClientConfig iClientConfig) { - this.serviceId = iClientConfig.getClientName(); - } - -} diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-ratelimit/pom.xml b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-ratelimit/pom.xml index acf7e431c..568e0a975 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-ratelimit/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-ratelimit/pom.xml @@ -67,12 +67,6 @@ test - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - test - - org.powermock powermock-module-junit4 diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/pom.xml b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/pom.xml index 41697663a..cbfd8ad68 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/pom.xml @@ -31,6 +31,12 @@ + + org.springframework.cloud + spring-cloud-loadbalancer + true + + com.tencent.polaris @@ -43,12 +49,6 @@ test - - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - - org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRoutingLoadBalancer.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRoutingLoadBalancer.java index 5c2258efe..2ecec187b 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRoutingLoadBalancer.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRoutingLoadBalancer.java @@ -17,16 +17,9 @@ package com.tencent.cloud.polaris.router; -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.DynamicServerListLoadBalancer; -import com.netflix.loadbalancer.IPing; -import com.netflix.loadbalancer.IRule; -import com.netflix.loadbalancer.PollingServerListUpdater; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; import com.tencent.cloud.metadata.constant.MetadataConstant.SystemMetadataKey; import com.tencent.cloud.metadata.context.MetadataContextHolder; -import com.tencent.cloud.polaris.pojo.PolarisServer; +import com.tencent.cloud.polaris.pojo.PolarisServiceInstance; import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.Instance; @@ -36,64 +29,48 @@ import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.router.api.core.RouterAPI; import com.tencent.polaris.router.api.rpc.ProcessRoutersRequest; import com.tencent.polaris.router.api.rpc.ProcessRoutersResponse; -import org.apache.commons.lang.StringUtils; -import org.springframework.util.CollectionUtils; - import java.util.ArrayList; import java.util.List; import java.util.Map; +import org.apache.commons.lang.StringUtils; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.util.CollectionUtils; /** * @author Haotian Zhang */ -public class PolarisRoutingLoadBalancer extends DynamicServerListLoadBalancer { +public class PolarisRoutingLoadBalancer { private final RouterAPI routerAPI; - public PolarisRoutingLoadBalancer(IClientConfig config, IRule rule, IPing ping, - ServerList serverList, RouterAPI routerAPI) { - super(config, rule, ping, serverList, null, new PollingServerListUpdater()); + public PolarisRoutingLoadBalancer(RouterAPI routerAPI) { this.routerAPI = routerAPI; } - @Override - public List getReachableServers() { - List allServers = super.getAllServers(); + public List chooseInstances(List allServers) { if (CollectionUtils.isEmpty(allServers)) { return allServers; } ServiceInstances serviceInstances = null; - if (allServers.get(0) instanceof PolarisServer) { - serviceInstances = ((PolarisServer) allServers.get(0)).getServiceInstances(); - } else { - String serviceName; - // notice the difference between different service registries - if (StringUtils.isNotBlank(allServers.get(0).getMetaInfo().getServiceIdForDiscovery())) { - serviceName = allServers.get(0).getMetaInfo().getServiceIdForDiscovery(); - } else { - serviceName = allServers.get(0).getMetaInfo().getAppName(); - } - if (StringUtils.isBlank(serviceName)) { - throw new IllegalStateException( - "PolarisRoutingLoadBalancer only Server with AppName or ServiceIdForDiscovery attribute"); - } - ServiceKey serviceKey = new ServiceKey(MetadataContextHolder.LOCAL_NAMESPACE, serviceName); - List instances = new ArrayList<>(8); - for (Server server : allServers) { - DefaultInstance instance = new DefaultInstance(); - instance.setNamespace(MetadataContextHolder.LOCAL_NAMESPACE); - instance.setService(serviceName); - instance.setHealthy(server.isAlive()); - instance.setProtocol(server.getScheme()); - instance.setId(server.getId()); - instance.setHost(server.getHost()); - instance.setPort(server.getPort()); - instance.setZone(server.getZone()); - instance.setWeight(100); - instances.add(instance); - } - serviceInstances = new DefaultServiceInstances(serviceKey, instances); + String serviceName = allServers.get(0).getServiceId(); + if (StringUtils.isBlank(serviceName)) { + throw new IllegalStateException( + "PolarisRoutingLoadBalancer only Server with AppName or ServiceIdForDiscovery attribute"); + } + ServiceKey serviceKey = new ServiceKey(MetadataContextHolder.LOCAL_NAMESPACE, serviceName); + List instances = new ArrayList<>(8); + for (ServiceInstance server : allServers) { + DefaultInstance instance = new DefaultInstance(); + instance.setNamespace(MetadataContextHolder.LOCAL_NAMESPACE); + instance.setService(serviceName); + instance.setProtocol(server.getScheme()); + instance.setId(server.getInstanceId()); + instance.setHost(server.getHost()); + instance.setPort(server.getPort()); + instance.setWeight(100); + instances.add(instance); } + serviceInstances = new DefaultServiceInstances(serviceKey, instances); ProcessRoutersRequest processRoutersRequest = new ProcessRoutersRequest(); processRoutersRequest.setDstInstances(serviceInstances); String srcNamespace = MetadataContextHolder.get().getSystemMetadata(SystemMetadataKey.LOCAL_NAMESPACE); @@ -110,15 +87,11 @@ public class PolarisRoutingLoadBalancer extends DynamicServerListLoadBalancer filteredInstances = new ArrayList<>(); + List filteredInstances = new ArrayList<>(); for (Instance instance : filteredServiceInstances.getInstances()) { - filteredInstances.add(new PolarisServer(serviceInstances, instance)); + filteredInstances.add(new PolarisServiceInstance(instance)); } return filteredInstances; } - @Override - public List getAllServers() { - return getReachableServers(); - } } diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonClientConfiguration.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonClientConfiguration.java deleted file mode 100644 index 5d0ed05b0..000000000 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonClientConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.cloud.polaris.router.config; - -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.ILoadBalancer; -import com.netflix.loadbalancer.IPing; -import com.netflix.loadbalancer.IRule; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; -import com.tencent.cloud.polaris.router.PolarisRoutingLoadBalancer; -import com.tencent.cloud.polaris.router.rule.PolarisLoadBalanceRule; -import com.tencent.cloud.polaris.router.rule.PolarisWeightedRandomRule; -import com.tencent.polaris.router.api.core.RouterAPI; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @author Haotian Zhang - */ -@Configuration -public class PolarisRibbonClientConfiguration { - - @Bean - @ConditionalOnMissingBean - public IRule polarisRibbonRule(PolarisRibbonProperties polarisRibbonProperties) { - switch (PolarisLoadBalanceRule.fromStrategy(polarisRibbonProperties.getPolicy())) { - case WEIGHTED_RANDOM_RULE: - default: - return new PolarisWeightedRandomRule(); - } - } - - @Bean - @ConditionalOnMissingBean - public ILoadBalancer polarisRoutingLoadBalancer(IClientConfig iClientConfig, IRule iRule, IPing iPing, - ServerList serverList, RouterAPI polarisRouter) { - return new PolarisRoutingLoadBalancer(iClientConfig, iRule, iPing, serverList, polarisRouter); - } -} diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfiguration.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterAutoConfiguration.java similarity index 77% rename from spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfiguration.java rename to spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterAutoConfiguration.java index 8d33972ae..94d8f311b 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfiguration.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterAutoConfiguration.java @@ -21,12 +21,9 @@ import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.client.api.SDKContext; import com.tencent.polaris.factory.api.RouterAPIFactory; import com.tencent.polaris.router.api.core.RouterAPI; -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.cloud.netflix.ribbon.RibbonAutoConfiguration; -import org.springframework.cloud.netflix.ribbon.RibbonClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -35,17 +32,15 @@ import org.springframework.context.annotation.Configuration; * * @author Haotian Zhang */ -@Configuration(proxyBeanMethods = false) +@Configuration() @EnableConfigurationProperties @ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled", matchIfMissing = true) -@AutoConfigureAfter(RibbonAutoConfiguration.class) -@RibbonClients(defaultConfiguration = PolarisRibbonClientConfiguration.class) -public class PolarisRibbonAutoConfiguration { +public class PolarisRouterAutoConfiguration { @Bean @ConditionalOnMissingBean - public PolarisRibbonProperties polarisRibbonProperties() { - return new PolarisRibbonProperties(); + public PolarisRouterProperties polarisRibbonProperties() { + return new PolarisRouterProperties(); } @Bean(name = "polarisRoute") diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisRibbonServerListConfiguration.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterClientConfiguration.java similarity index 57% rename from spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisRibbonServerListConfiguration.java rename to spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterClientConfiguration.java index 74efa1320..43b3fee15 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisRibbonServerListConfiguration.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterClientConfiguration.java @@ -15,28 +15,19 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.ribbon; +package com.tencent.cloud.polaris.router.config; -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; -import com.tencent.cloud.polaris.discovery.PolarisDiscoveryHandler; +import com.tencent.cloud.polaris.router.PolarisRoutingLoadBalancer; +import com.tencent.cloud.polaris.router.rule.PolarisLoadBalanceRule; +import com.tencent.polaris.router.api.core.RouterAPI; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** - * @author Haotian Zhang, Andrew Shan, Jie Cheng + * @author Haotian Zhang */ @Configuration -public class PolarisRibbonServerListConfiguration { +public class PolarisRouterClientConfiguration { - @Bean - @ConditionalOnMissingBean - public ServerList ribbonServerList(PolarisDiscoveryHandler polarisDiscoveryHandler, - IClientConfig iClientConfig) { - PolarisServerList serverList = new PolarisServerList(polarisDiscoveryHandler); - serverList.initWithNiwsConfig(iClientConfig); - return serverList; - } } diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonProperties.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterProperties.java similarity index 98% rename from spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonProperties.java rename to spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterProperties.java index 6e6ab5014..47575d105 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonProperties.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRouterProperties.java @@ -24,7 +24,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * @author Haotian Zhang */ @ConfigurationProperties("spring.cloud.polaris.ribbon") -public class PolarisRibbonProperties { +public class PolarisRouterProperties { /** * 是否开启负载均衡 diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisWeightedRandomRule.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisWeightedRandomRule.java deleted file mode 100644 index d9dffa23a..000000000 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisWeightedRandomRule.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.cloud.polaris.router.rule; - -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.AbstractLoadBalancerRule; -import com.netflix.loadbalancer.Server; -import com.tencent.cloud.polaris.pojo.PolarisServer; -import com.tencent.polaris.api.config.consumer.LoadBalanceConfig; -import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.router.api.core.RouterAPI; -import com.tencent.polaris.router.api.rpc.ProcessLoadBalanceRequest; -import com.tencent.polaris.router.api.rpc.ProcessLoadBalanceResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; - -import java.util.List; - -/** - * @author Haotian Zhang - */ -public class PolarisWeightedRandomRule extends AbstractLoadBalancerRule { - - private static final String POLICY = LoadBalanceConfig.LOAD_BALANCE_WEIGHTED_RANDOM; - - @Autowired - private RouterAPI polarisRouter; - - @Override - public void initWithNiwsConfig(IClientConfig clientConfig) { - - } - - @Override - public Server choose(Object key) { - List allServers = getLoadBalancer().getReachableServers(); - if (CollectionUtils.isEmpty(allServers)) { - return null; - } - Server server = allServers.get(0); - if (!(server instanceof PolarisServer)) { - throw new IllegalStateException("PolarisDiscoveryRule only support PolarisServer instances"); - } - PolarisServer polarisServer = (PolarisServer) server; - ProcessLoadBalanceRequest request = new ProcessLoadBalanceRequest(); - request.setDstInstances(polarisServer.getServiceInstances()); - request.setLbPolicy(POLICY); - ProcessLoadBalanceResponse processLoadBalanceResponse = polarisRouter.processLoadBalance(request); - Instance targetInstance = processLoadBalanceResponse.getTargetInstance(); - return new PolarisServer(polarisServer.getServiceInstances(), targetInstance); - } -} diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories index 75c191046..5519d1071 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.tencent.cloud.polaris.router.config.PolarisRibbonAutoConfiguration + com.tencent.cloud.polaris.router.config.PolarisRouterAutoConfiguration diff --git a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfigurationTest.java b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfigurationTest.java index b6ec3abe6..7e00e75c0 100644 --- a/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfigurationTest.java +++ b/spring-cloud-tencent-starters/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfigurationTest.java @@ -36,7 +36,7 @@ public class PolarisRibbonAutoConfigurationTest { private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of( PolarisRibbonTest.class, - PolarisRibbonAutoConfiguration.class)) + PolarisRouterAutoConfiguration.class)) .withPropertyValues("spring.application.name=" + SERVICE_PROVIDER) .withPropertyValues("server.port=" + PORT) .withPropertyValues("spring.cloud.polaris.address=grpc://127.0.0.1:10081"); @@ -45,7 +45,7 @@ public class PolarisRibbonAutoConfigurationTest { public void testDefaultInitialization() { this.contextRunner.run(context -> { assertThat(context).hasSingleBean(RouterAPI.class); - assertThat(context).hasSingleBean(PolarisRibbonProperties.class); + assertThat(context).hasSingleBean(PolarisRouterProperties.class); }); } diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-commons/pom.xml b/spring-cloud-tencent-starters/spring-cloud-tencent-commons/pom.xml index 66d33281f..f880f91a7 100644 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-commons/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-commons/pom.xml @@ -42,15 +42,11 @@ spring-cloud-commons - - com.netflix.ribbon - ribbon-loadbalancer - - - - com.google.guava - guava - + + + + + commons-collections diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/polaris/pojo/PolarisServer.java b/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/polaris/pojo/PolarisServer.java deleted file mode 100644 index eeb8c74b7..000000000 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/polaris/pojo/PolarisServer.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.cloud.polaris.pojo; - -import com.google.common.base.Objects; -import com.netflix.loadbalancer.Server; -import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.ServiceInstances; -import org.apache.commons.lang.StringUtils; - -import java.util.Map; - -/** - * Polaris implementation of {@link Server} - * - * @author Haotian Zhang - */ -public class PolarisServer extends Server { - - private final ServiceInstances serviceInstances; - - private final Instance instance; - - private final MetaInfo metaInfo; - - public PolarisServer(ServiceInstances serviceInstances, Instance instance) { - super(instance.getHost(), instance.getPort()); - if (StringUtils.equalsIgnoreCase(instance.getProtocol(), "https")) { - setSchemea("https"); - } else { - setSchemea("http"); - } - this.serviceInstances = serviceInstances; - this.instance = instance; - this.metaInfo = new MetaInfo() { - @Override - public String getAppName() { - return instance.getService(); - } - - @Override - public String getServerGroup() { - return null; - } - - @Override - public String getServiceIdForDiscovery() { - return instance.getService(); - } - - @Override - public String getInstanceId() { - return instance.getId(); - } - }; - } - - public Instance getInstance() { - return instance; - } - - @Override - public MetaInfo getMetaInfo() { - return metaInfo; - } - - public Map getMetadata() { - return instance.getMetadata(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - PolarisServer that = (PolarisServer) o; - return Objects.equal(instance, that.instance); - } - - @Override - public int hashCode() { - return Objects.hashCode(super.hashCode(), instance); - } - - public ServiceInstances getServiceInstances() { - return serviceInstances; - } -} diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-metadata/pom.xml b/spring-cloud-tencent-starters/spring-cloud-tencent-metadata/pom.xml index 1dd81df5c..2775d406e 100644 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-metadata/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-metadata/pom.xml @@ -44,12 +44,6 @@ test - - org.springframework.cloud - spring-cloud-starter-netflix-ribbon - test - - org.powermock diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/pom.xml b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/pom.xml index 261bd215c..888cd02b7 100644 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/pom.xml +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/pom.xml @@ -30,13 +30,6 @@ spring-cloud-starter-tencent-polaris-ratelimit - - - org.springframework.cloud - spring-cloud-starter-netflix-zuul - true - - org.springframework.cloud spring-cloud-starter-gateway diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/config/PolarisGatewayAutoConfiguration.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/config/PolarisGatewayAutoConfiguration.java index cf8c17430..e548680e2 100644 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/config/PolarisGatewayAutoConfiguration.java +++ b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/config/PolarisGatewayAutoConfiguration.java @@ -17,14 +17,9 @@ package com.tencent.cloud.polaris.gateway.config; -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.http.ZuulServlet; import com.tencent.cloud.polaris.gateway.core.scg.filter.Metadata2HeaderScgFilter; import com.tencent.cloud.polaris.gateway.core.scg.filter.MetadataFirstScgFilter; import com.tencent.cloud.polaris.gateway.core.scg.filter.RateLimitScgFilter; -import com.tencent.cloud.polaris.gateway.core.zuul.filter.Metadata2HeaderZuulFilter; -import com.tencent.cloud.polaris.gateway.core.zuul.filter.MetadataFirstZuulFilter; -import com.tencent.cloud.polaris.gateway.core.zuul.filter.RateLimitZuulFilter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.context.annotation.Bean; @@ -38,25 +33,7 @@ import org.springframework.context.annotation.Configuration; @Configuration public class PolarisGatewayAutoConfiguration { - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(ZuulServlet.class) - static class PolarisGatewayZuulAutoConfiguration { - @Bean - public ZuulFilter metadataFirstZuulFilter() { - return new MetadataFirstZuulFilter(); - } - - @Bean - public ZuulFilter rateLimitZuulFilter() { - return new RateLimitZuulFilter(); - } - @Bean - public ZuulFilter metadata2HeaderZuulFilter() { - return new Metadata2HeaderZuulFilter(); - } - } - - @Configuration(proxyBeanMethods = false) + @Configuration() @ConditionalOnClass(GlobalFilter.class) static class PolarisGatewayScgAutoConfiguration { @Bean diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/Metadata2HeaderZuulFilter.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/Metadata2HeaderZuulFilter.java deleted file mode 100644 index 4b743f070..000000000 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/Metadata2HeaderZuulFilter.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.cloud.polaris.gateway.core.zuul.filter; - -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import com.tencent.cloud.metadata.constant.MetadataConstant; -import com.tencent.cloud.metadata.context.MetadataContext; -import com.tencent.cloud.metadata.context.MetadataContextHolder; -import com.tencent.cloud.metadata.util.JacksonUtils; -import org.springframework.util.CollectionUtils; - - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.Map; - -import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.RIBBON_ROUTING_FILTER_ORDER; -import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.ROUTE_TYPE; - -/** - * Zuul filter used for writing metadata in HTTP request header. - * - * @author skyehtzhang - */ -public class Metadata2HeaderZuulFilter extends ZuulFilter { - - @Override - public String filterType() { - return ROUTE_TYPE; - } - - @Override - public int filterOrder() { - return RIBBON_ROUTING_FILTER_ORDER - 1; - } - - @Override - public boolean shouldFilter() { - return true; - } - - @Override - public Object run() { - // get request context - RequestContext requestContext = RequestContext.getCurrentContext(); - - // get metadata of current thread - MetadataContext metadataContext = MetadataContextHolder.get(); - - // add new metadata and cover old - Map customMetadata = metadataContext.getAllTransitiveCustomMetadata(); - if (!CollectionUtils.isEmpty(customMetadata)) { - String metadataStr = JacksonUtils.serialize2Json(customMetadata); - try { - requestContext.addZuulRequestHeader(MetadataConstant.HeaderName.CUSTOM_METADATA, - URLEncoder.encode(metadataStr, "UTF-8")); - } catch (UnsupportedEncodingException e) { - requestContext.addZuulRequestHeader(MetadataConstant.HeaderName.CUSTOM_METADATA, metadataStr); - } - } - return null; - } -} diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/MetadataFirstZuulFilter.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/MetadataFirstZuulFilter.java deleted file mode 100644 index 2d158d0e5..000000000 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/MetadataFirstZuulFilter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.cloud.polaris.gateway.core.zuul.filter; - -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import com.tencent.cloud.metadata.constant.MetadataConstant; -import com.tencent.cloud.metadata.context.MetadataContextHolder; - -import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER; -import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE; -import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.REQUEST_URI_KEY; -import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVICE_ID_KEY; - -/** - * Zuul filter used for setting peer info in context. - * - * @author Haotian Zhang - */ -public class MetadataFirstZuulFilter extends ZuulFilter { - @Override - public String filterType() { - return PRE_TYPE; - } - - @Override - public int filterOrder() { - return PRE_DECORATION_FILTER_ORDER + 1; - } - - @Override - public boolean shouldFilter() { - return true; - } - - @Override - public Object run() { - // get request context - RequestContext requestContext = RequestContext.getCurrentContext(); - - // TODO 对端命名空间暂时与本地命名空间相同 - MetadataContextHolder.get().putSystemMetadata(MetadataConstant.SystemMetadataKey.PEER_NAMESPACE, - MetadataContextHolder.get().getSystemMetadata(MetadataConstant.SystemMetadataKey.LOCAL_NAMESPACE)); - MetadataContextHolder.get().putSystemMetadata(MetadataConstant.SystemMetadataKey.PEER_SERVICE, - (String) requestContext.get(SERVICE_ID_KEY)); - MetadataContextHolder.get().putSystemMetadata(MetadataConstant.SystemMetadataKey.PEER_PATH, - (String) requestContext.get(REQUEST_URI_KEY)); - return null; - } -} diff --git a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/RateLimitZuulFilter.java b/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/RateLimitZuulFilter.java deleted file mode 100644 index 89cf7896d..000000000 --- a/spring-cloud-tencent-starters/spring-cloud-tencent-polaris-gateway/src/main/java/com/tencent/cloud/polaris/gateway/core/zuul/filter/RateLimitZuulFilter.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.cloud.polaris.gateway.core.zuul.filter; - -import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.context.RequestContext; -import com.tencent.cloud.metadata.constant.MetadataConstant; -import com.tencent.cloud.metadata.context.MetadataContextHolder; -import com.tencent.cloud.polaris.ratelimit.utils.Consts; -import com.tencent.cloud.polaris.ratelimit.utils.QuotaCheckUtils; -import com.tencent.polaris.ratelimit.api.core.LimitAPI; -import com.tencent.polaris.ratelimit.api.rpc.QuotaResponse; -import com.tencent.polaris.ratelimit.api.rpc.QuotaResultCode; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.HashMap; -import java.util.Map; - -import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE; -import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.RIBBON_ROUTING_FILTER_ORDER; -import static org.springframework.http.HttpStatus.TOO_MANY_REQUESTS; - -/** - * Zuul filter used for rate limit. - * - * @author Haotian Zhang - */ -public class RateLimitZuulFilter extends ZuulFilter { - - private static final Logger LOG = LoggerFactory.getLogger(RateLimitZuulFilter.class); - - @Autowired(required = false) - private LimitAPI limitAPI; - - @Override - public String filterType() { - return PRE_TYPE; - } - - @Override - public int filterOrder() { - return RIBBON_ROUTING_FILTER_ORDER - 1; - } - - @Override - public boolean shouldFilter() { - return limitAPI != null; - } - - @Override - public Object run() { - // get request context - RequestContext requestContext = RequestContext.getCurrentContext(); - - String peerNamespace = - MetadataContextHolder.get().getSystemMetadata(MetadataConstant.SystemMetadataKey.PEER_NAMESPACE); - String peerService = - MetadataContextHolder.get().getSystemMetadata(MetadataConstant.SystemMetadataKey.PEER_SERVICE); - String peerPath = MetadataContextHolder.get().getSystemMetadata(MetadataConstant.SystemMetadataKey.PEER_PATH); - Map labels = null; - if (StringUtils.isNotBlank(peerPath)) { - labels = new HashMap<>(); - labels.put("method", peerPath); - } - - try { - QuotaResponse quotaResponse = QuotaCheckUtils.getQuota(limitAPI, peerNamespace, peerService, 1, labels, - null); - if (quotaResponse.getCode() == QuotaResultCode.QuotaResultLimited) { - requestContext.setSendZuulResponse(false); - requestContext.setResponseStatusCode(TOO_MANY_REQUESTS.value()); - requestContext.getResponse().getWriter().write(Consts.QUOTA_LIMITED_INFO + quotaResponse.getInfo()); - } - } catch (Throwable throwable) { - //限流API调用出现异常,不应该影响业务流程的调用 - LOG.error("fail to rate limit with QuotaRequest[{}-{}-{}].", peerNamespace, peerService, peerPath, - throwable); - } - - return null; - } -}