diff --git a/mse-simple-demo/A/Dockerfile b/mse-simple-demo/A/Dockerfile index f91baacd..f589a1aa 100644 --- a/mse-simple-demo/A/Dockerfile +++ b/mse-simple-demo/A/Dockerfile @@ -1,5 +1,8 @@ FROM eclipse-temurin:8-jdk-alpine +# copy arthas +COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas + RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk add wget unzip tcpdump ngrep iproute2-ss bind-tools diff --git a/mse-simple-demo/A/pom.xml b/mse-simple-demo/A/pom.xml index 95820ca1..2dd897e8 100644 --- a/mse-simple-demo/A/pom.xml +++ b/mse-simple-demo/A/pom.xml @@ -59,13 +59,13 @@ org.apache.dubbo dubbo-spring-boot-starter - 2.7.7 + 2.7.15 org.apache.dubbo dubbo-registry-nacos - 2.7.7 + 2.7.15 diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/AApplication.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/AApplication.java index da30a082..8b700eb7 100644 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/AApplication.java +++ b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/AApplication.java @@ -1,37 +1,19 @@ package com.alibabacloud.mse.demo; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Enumeration; -import java.util.List; -import java.util.Properties; - -import javax.annotation.PostConstruct; -import javax.servlet.http.HttpServletRequest; - -import com.alibabacloud.mse.demo.service.HelloServiceB; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.apache.dubbo.config.annotation.Reference; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.util.EntityUtils; -import org.springframework.beans.factory.annotation.Autowired; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.cloud.commons.util.InetUtils; import org.springframework.context.annotation.Bean; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.client.RestTemplate; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Properties; + /** * @author Jim */ @@ -48,106 +30,20 @@ RestTemplate restTemplate() { return new RestTemplate(); } - @Reference(application = "${dubbo.application.id}", version = "1.0.0") - private HelloServiceB helloServiceB; - - @Api(value = "/", tags = {"入口应用"}) - @RestController - class AController { - - @Autowired - RestTemplate restTemplate; - - @Autowired - InetUtils inetUtils; - - private String currentZone; - - @PostConstruct - private void init() { - try { - HttpClient client = HttpClientBuilder.create().build(); - RequestConfig requestConfig = RequestConfig.custom() - .setConnectionRequestTimeout(1000) - .setConnectTimeout(1000) - .setSocketTimeout(1000) - .build(); - HttpGet req = new HttpGet("http://100.100.100.200/latest/meta-data/zone-id"); - req.setConfig(requestConfig); - HttpResponse response = client.execute(req); - currentZone = EntityUtils.toString(response.getEntity()); - } catch (Exception e) { - currentZone = e.getMessage(); - } - } - - @ApiOperation(value = "HTTP 全链路灰度入口", tags = {"入口应用"}) - @GetMapping("/a") - public String a(HttpServletRequest request) { - StringBuilder headerSb = new StringBuilder(); - Enumeration enumeration = request.getHeaderNames(); - while (enumeration.hasMoreElements()) { - String headerName = enumeration.nextElement(); - Enumeration val = request.getHeaders(headerName); - while (val.hasMoreElements()) { - String headerVal = val.nextElement(); - headerSb.append(headerName + ":" + headerVal + ","); - } - } - return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + - restTemplate.getForObject("http://sc-B/b", String.class); - } - - @ApiOperation(value = "HTTP 全链路灰度入口", tags = {"入口应用"}) - @GetMapping("/a-zone") - public String aZone(HttpServletRequest request) { - StringBuilder headerSb = new StringBuilder(); - Enumeration enumeration = request.getHeaderNames(); - while (enumeration.hasMoreElements()) { - String headerName = enumeration.nextElement(); - Enumeration val = request.getHeaders(headerName); - while (val.hasMoreElements()) { - String headerVal = val.nextElement(); - headerSb.append(headerName + ":" + headerVal + ","); - } - } - return "A"+SERVICE_TAG+"[" + currentZone + "]" + " -> " + - restTemplate.getForObject("http://sc-B/b-zone", String.class); - } - - @ApiOperation(value = "Dubbo 全链路灰度入口", tags = {"入口应用"}) - @GetMapping("/dubbo") - public String dubbo(HttpServletRequest request) { - StringBuilder headerSb = new StringBuilder(); - Enumeration enumeration = request.getHeaderNames(); - while (enumeration.hasMoreElements()) { - String headerName = enumeration.nextElement(); - Enumeration val = request.getHeaders(headerName); - while (val.hasMoreElements()) { - String headerVal = val.nextElement(); - headerSb.append(headerName + ":" + headerVal + ","); - } - } - return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + - helloServiceB.hello("A"); - } - - @GetMapping("swagger-demo") - @ApiOperation(value = "这是一个演示swagger的接口 ", tags = {"首页操作页面"}) - public String swagger(@ApiParam(name = "name", value = "我是姓名", required = true) String name, - @ApiParam(name = "age", value = "我是年龄", required = true)int age, - @ApiParam(name = "aliware-products", value = "我是购买阿里云原生产品列表", required = true) List aliwareProducts) { - return "hello swagger"; + @Bean(name = "serviceTag") + String serviceTag() { + String tag = parseServiceTag("/etc/podinfo/labels"); + if (StringUtils.isNotEmpty(tag)) { + return tag; } + return parseServiceTag("/etc/podinfo/annotations"); } - public static String SERVICE_TAG=""; - static { - + private String parseServiceTag(String path) { + String tag = null; try { - File file = new File("/etc/podinfo/annotations"); + File file = new File(path); if (file.exists()) { - Properties properties = new Properties(); FileReader fr = null; try { @@ -158,19 +54,32 @@ public String swagger(@ApiParam(name = "name", value = "我是姓名", required if (fr != null) { try { fr.close(); - } catch (Throwable ignore) {} + } catch (Throwable ignore) { + } } } - SERVICE_TAG = properties.getProperty("alicloud.service.tag").replace("\"",""); + tag = properties.getProperty("alicloud.service.tag").replace("\"", ""); } else { - SERVICE_TAG = System.getProperty("alicloud.service.tag"); + tag = System.getProperty("alicloud.service.tag"); } - } catch (Throwable ignore) {} + } catch (Throwable ignore) { + } - if ("null".equalsIgnoreCase(SERVICE_TAG) || null == SERVICE_TAG) { - SERVICE_TAG = ""; + if ("null".equalsIgnoreCase(tag) || null == tag) { + tag = ""; } + return tag; + } + @Bean(name = "taskExecutor") + ThreadPoolTaskExecutor taskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setThreadNamePrefix("taskExecutor-default-"); + executor.setCorePoolSize(5); + executor.setKeepAliveSeconds(30000); + executor.setMaxPoolSize(10); + executor.setQueueCapacity(10); + return executor; } } diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/AController.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/AController.java new file mode 100644 index 00000000..b40cfcac --- /dev/null +++ b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/AController.java @@ -0,0 +1,130 @@ +package com.alibabacloud.mse.demo; + +import com.alibabacloud.mse.demo.service.HelloServiceB; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.apache.dubbo.config.annotation.Reference; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import java.util.Enumeration; +import java.util.List; +import java.util.concurrent.ExecutionException; + +@Api(value = "/", tags = {"入口应用"}) +@RestController +class AController { + + @Autowired + RestTemplate restTemplate; + + @Autowired + InetUtils inetUtils; + + @Reference(application = "${dubbo.application.id}", version = "1.0.0") + private HelloServiceB helloServiceB; + + @Autowired + String servcieTag; + + @Autowired + ThreadPoolTaskExecutor taskExecutor; + + private String currentZone; + + @PostConstruct + private void init() { + try { + HttpClient client = HttpClientBuilder.create().build(); + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(1000) + .setConnectTimeout(1000) + .setSocketTimeout(1000) + .build(); + HttpGet req = new HttpGet("http://100.100.100.200/latest/meta-data/zone-id"); + req.setConfig(requestConfig); + HttpResponse response = client.execute(req); + currentZone = EntityUtils.toString(response.getEntity()); + } catch (Exception e) { + currentZone = e.getMessage(); + } + } + + @ApiOperation(value = "HTTP 全链路灰度入口", tags = {"入口应用"}) + @GetMapping("/a") + public String a(HttpServletRequest request) throws ExecutionException, InterruptedException { + StringBuilder headerSb = new StringBuilder(); + Enumeration enumeration = request.getHeaderNames(); + while (enumeration.hasMoreElements()) { + String headerName = enumeration.nextElement(); + Enumeration val = request.getHeaders(headerName); + while (val.hasMoreElements()) { + String headerVal = val.nextElement(); + headerSb.append(headerName + ":" + headerVal + ","); + } + } + + String result=restTemplate.getForObject("http://sc-B/b", String.class); +// String result = taskExecutor.submit(() -> +// restTemplate.getForObject("http://sc-B/b", String.class) +// ).get(); + + return "A" + servcieTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + + result; + } + + @ApiOperation(value = "HTTP 全链路灰度入口", tags = {"入口应用"}) + @GetMapping("/a-zone") + public String aZone(HttpServletRequest request) { + StringBuilder headerSb = new StringBuilder(); + Enumeration enumeration = request.getHeaderNames(); + while (enumeration.hasMoreElements()) { + String headerName = enumeration.nextElement(); + Enumeration val = request.getHeaders(headerName); + while (val.hasMoreElements()) { + String headerVal = val.nextElement(); + headerSb.append(headerName + ":" + headerVal + ","); + } + } + return "A" + servcieTag + "[" + currentZone + "]" + " -> " + + restTemplate.getForObject("http://sc-B/b-zone", String.class); + } + + @ApiOperation(value = "Dubbo 全链路灰度入口", tags = {"入口应用"}) + @GetMapping("/dubbo") + public String dubbo(HttpServletRequest request) { + StringBuilder headerSb = new StringBuilder(); + Enumeration enumeration = request.getHeaderNames(); + while (enumeration.hasMoreElements()) { + String headerName = enumeration.nextElement(); + Enumeration val = request.getHeaders(headerName); + while (val.hasMoreElements()) { + String headerVal = val.nextElement(); + headerSb.append(headerName + ":" + headerVal + ","); + } + } + return "A" + servcieTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + + helloServiceB.hello("A"); + } + + @GetMapping("swagger-demo") + @ApiOperation(value = "这是一个演示swagger的接口 ", tags = {"首页操作页面"}) + public String swagger(@ApiParam(name = "name", value = "我是姓名", required = true) String name, + @ApiParam(name = "age", value = "我是年龄", required = true) int age, + @ApiParam(name = "aliware-products", value = "我是购买阿里云原生产品列表", required = true) List aliwareProducts) { + return "hello swagger"; + } +} diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/service/HelloServiceAImpl.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/service/HelloServiceAImpl.java index b1821e83..91e32da0 100644 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/service/HelloServiceAImpl.java +++ b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/service/HelloServiceAImpl.java @@ -6,10 +6,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.commons.util.InetUtils; -import static com.alibabacloud.mse.demo.AApplication.SERVICE_TAG; - @Service(version = "1.0.0") -public class HelloServiceAImpl implements HelloServiceA{ +public class HelloServiceAImpl implements HelloServiceA { @Autowired InetUtils inetUtils; @@ -17,9 +15,12 @@ public class HelloServiceAImpl implements HelloServiceA{ @Reference(application = "${dubbo.application.id}", version = "1.0.0") private HelloServiceB helloServiceB; + @Autowired + String servcieTag; + @Override public String hello(String name) { - return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + + return "A" + servcieTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + helloServiceB.hello(name); } } diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/service/MqConsumer.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/service/MqConsumer.java index ad28bfc5..aaf0aa43 100644 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/service/MqConsumer.java +++ b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/service/MqConsumer.java @@ -25,6 +25,9 @@ public class MqConsumer implements MessageListenerConcurrently { @Autowired InetUtils inetUtils; + @Autowired + String servcieTag; + @SneakyThrows @Override public ConsumeConcurrentlyStatus consumeMessage(List list, ConsumeConcurrentlyContext consumeConcurrentlyContext) { @@ -32,7 +35,7 @@ public ConsumeConcurrentlyStatus consumeMessage(List list, ConsumeCo MessageExt messageExt = list.get(0); String topic = messageExt.getTopic(); String messageString = new String(messageExt.getBody(), StandardCharsets.UTF_8); - String result = "A"+ AApplication.SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + + String result = "A"+ servcieTag+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + restTemplate.getForObject("http://sc-B/b", String.class); log.info("topic:{},producer:{},invoke result:{}", topic, messageString, result); diff --git a/mse-simple-demo/B/Dockerfile b/mse-simple-demo/B/Dockerfile index 615b6ec8..2c4c049a 100644 --- a/mse-simple-demo/B/Dockerfile +++ b/mse-simple-demo/B/Dockerfile @@ -1,5 +1,8 @@ FROM eclipse-temurin:8-jdk-alpine +# copy arthas +COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas + RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk add wget unzip tcpdump ngrep iproute2-ss bind-tools diff --git a/mse-simple-demo/B/pom.xml b/mse-simple-demo/B/pom.xml index 2bc253b6..e143158f 100644 --- a/mse-simple-demo/B/pom.xml +++ b/mse-simple-demo/B/pom.xml @@ -46,13 +46,13 @@ org.apache.dubbo dubbo-spring-boot-starter - 2.7.7 + 2.7.15 org.apache.dubbo dubbo-registry-nacos - 2.7.7 + 2.7.15 diff --git a/mse-simple-demo/C/C-gray-deployment.yaml b/mse-simple-demo/C/C-gray-deployment.yaml deleted file mode 100644 index 03df3986..00000000 --- a/mse-simple-demo/C/C-gray-deployment.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: spring-cloud-c-gray -spec: - selector: - matchLabels: - app: spring-cloud-c-gray - template: - metadata: - annotations: - alicloud.service.tag: gray - msePilotCreateAppName: spring-cloud-c - labels: - app: spring-cloud-c-gray - spec: - containers: - - env: - - name: JAVA_HOME - value: /usr/lib/jvm/java-1.8-openjdk/jre - image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0 - imagePullPolicy: Always - name: spring-cloud-c-gray - ports: - - containerPort: 20003 diff --git a/mse-simple-demo/C/Dockerfile b/mse-simple-demo/C/Dockerfile index 54df0012..84121cd4 100644 --- a/mse-simple-demo/C/Dockerfile +++ b/mse-simple-demo/C/Dockerfile @@ -1,5 +1,8 @@ FROM eclipse-temurin:8-jdk-alpine +# copy arthas +COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas + RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk add wget unzip tcpdump ngrep iproute2-ss bind-tools diff --git a/mse-simple-demo/C/pom.xml b/mse-simple-demo/C/pom.xml index 64c988b6..204da641 100644 --- a/mse-simple-demo/C/pom.xml +++ b/mse-simple-demo/C/pom.xml @@ -61,13 +61,13 @@ org.apache.dubbo dubbo-spring-boot-starter - 2.7.7 + 2.7.15 org.apache.dubbo dubbo-registry-nacos - 2.7.7 + 2.7.15 diff --git a/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/CApplication.java b/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/CApplication.java index 06956a34..72fedb70 100644 --- a/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/CApplication.java +++ b/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/CApplication.java @@ -1,25 +1,12 @@ - package com.alibabacloud.mse.demo; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.util.EntityUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.cloud.commons.util.InetUtils; import org.springframework.context.annotation.Bean; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; -import javax.annotation.PostConstruct; -import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileReader; import java.io.IOException; @@ -38,63 +25,21 @@ RestTemplate restTemplate() { return new RestTemplate(); } - @RestController - class AController { - - @Autowired - RestTemplate restTemplate; - - @Autowired - InetUtils inetUtils; - - @Value("${throwException:false}") - boolean throwException; - - private String currentZone; - - @PostConstruct - private void init() { - try { - HttpClient client = HttpClientBuilder.create().build(); - RequestConfig requestConfig = RequestConfig.custom() - .setConnectionRequestTimeout(1000) - .setConnectTimeout(1000) - .setSocketTimeout(1000) - .build(); - HttpGet req = new HttpGet("http://100.100.100.200/latest/meta-data/zone-id"); - req.setConfig(requestConfig); - HttpResponse response = client.execute(req); - currentZone = EntityUtils.toString(response.getEntity()); - } catch (Exception e) { - currentZone = e.getMessage(); - } - } - - @GetMapping("/c") - public String c(HttpServletRequest request) { - if (throwException) { - throw new RuntimeException(); - } - return "C" + SERVICE_TAG + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]"; - } - @GetMapping("/c-zone") - public String cZone(HttpServletRequest request) { - if (throwException) { - throw new RuntimeException(); - } - return "C" + SERVICE_TAG + "[" + currentZone + "]"; + @Bean(name = "serviceTag") + String serviceTag() { + String tag = parseServiceTag("/etc/podinfo/labels"); + if (StringUtils.isNotEmpty(tag)) { + return tag; } + return parseServiceTag("/etc/podinfo/annotations"); } - public static String SERVICE_TAG = ""; - - static { - + private String parseServiceTag(String path) { + String tag = null; try { - File file = new File("/etc/podinfo/annotations"); + File file = new File(path); if (file.exists()) { - Properties properties = new Properties(); FileReader fr = null; try { @@ -109,14 +54,16 @@ public String cZone(HttpServletRequest request) { } } } - SERVICE_TAG = properties.getProperty("alicloud.service.tag").replace("\"", ""); + tag = properties.getProperty("alicloud.service.tag").replace("\"", ""); } else { - SERVICE_TAG = System.getProperty("alicloud.service.tag");; + tag = System.getProperty("alicloud.service.tag"); } } catch (Throwable ignore) { } - if ("null".equalsIgnoreCase(SERVICE_TAG) || null == SERVICE_TAG) { - SERVICE_TAG = ""; + + if ("null".equalsIgnoreCase(tag) || null == tag) { + tag = ""; } + return tag; } } diff --git a/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/CController.java b/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/CController.java new file mode 100644 index 00000000..d0eec48b --- /dev/null +++ b/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/CController.java @@ -0,0 +1,69 @@ +package com.alibabacloud.mse.demo; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; + +@RestController +class CController { + + @Autowired + RestTemplate restTemplate; + + @Autowired + InetUtils inetUtils; + + @Autowired + String servcieTag; + + @Value("${throwException:false}") + boolean throwException; + + private String currentZone; + + @PostConstruct + private void init() { + try { + HttpClient client = HttpClientBuilder.create().build(); + RequestConfig requestConfig = RequestConfig.custom() + .setConnectionRequestTimeout(1000) + .setConnectTimeout(1000) + .setSocketTimeout(1000) + .build(); + HttpGet req = new HttpGet("http://100.100.100.200/latest/meta-data/zone-id"); + req.setConfig(requestConfig); + HttpResponse response = client.execute(req); + currentZone = EntityUtils.toString(response.getEntity()); + } catch (Exception e) { + currentZone = e.getMessage(); + } + } + + @GetMapping("/c") + public String c(HttpServletRequest request) { + if (throwException) { + throw new RuntimeException(); + } + return "C" + servcieTag+ "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]"; + } + + @GetMapping("/c-zone") + public String cZone(HttpServletRequest request) { + if (throwException) { + throw new RuntimeException(); + } + return "C" + servcieTag + "[" + currentZone + "]"; + } +} diff --git a/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/service/HelloServiceCImpl.java b/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/service/HelloServiceCImpl.java index 425c12dc..0c8d42a3 100644 --- a/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/service/HelloServiceCImpl.java +++ b/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/service/HelloServiceCImpl.java @@ -13,8 +13,6 @@ import java.nio.charset.StandardCharsets; -import static com.alibabacloud.mse.demo.CApplication.SERVICE_TAG; - @Slf4j @DubboService(version = "1.0.0") @RequiredArgsConstructor @@ -28,6 +26,8 @@ public class HelloServiceCImpl implements HelloServiceC { @Value("${rocketmq.consumer.topic}") private String topic; + @Autowired + String servcieTag; @Value("${throwException:false}") boolean throwException; @@ -39,7 +39,7 @@ public String hello(String name) { throw new RuntimeException(); } - String value = "C" + SERVICE_TAG + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]"; + String value = "C" + servcieTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]"; String invokerTag=""; String userData = RpcContext.getContext().getAttachment("__microservice_tag__"); if (!StringUtils.isEmpty(userData)) { diff --git a/mse-simple-demo/gateway/Dockerfile b/mse-simple-demo/gateway/Dockerfile index 634f56a0..852ad3ba 100644 --- a/mse-simple-demo/gateway/Dockerfile +++ b/mse-simple-demo/gateway/Dockerfile @@ -1,5 +1,8 @@ FROM eclipse-temurin:8-jdk-alpine +# copy arthas +COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas + RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories RUN apk add wget unzip tcpdump ngrep iproute2-ss bind-tools diff --git a/mse-simple-demo/gateway/src/main/java/com/alibabacloud/mse/demo/DemoController.java b/mse-simple-demo/gateway/src/main/java/com/alibabacloud/mse/demo/DemoController.java index f15614e6..f059ec17 100644 --- a/mse-simple-demo/gateway/src/main/java/com/alibabacloud/mse/demo/DemoController.java +++ b/mse-simple-demo/gateway/src/main/java/com/alibabacloud/mse/demo/DemoController.java @@ -49,48 +49,49 @@ public String index(Model model) { @PostConstruct private void flow() { + if (qps > 0) { + FLOW_EXECUTOR.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { - FLOW_EXECUTOR.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - - try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { - HttpGet httpGet = new HttpGet("http://localhost:20000/A/a"); - httpClient.execute(httpGet); + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + HttpGet httpGet = new HttpGet("http://localhost:20000/A/a"); + httpClient.execute(httpGet); - } catch (Exception ignore) { + } catch (Exception ignore) { + } } - } - }, 100, 1000000 / qps, TimeUnit.MICROSECONDS); + }, 100, 1000000 / qps, TimeUnit.MICROSECONDS); - FLOW_EXECUTOR.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { + FLOW_EXECUTOR.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { - try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { - HttpGet httpGet = new HttpGet("http://localhost:20000/A/a?name=xiaoming"); - httpClient.execute(httpGet); + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + HttpGet httpGet = new HttpGet("http://localhost:20000/A/a?name=xiaoming"); + httpClient.execute(httpGet); - } catch (Exception ignore) { + } catch (Exception ignore) { + } } - } - }, 100, 10 * 1000000 / qps, TimeUnit.MICROSECONDS); + }, 100, 10 * 1000000 / qps, TimeUnit.MICROSECONDS); - FLOW_EXECUTOR.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { + FLOW_EXECUTOR.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { - try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { - HttpGet httpGet = new HttpGet("http://localhost:20000/A/a"); - httpGet.addHeader("x-mse-tag", "gray"); - httpClient.execute(httpGet); + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + HttpGet httpGet = new HttpGet("http://localhost:20000/A/a"); + httpGet.addHeader("x-mse-tag", "gray"); + httpClient.execute(httpGet); - } catch (Exception ignore) { + } catch (Exception ignore) { + } } - } - }, 100, 10 * 1000000 / qps, TimeUnit.MICROSECONDS); + }, 100, 10 * 1000000 / qps, TimeUnit.MICROSECONDS); + } if (enableMqInvoke) { diff --git a/mse-simple-demo/helm/mse-simple-demo/README.md b/mse-simple-demo/helm/mse-simple-demo/README.md index 02d7ae9a..83731a31 100644 --- a/mse-simple-demo/helm/mse-simple-demo/README.md +++ b/mse-simple-demo/helm/mse-simple-demo/README.md @@ -9,8 +9,8 @@ At directory `A`/`B`/`C`/`gateway`: ## install ```shell -helm3 upgrade helm/mse-simple-demo \ +helm3 upgrade mse-simple-demo1 helm/mse-simple-demo \ --namespace default --create-namespace \ - --install mse-simple-demo1 \ + --install \ --values helm/mse-simple-demo/values.example.yaml ``` diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-b-gray-deployment.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml similarity index 79% rename from mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-b-gray-deployment.yaml rename to mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml index c17cdc9b..4d1246eb 100644 --- a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-b-gray-deployment.yaml +++ b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml @@ -1,25 +1,24 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: spring-cloud-b-gray + name: spring-cloud-c-gray namespace: {{ .Release.Namespace }} spec: replicas: 1 selector: matchLabels: - app: spring-cloud-b-gray + app: spring-cloud-c-gray template: metadata: - annotations: - alicloud.service.tag: gray labels: + alicloud.service.tag: gray msePilotAutoEnable: "on" - appName: "{{ .Release.Namespace }}-spring-cloud-b" - app: "spring-cloud-b-gray" + appName: "{{ .Release.Namespace }}-spring-cloud-c" + app: "spring-cloud-c-gray" spec: containers: - - name: spring-cloud-b - image: "{{ .Values.registry }}spring-cloud-b:1.0.0" + - name: spring-cloud-c + image: "{{ .Values.registry }}spring-cloud-c:1.0.0" imagePullPolicy: Always env: - name: nacos.host