diff --git a/eclipse/checkstyle-suppressions.xml b/eclipse/checkstyle-suppressions.xml index eda2bdc85c..b2e0b9ffbc 100644 --- a/eclipse/checkstyle-suppressions.xml +++ b/eclipse/checkstyle-suppressions.xml @@ -5,5 +5,7 @@ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 72c63cb936..66cbed9c83 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.springframework.cloud spring-cloud-build - 4.1.3 + 4.3.0 @@ -80,13 +80,13 @@ - 2023.0.3.3 + 2025.0.0.0 - 2023.0.3 + 2025.0.0 - 3.2.9 + 3.5.0 3.8.1 diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml index 870669c2d7..661d1873cb 100644 --- a/spring-cloud-alibaba-dependencies/pom.xml +++ b/spring-cloud-alibaba-dependencies/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-dependencies-parent - 4.1.0 + 4.3.0 @@ -18,15 +18,16 @@ Spring Cloud Alibaba Dependencies - 2023.0.3.3 + 2025.0.0.0 1.8.8 - 2.4.2 - 2.1.0 + 3.0.1 + 2.3.0 - 5.3.1 + 5.3.3 + 5.3.2 - 4.23.0 + 6.9.0 1.11.4 @@ -167,7 +168,7 @@ org.apache.rocketmq rocketmq-acl - ${rocketmq.version} + ${rocketmq.acl.version} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/loadbalancer/NacosLoadBalancer.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/loadbalancer/NacosLoadBalancer.java index 6856072472..290d33ab94 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/loadbalancer/NacosLoadBalancer.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/main/java/com/alibaba/cloud/nacos/loadbalancer/NacosLoadBalancer.java @@ -25,7 +25,6 @@ import com.alibaba.cloud.commons.lang.StringUtils; import com.alibaba.cloud.nacos.NacosDiscoveryProperties; import com.alibaba.cloud.nacos.util.InetIPv6Utils; -import com.alibaba.nacos.client.naming.utils.CollectionUtils; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -149,7 +148,7 @@ private Response getInstanceResponse(Request request, .get("nacos.cluster"); return StringUtils.equals(cluster, clusterName); }).collect(Collectors.toList()); - if (!CollectionUtils.isEmpty(sameClusterInstances)) { + if (!sameClusterInstances.isEmpty()) { instancesToChoose = sameClusterInstances; } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java index 969c2759bc..d91d02448f 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-discovery/src/test/java/com/alibaba/cloud/nacos/registry/MockNamingService.java @@ -18,10 +18,12 @@ import java.util.Collections; import java.util.List; +import java.util.concurrent.Future; import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.api.naming.NamingService; import com.alibaba.nacos.api.naming.listener.EventListener; +import com.alibaba.nacos.api.naming.listener.FuzzyWatchEventWatcher; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.api.naming.pojo.ListView; import com.alibaba.nacos.api.naming.pojo.ServiceInfo; @@ -370,4 +372,35 @@ public void unsubscribe(String s, NamingSelector namingSelector, EventListener e public void unsubscribe(String s, String s1, NamingSelector namingSelector, EventListener eventListener) throws NacosException { } + + @Override + public void fuzzyWatch(String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException { + + } + + @Override + public void fuzzyWatch(String serviceNamePattern, String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException { + + } + + @Override + public Future> fuzzyWatchWithServiceKeys(String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException { + return null; + } + + @Override + public Future> fuzzyWatchWithServiceKeys(String serviceNamePattern, String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException { + return null; + } + + @Override + public void cancelFuzzyWatch(String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException { + + } + + @Override + public void cancelFuzzyWatch(String serviceNamePattern, String groupNamePattern, FuzzyWatchEventWatcher listener) throws NacosException { + + } + } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/BaseHttpInputMessage.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/BaseHttpInputMessage.java new file mode 100644 index 0000000000..2133f9b18d --- /dev/null +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/BaseHttpInputMessage.java @@ -0,0 +1,62 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed 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 + * + * https://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 com.alibaba.cloud.sentinel.rest; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpInputMessage; +import org.springframework.util.Assert; + + +public class BaseHttpInputMessage implements HttpInputMessage { + + private final HttpHeaders headers = new HttpHeaders(); + private final InputStream body; + + + /** + * Create a {@code MockHttpInputMessage} with the supplied body. + */ + public BaseHttpInputMessage(byte[] body) { + Assert.notNull(body, "Byte array must not be null"); + this.body = new ByteArrayInputStream(body); + } + + /** + * Create a {@code MockHttpInputMessage} with the supplied body. + */ + public BaseHttpInputMessage(InputStream body) { + Assert.notNull(body, "InputStream must not be null"); + this.body = body; + } + + + @Override + public HttpHeaders getHeaders() { + return this.headers; + } + + @Override + public InputStream getBody() throws IOException { + return this.body; + } + +} + diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/SentinelClientHttpResponse.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/SentinelClientHttpResponse.java index be8c9cdba8..df239e4f28 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/SentinelClientHttpResponse.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-sentinel/src/main/java/com/alibaba/cloud/sentinel/rest/SentinelClientHttpResponse.java @@ -16,66 +16,95 @@ package com.alibaba.cloud.sentinel.rest; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import com.alibaba.cloud.sentinel.annotation.SentinelRestTemplate; -import com.alibaba.cloud.sentinel.custom.SentinelProtectInterceptor; - -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.client.AbstractClientHttpResponse; +import org.springframework.http.HttpStatusCode; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.Assert; -/** - * Using by {@link SentinelRestTemplate} and {@link SentinelProtectInterceptor}. - * - * @author Jim - */ -public class SentinelClientHttpResponse extends AbstractClientHttpResponse { - private String blockResponse = "RestTemplate request block by sentinel"; +public class SentinelClientHttpResponse extends BaseHttpInputMessage implements ClientHttpResponse { + + private final HttpStatusCode statusCode; + private static final String BLOCK_RESPONSE = "RestTemplate request block by sentinel"; + //private String blockResponse = BLOCK_RESPONSE; + + /** + * Create a {@code SentinelMyClientHttpResponse} with an empty response body and + * HTTP status code {@link HttpStatus#OK OK}. + * + * @since 6.0.3 + */ public SentinelClientHttpResponse() { + this(BLOCK_RESPONSE.getBytes(), HttpStatus.OK); } public SentinelClientHttpResponse(String blockResponse) { - this.blockResponse = blockResponse; + this(blockResponse.getBytes(), HttpStatus.OK); } - @Override - public int getRawStatusCode() throws IOException { - return HttpStatus.OK.value(); + /** + * Create a {@code SentinelMyClientHttpResponse} with response body as a byte array + * and the supplied HTTP status code. + */ + public SentinelClientHttpResponse(byte[] body, HttpStatusCode statusCode) { + super(body); + Assert.notNull(statusCode, "HttpStatusCode must not be null"); + this.statusCode = statusCode; } - @Override - public String getStatusText() throws IOException { - return blockResponse; + /** + * Create a {@code SentinelMyClientHttpResponse} with response body as a byte array + * and a custom HTTP status code. + * + * @since 5.3.17 + */ + public SentinelClientHttpResponse(byte[] body, int statusCode) { + this(body, HttpStatusCode.valueOf(statusCode)); } + /** + * Create a {@code SentinelMyClientHttpResponse} with response body as {@link InputStream} + * and the supplied HTTP status code. + */ + public SentinelClientHttpResponse(InputStream body, HttpStatusCode statusCode) { + super(body); + Assert.notNull(statusCode, "HttpStatusCode must not be null"); + this.statusCode = statusCode; + } + + /** + * Create a {@code SentinelMyClientHttpResponse} with response body as {@link InputStream} + * and a custom HTTP status code. + * + * @since 5.3.17 + */ + public SentinelClientHttpResponse(InputStream body, int statusCode) { + this(body, HttpStatusCode.valueOf(statusCode)); + } + + @Override - public void close() { - // nothing do + public HttpStatusCode getStatusCode() { + return this.statusCode; } @Override - public InputStream getBody() throws IOException { - return new ByteArrayInputStream(blockResponse.getBytes()); + public String getStatusText() { + return (this.statusCode instanceof HttpStatus status ? status.getReasonPhrase() : ""); } @Override - public HttpHeaders getHeaders() { - Map> headers = new HashMap<>(); - headers.put(HttpHeaders.CONTENT_TYPE, - Arrays.asList(MediaType.APPLICATION_JSON_VALUE)); - HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.putAll(headers); - return httpHeaders; + public void close() { + try { + getBody().close(); + } + catch (IOException ex) { + // ignore + } } }