diff --git a/mse-simple-demo/A/Dockerfile b/mse-simple-demo/A/Dockerfile index 032abfb8..e5ffcb08 100644 --- a/mse-simple-demo/A/Dockerfile +++ b/mse-simple-demo/A/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.4 -FROM maven:3-eclipse-temurin-8 as build +FROM maven:3-eclipse-temurin-17 as build # copy arthas COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas @@ -27,10 +27,10 @@ RUN --mount=type=cache,target=/root/.m2/repository/ \ mvn clean package --batch-mode -FROM eclipse-temurin:8-jdk +FROM eclipse-temurin:21-jdk RUN apt-get update && apt-get install -y \ - vim unzip netcat telnet tcpdump iproute2 lsof \ + vim unzip netcat-openbsd telnet tcpdump iproute2 lsof \ && rm -rf /var/lib/apt/lists/* # copy arthas diff --git a/mse-simple-demo/A/build.sh b/mse-simple-demo/A/build.sh index f804335d..1652fdbe 100755 --- a/mse-simple-demo/A/build.sh +++ b/mse-simple-demo/A/build.sh @@ -3,7 +3,7 @@ export REGISTRY=${REGISTRY} export appName=spring-cloud-a -export VERSION="${VERSION:-3.0.8}" +export VERSION="${VERSION:-3.0.8-sb3-jdk21}" set -e diff --git a/mse-simple-demo/A/pom.xml b/mse-simple-demo/A/pom.xml index 68c01880..48ed3c5c 100644 --- a/mse-simple-demo/A/pom.xml +++ b/mse-simple-demo/A/pom.xml @@ -5,7 +5,7 @@ com.alibabacloud.mse.demo A - 3.0.8 + 3.0.8-sb3-jdk21 jar A @@ -14,11 +14,11 @@ UTF-8 UTF-8 - 8 - 2.6.1 - 2021.0.4 - 2.1.1.RELEASE - 2.7.18 + 17 + 3.2.3 + 2023.0.0 + 2023.0.0.0-RC1 + 3.2.11 4.5.2 @@ -80,9 +80,9 @@ - io.springfox - springfox-boot-starter - 3.0.0 + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.3.0 @@ -103,10 +103,14 @@ 3.12.0 + + org.springframework.cloud + spring-cloud-loadbalancer + + org.springframework.cloud spring-cloud-starter-openfeign - 2.2.5.RELEASE commons-io diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/AApplication.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/AApplication.java index a88fa568..f6fa7650 100644 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/AApplication.java +++ b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/AApplication.java @@ -2,7 +2,6 @@ package com.alibabacloud.mse.demo.a; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -11,18 +10,18 @@ import org.springframework.context.annotation.Bean; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.client.RestTemplate; -import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.Properties; /** * @author Jim */ @SpringBootApplication -@EnableSwagger2 @EnableFeignClients public class AApplication { @@ -30,19 +29,23 @@ public static void main(String[] args) { SpringApplication.run(AApplication.class, args); } - @Bean + @Bean(name = "loadBalancedRestTemplate") @LoadBalanced - RestTemplate restTemplate() { + RestTemplate loadBalancedRestTemplate() { return new RestTemplate(); } + @Bean(name = "restTemplate") + RestTemplate restTemplate() { + return new RestTemplateBuilder(rt -> rt.getInterceptors().add((request, body, execution) -> { + request.getHeaders().add("Connection", "close"); + return execution.execute(request, body); + })).build(); + } + @Bean(name = "serviceTag") String serviceTag() { - String tag = parseServiceTag("/etc/podinfo/labels"); - if (StringUtils.isNotEmpty(tag)) { - return tag; - } - return parseServiceTag("/etc/podinfo/annotations"); + return parseServiceTag("/etc/podinfo/labels"); } private String parseServiceTag(String path) { diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/AController.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/AController.java index da85a402..afe036a8 100644 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/AController.java +++ b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/AController.java @@ -4,9 +4,9 @@ import com.alibabacloud.mse.demo.a.service.FeignClientTest; import com.alibabacloud.mse.demo.b.service.HelloServiceB; import com.alibabacloud.mse.demo.b.service.HelloServiceBTwo; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.dubbo.config.annotation.Reference; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -14,12 +14,11 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.commons.util.InetUtils; -import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; @@ -31,17 +30,22 @@ import java.util.Map; import java.util.concurrent.ExecutionException; -@Api(value = "/", tags = {"入口应用"}) +@Tag(name = "入口应用") @RestController class AController { - private static final Logger log = LoggerFactory.getLogger(AController.class); + private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AController.class); @Autowired - private RestTemplate restTemplate; + @Qualifier("loadBalancedRestTemplate") + private RestTemplate loadBalancedRestTemplate; @Autowired private FeignClientTest feignClient; + @Autowired + @Qualifier("restTemplate") + private RestTemplate restTemplate; + @Autowired InetUtils inetUtils; @@ -78,29 +82,29 @@ private void init() { } } - @ApiOperation(value = "HTTP 全链路灰度入口", tags = {"入口应用"}) + @Operation(summary = "HTTP 全链路灰度入口", tags = {"入口应用"}) @RequestMapping("/a") public String a() throws ExecutionException, InterruptedException { //这是rpc调用的方式 - String result = restTemplate.getForObject("http://sc-B/b", String.class); + String result = loadBalancedRestTemplate.getForObject("http://sc-B/b", String.class); return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + "[config=" + configValue + "]" + " -> " + result; } - @ApiOperation(value = "HTTP 全链路灰度入口 a调用b和c", tags = {"入口应用"}) + @Operation(summary = "HTTP 全链路灰度入口 a调用b和c", tags = {"入口应用"}) @GetMapping("/a2bc") public String a2bc() throws ExecutionException, InterruptedException { String resultB = "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + - "[config=" + configValue + "]" + " -> " + restTemplate.getForObject("http://sc-B/b", String.class); + "[config=" + configValue + "]" + " -> " + loadBalancedRestTemplate.getForObject("http://sc-B/b", String.class); String resultA = "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + - "[config=" + configValue + "]" + " -> " + restTemplate.getForObject("http://sc-C/c", String.class); + "[config=" + configValue + "]" + " -> " + loadBalancedRestTemplate.getForObject("http://sc-C/c", String.class); return resultA + "\n" + resultB; } - @ApiOperation(value = "HTTP 全链路灰度入口 feign", tags = {"入口应用"}) + @Operation(summary = "HTTP 全链路灰度入口 feign", tags = {"入口应用"}) @GetMapping("/aByFeign") public String aByFeign() throws ExecutionException, InterruptedException { @@ -110,12 +114,12 @@ public String aByFeign() throws ExecutionException, InterruptedException { "[config=" + configValue + "]" + " -> " + result; } - @ApiOperation(value = "测试防护规则" , tags = {"流量防护"}) + @Operation(summary = "测试防护规则", tags = {"流量防护"}) @GetMapping("/flow") - public String flow() throws ExecutionException, InterruptedException { + public String flow() { - ResponseEntity responseEntity = restTemplate.getForEntity("http://sc-B/flow", String.class); - HttpStatus status = responseEntity.getStatusCode(); + ResponseEntity responseEntity = loadBalancedRestTemplate.getForEntity("http://sc-B/flow", String.class); + HttpStatusCode status = responseEntity.getStatusCode(); String result = responseEntity.getBody() + " code:" + status.value(); return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + @@ -123,30 +127,38 @@ public String flow() throws ExecutionException, InterruptedException { } - @ApiOperation(value = "测试热点规则", tags = {"流量防护"}) + @Operation(summary = "测试热点规则", tags = {"流量防护"}) @GetMapping("/params/{hot}") public String params(@PathVariable("hot") String hot) throws ExecutionException, InterruptedException { ResponseEntity responseEntity = restTemplate.getForEntity("http://sc-B/params/" + hot, String.class); - HttpStatus status = responseEntity.getStatusCode(); + HttpStatusCode status = responseEntity.getStatusCode(); String result = responseEntity.getBody() + " code:" + status.value(); return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + "[config=" + configValue + "]" + " params:" + hot + " -> " + result; } - @ApiOperation(value = "测试隔离规则", tags = { "流量防护"}) + @Operation(summary = "测试隔离规则", tags = {"流量防护"}) @GetMapping("/isolate") public String isolate() throws ExecutionException, InterruptedException { ResponseEntity responseEntity = restTemplate.getForEntity("http://sc-B/isolate", String.class); - HttpStatus status = responseEntity.getStatusCode(); + HttpStatusCode status = responseEntity.getStatusCode(); String result = responseEntity.getBody() + " code:" + status.value(); return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + "[config=" + configValue + "]" + " -> " + result; } + + @GetMapping("/spring_boot") + public String spring_boot() { + String result = restTemplate.getForObject("http://sc-b:20002/spring_boot", String.class); + return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + + " -> " + result; + } + @GetMapping("/sql") public String sql(@RequestParam Map allRequestParams) throws UnsupportedEncodingException { StringBuilder url = new StringBuilder("http://sc-B/sql?"); @@ -162,14 +174,14 @@ public String sql(@RequestParam Map allRequestParams) throws Uns "[config=" + configValue + "]" + " -> " + result; } - @ApiOperation(value = "HTTP 全链路灰度入口", tags = {"入口应用"}) + @Operation(summary = "HTTP 全链路灰度入口", tags = {"入口应用"}) @GetMapping("/a-zone") public String aZone() { return "A" + serviceTag + "[" + currentZone + "]" + " -> " + - restTemplate.getForObject("http://sc-B/b-zone", String.class); + loadBalancedRestTemplate.getForObject("http://sc-B/b-zone", String.class); } - @ApiOperation(value = "Dubbo 全链路灰度入口", tags = {"入口应用"}) + @Operation(summary = "Dubbo 全链路灰度入口", tags = {"入口应用"}) @GetMapping("/dubbo") public String dubbo(@RequestParam(required = false) String param) { return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + @@ -177,35 +189,35 @@ public String dubbo(@RequestParam(required = false) String param) { } - @ApiOperation(value = "Dubbo 全链路灰度入口", tags = {"入口应用"}) + @Operation(summary = "Dubbo 全链路灰度入口", tags = {"入口应用"}) @GetMapping("/dubbo2") - public String dubbo2(@RequestParam Map allRequestParams) { + public String dubbo2(@RequestParam Map allRequestParams) { return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + helloServiceBTwo.hello2(JSON.toJSONString(allRequestParams)); } - @ApiOperation(value = "Dubbo 限流测试", tags = {"入口应用"}) + @Operation(summary = "Dubbo 限流测试", tags = {"入口应用"}) @GetMapping("/dubbo-flow") public String dubbo_flow() { return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + helloServiceB.hello("A"); } - @ApiOperation(value = "Dubbo 热点测试", tags = {"入口应用"}) + @Operation(summary = "Dubbo 热点测试", tags = {"入口应用"}) @GetMapping("/dubbo-params/{hot}") public String dubbo_params(@PathVariable("hot") String hot) { return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " params:" + hot + " -> " + helloServiceB.hello(hot); } - @ApiOperation(value = "Dubbo 隔离测试", tags = {"入口应用"}) + @Operation(summary = "Dubbo 隔离测试", tags = {"入口应用"}) @GetMapping("/dubbo-isolate") public String dubbo_isolate() { return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + helloServiceB.hello("isolate"); } - @ApiOperation(value = "熔断 rt 测试", tags = {"流量防护"}) + @Operation(summary = "熔断 rt 测试", tags = {"流量防护"}) @GetMapping("/circuit-breaker-rt") public String circuit_breaker_rt() throws ExecutionException, InterruptedException { @@ -215,7 +227,7 @@ public String circuit_breaker_rt() throws ExecutionException, InterruptedExcepti "[config=" + configValue + "]" + " -> " + result; } - @ApiOperation(value = "熔断异常测试" , tags = {"流量防护"}) + @Operation(summary = "熔断异常测试", tags = {"流量防护"}) @GetMapping("/circuit-breaker-exception") public String circuit_breaker_exception() throws ExecutionException, InterruptedException { String result = feignClient.circuit_breaker_exception_b(); @@ -225,21 +237,23 @@ public String circuit_breaker_exception() throws ExecutionException, Interrupted } @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) { + @Operation(summary = "这是一个演示swagger的接口 ", tags = {"首页操作页面"}) + public String swagger( + @Parameter(name = "name", description = "我是姓名", required = true) String name, + @Parameter(name = "age", description = "我是年龄", required = true) int age, + @Parameter(name = "aliware-products", description = "我是购买阿里云原生产品列表", required = true) List aliwareProducts + ) { return "hello swagger"; } - @ApiOperation(value = "Dubbo rt 熔断测试", tags = {"入口应用"}) + @Operation(summary = "Dubbo rt 熔断测试", tags = {"入口应用"}) @GetMapping("/dubbo-circuit-breaker-rt") public String dubbo_circuit_breaker_rt() { return "A" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + helloServiceB.slow(); } - @ApiOperation(value = "Dubbo 异常熔断测试", tags = {"入口应用"}) + @Operation(summary = "Dubbo 异常熔断测试", tags = {"入口应用"}) @GetMapping("/dubbo-circuit-breaker-exception") public String dubbo_circuit_breaker_exception() { String response = ""; diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/Swagger2Config.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/Swagger2Config.java deleted file mode 100644 index 66abb359..00000000 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/Swagger2Config.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.alibabacloud.mse.demo.a; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; - -/** - * Swagger2API文档的配置 - */ -@Configuration -public class Swagger2Config extends WebMvcConfigurationSupport { - - @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build(); - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry - .addResourceHandler("/swagger-ui/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") - .resourceChain(false); - } -} diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/SwaggerBeanPostProcessor.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/SwaggerBeanPostProcessor.java deleted file mode 100644 index 64459812..00000000 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/SwaggerBeanPostProcessor.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.alibabacloud.mse.demo.a; - -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.stereotype.Component; -import org.springframework.util.ReflectionUtils; -import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; -import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; -import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; - -import java.lang.reflect.Field; -import java.util.List; -import java.util.stream.Collectors; - -@Component -public class SwaggerBeanPostProcessor implements BeanPostProcessor { - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) - { - List handlerMappings = getHandlerMappings(bean); - customizeSpringfoxHandlerMappings(handlerMappings); - } - return bean; - } - - private void customizeSpringfoxHandlerMappings(List mappings) { - List copy = mappings.stream() - .filter(mapping -> mapping.getPatternParser() == null) - .collect(Collectors.toList()); - mappings.clear(); - mappings.addAll(copy); - } - - @SuppressWarnings("unchecked") - private List getHandlerMappings(Object bean) { - try { - Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); - field.setAccessible(true); - return (List) field.get(bean); - } - catch (IllegalArgumentException | IllegalAccessException e) { - throw new IllegalStateException(e); - } - } -} \ No newline at end of file diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/mq/MqConsumer.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/mq/MqConsumer.java index a562a8c4..2c78c568 100644 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/mq/MqConsumer.java +++ b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/mq/MqConsumer.java @@ -10,6 +10,7 @@ import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.common.message.MessageExt; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cloud.commons.util.InetUtils; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @@ -24,7 +25,8 @@ public class MqConsumer implements MessageListenerConcurrently { private String serviceTag; - public MqConsumer(RestTemplate restTemplate, InetUtils inetUtils, String serviceTag) { + public MqConsumer( + @Qualifier("loadBalancedRestTemplate") RestTemplate restTemplate, InetUtils inetUtils, String serviceTag) { this.restTemplate = restTemplate; this.inetUtils = inetUtils; this.serviceTag = serviceTag; diff --git a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/mq/RocketMqConfiguration.java b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/mq/RocketMqConfiguration.java index 24e02e6b..cb00ee9d 100644 --- a/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/mq/RocketMqConfiguration.java +++ b/mse-simple-demo/A/src/main/java/com/alibabacloud/mse/demo/a/mq/RocketMqConfiguration.java @@ -28,6 +28,7 @@ public class RocketMqConfiguration { private String topic; @Autowired + @Qualifier("loadBalancedRestTemplate") private RestTemplate restTemplate; @Autowired diff --git a/mse-simple-demo/B/Dockerfile b/mse-simple-demo/B/Dockerfile index fb038b22..fff0a282 100644 --- a/mse-simple-demo/B/Dockerfile +++ b/mse-simple-demo/B/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.4 -FROM maven:3-eclipse-temurin-8 as build +FROM maven:3-eclipse-temurin-17 as build COPY < @@ -23,10 +23,10 @@ COPY ./ ./ RUN --mount=type=cache,target=/root/.m2/repository/ \ mvn clean package --batch-mode -FROM eclipse-temurin:8-jdk +FROM eclipse-temurin:21-jdk RUN apt-get update && apt-get install -y \ - vim unzip netcat telnet tcpdump iproute2 lsof \ + vim unzip netcat-openbsd telnet tcpdump iproute2 lsof \ && rm -rf /var/lib/apt/lists/* # copy arthas diff --git a/mse-simple-demo/B/build.sh b/mse-simple-demo/B/build.sh index 2c5601fa..0fa93c70 100755 --- a/mse-simple-demo/B/build.sh +++ b/mse-simple-demo/B/build.sh @@ -3,7 +3,7 @@ export REGISTRY=${REGISTRY} export appName=spring-cloud-b -export VERSION="${VERSION:-3.0.8}" +export VERSION="${VERSION:-3.0.8-sb3-jdk21}" set -e diff --git a/mse-simple-demo/B/pom.xml b/mse-simple-demo/B/pom.xml index b19f2e89..0699e96b 100644 --- a/mse-simple-demo/B/pom.xml +++ b/mse-simple-demo/B/pom.xml @@ -5,7 +5,7 @@ com.alibabacloud.mse.demo B - 3.0.8 + 3.0.8-sb3-jdk21 jar B @@ -14,11 +14,11 @@ UTF-8 UTF-8 - 8 - 2.2.0.RELEASE - Hoxton.SR1 - 2.1.1.RELEASE - 2.7.18 + 17 + 3.1.9 + 2022.0.5 + 2022.0.0.0 + 3.2.11 @@ -41,7 +41,6 @@ io.micrometer micrometer-registry-prometheus - 1.3.0 @@ -78,7 +77,7 @@ com.baomidou mybatis-plus-boot-starter - 3.5.3 + 3.5.5 @@ -101,14 +100,17 @@ org.springframework.cloud - spring-cloud-starter-openfeign - 2.2.5.RELEASE + spring-cloud-loadbalancer org.springframework.cloud spring-cloud-starter-openfeign - 2.2.5.RELEASE + + + com.alibaba + fastjson + 1.2.58 diff --git a/mse-simple-demo/B/src/main/java/com/alibabacloud/mse/demo/b/BApplication.java b/mse-simple-demo/B/src/main/java/com/alibabacloud/mse/demo/b/BApplication.java index 9560be37..9abf5fa9 100644 --- a/mse-simple-demo/B/src/main/java/com/alibabacloud/mse/demo/b/BApplication.java +++ b/mse-simple-demo/B/src/main/java/com/alibabacloud/mse/demo/b/BApplication.java @@ -18,7 +18,9 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.net.InetAddress; import java.net.URI; +import java.net.UnknownHostException; import java.util.Properties; @SpringBootApplication @@ -30,19 +32,23 @@ public static void main(String[] args) { SpringApplication.run(BApplication.class, args); } - @Bean + @Bean(name = "loadBalancedRestTemplate") @LoadBalanced - RestTemplate restTemplate() { + RestTemplate loadBalancedRestTemplate() { return new RestTemplate(); } + @Bean(name = "restTemplate") + RestTemplate restTemplate() { + return new RestTemplateBuilder(rt -> rt.getInterceptors().add((request, body, execution) -> { + request.getHeaders().add("Connection", "close"); + return execution.execute(request, body); + })).build(); + } + @Bean(name = "serviceTag") String serviceTag() { - String tag = parseServiceTag("/etc/podinfo/labels"); - if (StringUtils.isNotEmpty(tag)) { - return tag; - } - return parseServiceTag("/etc/podinfo/annotations"); + return parseServiceTag("/etc/podinfo/labels"); } private String parseServiceTag(String path) { diff --git a/mse-simple-demo/B/src/main/java/com/alibabacloud/mse/demo/b/BController.java b/mse-simple-demo/B/src/main/java/com/alibabacloud/mse/demo/b/BController.java index 9c2b4b8b..32955bb8 100644 --- a/mse-simple-demo/B/src/main/java/com/alibabacloud/mse/demo/b/BController.java +++ b/mse-simple-demo/B/src/main/java/com/alibabacloud/mse/demo/b/BController.java @@ -12,6 +12,7 @@ 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.Qualifier; import org.springframework.cloud.commons.util.InetUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -30,6 +31,11 @@ class BController { @Autowired + @Qualifier("loadBalancedRestTemplate") + private RestTemplate loadBalancedRestTemplate; + + @Autowired + @Qualifier("restTemplate") private RestTemplate restTemplate; @Reference(application = "${dubbo.application.id}", version = "1.2.0") @@ -68,7 +74,7 @@ private void init() { public String flow() throws ExecutionException, InterruptedException { long sleepTime = 5 + RANDOM.nextInt(5); silentSleep(sleepTime); - String result = restTemplate.getForObject("http://sc-C/flow", String.class); + String result = loadBalancedRestTemplate.getForObject("http://sc-C/flow", String.class); return "B" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " sleepTime:" + sleepTime + " -> " + result; } @@ -76,7 +82,7 @@ public String flow() throws ExecutionException, InterruptedException { public String params(@PathVariable("hot") String hot) throws ExecutionException, InterruptedException { long sleepTime = 5 + RANDOM.nextInt(5); silentSleep(sleepTime); - String result = restTemplate.getForObject("http://sc-C/params/" + hot, String.class); + String result = loadBalancedRestTemplate.getForObject("http://sc-C/params/" + hot, String.class); return "B" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " sleepTime:" + sleepTime + " params:" + hot + " -> " + result; } @@ -84,14 +90,14 @@ public String params(@PathVariable("hot") String hot) throws ExecutionException, public String isolate() throws ExecutionException, InterruptedException { long sleepTime = 500 + RANDOM.nextInt(5); silentSleep(sleepTime); - String result = restTemplate.getForObject("http://sc-C/isolate", String.class); + String result = loadBalancedRestTemplate.getForObject("http://sc-C/isolate", String.class); return "B" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " sleepTime:" + sleepTime + " -> " + result; } @GetMapping("/b") public String b() { return "B" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + - restTemplate.getForObject("http://sc-C/c", String.class); + loadBalancedRestTemplate.getForObject("http://sc-C/c", String.class); } @GetMapping("/bByFeign") @@ -128,7 +134,13 @@ public String circuit_breaker_exception_b() { @GetMapping("/b-zone") public String bZone() { return "B" + serviceTag + "[" + currentZone + "]" + " -> " + - restTemplate.getForObject("http://sc-C/c-zone", String.class); + loadBalancedRestTemplate.getForObject("http://sc-C/c-zone", String.class); + } + + @GetMapping("/spring_boot") + public String spring_boot() { + return "B" + serviceTag + "[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " + + restTemplate.getForObject("http://sc-c:20003/spring_boot", String.class); } @GetMapping("/sql") diff --git a/mse-simple-demo/C/Dockerfile b/mse-simple-demo/C/Dockerfile index 0687a403..b9ea16a2 100644 --- a/mse-simple-demo/C/Dockerfile +++ b/mse-simple-demo/C/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.4 -FROM maven:3-eclipse-temurin-8 as build +FROM maven:3-eclipse-temurin-17 as build COPY < @@ -23,10 +23,10 @@ COPY ./ ./ RUN --mount=type=cache,target=/root/.m2/repository/ \ mvn clean package --batch-mode -FROM eclipse-temurin:8-jdk +FROM eclipse-temurin:21-jdk RUN apt-get update && apt-get install -y \ - vim unzip netcat telnet tcpdump iproute2 lsof \ + vim unzip netcat-openbsd telnet tcpdump iproute2 lsof \ && rm -rf /var/lib/apt/lists/* # copy arthas diff --git a/mse-simple-demo/C/build.sh b/mse-simple-demo/C/build.sh index a8735216..4ecdb9e7 100755 --- a/mse-simple-demo/C/build.sh +++ b/mse-simple-demo/C/build.sh @@ -3,7 +3,7 @@ export REGISTRY=${REGISTRY} export appName=spring-cloud-c -export VERSION="${VERSION:-3.0.8}" +export VERSION="${VERSION:-3.0.8-sb3-jdk21}" set -e diff --git a/mse-simple-demo/C/pom.xml b/mse-simple-demo/C/pom.xml index 513d8920..a93814ac 100644 --- a/mse-simple-demo/C/pom.xml +++ b/mse-simple-demo/C/pom.xml @@ -5,7 +5,7 @@ com.alibabacloud.mse.demo C - 3.0.8 + 3.0.8-sb3-jdk21 jar C @@ -14,11 +14,11 @@ UTF-8 UTF-8 - 8 - 1.5.1.RELEASE - Edgware.SR2 - 1.5.0.RELEASE - 2.7.18 + 17 + 3.0.13 + 2022.0.5 + 2022.0.0.0 + 3.2.11 4.5.2 @@ -40,7 +40,7 @@ org.projectlombok lombok - 1.18.24 + 1.18.30 @@ -107,6 +107,10 @@ sentinel-core 1.8.7 + + io.micrometer + micrometer-registry-prometheus + diff --git a/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/c/CApplication.java b/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/c/CApplication.java index 986a3b2f..38a80fa7 100644 --- a/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/c/CApplication.java +++ b/mse-simple-demo/C/src/main/java/com/alibabacloud/mse/demo/c/CApplication.java @@ -1,5 +1,6 @@ package com.alibabacloud.mse.demo.c; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -10,6 +11,8 @@ import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.Properties; @SpringBootApplication @@ -35,11 +38,7 @@ RestTemplate restTemplate() { @Bean(name = "serviceTag") String serviceTag() { - String tag = parseServiceTag("/etc/podinfo/labels"); - if (tag != null && !tag.isEmpty()) { - return tag; - } - return parseServiceTag("/etc/podinfo/annotations"); + return parseServiceTag("/etc/podinfo/labels"); } private String parseServiceTag(String path) { diff --git a/mse-simple-demo/SpringCloudGateway/Dockerfile b/mse-simple-demo/SpringCloudGateway/Dockerfile index c114f30a..0eb7825b 100644 --- a/mse-simple-demo/SpringCloudGateway/Dockerfile +++ b/mse-simple-demo/SpringCloudGateway/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1.4 -FROM maven:3-eclipse-temurin-8 as build +FROM maven:3-eclipse-temurin-17 as build # copy arthas COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas @@ -26,10 +26,10 @@ RUN --mount=type=cache,target=/root/.m2/repository/ \ mvn clean package --batch-mode -FROM eclipse-temurin:8-jdk +FROM eclipse-temurin:21-jdk RUN apt-get update && apt-get install -y \ - vim unzip netcat telnet tcpdump iproute2 lsof \ + vim unzip netcat-openbsd telnet tcpdump iproute2 lsof \ && rm -rf /var/lib/apt/lists/* # copy arthas diff --git a/mse-simple-demo/SpringCloudGateway/build.sh b/mse-simple-demo/SpringCloudGateway/build.sh index 3a8c3cca..5eb75a77 100755 --- a/mse-simple-demo/SpringCloudGateway/build.sh +++ b/mse-simple-demo/SpringCloudGateway/build.sh @@ -2,7 +2,7 @@ export REGISTRY=${REGISTRY} export appName=spring-cloud-gateway -export VERSION="${VERSION:-3.0.8}" +export VERSION="${VERSION:-3.0.8-sb3-jdk21}" set -e diff --git a/mse-simple-demo/SpringCloudGateway/pom.xml b/mse-simple-demo/SpringCloudGateway/pom.xml index 60660cfb..8a1f4b82 100644 --- a/mse-simple-demo/SpringCloudGateway/pom.xml +++ b/mse-simple-demo/SpringCloudGateway/pom.xml @@ -4,16 +4,16 @@ com.alibabacloud.mse.demo SpringCloudGateway - 3.0.8 + 3.0.8-sb3-jdk21 jar UTF-8 UTF-8 - 8 - 2.1.0.RELEASE - Greenwich.SR3 - 2.1.1.RELEASE + 17 + 3.2.3 + 2023.0.0 + 2023.0.0.0-RC1 @@ -37,7 +37,11 @@ io.micrometer micrometer-registry-prometheus - 1.1.0 + + + + org.springframework.cloud + spring-cloud-loadbalancer @@ -47,6 +51,13 @@ org.apache.httpcomponents httpclient + 4.5.14 + + + javax.annotation + javax.annotation-api + 1.3.2 + compile diff --git a/mse-simple-demo/ZuulGateway/Dockerfile b/mse-simple-demo/ZuulGateway/Dockerfile index 7cb7a323..cca3e1a0 100644 --- a/mse-simple-demo/ZuulGateway/Dockerfile +++ b/mse-simple-demo/ZuulGateway/Dockerfile @@ -26,7 +26,7 @@ RUN --mount=type=cache,target=/root/.m2/repository/ \ FROM eclipse-temurin:8-jdk RUN apt-get update && apt-get install -y \ - vim unzip netcat telnet tcpdump iproute2 lsof \ + vim unzip netcat-openbsd telnet tcpdump iproute2 lsof \ && rm -rf /var/lib/apt/lists/* # copy arthas diff --git a/mse-simple-demo/ZuulGateway/build.sh b/mse-simple-demo/ZuulGateway/build.sh index 5aa638dd..61d9702d 100755 --- a/mse-simple-demo/ZuulGateway/build.sh +++ b/mse-simple-demo/ZuulGateway/build.sh @@ -3,7 +3,7 @@ export REGISTRY=${REGISTRY} export appName=spring-cloud-zuul -export VERSION="${VERSION:-3.0.8}" +export VERSION="${VERSION:-3.0.8-sb3-jdk21}" set -e diff --git a/mse-simple-demo/ZuulGateway/pom.xml b/mse-simple-demo/ZuulGateway/pom.xml index 449fa1d5..9e14ca30 100644 --- a/mse-simple-demo/ZuulGateway/pom.xml +++ b/mse-simple-demo/ZuulGateway/pom.xml @@ -5,7 +5,7 @@ com.alibabacloud.mse.demo ZuulGateway - 3.0.8 + 3.0.8-sb3-jdk21 jar diff --git a/mse-simple-demo/build.sh b/mse-simple-demo/build.sh index 64865eeb..780d7a19 100755 --- a/mse-simple-demo/build.sh +++ b/mse-simple-demo/build.sh @@ -1,7 +1,7 @@ #!/bin/sh # Select the correct warehouse prefix export REGISTRY=${REGISTRY} -export VERSION="${VERSION:-3.0.8}" +export VERSION="${VERSION:-3.0.8-sb3-jdk21}" set -e diff --git a/mse-simple-demo/helm/mse-simple-demo/Chart.yaml b/mse-simple-demo/helm/mse-simple-demo/Chart.yaml index 941bb568..7ca3ac6d 100644 --- a/mse-simple-demo/helm/mse-simple-demo/Chart.yaml +++ b/mse-simple-demo/helm/mse-simple-demo/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: mse-simple-demo -version: "3.0.8" -appVersion: "3.0.8" +version: "3.0.8-sb3-jdk21" +appVersion: "3.0.8-sb3-jdk21" home: https://mse.console.aliyun.com/ keywords: - mse diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/nacos-server.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/nacos-server.yaml index 834bc920..c2ceccff 100644 --- a/mse-simple-demo/helm/mse-simple-demo/templates/nacos-server.yaml +++ b/mse-simple-demo/helm/mse-simple-demo/templates/nacos-server.yaml @@ -12,6 +12,7 @@ spec: labels: msePilotAutoEnable: "off" app: nacos-server + sidecar.istio.io/inject: "false" spec: containers: - name: nacos-server diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/sc-a-svc.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/sc-a-svc.yaml new file mode 100644 index 00000000..3b034ae1 --- /dev/null +++ b/mse-simple-demo/helm/mse-simple-demo/templates/sc-a-svc.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: sc-a + namespace: {{ .Release.Namespace }} +spec: + ports: + - port: 20001 + protocol: TCP + targetPort: 20001 + selector: + app: spring-cloud-a + type: ClusterIP diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/sc-b-svc.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/sc-b-svc.yaml new file mode 100644 index 00000000..2a266b61 --- /dev/null +++ b/mse-simple-demo/helm/mse-simple-demo/templates/sc-b-svc.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: sc-b + namespace: {{ .Release.Namespace }} +spec: + ports: + - port: 20002 + protocol: TCP + targetPort: 20002 + selector: + app: spring-cloud-b + type: ClusterIP diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/sc-c-svc.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/sc-c-svc.yaml new file mode 100644 index 00000000..ab12b4f3 --- /dev/null +++ b/mse-simple-demo/helm/mse-simple-demo/templates/sc-c-svc.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: sc-c + namespace: {{ .Release.Namespace }} +spec: + ports: + - port: 20003 + protocol: TCP + targetPort: 20003 + selector: + app: spring-cloud-c + type: ClusterIP diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-a-deployment.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-a-deployment.yaml index 2e2bc749..d362ddf9 100644 --- a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-a-deployment.yaml +++ b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-a-deployment.yaml @@ -8,6 +8,7 @@ spec: selector: matchLabels: app: spring-cloud-a + version: base strategy: rollingUpdate: maxSurge: 100% @@ -19,6 +20,7 @@ spec: # msePilotAutoEnable: "on" msePilotCreateAppName: "spring-cloud-a" app: "spring-cloud-a" + version: base spec: containers: - name: spring-cloud-a diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml index 295ad6e7..a7570d24 100644 --- a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml +++ b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-a-gray-deployment.yaml @@ -7,7 +7,7 @@ spec: replicas: 1 selector: matchLabels: - app: spring-cloud-a-gray + app: spring-cloud-a version: gray strategy: rollingUpdate: @@ -20,7 +20,7 @@ spec: # msePilotAutoEnable: "on" msePilotCreateAppName: "spring-cloud-a" alicloud.service.tag: gray - app: "spring-cloud-a-gray" + app: "spring-cloud-a" version: gray spec: containers: diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-deployment.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-deployment.yaml index 2f4ea67a..ea99bbd1 100644 --- a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-deployment.yaml +++ b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-deployment.yaml @@ -8,6 +8,7 @@ spec: selector: matchLabels: app: spring-cloud-c + version: base strategy: rollingUpdate: maxSurge: 100% @@ -19,6 +20,7 @@ spec: # msePilotAutoEnable: "on" msePilotCreateAppName: "spring-cloud-c" app: "spring-cloud-c" + version: base spec: containers: - name: spring-cloud-c diff --git a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml index 76121cd2..060f8bf2 100644 --- a/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml +++ b/mse-simple-demo/helm/mse-simple-demo/templates/spring-cloud-c-gray-deployment.yaml @@ -7,7 +7,7 @@ spec: replicas: 1 selector: matchLabels: - app: spring-cloud-c-gray + app: spring-cloud-c version: gray strategy: rollingUpdate: @@ -20,7 +20,7 @@ spec: # msePilotAutoEnable: "on" msePilotCreateAppName: "spring-cloud-c" alicloud.service.tag: gray - app: "spring-cloud-c-gray" + app: "spring-cloud-c" version: gray spec: containers: diff --git a/mse-simple-demo/helm/mse-simple-demo/values.yaml b/mse-simple-demo/helm/mse-simple-demo/values.yaml index 217de8df..9c331082 100644 --- a/mse-simple-demo/helm/mse-simple-demo/values.yaml +++ b/mse-simple-demo/helm/mse-simple-demo/values.yaml @@ -2,7 +2,7 @@ registry: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/ images: - version: 3.0.8 + version: 3.0.8-sb3-jdk21 # 是否启动zuul、springcloud网关 gateway: diff --git a/mse-simple-demo/istio/destination-rule-all.yaml b/mse-simple-demo/istio/destination-rule-all.yaml new file mode 100644 index 00000000..cebcdba4 --- /dev/null +++ b/mse-simple-demo/istio/destination-rule-all.yaml @@ -0,0 +1,42 @@ +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: sc-a +spec: + host: sc-a + subsets: + - name: base + labels: + version: base + - name: gray + labels: + version: gray +--- +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: sc-b +spec: + host: sc-b + subsets: + - name: base + labels: + version: base + - name: gray + labels: + version: gray + +--- +apiVersion: networking.istio.io/v1alpha3 +kind: DestinationRule +metadata: + name: sc-c +spec: + host: sc-c + subsets: + - name: base + labels: + version: base + - name: gray + labels: + version: gray diff --git a/mse-simple-demo/istio/virtual-service-all-gray.yaml b/mse-simple-demo/istio/virtual-service-all-gray.yaml new file mode 100644 index 00000000..6a9ec463 --- /dev/null +++ b/mse-simple-demo/istio/virtual-service-all-gray.yaml @@ -0,0 +1,25 @@ +apiVersion: networking.istio.io/v1 +kind: VirtualService +metadata: + name: sc-a +spec: + hosts: + - sc-a + http: + - route: + - destination: + host: sc-a + subset: gray +--- +apiVersion: networking.istio.io/v1 +kind: VirtualService +metadata: + name: sc-c +spec: + hosts: + - sc-c + http: + - route: + - destination: + host: sc-c + subset: gray diff --git a/mse-simple-demo/mysql/build.sh b/mse-simple-demo/mysql/build.sh index c05aa45e..1336578d 100755 --- a/mse-simple-demo/mysql/build.sh +++ b/mse-simple-demo/mysql/build.sh @@ -2,7 +2,7 @@ export REGISTRY=${REGISTRY} export appName=demo-mysql -export VERSION="${VERSION:-3.0.8}" +export VERSION="${VERSION:-3.0.8-sb3-jdk21}" set -e diff --git a/mse-simple-demo/pom.xml b/mse-simple-demo/pom.xml index 68cd799c..43cab9fa 100644 --- a/mse-simple-demo/pom.xml +++ b/mse-simple-demo/pom.xml @@ -5,13 +5,13 @@ 4.0.0 - 3.0.8 + 3.0.8-sb3-jdk21 com.alibabacloud.mse.demo mse-simple-demo - 3.0.8 + 3.0.8-sb3-jdk21 A B