This is an automated email from the ASF dual-hosted git repository. wujimin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push: new 0ec976d [SCB-2127]when timeout, will not isolate service 0ec976d is described below commit 0ec976d29b77b07601e3514d12794d52b5793b22 Author: liubao <bi...@qq.com> AuthorDate: Thu Nov 26 14:20:43 2020 +0800 [SCB-2127]when timeout, will not isolate service --- .../servicecomb/demo/jaxrs/client/JaxrsClient.java | 43 ---------- .../demo/jaxrs/client/TestClientTimeout.java | 96 ++++++++++++++++++++++ .../loadbalance/LoadbalanceHandler.java | 3 +- 3 files changed, 98 insertions(+), 44 deletions(-) diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java index ae6a7dd..9ee4b40 100644 --- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java +++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java @@ -25,7 +25,6 @@ import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory; -import org.apache.servicecomb.core.Const; import org.apache.servicecomb.demo.CategorizedTestCaseRunner; import org.apache.servicecomb.demo.CodeFirstRestTemplate; import org.apache.servicecomb.demo.DemoConst; @@ -84,7 +83,6 @@ public class JaxrsClient { codeFirstClient.testCodeFirst(templateNew, "jaxrs", "/codeFirstJaxrs/"); testCompute(templateNew); testValidator(templateNew); - testClientTimeOut(templateNew); testJaxRSDefaultValuesAllTransport(templateNew); testSpringMvcDefaultValuesJavaPrimitiveAllTransport(templateNew); @@ -479,47 +477,6 @@ public class JaxrsClient { TestMgr.check("hello test 15", result); } - private static void testClientTimeOut(RestTemplate template) { - String microserviceName = "jaxrs"; - for (String transport : DemoConst.transports) { - if (transport.equals(Const.ANY_TRANSPORT)) { - continue; - } - ArchaiusUtils.setProperty("servicecomb.references.transport." + microserviceName, transport); - TestMgr.setMsg(microserviceName, transport); - - String cseUrlPrefix = "cse://" + microserviceName + "/clientreqtimeout/"; - - testClientTimeoutSayHi(template, cseUrlPrefix); - testClientTimeoutAdd(template, cseUrlPrefix); - } - } - - private static void testClientTimeoutSayHi(RestTemplate template, String cseUrlPrefix) { - Student student = new Student(); - student.setName("timeout"); - student.setAge(30); - Student result = template.postForObject(cseUrlPrefix + "sayhello", student, Student.class); - TestMgr.check("hello timeout 30", result); - } - - private static void testClientTimeoutAdd(RestTemplate template, String cseUrlPrefix) { - Map<String, String> params = new HashMap<>(); - params.put("a", "5"); - params.put("b", "20"); - boolean isExcep = false; - try { - template.postForObject(cseUrlPrefix + "add", params, Integer.class); - } catch (InvocationException e) { - isExcep = true; - // implement timeout with same error code and message for rest and highway - TestMgr.check(408, e.getStatus().getStatusCode()); - TestMgr.check(true, - e.getErrorData().toString().contains("CommonExceptionData [message=Request Timeout. Details:")); - } - - TestMgr.check(true, isExcep); - } private static void testSpringMvcDefaultValuesJavaPrimitiveRest(RestTemplate template) { String microserviceName = "jaxrs"; diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestClientTimeout.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestClientTimeout.java new file mode 100644 index 0000000..9c3ea15 --- /dev/null +++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestClientTimeout.java @@ -0,0 +1,96 @@ +/* + * 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 org.apache.servicecomb.demo.jaxrs.client; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.servicecomb.demo.CategorizedTestCase; +import org.apache.servicecomb.demo.TestMgr; +import org.apache.servicecomb.demo.validator.Student; +import org.apache.servicecomb.loadbalance.ServiceCombLoadBalancerStats; +import org.apache.servicecomb.loadbalance.ServiceCombServer; +import org.apache.servicecomb.loadbalance.ServiceCombServerStats; +import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder; +import org.apache.servicecomb.registry.DiscoveryManager; +import org.apache.servicecomb.registry.RegistrationManager; +import org.apache.servicecomb.registry.cache.InstanceCache; +import org.apache.servicecomb.swagger.invocation.exception.InvocationException; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Component +public class TestClientTimeout implements CategorizedTestCase { + private static RestTemplate template = RestTemplateBuilder.create(); + + public void testAllTransport() throws Exception { + testClientTimeOut(template); + } + + private static void testClientTimeOut(RestTemplate template) { + String microserviceName = "jaxrs"; + + String cseUrlPrefix = "cse://" + microserviceName + "/clientreqtimeout/"; + + testClientTimeoutSayHi(template, cseUrlPrefix); + testClientTimeoutAdd(template, cseUrlPrefix); + } + + private static void testClientTimeoutSayHi(RestTemplate template, String cseUrlPrefix) { + Student student = new Student(); + student.setName("timeout"); + student.setAge(30); + Student result = template.postForObject(cseUrlPrefix + "sayhello", student, Student.class); + TestMgr.check("hello timeout 30", result); + } + + private static void testClientTimeoutAdd(RestTemplate template, String cseUrlPrefix) { + Map<String, String> params = new HashMap<>(); + params.put("a", "5"); + params.put("b", "20"); + boolean failed = false; + long failures = 0; + ServiceCombServerStats serviceCombServerStats = null; + try { + serviceCombServerStats = getServiceCombServerStats(); + failures = serviceCombServerStats.getContinuousFailureCount(); + template.postForObject(cseUrlPrefix + "add", params, Integer.class); + } catch (InvocationException e) { + failed = true; + // implement timeout with same error code and message for rest and highway + TestMgr.check(408, e.getStatus().getStatusCode()); + TestMgr.check(true, + e.getErrorData().toString().contains("CommonExceptionData [message=Request Timeout. Details:")); + TestMgr.check(serviceCombServerStats.getContinuousFailureCount(), failures + 1); + } + + TestMgr.check(true, failed); + } + + private static ServiceCombServerStats getServiceCombServerStats() { + InstanceCache instanceCache = DiscoveryManager.INSTANCE.getInstanceCacheManager() + .getOrCreate(RegistrationManager.INSTANCE.getAppId(), + "jaxrs", "0+"); + org.apache.servicecomb.registry.api.registry.MicroserviceInstance microserviceInstance = instanceCache + .getInstanceMap().values().iterator().next(); + ServiceCombServer serviceCombServer = ServiceCombLoadBalancerStats.INSTANCE + .getServiceCombServer(microserviceInstance); + return ServiceCombLoadBalancerStats.INSTANCE + .getServiceCombServerStats(serviceCombServer); + } +} diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java index 8f7a524..dc507c6 100644 --- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java +++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/LoadbalanceHandler.java @@ -441,7 +441,8 @@ public class LoadbalanceHandler implements Handler { if (InvocationException.class.isInstance(resp.getResult())) { InvocationException e = (InvocationException) resp.getResult(); return e.getStatusCode() == ExceptionFactory.CONSUMER_INNER_STATUS_CODE - || e.getStatusCode() == 503; + || e.getStatusCode() == Status.SERVICE_UNAVAILABLE.getStatusCode() + || e.getStatusCode() == Status.REQUEST_TIMEOUT.getStatusCode(); } else { return true; }