From 4450abcb93235c361fd2958afd6f7eae09302360 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Mon, 10 Nov 2025 20:35:03 +0800 Subject: [PATCH 01/14] Fixing the issue where microservices cannot be registered when enabling RBAC authentication in a dual-engine disaster recovery scenario. --- .../client/ConfigCenterAddressManager.java | 6 +- .../center/client/ConfigCenterClient.java | 19 ++- .../config/kie/client/KieClient.java | 19 ++- .../kie/client/model/KieAddressManager.java | 5 +- .../client/model/KieAddressManagerTest.java | 4 +- .../client/DashboardAddressManager.java | 5 +- .../dashboard/client/AddressManagerTest.java | 4 +- .../client/common/AbstractAddressManager.java | 114 ++++++++++++++++-- .../http/client/common/HttpTransportImpl.java | 15 ++- .../http/client/event}/OperationEvents.java | 10 +- .../common/AbstractAddressManagerTest.java | 22 +++- .../client/ServiceCenterAddressManager.java | 5 +- .../center/client/ServiceCenterClient.java | 35 +----- .../center/client/ServiceCenterOperation.java | 2 +- .../center/client/ServiceCenterRawClient.java | 48 ++++++-- .../ServiceCenterAddressManagerTest.java | 9 +- .../client/ServiceCenterRawClientTest.java | 4 +- .../RegistryClientTest.java | 4 +- .../ConfigCenterConfigurationSourceImpl.java | 5 +- ...nfigCenterConfigurationSourceImplTest.java | 9 +- .../ConfigCenterAddressManagerTest.java | 9 +- .../kie/KieConfigurationSourceImpl.java | 7 +- .../foundation/auth/AuthHeaderProvider.java | 8 +- .../monitor/DefaultMonitorDataPublisher.java | 5 +- .../auth/RBACBootStrapService.java | 3 +- .../auth/TokenAuthHeaderProvider.java | 2 +- .../auth/TokenCacheManager.java | 2 +- .../serviceregistry/client/IpPortManager.java | 3 +- .../client/http/EmptyAuthHeaderProvider.java | 2 +- .../ServiceRegistryAddressManager.java | 6 +- .../client/http/MockAuthHeaderProvider.java | 2 +- .../ServiceRegistryAddressManagerTest.java | 12 +- 32 files changed, 291 insertions(+), 114 deletions(-) rename clients/{service-center-client/src/main/java/org/apache/servicecomb/service/center/client => http-client-common/src/main/java/org/apache/servicecomb/http/client/event}/OperationEvents.java (79%) diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java index 3b346153a0b..5c1be004595 100644 --- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java +++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.config.center.client; +import java.util.ArrayList; import java.util.List; import org.apache.servicecomb.http.client.common.AbstractAddressManager; @@ -28,8 +29,9 @@ public class ConfigCenterAddressManager extends AbstractAddressManager { - public ConfigCenterAddressManager(String projectName, List addresses, EventBus eventBus) { - super(projectName, addresses); + public ConfigCenterAddressManager(String projectName, List addresses, List sameSideAddresses, + List diffSideAddresses, EventBus eventBus) { + super(projectName, addresses, sameSideAddresses, diffSideAddresses); eventBus.register(this); } diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java index 7763f5ec64a..1b6c4e70fc4 100644 --- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java +++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterClient.java @@ -32,6 +32,7 @@ import org.apache.servicecomb.http.client.common.HttpResponse; import org.apache.servicecomb.http.client.common.HttpTransport; import org.apache.servicecomb.http.client.common.HttpUtils; +import org.apache.servicecomb.http.client.event.OperationEvents.UnAuthorizedOperationEvent; import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,12 +62,15 @@ public class ConfigCenterClient implements ConfigCenterOperation { private final Map> dimensionConfigNames = new HashMap<>(); + private EventBus eventBus; + public ConfigCenterClient(ConfigCenterAddressManager addressManager, HttpTransport httpTransport) { this.addressManager = addressManager; this.httpTransport = httpTransport; } public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; addressManager.setEventBus(eventBus); } @@ -88,6 +92,7 @@ public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsReques HttpRequest.GET); HttpResponse httpResponse = httpTransport.doRequest(httpRequest); + recordAndSendUnAuthorizedEvent(httpResponse, address); if (httpResponse.getStatusCode() == HttpStatus.SC_OK) { Map> allConfigMap = HttpUtils.deserialize( httpResponse.getContent(), @@ -121,21 +126,17 @@ public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsReques } queryConfigurationsResponse.setConfigurations(configurations); queryConfigurationsResponse.setChanged(true); - addressManager.recordSuccessState(address); return queryConfigurationsResponse; } else if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_MODIFIED) { queryConfigurationsResponse.setChanged(false); - addressManager.recordSuccessState(address); return queryConfigurationsResponse; } else if (httpResponse.getStatusCode() == HttpStatus.SC_TOO_MANY_REQUESTS) { LOGGER.warn("rate limited, keep the local dimension [{}] configs unchanged.", dimensionsInfo); queryConfigurationsResponse.setChanged(false); - addressManager.recordSuccessState(address); return queryConfigurationsResponse; } else if (httpResponse.getStatusCode() == HttpStatus.SC_BAD_REQUEST) { throw new OperationException("Bad request for query configurations."); } else { - addressManager.recordFailState(address); throw new OperationException( "read response failed. status:" + httpResponse.getStatusCode() @@ -151,6 +152,16 @@ public QueryConfigurationsResponse queryConfigurations(QueryConfigurationsReques } } + private void recordAndSendUnAuthorizedEvent(HttpResponse response, String address) { + if (this.eventBus != null && response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + LOGGER.warn("query configuration unauthorized from server [{}], message [{}]", address, response.getMessage()); + addressManager.recordFailState(address); + this.eventBus.post(new UnAuthorizedOperationEvent(address)); + } else { + addressManager.recordSuccessState(address); + } + } + /** * Only the name of the new configuration item is printed. * No log is printed when the configuration content is updated. diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java index 7d6cd6548c2..175baadfbbf 100644 --- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java +++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java @@ -46,6 +46,7 @@ import org.apache.servicecomb.http.client.common.HttpResponse; import org.apache.servicecomb.http.client.common.HttpTransport; import org.apache.servicecomb.http.client.common.HttpUtils; +import org.apache.servicecomb.http.client.event.OperationEvents.UnAuthorizedOperationEvent; import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,6 +72,8 @@ public class KieClient implements KieConfigOperation { private final Map> dimensionConfigNames = new HashMap<>(); + private EventBus eventBus; + public KieClient(KieAddressManager addressManager, HttpTransport httpTransport, KieConfiguration kieConfiguration) { this.httpTransport = httpTransport; this.addressManager = addressManager; @@ -78,6 +81,7 @@ public KieClient(KieAddressManager addressManager, HttpTransport httpTransport, } public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; addressManager.setEventBus(eventBus); } @@ -91,6 +95,7 @@ public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request, HttpRequest httpRequest = new HttpRequest(url, null, null, HttpRequest.GET); HttpResponse httpResponse = httpTransport.doRequest(httpRequest); + recordAndSendUnAuthorizedEvent(httpResponse, address); ConfigurationsResponse configurationsResponse = new ConfigurationsResponse(); if (httpResponse.getStatusCode() == HttpStatus.SC_OK) { revision = httpResponse.getHeader("X-Kie-Revision"); @@ -100,7 +105,6 @@ public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request, configurationsResponse.setConfigurations(configurations); configurationsResponse.setChanged(true); configurationsResponse.setRevision(revision); - addressManager.recordSuccessState(address); return configurationsResponse; } if (httpResponse.getStatusCode() == HttpStatus.SC_BAD_REQUEST) { @@ -108,16 +112,13 @@ public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request, } if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_MODIFIED) { configurationsResponse.setChanged(false); - addressManager.recordSuccessState(address); return configurationsResponse; } if (httpResponse.getStatusCode() == HttpStatus.SC_TOO_MANY_REQUESTS) { LOGGER.warn("rate limited, keep the local dimension [{}] configs unchanged.", request.getLabelsQuery()); configurationsResponse.setChanged(false); - addressManager.recordSuccessState(address); return configurationsResponse; } - addressManager.recordFailState(address); throw new OperationException( "read response failed. status:" + httpResponse.getStatusCode() + "; message:" + httpResponse.getMessage() + "; content:" + httpResponse.getContent()); @@ -128,6 +129,16 @@ public ConfigurationsResponse queryConfigurations(ConfigurationsRequest request, } } + private void recordAndSendUnAuthorizedEvent(HttpResponse response, String address) { + if (this.eventBus != null && response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { + LOGGER.warn("query configuration unauthorized from server [{}], message [{}]", address, response.getMessage()); + addressManager.recordFailState(address); + this.eventBus.post(new UnAuthorizedOperationEvent(address)); + } else { + addressManager.recordSuccessState(address); + } + } + /** * Only the name of the new configuration item is printed. * No log is printed when the configuration content is updated. diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java index 0742c11fb10..dc162bb8791 100644 --- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java +++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java @@ -27,8 +27,9 @@ public class KieAddressManager extends AbstractAddressManager { - public KieAddressManager(List addresses, EventBus eventBus) { - super(addresses); + public KieAddressManager(List addresses, List sameSideAddresses, List diffSideAddresses, + EventBus eventBus) { + super(addresses, sameSideAddresses, diffSideAddresses); eventBus.register(this); } diff --git a/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java b/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java index 6533fc60e57..3f5662f4618 100644 --- a/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java +++ b/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java @@ -40,7 +40,7 @@ class KieAddressManagerTest { public void kieAddressManagerTest() throws NoSuchFieldException, IllegalAccessException { addresses.add("http://127.0.0.1:30103"); addresses.add("https://127.0.0.2:30103"); - addressManager1 = new KieAddressManager(addresses, new EventBus()); + addressManager1 = new KieAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus()); Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager1, 0); @@ -64,7 +64,7 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new KieAddressManager(addresses, new EventBus()); + addressManager1 = new KieAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "KIE"); addressManager1.refreshEndpoint(event, "KIE"); diff --git a/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java b/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java index 9dd8c6a3448..4e7ffa9c242 100644 --- a/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java +++ b/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java @@ -29,8 +29,9 @@ public class DashboardAddressManager extends AbstractAddressManager { - public DashboardAddressManager(List addresses, EventBus eventBus) { - super(addresses); + public DashboardAddressManager(List addresses, List sameSideAddresses, + List diffSideAddresses, EventBus eventBus) { + super(addresses, sameSideAddresses, diffSideAddresses); eventBus.register(this); } diff --git a/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java b/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java index ac0c08b3eb4..ff265477e15 100644 --- a/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java +++ b/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java @@ -41,7 +41,7 @@ class AddressManagerTest { public void kieAddressManagerTest() throws IllegalAccessException, NoSuchFieldException { addresses.add("http://127.0.0.1:30103"); addresses.add("https://127.0.0.2:30103"); - addressManager1 = new DashboardAddressManager(addresses, new EventBus()); + addressManager1 = new DashboardAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus()); Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager1, 0); @@ -65,7 +65,7 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new DashboardAddressManager(addresses, new EventBus()); + addressManager1 = new DashboardAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseMonitoring"); addressManager1.refreshEndpoint(event, "CseMonitoring"); diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java index 7493aff4e69..a84b09a5858 100644 --- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java +++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.http.client.common; +import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -24,7 +25,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.servicecomb.http.client.event.EngineConnectChangedEvent; import org.apache.servicecomb.http.client.event.RefreshEndpointEvent; import org.slf4j.Logger; @@ -74,20 +75,59 @@ public class AbstractAddressManager { private EventBus eventBus; - public AbstractAddressManager(List addresses) { + private List sameSideAddresses = new ArrayList<>(); + + private final List isolationSameSideAddresses = new ArrayList<>(); + + private List diffSideAddresses = new ArrayList<>(); + + private final List isolationDiffSideAddresses = new ArrayList<>(); + + public AbstractAddressManager(List addresses, List sameSideAddresses, + List diffSideAddresses) { this.projectName = DEFAULT_PROJECT; - this.addresses.addAll(addresses); - this.defaultAddress.addAll(addresses); + initAddresses(addresses, sameSideAddresses, diffSideAddresses); this.index = !addresses.isEmpty() ? getRandomIndex() : 0; } - public AbstractAddressManager(String projectName, List addresses) { + private void initAddresses(List addresses, List sameSideAddresses, List diffSideAddresses) { + if (addresses != null) { + this.addresses.addAll(addresses); + this.defaultAddress.addAll(addresses); + } + if (sameSideAddresses != null) { + this.sameSideAddresses.addAll(sameSideAddresses); + this.defaultAddress.addAll(sameSideAddresses); + } + if (diffSideAddresses != null) { + this.diffSideAddresses.addAll(diffSideAddresses); + this.defaultAddress.addAll(diffSideAddresses); + } + } + + public AbstractAddressManager(String projectName, List addresses, List sameSideAddresses, + List diffSideAddresses) { this.projectName = StringUtils.isEmpty(projectName) ? DEFAULT_PROJECT : projectName; - this.addresses = this.transformAddress(addresses); - this.defaultAddress.addAll(addresses); + initAddressesWithFormat(addresses, sameSideAddresses, diffSideAddresses); this.index = !addresses.isEmpty() ? getRandomIndex() : 0; } + private void initAddressesWithFormat(List addresses, List sameSideAddresses, + List diffSideAddresses) { + if (addresses != null) { + this.addresses = this.transformAddress(addresses); + this.defaultAddress.addAll(addresses); + } + if (sameSideAddresses != null) { + this.sameSideAddresses = this.transformAddress(sameSideAddresses); + this.defaultAddress.addAll(sameSideAddresses); + } + if (diffSideAddresses != null) { + this.diffSideAddresses = this.transformAddress(diffSideAddresses); + this.defaultAddress.addAll(diffSideAddresses); + } + } + private int getRandomIndex() { return random.nextInt(addresses.size()); } @@ -156,9 +196,15 @@ public String address() { } private String getDefaultAddress() { + if (!sameSideAddresses.isEmpty()) { + return getCurrentAddress(sameSideAddresses); + } if (!addresses.isEmpty()) { return getCurrentAddress(addresses); } + if (!diffSideAddresses.isEmpty()) { + return getCurrentAddress(diffSideAddresses); + } LOGGER.warn("all addresses are isolation, please check server status."); // when all addresses are isolation, it will use all default address for polling. return getCurrentAddress(defaultAddress); @@ -170,8 +216,9 @@ private String getAvailableZoneAddress() { return getCurrentAddress(zoneOrRegionAddress); } LOGGER.warn("all auto discovery addresses are isolation, please check server status."); + // when all available address are isolation, it will use config addresses for polling. - return getCurrentAddress(addresses); + return getDefaultAddress(); } private String getCurrentAddress(List addresses) { @@ -215,12 +262,28 @@ public void recordSuccessState(String address) { LOGGER.warn("restore default address [{}]", address); addresses.add(address); } + if (isolationSameSideAddresses.remove(address)) { + LOGGER.warn("restore same side server address [{}]", address); + if (eventBus != null && sameSideAddresses.isEmpty()) { + eventBus.post(new EngineConnectChangedEvent()); + } + sameSideAddresses.add(address); + } + if (isolationDiffSideAddresses.remove(address)) { + LOGGER.warn("restore different side server address [{}]", address); + diffSideAddresses.add(address); + } } public void resetFailureStatus(String address) { addressFailureStatus.put(address, 0); } + /** + * Only authentication failure, IO, and timeout exception record as failed. + * + * @param address request address + */ public void recordFailState(String address) { synchronized (lock) { if (!addressFailureStatus.containsKey(address)) { @@ -245,6 +308,17 @@ void removeAddress(String address) { LOGGER.warn("isolation default address [{}]", address); defaultIsolationAddress.add(address); } + if (sameSideAddresses.remove(address)) { + LOGGER.warn("isolation same side server address [{}]", address); + isolationSameSideAddresses.add(address); + if (eventBus != null && sameSideAddresses.isEmpty() && !diffSideAddresses.isEmpty()) { + eventBus.post(new EngineConnectChangedEvent()); + } + } + if (diffSideAddresses.remove(address)) { + LOGGER.warn("isolation different side server address [{}]", address); + isolationDiffSideAddresses.add(address); + } return; } if (availableZone.remove(address)) { @@ -267,8 +341,32 @@ public void setEventBus(EventBus eventBus) { public List getIsolationAddresses() { List isolationAddresses = new ArrayList<>(defaultIsolationAddress); + isolationAddresses.addAll(isolationSameSideAddresses); + isolationAddresses.addAll(isolationDiffSideAddresses); isolationAddresses.addAll(isolationZoneAddress); isolationAddresses.addAll(isolationRegionAddress); return isolationAddresses; } + + public String compareAndGetAddress(String host) { + for (String address : defaultAddress) { + if (isAddressHostSame(address, host)) { + return address; + } + } + return ""; + } + + private boolean isAddressHostSame(String address, String host) { + if (StringUtils.isEmpty(host)) { + return false; + } + try { + URI uri = new URI(address); + return host.equals(uri.getHost()); + } catch (Exception e) { + LOGGER.warn("Exception occurred while constructing URI using the address [{}]", address); + } + return false; + } } diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java index da87892929c..4f03f112f7c 100644 --- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java +++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/HttpTransportImpl.java @@ -18,6 +18,7 @@ package org.apache.servicecomb.http.client.common; import java.io.IOException; +import java.net.URI; import java.util.Map; import org.apache.http.client.HttpClient; @@ -87,7 +88,7 @@ public HttpResponse doRequest(HttpRequest httpRequest) throws IOException { globalHeaders.forEach(httpRequest::addHeader); } - httpRequest.getHeaders().putAll(requestAuthHeaderProvider.loadAuthHeader(createSignRequest())); + httpRequest.getHeaders().putAll(requestAuthHeaderProvider.loadAuthHeader(createSignRequest(httpRequest.getUrl()))); //get Http response org.apache.http.HttpResponse response = httpClient.execute(httpRequest.getRealRequest()); @@ -98,9 +99,15 @@ public HttpResponse doRequest(HttpRequest httpRequest) throws IOException { response.getAllHeaders()); } - private static SignRequest createSignRequest() { - // Now the implementations do not process SignRequest, so return null. Maybe future will use it. - return null; + private static SignRequest createSignRequest(String url) { + try { + URI uri = URI.create(url); + SignRequest signRequest = new SignRequest(); + signRequest.setEndpoint(uri); + return signRequest; + } catch (Exception e) { + return null; + } } @Override diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/OperationEvents.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/OperationEvents.java similarity index 79% rename from clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/OperationEvents.java rename to clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/OperationEvents.java index 62274519ea4..69896f750ec 100644 --- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/OperationEvents.java +++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/event/OperationEvents.java @@ -15,10 +15,18 @@ * limitations under the License. */ -package org.apache.servicecomb.service.center.client; +package org.apache.servicecomb.http.client.event; public abstract class OperationEvents { public static class UnAuthorizedOperationEvent extends OperationEvents { + private final String address; + public UnAuthorizedOperationEvent(String address) { + this.address = address; + } + + public String getAddress() { + return address; + } } } diff --git a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java index b831d032491..f20b1200fe9 100644 --- a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java +++ b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java @@ -46,9 +46,9 @@ public class AbstractAddressManagerTest { public void setUp() throws NoSuchFieldException, IllegalAccessException { addresses.add("http://127.0.0.1:30103"); addresses.add("https://127.0.0.2:30103"); - addressManager1 = new AbstractAddressManager(addresses); - addressManager2 = new AbstractAddressManager("project", addresses); - addressManager3 = new AbstractAddressManager(null, addresses); + addressManager1 = new AbstractAddressManager(addresses, new ArrayList<>(), new ArrayList<>()); + addressManager2 = new AbstractAddressManager("project", addresses, new ArrayList<>(), new ArrayList<>()); + addressManager3 = new AbstractAddressManager(null, addresses, new ArrayList<>(), new ArrayList<>()); Field addressManagerField = addressManager1.getClass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager1, 0); @@ -88,7 +88,8 @@ public void recordStateTest() throws ExecutionException { zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "TEST"); - AbstractAddressManager addressManager = new AbstractAddressManager(addresses) {}; + AbstractAddressManager addressManager = new AbstractAddressManager(addresses, new ArrayList<>(), + new ArrayList<>()) {}; addressManager.refreshEndpoint(event, "TEST"); @@ -124,7 +125,7 @@ public void recordStateTest() throws ExecutionException { @Test public void testMultipleThread() throws Exception { - AbstractAddressManager addressManager = new AbstractAddressManager(addresses); + AbstractAddressManager addressManager = new AbstractAddressManager(addresses, new ArrayList<>(), new ArrayList<>()); String address = "http://127.0.0.3:30100"; CountDownLatch latch = new CountDownLatch(2); @@ -302,4 +303,15 @@ public void normalizeIPV6Test() { uri = addressManager1.normalizeUri("rest://[2008::7:957f:b2d6:1af4:a1f8]:30100"); Assertions.assertEquals("http://[2008::7:957f:b2d6:1af4:a1f8]:30100", uri); } + + @Test + public void compareAndGetAddressTest() { + List testAddr = new ArrayList<>(); + testAddr.add("https://192.168.20.160:30100"); + testAddr.add("https://127.0.0.1:30100"); + testAddr.add("https://127.0.0.3:30100"); + AbstractAddressManager manager = new AbstractAddressManager(testAddr, new ArrayList<>(), new ArrayList<>()); + Assertions.assertTrue(manager.compareAndGetAddress("192.168.20.16").isEmpty()); + Assertions.assertEquals("https://192.168.20.160:30100", manager.compareAndGetAddress("192.168.20.160")); + } } diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java index a5fd128ab1e..9f99ebef229 100644 --- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java +++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java @@ -26,8 +26,9 @@ import com.google.common.eventbus.Subscribe; public class ServiceCenterAddressManager extends AbstractAddressManager { - public ServiceCenterAddressManager(String projectName, List addresses, EventBus eventBus) { - super(projectName, addresses); + public ServiceCenterAddressManager(String projectName, List addresses, List sameSideAddresses, + List diffSideAddresses, EventBus eventBus) { + super(projectName, addresses, sameSideAddresses, diffSideAddresses); eventBus.register(this); } diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java index 56e07bae055..9f6e2baf88e 100755 --- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java +++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java @@ -33,7 +33,6 @@ import org.apache.servicecomb.http.client.common.HttpTransport; import org.apache.servicecomb.http.client.common.HttpTransportFactory; import org.apache.servicecomb.http.client.common.HttpUtils; -import org.apache.servicecomb.service.center.client.OperationEvents.UnAuthorizedOperationEvent; import org.apache.servicecomb.service.center.client.exception.OperationException; import org.apache.servicecomb.service.center.client.model.CreateMicroserviceInstanceRequest; import org.apache.servicecomb.service.center.client.model.CreateMicroserviceRequest; @@ -76,8 +75,6 @@ public class ServiceCenterClient implements ServiceCenterOperation { private final ServiceCenterRawClient httpClient; - private EventBus eventBus; - private ServiceCenterAddressManager addressManager; public ServiceCenterClient(ServiceCenterRawClient httpClient) { @@ -85,8 +82,8 @@ public ServiceCenterClient(ServiceCenterRawClient httpClient) { } public ServiceCenterClient setEventBus(EventBus eventBus) { - this.eventBus = eventBus; addressManager.setEventBus(eventBus); + this.httpClient.setEventBus(eventBus); return this; } @@ -124,7 +121,6 @@ public MicroserviceInstancesResponse getServiceCenterInstances() { if (response.getStatusCode() == HttpStatus.SC_OK) { return HttpUtils.deserialize(response.getContent(), MicroserviceInstancesResponse.class); } - sendUnAuthorizedEvent(response); throw new OperationException( "get service-center instances fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -145,7 +141,6 @@ public RegisteredMicroserviceResponse registerMicroservice(Microservice microser if (response.getStatusCode() == HttpStatus.SC_OK) { return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceResponse.class); } - sendUnAuthorizedEvent(response); throw new OperationException( "register service fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -163,7 +158,6 @@ public MicroservicesResponse getMicroserviceList() { if (response.getStatusCode() == HttpStatus.SC_OK) { return HttpUtils.deserialize(response.getContent(), MicroservicesResponse.class); } - sendUnAuthorizedEvent(response); throw new OperationException( "get service List fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -188,7 +182,6 @@ public RegisteredMicroserviceResponse queryServiceId(Microservice microservice) if (response.getStatusCode() == HttpStatus.SC_OK) { return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceResponse.class); } - sendUnAuthorizedEvent(response); LOGGER.info("Query serviceId fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() + "; content = " + response.getContent()); @@ -211,7 +204,6 @@ public Microservice getMicroserviceByServiceId(String serviceId) { .deserialize(response.getContent(), MicroserviceResponse.class); return microserviceResponse.getService(); } - sendUnAuthorizedEvent(response); throw new OperationException( "get service message fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -233,7 +225,6 @@ public RegisteredMicroserviceInstanceResponse registerMicroserviceInstance(Micro if (response.getStatusCode() == HttpStatus.SC_OK) { return HttpUtils.deserialize(response.getContent(), RegisteredMicroserviceInstanceResponse.class); } - sendUnAuthorizedEvent(response); throw new OperationException( "register service instance fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -274,7 +265,6 @@ public FindMicroserviceInstancesResponse findMicroserviceInstance(String consume result.setModified(false); return result; } - sendUnAuthorizedEvent(response); throw new OperationException( "get service instances list fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -293,7 +283,6 @@ public MicroserviceInstancesResponse getMicroserviceInstanceList(String serviceI if (response.getStatusCode() == HttpStatus.SC_OK) { return HttpUtils.deserialize(response.getContent(), MicroserviceInstancesResponse.class); } - sendUnAuthorizedEvent(response); throw new OperationException( "get service instances list fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -314,7 +303,6 @@ public MicroserviceInstance getMicroserviceInstance(String serviceId, String ins .deserialize(response.getContent(), MicroserviceInstanceResponse.class); return instanceResponse.getInstance(); } - sendUnAuthorizedEvent(response); throw new OperationException( "get service instance message fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -334,7 +322,6 @@ public void deleteMicroserviceInstance(String serviceId, String instanceId) { LOGGER.info("Delete service instance successfully."); return; } - sendUnAuthorizedEvent(response); throw new OperationException( "delete service instance fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -354,7 +341,6 @@ public boolean updateMicroserviceInstanceStatus(String serviceId, String instanc if (response.getStatusCode() == HttpStatus.SC_OK) { return true; } - sendUnAuthorizedEvent(response); throw new OperationException( "update service instance status fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -373,7 +359,6 @@ public void sendHeartBeats(HeartbeatsRequest heartbeatsRequest) { if (response.getStatusCode() == HttpStatus.SC_OK) { return; } - sendUnAuthorizedEvent(response); throw new OperationException( "heartbeats fails, statusCode = " + response.getStatusCode() + "; message = " + response.getMessage() + "; content = " + response.getContent()); @@ -393,7 +378,6 @@ public boolean sendHeartBeat(String serviceId, String instanceId) { if (response.getStatusCode() == HttpStatus.SC_OK) { return true; } - sendUnAuthorizedEvent(response); throw new OperationException( "heartbeats fails, statusCode = " + response.getStatusCode() + "; message = " + response.getMessage() + "; content = " + response.getContent()); @@ -418,7 +402,6 @@ public List getServiceSchemasList(String serviceId, boolean withCont .deserialize(response.getContent(), GetSchemaListResponse.class); return getSchemaResponse.getSchemas(); } - sendUnAuthorizedEvent(response); throw new OperationException( "get service schemas list fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -445,7 +428,6 @@ public String getServiceSchemaContext(String serviceId, String schemaId) { GetSchemaResponse getSchemaResponse = HttpUtils.deserialize(response.getContent(), GetSchemaResponse.class); return getSchemaResponse.getSchema(); } - sendUnAuthorizedEvent(response); throw new OperationException( "get service schema context fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -465,7 +447,6 @@ public boolean registerSchema(String serviceId, String schemaId, CreateSchemaReq if (response.getStatusCode() == HttpStatus.SC_OK) { return true; } - sendUnAuthorizedEvent(response); throw new OperationException( "update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -488,7 +469,6 @@ public boolean updateServiceSchemaContext(String serviceId, SchemaInfo schemaInf if (response.getStatusCode() == HttpStatus.SC_OK) { return true; } - sendUnAuthorizedEvent(response); throw new OperationException( "update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -508,7 +488,6 @@ public boolean batchUpdateServiceSchemaContext(String serviceId, ModifySchemasRe if (response.getStatusCode() == HttpStatus.SC_OK) { return true; } - sendUnAuthorizedEvent(response); throw new OperationException( "update service schema fails, statusCode = " + response.getStatusCode() + "; message = " + response .getMessage() @@ -519,18 +498,13 @@ public boolean batchUpdateServiceSchemaContext(String serviceId, ModifySchemasRe } } - private void sendUnAuthorizedEvent(HttpResponse response) { - if (this.eventBus != null && response.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - this.eventBus.post(new UnAuthorizedOperationEvent()); - } - } - @Override - public RbacTokenResponse queryToken(RbacTokenRequest request) { + public RbacTokenResponse queryToken(RbacTokenRequest request, String host) { try { + String queryAddress = addressManager.compareAndGetAddress(host); HttpResponse response = httpClient .postHttpRequestAbsoluteUrl("/v4/token", null, - HttpUtils.serialize(request)); + HttpUtils.serialize(request), queryAddress); if (response.getStatusCode() == HttpStatus.SC_OK) { RbacTokenResponse result = HttpUtils.deserialize(response.getContent(), RbacTokenResponse.class); result.setStatusCode(HttpStatus.SC_OK); @@ -570,7 +544,6 @@ public boolean updateMicroserviceProperties(String serviceId, Map headers, String content) + public HttpResponse postHttpRequestAbsoluteUrl(String url, Map headers, String content, String address) throws IOException { - return doHttpRequest(url, true, headers, content, HttpRequest.POST); + return doHttpRequest(url, true, headers, content, HttpRequest.POST, address); } public HttpResponse postHttpRequest(String url, Map headers, String content) throws IOException { - return doHttpRequest(url, false, headers, content, HttpRequest.POST); + return doHttpRequest(url, false, headers, content, HttpRequest.POST, ""); } public HttpResponse putHttpRequest(String url, Map headers, String content) throws IOException { - return doHttpRequest(url, false, headers, content, HttpRequest.PUT); + return doHttpRequest(url, false, headers, content, HttpRequest.PUT, ""); } public HttpResponse deleteHttpRequest(String url, Map headers, String content) throws IOException { - return doHttpRequest(url, false, headers, content, HttpRequest.DELETE); + return doHttpRequest(url, false, headers, content, HttpRequest.DELETE, ""); } private HttpResponse doHttpRequest(String url, boolean absoluteUrl, Map headers, String content, - String method) - throws IOException { - String address = addressManager.address(); + String method, String queryAddress) throws IOException { + String address = StringUtils.isEmpty(queryAddress) ? addressManager.address() : queryAddress; String formatUrl = addressManager.formatUrl(url, absoluteUrl, address); HttpRequest httpRequest = buildHttpRequest(formatUrl, headers, content, method); - + HttpResponse httpResponse; try { - HttpResponse httpResponse = httpTransport.doRequest(httpRequest); - addressManager.recordSuccessState(address); + httpResponse = httpTransport.doRequest(httpRequest); + recordAndSendUnAuthorizedEvent(httpResponse, address); return httpResponse; } catch (IOException e) { addressManager.recordFailState(address); @@ -87,7 +93,9 @@ private HttpResponse doHttpRequest(String url, boolean absoluteUrl, Map headers, St return new HttpRequest(url, headers, content, method); } + public void setEventBus(EventBus eventBus) { + this.eventBus = eventBus; + } + public static class Builder { private String tenantName; diff --git a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java index f5c316cd848..307d4f6d6a9 100644 --- a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java +++ b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java @@ -41,7 +41,8 @@ class ServiceCenterAddressManagerTest { @Test public void getUrlPrefix() { addresses.add("http://127.0.0.1:30103"); - addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus()); + addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(), + new ArrayList<>(), new EventBus()); Assertions.assertNotNull(addressManager1); @@ -55,7 +56,8 @@ public void getUrlPrefix() { @Test public void formatUrlTest() { addresses.add("http://127.0.0.1:30103"); - addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus()); + addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(), + new ArrayList<>(), new EventBus()); Assertions.assertNotNull(addressManager1); String address = addressManager1.address(); @@ -76,7 +78,8 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new ServiceCenterAddressManager("project", addresses, new EventBus()); + addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(), + new ArrayList<>(), new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "SERVICECENTER"); addressManager1.refreshEndpoint(event, "SERVICECENTER"); diff --git a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java index 29337e31a44..18476427eb7 100755 --- a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java +++ b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java @@ -18,6 +18,7 @@ package org.apache.servicecomb.service.center.client; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import org.apache.servicecomb.http.client.common.HttpResponse; @@ -41,7 +42,8 @@ public class ServiceCenterRawClientTest { public void TestDefaultParameter() throws IOException { HttpTransport httpTransport = Mockito.mock(HttpTransport.class); - ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager(PROJECT_NAME, Arrays.asList("http://127.0.0.1:30100"), new EventBus()); + ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager(PROJECT_NAME, + Arrays.asList("http://127.0.0.1:30100"), new ArrayList<>(), new ArrayList<>(), new EventBus()); ServiceCenterRawClient client = new ServiceCenterRawClient.Builder() .setHttpTransport(httpTransport) .setAddressManager(addressManager) diff --git a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java index 50ae96db158..e81e43a9ab4 100644 --- a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java +++ b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java @@ -69,8 +69,8 @@ public RegistryClientTest(Environment environment) { @Override public void testRestTransport() throws Exception { - ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager("default", Arrays.asList("http://127.0.0.1:30100"), - new EventBus()); + ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager("default", + Arrays.asList("http://127.0.0.1:30100"),new ArrayList<>(), new ArrayList<>(), new EventBus()); SSLProperties sslProperties = new SSLProperties(); sslProperties.setEnabled(false); ServiceCenterClient serviceCenterClient = new ServiceCenterClient(addressManager, sslProperties, diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java index 492c5658f2f..1b898880ef2 100644 --- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java +++ b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.config; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -188,8 +189,9 @@ private HttpTransport createHttpTransport(ConfigCenterAddressManager configCente private static RequestAuthHeaderProvider getRequestAuthHeaderProvider(List authHeaderProviders) { return signRequest -> { + String host = signRequest != null && signRequest.getEndpoint() != null ? signRequest.getEndpoint().getHost() : ""; Map headers = new HashMap<>(); - authHeaderProviders.forEach(provider -> headers.putAll(provider.authHeaders())); + authHeaderProviders.forEach(provider -> headers.putAll(provider.authHeaders(host))); return headers; }; } @@ -198,6 +200,7 @@ private ConfigCenterAddressManager configCenterAddressManager() { return new ConfigCenterAddressManager(ConfigCenterConfig.INSTANCE.getDomainName(), Deployment .getSystemBootStrapInfo(ConfigCenterDefaultDeploymentProvider.SYSTEM_KEY_CONFIG_CENTER).getAccessURL(), + new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); } diff --git a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java index 4a9b64a886e..2ee76f9b858 100644 --- a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java +++ b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java @@ -36,7 +36,8 @@ void configAddressManagerTest() throws IllegalAccessException, NoSuchFieldExcept List addresses = new ArrayList<>(); addresses.add("http://127.0.0.1:30103"); addresses.add("http://127.0.0.2:30103"); - ConfigCenterAddressManager addressManager = new ConfigCenterAddressManager("test", addresses, EventManager.getEventBus()); + ConfigCenterAddressManager addressManager = new ConfigCenterAddressManager("test", addresses, + new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); Field addressManagerField = addressManager.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager, 0); @@ -47,7 +48,8 @@ void configAddressManagerTest() throws IllegalAccessException, NoSuchFieldExcept address = addressManager.address(); Assertions.assertEquals("http://127.0.0.1:30103/v3/test", address); - addressManager = new ConfigCenterAddressManager(null, addresses, EventManager.getEventBus()); + addressManager = new ConfigCenterAddressManager(null, addresses, new ArrayList<>(), new ArrayList<>(), + EventManager.getEventBus()); addressManagerField = addressManager.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager, 0); @@ -65,7 +67,8 @@ void onRefreshEndpointEventTest() { zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", new ArrayList<>()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseConfigCenter"); - ConfigCenterAddressManager addressManager = new ConfigCenterAddressManager("test", addresses, EventManager.getEventBus()); + ConfigCenterAddressManager addressManager = new ConfigCenterAddressManager("test", addresses, + new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); addressManager.onRefreshEndpointEvent(event); List availableAZ = addressManager.getAvailableZone(); diff --git a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManagerTest.java b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManagerTest.java index f47cc35beea..d8891c717a8 100644 --- a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManagerTest.java +++ b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManagerTest.java @@ -40,8 +40,10 @@ class ConfigCenterAddressManagerTest { public void addressManagerTest() throws NoSuchFieldException, IllegalAccessException { addresses.add("http://127.0.0.1:30103"); addresses.add("https://127.0.0.2:30103"); - addressManager1 = new ConfigCenterAddressManager("project", addresses, new EventBus()); - addressManager2 = new ConfigCenterAddressManager(null, addresses, new EventBus()); + addressManager1 = new ConfigCenterAddressManager("project", addresses, new ArrayList<>(), + new ArrayList<>(), new EventBus()); + addressManager2 = new ConfigCenterAddressManager(null, addresses, new ArrayList<>(), new ArrayList<>(), + new EventBus()); Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager1, 0); @@ -70,7 +72,8 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new ConfigCenterAddressManager("project", addresses, new EventBus()); + addressManager1 = new ConfigCenterAddressManager("project", addresses, new ArrayList<>(), + new ArrayList<>(), new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseConfigCenter"); addressManager1.refreshEndpoint(event, "CseConfigCenter"); diff --git a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java index 51446608909..46ec5b4fb10 100644 --- a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java +++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java @@ -17,6 +17,7 @@ package org.apache.servicecomb.config.kie; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -169,15 +170,17 @@ private HttpTransport createHttpTransport(KieAddressManager kieAddressManager, R private static RequestAuthHeaderProvider getRequestAuthHeaderProvider(List authHeaderProviders) { return signRequest -> { + String host = signRequest != null && signRequest.getEndpoint() != null ? signRequest.getEndpoint().getHost() : ""; Map headers = new HashMap<>(); - authHeaderProviders.forEach(provider -> headers.putAll(provider.authHeaders())); + authHeaderProviders.forEach(provider -> headers.putAll(provider.authHeaders(host))); return headers; }; } private KieAddressManager configKieAddressManager() { return new KieAddressManager( - Arrays.asList(KieConfig.INSTANCE.getServerUri().split(",")), EventManager.getEventBus()); + Arrays.asList(KieConfig.INSTANCE.getServerUri().split(",")), new ArrayList<>(), new ArrayList<>(), + EventManager.getEventBus()); } private void updateConfiguration(WatchedUpdateResult result) { diff --git a/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java b/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java index 313c19ee5ba..6de6463fb4a 100644 --- a/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java +++ b/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java @@ -21,11 +21,15 @@ import java.util.Map; public interface AuthHeaderProvider { - default Map authHeaders() { + default Map authHeaders(String host) { return new HashMap<>(0); } default Map getSignAuthHeaders(SignRequest request) { - return authHeaders(); + String host = ""; + if (request != null && request.getEndpoint() != null) { + host = request.getEndpoint().getHost(); + } + return authHeaders(host); } } diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java index de350f78779..9e100086da5 100644 --- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java +++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java @@ -76,7 +76,7 @@ private DashboardAddressManager createDashboardAddressManager() { throw new IllegalStateException("dashboard address is not configured."); } - return new DashboardAddressManager(addresses, EventManager.getEventBus()); + return new DashboardAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); } private HttpTransport createHttpTransport(DashboardAddressManager addressManager, RequestConfig requestConfig, @@ -111,8 +111,9 @@ private HttpTransport createHttpTransport(DashboardAddressManager addressManager private static RequestAuthHeaderProvider getRequestAuthHeaderProvider(List authHeaderProviders) { return signRequest -> { + String host = signRequest != null && signRequest.getEndpoint() != null ? signRequest.getEndpoint().getHost() : ""; Map headers = new HashMap<>(); - authHeaderProviders.forEach(provider -> headers.putAll(provider.authHeaders())); + authHeaderProviders.forEach(provider -> headers.putAll(provider.authHeaders(host))); return headers; }; } diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/RBACBootStrapService.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/RBACBootStrapService.java index 1c599c4cca7..2dec8cd1da7 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/RBACBootStrapService.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/RBACBootStrapService.java @@ -19,6 +19,7 @@ import static org.apache.servicecomb.foundation.ssl.SSLOption.DEFAULT_OPTION; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -94,7 +95,7 @@ Cipher getCipher(String cipherName) { private ServiceCenterAddressManager createAddressManager(Environment environment) { return new ServiceCenterAddressManager(getTenantName(environment), - getRBACAddressList(environment), EventManager.getEventBus()); + getRBACAddressList(environment), new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); } private SSLProperties createSSLProperties(Environment environment, String tag) { diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenAuthHeaderProvider.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenAuthHeaderProvider.java index 0f075568313..a926f9ffd0b 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenAuthHeaderProvider.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenAuthHeaderProvider.java @@ -26,7 +26,7 @@ public class TokenAuthHeaderProvider implements AuthHeaderProvider { @Override - public Map authHeaders() { + public Map authHeaders(String host) { String token = TokenCacheManager.getInstance().getToken(RBACBootStrapService.DEFAULT_REGISTRY_NAME); if (StringUtils.isEmpty(token)) { return new HashMap<>(); diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java index e43f9127b7f..cf3bf840908 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java @@ -169,7 +169,7 @@ private String createHeaders() { request.setName(accountName); request.setPassword(new String(cipher.decrypt(password.toCharArray()))); - RbacTokenResponse rbacTokenResponse = serviceCenterClient.queryToken(request); + RbacTokenResponse rbacTokenResponse = serviceCenterClient.queryToken(request, ""); this.lastStatusCode = rbacTokenResponse.getStatusCode(); this.lastErrorCode = rbacTokenResponse.getErrorCode(); diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java index 1dcd10a0e4c..34e471f258a 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java @@ -66,7 +66,8 @@ public IpPortManager(ServiceRegistryConfig serviceRegistryConfig) { throw new IllegalArgumentException("Service center address is required to start the application."); } List addresses = defaultIpPort.stream().map(IpPort::toString).collect(Collectors.toList()); - addressManger = new ServiceRegistryAddressManager(addresses, EventManager.getEventBus()); + addressManger = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), + EventManager.getEventBus()); classificationAddress = new ClassificationAddress(serviceRegistryConfig, instanceCacheManager); LOGGER.info("Initial service center address is {}", getAvailableAddress()); } diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/EmptyAuthHeaderProvider.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/EmptyAuthHeaderProvider.java index 37828b4ad15..79dc86cfdbc 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/EmptyAuthHeaderProvider.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/EmptyAuthHeaderProvider.java @@ -24,7 +24,7 @@ public class EmptyAuthHeaderProvider implements AuthHeaderProvider { @Override - public Map authHeaders() { + public Map authHeaders(String host) { return new HashMap<>(0); } } diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java index 4f25eafba44..7feb8aad288 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java @@ -18,6 +18,7 @@ package org.apache.servicecomb.serviceregistry.refresh; import java.net.URI; +import java.util.ArrayList; import java.util.List; import org.apache.servicecomb.foundation.common.net.IpPort; @@ -31,8 +32,9 @@ public class ServiceRegistryAddressManager extends AbstractAddressManager { private static final String URI_PREFIX = "rest://"; - public ServiceRegistryAddressManager(List addresses, EventBus eventBus) { - super(addresses); + public ServiceRegistryAddressManager(List addresses, List sameSideAddresses, + List diffSideAddresses, EventBus eventBus) { + super(addresses, sameSideAddresses, diffSideAddresses); eventBus.register(this); } diff --git a/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/client/http/MockAuthHeaderProvider.java b/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/client/http/MockAuthHeaderProvider.java index ea210a6c197..64ae22092e9 100644 --- a/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/client/http/MockAuthHeaderProvider.java +++ b/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/client/http/MockAuthHeaderProvider.java @@ -24,7 +24,7 @@ public class MockAuthHeaderProvider implements AuthHeaderProvider { @Override - public Map authHeaders() { + public Map authHeaders(String host) { HashMap headers = new HashMap<>(); headers.put("X-Service-AK", "blah..."); return headers; diff --git a/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManagerTest.java b/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManagerTest.java index d6a181b4f48..15e3db42c03 100644 --- a/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManagerTest.java +++ b/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManagerTest.java @@ -44,8 +44,10 @@ class ServiceRegistryAddressManagerTest { public void addressManagerTest() { IpPort ipPort = new IpPort("127.0.0.1", 30103); addresses.add(ipPort.toString()); - addressManager1 = new ServiceRegistryAddressManager(addresses, new EventBus()); - addressManager2 = new ServiceRegistryAddressManager(addresses, new EventBus()); + addressManager1 = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), + new EventBus()); + addressManager2 = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), + new EventBus()); Assertions.assertNotNull(addressManager1); Assertions.assertNotNull(addressManager2); @@ -70,7 +72,8 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new ServiceRegistryAddressManager(addresses, new EventBus()); + addressManager1 = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), + new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "SERVICECENTER"); addressManager1.refreshEndpoint(event, "SERVICECENTER"); @@ -88,7 +91,8 @@ public void addressIPV6Test() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", new ArrayList<>()); - addressManager1 = new ServiceRegistryAddressManager(addresses, EventManager.getEventBus()); + addressManager1 = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), + EventManager.getEventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "SERVICECENTER"); addressManager1.refreshEndpoint(event, "SERVICECENTER"); From e8efddcde250cc1d7f1b2fc041db221643f9d6a9 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Tue, 11 Nov 2025 09:59:17 +0800 Subject: [PATCH 02/14] fixed style issues --- .../config/center/client/ConfigCenterAddressManager.java | 1 - .../demo/multiServiceCenterClient/RegistryClientTest.java | 2 +- demo/docker-build-config/pom.xml | 2 +- .../serviceregistry/refresh/ServiceRegistryAddressManager.java | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java index 5c1be004595..23db2facbea 100644 --- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java +++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java @@ -17,7 +17,6 @@ package org.apache.servicecomb.config.center.client; -import java.util.ArrayList; import java.util.List; import org.apache.servicecomb.http.client.common.AbstractAddressManager; diff --git a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java index e81e43a9ab4..b10a70af1ca 100644 --- a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java +++ b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java @@ -70,7 +70,7 @@ public RegistryClientTest(Environment environment) { @Override public void testRestTransport() throws Exception { ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager("default", - Arrays.asList("http://127.0.0.1:30100"),new ArrayList<>(), new ArrayList<>(), new EventBus()); + Arrays.asList("http://127.0.0.1:30100"), new ArrayList<>(), new ArrayList<>(), new EventBus()); SSLProperties sslProperties = new SSLProperties(); sslProperties.setEnabled(false); ServiceCenterClient serviceCenterClient = new ServiceCenterClient(addressManager, sslProperties, diff --git a/demo/docker-build-config/pom.xml b/demo/docker-build-config/pom.xml index 4faa3efdd33..55cb647b917 100644 --- a/demo/docker-build-config/pom.xml +++ b/demo/docker-build-config/pom.xml @@ -42,7 +42,7 @@ ${project.artifactId}:${project.version} ${project.artifactId} - openjdk:8-jre-alpine + openjdk8 7070 8080 diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java index 7feb8aad288..e71d543a2ed 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java @@ -18,7 +18,6 @@ package org.apache.servicecomb.serviceregistry.refresh; import java.net.URI; -import java.util.ArrayList; import java.util.List; import org.apache.servicecomb.foundation.common.net.IpPort; From 40d521a5feae1ae1fcfe466b121d5dcb50d1751c Mon Sep 17 00:00:00 2001 From: chengyouling Date: Tue, 11 Nov 2025 19:39:55 +0800 Subject: [PATCH 03/14] fixed image --- demo/docker-build-config/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/docker-build-config/pom.xml b/demo/docker-build-config/pom.xml index 55cb647b917..05e55e6d166 100644 --- a/demo/docker-build-config/pom.xml +++ b/demo/docker-build-config/pom.xml @@ -42,7 +42,7 @@ ${project.artifactId}:${project.version} ${project.artifactId} - openjdk8 + openjdk:8-jre 7070 8080 From e248274d3dcc9e061c3fabc418a0e7308e7a0a01 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Tue, 11 Nov 2025 19:51:00 +0800 Subject: [PATCH 04/14] change to 8.0.392 --- demo/docker-build-config/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/docker-build-config/pom.xml b/demo/docker-build-config/pom.xml index 05e55e6d166..ff9b3f7fe36 100644 --- a/demo/docker-build-config/pom.xml +++ b/demo/docker-build-config/pom.xml @@ -42,7 +42,7 @@ ${project.artifactId}:${project.version} ${project.artifactId} - openjdk:8-jre + openjdk:8.0.392 7070 8080 From a63eb10efb9d9147409c48b81e4e20281750dab9 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Tue, 11 Nov 2025 20:13:23 +0800 Subject: [PATCH 05/14] change to 8-jre-slim --- demo/docker-build-config/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/docker-build-config/pom.xml b/demo/docker-build-config/pom.xml index ff9b3f7fe36..409c64e76d5 100644 --- a/demo/docker-build-config/pom.xml +++ b/demo/docker-build-config/pom.xml @@ -42,7 +42,7 @@ ${project.artifactId}:${project.version} ${project.artifactId} - openjdk:8.0.392 + openjdk:8-jre-slim 7070 8080 From 6896f91e7177cbe424264802ad5cf5d8ca660236 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Tue, 11 Nov 2025 20:18:04 +0800 Subject: [PATCH 06/14] change to openjdk:8u342-jre --- demo/docker-build-config/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/docker-build-config/pom.xml b/demo/docker-build-config/pom.xml index 409c64e76d5..625e01894ab 100644 --- a/demo/docker-build-config/pom.xml +++ b/demo/docker-build-config/pom.xml @@ -42,7 +42,7 @@ ${project.artifactId}:${project.version} ${project.artifactId} - openjdk:8-jre-slim + openjdk:8u342-jre 7070 8080 From 59d393c2f42a06d6abdb7717f339b52e470b728a Mon Sep 17 00:00:00 2001 From: chengyouling Date: Thu, 13 Nov 2025 17:33:54 +0800 Subject: [PATCH 07/14] change to address set datacenter info --- .../client/ConfigCenterAddressManager.java | 6 +- .../kie/client/model/KieAddressManager.java | 5 +- .../client/model/KieAddressManagerTest.java | 4 +- .../client/DashboardAddressManager.java | 5 +- .../dashboard/client/AddressManagerTest.java | 4 +- .../client/common/AbstractAddressManager.java | 122 ++++++++---------- .../common/AbstractAddressManagerTest.java | 13 +- .../client/ServiceCenterAddressManager.java | 6 +- .../ServiceCenterAddressManagerTest.java | 9 +- .../client/ServiceCenterRawClientTest.java | 3 +- .../RegistryClientTest.java | 2 +- .../ConfigCenterConfigurationSourceImpl.java | 15 ++- ...nfigCenterConfigurationSourceImplTest.java | 7 +- .../ConfigCenterAddressManagerTest.java | 9 +- .../kie/KieConfigurationSourceImpl.java | 8 +- .../foundation/auth/AuthHeaderProvider.java | 6 + .../monitor/DefaultMonitorDataPublisher.java | 8 +- .../auth/RBACBootStrapService.java | 5 +- .../serviceregistry/client/IpPortManager.java | 14 +- .../ServiceRegistryAddressManager.java | 6 +- .../ServiceRegistryAddressManagerTest.java | 12 +- 21 files changed, 137 insertions(+), 132 deletions(-) diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java index 23db2facbea..62dcb7f8da9 100644 --- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java +++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManager.java @@ -28,9 +28,9 @@ public class ConfigCenterAddressManager extends AbstractAddressManager { - public ConfigCenterAddressManager(String projectName, List addresses, List sameSideAddresses, - List diffSideAddresses, EventBus eventBus) { - super(projectName, addresses, sameSideAddresses, diffSideAddresses); + public ConfigCenterAddressManager(String projectName, List addresses, String ownRegion, + String ownAvailableZone, EventBus eventBus) { + super(projectName, addresses, ownRegion, ownAvailableZone); eventBus.register(this); } diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java index dc162bb8791..d8b6582d846 100644 --- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java +++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/model/KieAddressManager.java @@ -27,9 +27,8 @@ public class KieAddressManager extends AbstractAddressManager { - public KieAddressManager(List addresses, List sameSideAddresses, List diffSideAddresses, - EventBus eventBus) { - super(addresses, sameSideAddresses, diffSideAddresses); + public KieAddressManager(List addresses, String ownRegion, String ownAvailableZone, EventBus eventBus) { + super(addresses, ownRegion, ownAvailableZone); eventBus.register(this); } diff --git a/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java b/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java index 3f5662f4618..4fd547a2ce2 100644 --- a/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java +++ b/clients/config-kie-client/src/test/java/org/apache/servicecomb/config/kie/client/model/KieAddressManagerTest.java @@ -40,7 +40,7 @@ class KieAddressManagerTest { public void kieAddressManagerTest() throws NoSuchFieldException, IllegalAccessException { addresses.add("http://127.0.0.1:30103"); addresses.add("https://127.0.0.2:30103"); - addressManager1 = new KieAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus()); + addressManager1 = new KieAddressManager(addresses, "", "", new EventBus()); Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager1, 0); @@ -64,7 +64,7 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new KieAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus()); + addressManager1 = new KieAddressManager(addresses, "", "", new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "KIE"); addressManager1.refreshEndpoint(event, "KIE"); diff --git a/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java b/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java index 4e7ffa9c242..e80c537bc46 100644 --- a/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java +++ b/clients/dashboard-client/src/main/java/org/apache/servicecomb/dashboard/client/DashboardAddressManager.java @@ -29,9 +29,8 @@ public class DashboardAddressManager extends AbstractAddressManager { - public DashboardAddressManager(List addresses, List sameSideAddresses, - List diffSideAddresses, EventBus eventBus) { - super(addresses, sameSideAddresses, diffSideAddresses); + public DashboardAddressManager(List addresses, String ownRegion, String ownAvailableZone, EventBus eventBus) { + super(addresses, ownRegion, ownAvailableZone); eventBus.register(this); } diff --git a/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java b/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java index ff265477e15..448f2d7170f 100644 --- a/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java +++ b/clients/dashboard-client/src/test/java/org/apache/servicecomb/dashboard/client/AddressManagerTest.java @@ -41,7 +41,7 @@ class AddressManagerTest { public void kieAddressManagerTest() throws IllegalAccessException, NoSuchFieldException { addresses.add("http://127.0.0.1:30103"); addresses.add("https://127.0.0.2:30103"); - addressManager1 = new DashboardAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus()); + addressManager1 = new DashboardAddressManager(addresses, "", "", new EventBus()); Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager1, 0); @@ -65,7 +65,7 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new DashboardAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), new EventBus()); + addressManager1 = new DashboardAddressManager(addresses, "", "", new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseMonitoring"); addressManager1.refreshEndpoint(event, "CseMonitoring"); diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java index a84b09a5858..b5ad9f22afd 100644 --- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java +++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java @@ -30,6 +30,7 @@ import org.apache.servicecomb.http.client.event.RefreshEndpointEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; import com.google.common.annotations.VisibleForTesting; import com.google.common.eventbus.EventBus; @@ -43,6 +44,10 @@ public class AbstractAddressManager { private static final String V3_PREFIX = "/v3/"; + private static final String ZONE = "availableZone"; + + private static final String REGION = "region"; + private static final int ISOLATION_THRESHOLD = 3; private volatile List addresses = new ArrayList<>(); @@ -75,59 +80,61 @@ public class AbstractAddressManager { private EventBus eventBus; - private List sameSideAddresses = new ArrayList<>(); - - private final List isolationSameSideAddresses = new ArrayList<>(); - - private List diffSideAddresses = new ArrayList<>(); - - private final List isolationDiffSideAddresses = new ArrayList<>(); - - public AbstractAddressManager(List addresses, List sameSideAddresses, - List diffSideAddresses) { + public AbstractAddressManager(List addresses, String ownRegion, String ownAvailableZone) { this.projectName = DEFAULT_PROJECT; - initAddresses(addresses, sameSideAddresses, diffSideAddresses); + parseAndInitAddresses(addresses, ownRegion, ownAvailableZone, false); this.index = !addresses.isEmpty() ? getRandomIndex() : 0; } - private void initAddresses(List addresses, List sameSideAddresses, List diffSideAddresses) { - if (addresses != null) { - this.addresses.addAll(addresses); - this.defaultAddress.addAll(addresses); + /** + * address support config with region/availableZone info, to enable engine affinity calls during startup + * address may be like: + * https://192.168.20.13:30110?region=region1&availableZone=az + * https://192.168.20.13:30100?region=region1&availableZone=az + * When address have no datacenter information, roundRobin using address + * + * @param addresses engine addresses + * @param ownRegion microservice region + * @param ownAvailableZone microservice zone + * @param isFormat is need format + */ + private void parseAndInitAddresses(List addresses, String ownRegion, String ownAvailableZone, + boolean isFormat) { + if (CollectionUtils.isEmpty(addresses)) { + return; } - if (sameSideAddresses != null) { - this.sameSideAddresses.addAll(sameSideAddresses); - this.defaultAddress.addAll(sameSideAddresses); + List tesmpList = new ArrayList<>(); + addressAutoRefreshed = addresses.stream().anyMatch(addr -> addr.contains(ZONE) || addr.contains(REGION)); + for (String address : addresses) { + // Compatible IpPortManager init address is 127.0.0.1:30100 + if (!address.startsWith("http")) { + tesmpList.add(address); + continue; + } + URLEndPoint endpoint = new URLEndPoint(address); + tesmpList.add(endpoint.toString()); + buildAffinityAddress(endpoint, ownRegion, ownAvailableZone); } - if (diffSideAddresses != null) { - this.diffSideAddresses.addAll(diffSideAddresses); - this.defaultAddress.addAll(diffSideAddresses); + this.addresses.addAll(isFormat ? this.transformAddress(tesmpList) : tesmpList); + this.defaultAddress.addAll(isFormat ? this.transformAddress(tesmpList) : tesmpList); + } + + private void buildAffinityAddress(URLEndPoint endpoint, String ownRegion, String ownAvailableZone) { + if (addressAutoRefreshed) { + if (regionAndAZMatch(ownRegion, ownAvailableZone, endpoint.getFirst(REGION), endpoint.getFirst(ZONE))) { + availableZone.add(endpoint.toString()); + } else { + availableRegion.add(endpoint.toString()); + } } } - public AbstractAddressManager(String projectName, List addresses, List sameSideAddresses, - List diffSideAddresses) { + public AbstractAddressManager(String projectName, List addresses, String ownRegion, String ownAvailableZone) { this.projectName = StringUtils.isEmpty(projectName) ? DEFAULT_PROJECT : projectName; - initAddressesWithFormat(addresses, sameSideAddresses, diffSideAddresses); + parseAndInitAddresses(addresses, ownRegion, ownAvailableZone, true); this.index = !addresses.isEmpty() ? getRandomIndex() : 0; } - private void initAddressesWithFormat(List addresses, List sameSideAddresses, - List diffSideAddresses) { - if (addresses != null) { - this.addresses = this.transformAddress(addresses); - this.defaultAddress.addAll(addresses); - } - if (sameSideAddresses != null) { - this.sameSideAddresses = this.transformAddress(sameSideAddresses); - this.defaultAddress.addAll(sameSideAddresses); - } - if (diffSideAddresses != null) { - this.diffSideAddresses = this.transformAddress(diffSideAddresses); - this.defaultAddress.addAll(diffSideAddresses); - } - } - private int getRandomIndex() { return random.nextInt(addresses.size()); } @@ -196,15 +203,9 @@ public String address() { } private String getDefaultAddress() { - if (!sameSideAddresses.isEmpty()) { - return getCurrentAddress(sameSideAddresses); - } if (!addresses.isEmpty()) { return getCurrentAddress(addresses); } - if (!diffSideAddresses.isEmpty()) { - return getCurrentAddress(diffSideAddresses); - } LOGGER.warn("all addresses are isolation, please check server status."); // when all addresses are isolation, it will use all default address for polling. return getCurrentAddress(defaultAddress); @@ -262,17 +263,6 @@ public void recordSuccessState(String address) { LOGGER.warn("restore default address [{}]", address); addresses.add(address); } - if (isolationSameSideAddresses.remove(address)) { - LOGGER.warn("restore same side server address [{}]", address); - if (eventBus != null && sameSideAddresses.isEmpty()) { - eventBus.post(new EngineConnectChangedEvent()); - } - sameSideAddresses.add(address); - } - if (isolationDiffSideAddresses.remove(address)) { - LOGGER.warn("restore different side server address [{}]", address); - diffSideAddresses.add(address); - } } public void resetFailureStatus(String address) { @@ -308,17 +298,6 @@ void removeAddress(String address) { LOGGER.warn("isolation default address [{}]", address); defaultIsolationAddress.add(address); } - if (sameSideAddresses.remove(address)) { - LOGGER.warn("isolation same side server address [{}]", address); - isolationSameSideAddresses.add(address); - if (eventBus != null && sameSideAddresses.isEmpty() && !diffSideAddresses.isEmpty()) { - eventBus.post(new EngineConnectChangedEvent()); - } - } - if (diffSideAddresses.remove(address)) { - LOGGER.warn("isolation different side server address [{}]", address); - isolationDiffSideAddresses.add(address); - } return; } if (availableZone.remove(address)) { @@ -341,8 +320,6 @@ public void setEventBus(EventBus eventBus) { public List getIsolationAddresses() { List isolationAddresses = new ArrayList<>(defaultIsolationAddress); - isolationAddresses.addAll(isolationSameSideAddresses); - isolationAddresses.addAll(isolationDiffSideAddresses); isolationAddresses.addAll(isolationZoneAddress); isolationAddresses.addAll(isolationRegionAddress); return isolationAddresses; @@ -369,4 +346,9 @@ private boolean isAddressHostSame(String address, String host) { } return false; } + + private boolean regionAndAZMatch(String ownRegion, String ownAvailableZone, String engineRegion, + String engineAvailableZone) { + return ownRegion.equalsIgnoreCase(engineRegion) && ownAvailableZone.equals(engineAvailableZone); + } } diff --git a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java index f20b1200fe9..90754e0468f 100644 --- a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java +++ b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java @@ -46,9 +46,9 @@ public class AbstractAddressManagerTest { public void setUp() throws NoSuchFieldException, IllegalAccessException { addresses.add("http://127.0.0.1:30103"); addresses.add("https://127.0.0.2:30103"); - addressManager1 = new AbstractAddressManager(addresses, new ArrayList<>(), new ArrayList<>()); - addressManager2 = new AbstractAddressManager("project", addresses, new ArrayList<>(), new ArrayList<>()); - addressManager3 = new AbstractAddressManager(null, addresses, new ArrayList<>(), new ArrayList<>()); + addressManager1 = new AbstractAddressManager(addresses, "", ""); + addressManager2 = new AbstractAddressManager("project", addresses, "", ""); + addressManager3 = new AbstractAddressManager(null, addresses, "", ""); Field addressManagerField = addressManager1.getClass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager1, 0); @@ -88,8 +88,7 @@ public void recordStateTest() throws ExecutionException { zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "TEST"); - AbstractAddressManager addressManager = new AbstractAddressManager(addresses, new ArrayList<>(), - new ArrayList<>()) {}; + AbstractAddressManager addressManager = new AbstractAddressManager(addresses, "", "") {}; addressManager.refreshEndpoint(event, "TEST"); @@ -125,7 +124,7 @@ public void recordStateTest() throws ExecutionException { @Test public void testMultipleThread() throws Exception { - AbstractAddressManager addressManager = new AbstractAddressManager(addresses, new ArrayList<>(), new ArrayList<>()); + AbstractAddressManager addressManager = new AbstractAddressManager(addresses, "", ""); String address = "http://127.0.0.3:30100"; CountDownLatch latch = new CountDownLatch(2); @@ -310,7 +309,7 @@ public void compareAndGetAddressTest() { testAddr.add("https://192.168.20.160:30100"); testAddr.add("https://127.0.0.1:30100"); testAddr.add("https://127.0.0.3:30100"); - AbstractAddressManager manager = new AbstractAddressManager(testAddr, new ArrayList<>(), new ArrayList<>()); + AbstractAddressManager manager = new AbstractAddressManager(testAddr, "", ""); Assertions.assertTrue(manager.compareAndGetAddress("192.168.20.16").isEmpty()); Assertions.assertEquals("https://192.168.20.160:30100", manager.compareAndGetAddress("192.168.20.160")); } diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java index 9f99ebef229..f955c148af3 100644 --- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java +++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManager.java @@ -26,9 +26,9 @@ import com.google.common.eventbus.Subscribe; public class ServiceCenterAddressManager extends AbstractAddressManager { - public ServiceCenterAddressManager(String projectName, List addresses, List sameSideAddresses, - List diffSideAddresses, EventBus eventBus) { - super(projectName, addresses, sameSideAddresses, diffSideAddresses); + public ServiceCenterAddressManager(String projectName, List addresses, String ownRegion, + String ownAvailableZone, EventBus eventBus) { + super(projectName, addresses, ownRegion, ownAvailableZone); eventBus.register(this); } diff --git a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java index 307d4f6d6a9..d425cc5d449 100644 --- a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java +++ b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterAddressManagerTest.java @@ -41,8 +41,7 @@ class ServiceCenterAddressManagerTest { @Test public void getUrlPrefix() { addresses.add("http://127.0.0.1:30103"); - addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(), - new ArrayList<>(), new EventBus()); + addressManager1 = new ServiceCenterAddressManager("project", addresses, "", "", new EventBus()); Assertions.assertNotNull(addressManager1); @@ -56,8 +55,7 @@ public void getUrlPrefix() { @Test public void formatUrlTest() { addresses.add("http://127.0.0.1:30103"); - addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(), - new ArrayList<>(), new EventBus()); + addressManager1 = new ServiceCenterAddressManager("project", addresses, "", "", new EventBus()); Assertions.assertNotNull(addressManager1); String address = addressManager1.address(); @@ -78,8 +76,7 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new ServiceCenterAddressManager("project", addresses, new ArrayList<>(), - new ArrayList<>(), new EventBus()); + addressManager1 = new ServiceCenterAddressManager("project", addresses, "", "", new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "SERVICECENTER"); addressManager1.refreshEndpoint(event, "SERVICECENTER"); diff --git a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java index 18476427eb7..0cda29fc573 100755 --- a/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java +++ b/clients/service-center-client/src/test/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClientTest.java @@ -18,7 +18,6 @@ package org.apache.servicecomb.service.center.client; import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import org.apache.servicecomb.http.client.common.HttpResponse; @@ -43,7 +42,7 @@ public void TestDefaultParameter() throws IOException { HttpTransport httpTransport = Mockito.mock(HttpTransport.class); ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager(PROJECT_NAME, - Arrays.asList("http://127.0.0.1:30100"), new ArrayList<>(), new ArrayList<>(), new EventBus()); + Arrays.asList("http://127.0.0.1:30100"), "", "", new EventBus()); ServiceCenterRawClient client = new ServiceCenterRawClient.Builder() .setHttpTransport(httpTransport) .setAddressManager(addressManager) diff --git a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java index b10a70af1ca..bfcfc4bbf9a 100644 --- a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java +++ b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/RegistryClientTest.java @@ -70,7 +70,7 @@ public RegistryClientTest(Environment environment) { @Override public void testRestTransport() throws Exception { ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager("default", - Arrays.asList("http://127.0.0.1:30100"), new ArrayList<>(), new ArrayList<>(), new EventBus()); + Arrays.asList("http://127.0.0.1:30100"), "", "", new EventBus()); SSLProperties sslProperties = new SSLProperties(); sslProperties.setEnabled(false); ServiceCenterClient serviceCenterClient = new ServiceCenterClient(addressManager, sslProperties, diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java index 1b898880ef2..e0b508ae533 100644 --- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java +++ b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java @@ -17,7 +17,6 @@ package org.apache.servicecomb.config; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -55,6 +54,7 @@ import com.google.common.eventbus.Subscribe; import com.netflix.config.ConcurrentCompositeConfiguration; +import com.netflix.config.DynamicPropertyFactory; import com.netflix.config.WatchedUpdateListener; import com.netflix.config.WatchedUpdateResult; @@ -200,8 +200,17 @@ private ConfigCenterAddressManager configCenterAddressManager() { return new ConfigCenterAddressManager(ConfigCenterConfig.INSTANCE.getDomainName(), Deployment .getSystemBootStrapInfo(ConfigCenterDefaultDeploymentProvider.SYSTEM_KEY_CONFIG_CENTER).getAccessURL(), - new ArrayList<>(), new ArrayList<>(), - EventManager.getEventBus()); + getRegion(), getAvailableZone(), EventManager.getEventBus()); + } + + private String getRegion() { + return DynamicPropertyFactory.getInstance(). + getStringProperty("servicecomb.datacenter.region", "").get(); + } + + private String getAvailableZone() { + return DynamicPropertyFactory.getInstance(). + getStringProperty("servicecomb.datacenter.availableZone", "").get(); } private void updateConfiguration(WatchedUpdateResult result) { diff --git a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java index 2ee76f9b858..f5fa3d40488 100644 --- a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java +++ b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImplTest.java @@ -37,7 +37,7 @@ void configAddressManagerTest() throws IllegalAccessException, NoSuchFieldExcept addresses.add("http://127.0.0.1:30103"); addresses.add("http://127.0.0.2:30103"); ConfigCenterAddressManager addressManager = new ConfigCenterAddressManager("test", addresses, - new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); + "", "", EventManager.getEventBus()); Field addressManagerField = addressManager.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager, 0); @@ -48,8 +48,7 @@ void configAddressManagerTest() throws IllegalAccessException, NoSuchFieldExcept address = addressManager.address(); Assertions.assertEquals("http://127.0.0.1:30103/v3/test", address); - addressManager = new ConfigCenterAddressManager(null, addresses, new ArrayList<>(), new ArrayList<>(), - EventManager.getEventBus()); + addressManager = new ConfigCenterAddressManager(null, addresses, "", "", EventManager.getEventBus()); addressManagerField = addressManager.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager, 0); @@ -68,7 +67,7 @@ void onRefreshEndpointEventTest() { zoneAndRegion.put("sameRegion", new ArrayList<>()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseConfigCenter"); ConfigCenterAddressManager addressManager = new ConfigCenterAddressManager("test", addresses, - new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); + "", "", EventManager.getEventBus()); addressManager.onRefreshEndpointEvent(event); List availableAZ = addressManager.getAvailableZone(); diff --git a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManagerTest.java b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManagerTest.java index d8891c717a8..4592b867f78 100644 --- a/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManagerTest.java +++ b/dynamic-config/config-cc/src/test/java/org/apache/servicecomb/config/center/client/ConfigCenterAddressManagerTest.java @@ -40,10 +40,8 @@ class ConfigCenterAddressManagerTest { public void addressManagerTest() throws NoSuchFieldException, IllegalAccessException { addresses.add("http://127.0.0.1:30103"); addresses.add("https://127.0.0.2:30103"); - addressManager1 = new ConfigCenterAddressManager("project", addresses, new ArrayList<>(), - new ArrayList<>(), new EventBus()); - addressManager2 = new ConfigCenterAddressManager(null, addresses, new ArrayList<>(), new ArrayList<>(), - new EventBus()); + addressManager1 = new ConfigCenterAddressManager("project", addresses, "", "", new EventBus()); + addressManager2 = new ConfigCenterAddressManager(null, addresses, "", "", new EventBus()); Field addressManagerField = addressManager1.getClass().getSuperclass().getDeclaredField("index"); addressManagerField.setAccessible(true); addressManagerField.set(addressManager1, 0); @@ -72,8 +70,7 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new ConfigCenterAddressManager("project", addresses, new ArrayList<>(), - new ArrayList<>(), new EventBus()); + addressManager1 = new ConfigCenterAddressManager("project", addresses, "", "", new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "CseConfigCenter"); addressManager1.refreshEndpoint(event, "CseConfigCenter"); diff --git a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java index 46ec5b4fb10..7d37423f43b 100644 --- a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java +++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java @@ -17,7 +17,6 @@ package org.apache.servicecomb.config.kie; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -54,6 +53,7 @@ import com.google.common.eventbus.Subscribe; import com.netflix.config.ConcurrentCompositeConfiguration; +import com.netflix.config.DynamicPropertyFactory; import com.netflix.config.WatchedUpdateListener; import com.netflix.config.WatchedUpdateResult; @@ -178,8 +178,12 @@ private static RequestAuthHeaderProvider getRequestAuthHeaderProvider(List(), new ArrayList<>(), + Arrays.asList(KieConfig.INSTANCE.getServerUri().split(",")), region, availableZone, EventManager.getEventBus()); } diff --git a/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java b/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java index 6de6463fb4a..1e27d09ec73 100644 --- a/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java +++ b/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java @@ -21,6 +21,12 @@ import java.util.Map; public interface AuthHeaderProvider { + /** + * Obtain RBAC authentication request header, host is the key of cache, spring-cloud module have specific usage of host + * + * @param host engine address ip + * @return auth headers + */ default Map authHeaders(String host) { return new HashMap<>(0); } diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java index 9e100086da5..920f0b10396 100644 --- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java +++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/DefaultMonitorDataPublisher.java @@ -45,6 +45,8 @@ import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDataProvider; import org.apache.servicecomb.huaweicloud.dashboard.monitor.model.MonitorDataPublisher; +import com.netflix.config.DynamicPropertyFactory; + public class DefaultMonitorDataPublisher implements MonitorDataPublisher { private static final String SSL_KEY = "mc.consumer"; @@ -76,7 +78,11 @@ private DashboardAddressManager createDashboardAddressManager() { throw new IllegalStateException("dashboard address is not configured."); } - return new DashboardAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); + String region = DynamicPropertyFactory.getInstance(). + getStringProperty("servicecomb.datacenter.region", "").get(); + String availableZone = DynamicPropertyFactory.getInstance(). + getStringProperty("servicecomb.datacenter.availableZone", "").get(); + return new DashboardAddressManager(addresses, region, availableZone, EventManager.getEventBus()); } private HttpTransport createHttpTransport(DashboardAddressManager addressManager, RequestConfig requestConfig, diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/RBACBootStrapService.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/RBACBootStrapService.java index 2dec8cd1da7..a3671a3eb4d 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/RBACBootStrapService.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/RBACBootStrapService.java @@ -19,7 +19,6 @@ import static org.apache.servicecomb.foundation.ssl.SSLOption.DEFAULT_OPTION; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -94,8 +93,10 @@ Cipher getCipher(String cipherName) { } private ServiceCenterAddressManager createAddressManager(Environment environment) { + String region = environment.getProperty("servicecomb.datacenter.region", ""); + String availableZone = environment.getProperty("servicecomb.datacenter.availableZone", ""); return new ServiceCenterAddressManager(getTenantName(environment), - getRBACAddressList(environment), new ArrayList<>(), new ArrayList<>(), EventManager.getEventBus()); + getRBACAddressList(environment), region, availableZone, EventManager.getEventBus()); } private SSLProperties createSSLProperties(Environment environment, String tag) { diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java index 34e471f258a..759be2ef86c 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/IpPortManager.java @@ -33,6 +33,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.netflix.config.DynamicPropertyFactory; + public class IpPortManager { private static final Logger LOGGER = LoggerFactory.getLogger(IpPortManager.class); @@ -66,12 +68,22 @@ public IpPortManager(ServiceRegistryConfig serviceRegistryConfig) { throw new IllegalArgumentException("Service center address is required to start the application."); } List addresses = defaultIpPort.stream().map(IpPort::toString).collect(Collectors.toList()); - addressManger = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), + addressManger = new ServiceRegistryAddressManager(addresses, getRegion(), getAvailableZone(), EventManager.getEventBus()); classificationAddress = new ClassificationAddress(serviceRegistryConfig, instanceCacheManager); LOGGER.info("Initial service center address is {}", getAvailableAddress()); } + private String getRegion() { + return DynamicPropertyFactory.getInstance(). + getStringProperty("servicecomb.datacenter.region", "").get(); + } + + private String getAvailableZone() { + return DynamicPropertyFactory.getInstance(). + getStringProperty("servicecomb.datacenter.availableZone", "").get(); + } + // we have to do this operation after the first time setup has already done public void initAutoDiscovery() { if (!autoDiscoveryInited && this.serviceRegistryConfig.isRegistryAutoDiscovery()) { diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java index e71d543a2ed..25036cb1791 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java @@ -31,9 +31,9 @@ public class ServiceRegistryAddressManager extends AbstractAddressManager { private static final String URI_PREFIX = "rest://"; - public ServiceRegistryAddressManager(List addresses, List sameSideAddresses, - List diffSideAddresses, EventBus eventBus) { - super(addresses, sameSideAddresses, diffSideAddresses); + public ServiceRegistryAddressManager(List addresses, String ownRegion, String ownAvailableZone, + EventBus eventBus) { + super(addresses, ownRegion, ownAvailableZone); eventBus.register(this); } diff --git a/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManagerTest.java b/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManagerTest.java index 15e3db42c03..ff8547c4d99 100644 --- a/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManagerTest.java +++ b/service-registry/registry-service-center/src/test/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManagerTest.java @@ -44,10 +44,8 @@ class ServiceRegistryAddressManagerTest { public void addressManagerTest() { IpPort ipPort = new IpPort("127.0.0.1", 30103); addresses.add(ipPort.toString()); - addressManager1 = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), - new EventBus()); - addressManager2 = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), - new EventBus()); + addressManager1 = new ServiceRegistryAddressManager(addresses, "", "", new EventBus()); + addressManager2 = new ServiceRegistryAddressManager(addresses, "", "", new EventBus()); Assertions.assertNotNull(addressManager1); Assertions.assertNotNull(addressManager2); @@ -72,8 +70,7 @@ public void onRefreshEndpointEvent() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", addressRG); - addressManager1 = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), - new EventBus()); + addressManager1 = new ServiceRegistryAddressManager(addresses, "", "", new EventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "SERVICECENTER"); addressManager1.refreshEndpoint(event, "SERVICECENTER"); @@ -91,8 +88,7 @@ public void addressIPV6Test() { Map> zoneAndRegion = new HashMap<>(); zoneAndRegion.put("sameZone", addressAZ); zoneAndRegion.put("sameRegion", new ArrayList<>()); - addressManager1 = new ServiceRegistryAddressManager(addresses, new ArrayList<>(), new ArrayList<>(), - EventManager.getEventBus()); + addressManager1 = new ServiceRegistryAddressManager(addresses, "", "", EventManager.getEventBus()); RefreshEndpointEvent event = new RefreshEndpointEvent(zoneAndRegion, "SERVICECENTER"); addressManager1.refreshEndpoint(event, "SERVICECENTER"); From f6ecc014cd015e7889330876a85deb033373e043 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Thu, 13 Nov 2025 17:55:40 +0800 Subject: [PATCH 08/14] fixed name --- .../http/client/common/AbstractAddressManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java index b5ad9f22afd..1747d0f103c 100644 --- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java +++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java @@ -103,20 +103,20 @@ private void parseAndInitAddresses(List addresses, String ownRegion, Str if (CollectionUtils.isEmpty(addresses)) { return; } - List tesmpList = new ArrayList<>(); + List tempList = new ArrayList<>(); addressAutoRefreshed = addresses.stream().anyMatch(addr -> addr.contains(ZONE) || addr.contains(REGION)); for (String address : addresses) { // Compatible IpPortManager init address is 127.0.0.1:30100 if (!address.startsWith("http")) { - tesmpList.add(address); + tempList.add(address); continue; } URLEndPoint endpoint = new URLEndPoint(address); - tesmpList.add(endpoint.toString()); + tempList.add(endpoint.toString()); buildAffinityAddress(endpoint, ownRegion, ownAvailableZone); } - this.addresses.addAll(isFormat ? this.transformAddress(tesmpList) : tesmpList); - this.defaultAddress.addAll(isFormat ? this.transformAddress(tesmpList) : tesmpList); + this.addresses.addAll(isFormat ? this.transformAddress(tempList) : tempList); + this.defaultAddress.addAll(isFormat ? this.transformAddress(tempList) : tempList); } private void buildAffinityAddress(URLEndPoint endpoint, String ownRegion, String ownAvailableZone) { From d6fa1d8feed1d2f7a0d628dfd335dd71eb775fd9 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Fri, 14 Nov 2025 19:38:07 +0800 Subject: [PATCH 09/14] watch add createSignRequest --- .../service/center/client/ServiceCenterWatch.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java index a8be8b98b78..46ba02b8b9a 100644 --- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java +++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterWatch.java @@ -17,12 +17,14 @@ package org.apache.servicecomb.service.center.client; +import java.net.URI; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.servicecomb.foundation.auth.SignRequest; import org.apache.servicecomb.http.client.auth.RequestAuthHeaderProvider; import org.apache.servicecomb.http.client.common.HttpConfiguration.SSLProperties; import org.apache.servicecomb.http.client.common.WebSocketListener; @@ -107,7 +109,7 @@ private void startWatch() { Map headers = new HashMap<>(); headers.put("x-domain-name", this.tenantName); headers.putAll(this.extraGlobalHeaders); - headers.putAll(this.requestAuthHeaderProvider.loadAuthHeader(null)); + headers.putAll(this.requestAuthHeaderProvider.loadAuthHeader(createSignRequest(address))); currentServerUri = convertAddress(address); LOGGER.info("start watch to address {}", currentServerUri); webSocketTransport = new WebSocketTransport(currentServerUri, sslProperties, @@ -121,6 +123,17 @@ private void startWatch() { }); } + private SignRequest createSignRequest(String url) { + try { + URI uri = URI.create(url); + SignRequest signRequest = new SignRequest(); + signRequest.setEndpoint(uri); + return signRequest; + } catch (Exception e) { + return null; + } + } + private String convertAddress(String address) { String url = String.format(WATCH, project, serviceId); if (address.startsWith(HTTP)) { From bbe9fd01313863c39bb2f76f3c72c87f7d5b5ae8 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Tue, 18 Nov 2025 09:24:53 +0800 Subject: [PATCH 10/14] chassis supports RBAC authentication --- .../common/AbstractAddressManagerTest.java | 12 +++ .../foundation/auth/AuthHeaderProvider.java | 2 +- .../auth/TokenAuthHeaderProvider.java | 2 +- .../auth/TokenCacheManager.java | 99 +++++++++---------- .../http/ServiceRegistryClientImpl.java | 19 +++- 5 files changed, 73 insertions(+), 61 deletions(-) diff --git a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java index 90754e0468f..b14d6827cb8 100644 --- a/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java +++ b/clients/http-client-common/src/test/java/org/apache/servicecomb/http/client/common/AbstractAddressManagerTest.java @@ -313,4 +313,16 @@ public void compareAndGetAddressTest() { Assertions.assertTrue(manager.compareAndGetAddress("192.168.20.16").isEmpty()); Assertions.assertEquals("https://192.168.20.160:30100", manager.compareAndGetAddress("192.168.20.160")); } + + @Test + public void AddressAffinityTest() { + List testAddr = new ArrayList<>(); + testAddr.add("https://192.168.20.160:30100?region=region1&availableZone=zone1"); + testAddr.add("https://127.0.0.1:30100"); + AbstractAddressManager manager = new AbstractAddressManager(testAddr, "region1", "zone1"); + Assertions.assertEquals("https://192.168.20.160:30100", manager.address()); + + AbstractAddressManager manager2 = new AbstractAddressManager("default", testAddr, "region1", "zone1"); + Assertions.assertEquals("https://192.168.20.160:30100", manager2.address()); + } } diff --git a/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java b/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java index 1e27d09ec73..0e036e21a58 100644 --- a/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java +++ b/foundations/foundation-spi/src/main/java/org/apache/servicecomb/foundation/auth/AuthHeaderProvider.java @@ -22,7 +22,7 @@ public interface AuthHeaderProvider { /** - * Obtain RBAC authentication request header, host is the key of cache, spring-cloud module have specific usage of host + * Obtain RBAC authentication request header, host is the key of cache * * @param host engine address ip * @return auth headers diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenAuthHeaderProvider.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenAuthHeaderProvider.java index a926f9ffd0b..b040f516f65 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenAuthHeaderProvider.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenAuthHeaderProvider.java @@ -27,7 +27,7 @@ public class TokenAuthHeaderProvider implements AuthHeaderProvider { @Override public Map authHeaders(String host) { - String token = TokenCacheManager.getInstance().getToken(RBACBootStrapService.DEFAULT_REGISTRY_NAME); + String token = TokenCacheManager.getInstance().getToken(host); if (StringUtils.isEmpty(token)) { return new HashMap<>(); } diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java index cf3bf840908..269211c37d9 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java @@ -17,9 +17,8 @@ package org.apache.servicecomb.serviceregistry.auth; +import java.net.URI; import java.util.Map; -import java.util.Objects; -import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -28,13 +27,11 @@ import org.apache.commons.lang3.StringUtils; import org.apache.servicecomb.foundation.auth.Cipher; -import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx; -import org.apache.servicecomb.http.client.event.EngineConnectChangedEvent; +import org.apache.servicecomb.http.client.event.OperationEvents.UnAuthorizedOperationEvent; import org.apache.servicecomb.registry.api.event.ServiceCenterEventBus; import org.apache.servicecomb.service.center.client.ServiceCenterClient; import org.apache.servicecomb.service.center.client.model.RbacTokenRequest; import org.apache.servicecomb.service.center.client.model.RbacTokenResponse; -import org.apache.servicecomb.serviceregistry.event.NotPermittedEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,17 +52,17 @@ public final class TokenCacheManager { private static final TokenCacheManager INSTANCE = new TokenCacheManager(); + private Map serviceCenterClients; - private final Map tokenCacheMap; + private TokenCache tokenCache; - private Map serviceCenterClients; + private static final Object LOCK = new Object(); public static TokenCacheManager getInstance() { return INSTANCE; } private TokenCacheManager() { - tokenCacheMap = new ConcurrentHashMapEx<>(); } public void setServiceCenterClients(Map serviceCenterClients) { @@ -73,24 +70,17 @@ public void setServiceCenterClients(Map serviceCent } public void addTokenCache(String registryName, String accountName, String password, Cipher cipher) { - Objects.requireNonNull(registryName, "registryName should not be null!"); - if (tokenCacheMap.containsKey(registryName)) { - LOGGER.warn("duplicate token cache registration for serviceRegistry[{}]", registryName); - return; - } - - tokenCacheMap.put(registryName, new TokenCache(registryName, accountName, password, cipher)); + tokenCache = new TokenCache(registryName, accountName, password, cipher); } - public String getToken(String registryName) { - return Optional.ofNullable(tokenCacheMap.get(registryName)) - .map(TokenCache::getToken) - .orElse(null); + public String getToken(String host) { + if (tokenCache == null) { + return null; + } + return tokenCache.getToken(host); } public class TokenCache { - private static final String UN_AUTHORIZED_CODE_HALF_OPEN = "401302"; - private static final long TOKEN_REFRESH_TIME_IN_SECONDS = 20 * 60 * 1000; private final String registryName; @@ -105,10 +95,6 @@ public class TokenCache { private final Cipher cipher; - private int lastStatusCode; - - private String lastErrorCode; - public TokenCache(String registryName, String accountName, String password, Cipher cipher) { this.registryName = registryName; @@ -133,12 +119,12 @@ public void run() { .build(new CacheLoader() { @Override public String load(String key) throws Exception { - return createHeaders(); + return createHeaders(key); } @Override public ListenableFuture reload(String key, String oldValue) throws Exception { - return Futures.submit(() -> createHeaders(), executorService); + return Futures.submit(() -> createHeaders(key), executorService); } }); ServiceCenterEventBus.getEventBus().register(this); @@ -146,34 +132,28 @@ public ListenableFuture reload(String key, String oldValue) throws Excep } @Subscribe - public void onNotPermittedEvent(NotPermittedEvent event) { - this.executorService.submit(() -> { - if (lastStatusCode == Status.UNAUTHORIZED.getStatusCode() && UN_AUTHORIZED_CODE_HALF_OPEN - .equals(lastErrorCode)) { - cache.refresh(registryName); - } - }); + public void onUnAuthorizedOperationEvent(UnAuthorizedOperationEvent event) { + LOGGER.warn("address {} unAuthorized, refresh cache token!", event.getAddress()); + cache.refresh(getHostByAddress(event.getAddress())); } - @Subscribe - public void onEngineConnectChangedEvent(EngineConnectChangedEvent event) { - cache.refresh(registryName); + private String getHostByAddress(String address) { + try { + URI uri = URI.create(address); + return uri.getHost(); + } catch (Exception e) { + LOGGER.error("get host by address [{}] error!", address, e); + return registryName; + } } - private String createHeaders() { - LOGGER.info("start to create RBAC headers"); - + private String createHeaders(String host) { + LOGGER.info("start to create RBAC headers for host: {}", host); ServiceCenterClient serviceCenterClient = serviceCenterClients.get(this.registryName); - RbacTokenRequest request = new RbacTokenRequest(); request.setName(accountName); request.setPassword(new String(cipher.decrypt(password.toCharArray()))); - RbacTokenResponse rbacTokenResponse = serviceCenterClient.queryToken(request, ""); - - this.lastStatusCode = rbacTokenResponse.getStatusCode(); - this.lastErrorCode = rbacTokenResponse.getErrorCode(); - if (Status.UNAUTHORIZED.getStatusCode() == rbacTokenResponse.getStatusCode() || Status.FORBIDDEN.getStatusCode() == rbacTokenResponse.getStatusCode()) { // password wrong, do not try anymore @@ -185,8 +165,14 @@ private String createHeaders() { LOGGER.warn("service center do not support RBAC token, you should not config account info"); return INVALID_TOKEN; } + if (Status.INTERNAL_SERVER_ERROR.getStatusCode() == rbacTokenResponse.getStatusCode()) { + // return null for server_error, so the token information can be re-fetched on the next call. + // It will prompt 'CacheLoader returned null for key xxx' + LOGGER.warn("service center query RBAC token error!"); + return null; + } - LOGGER.info("refresh token successfully {}", rbacTokenResponse.getStatusCode()); + LOGGER.info("refresh host [{}] token successfully {}", host, rbacTokenResponse.getStatusCode()); return rbacTokenResponse.getToken(); } @@ -194,16 +180,21 @@ protected long refreshTime() { return TOKEN_REFRESH_TIME_IN_SECONDS; } - public String getToken() { + public String getToken(String host) { if (!enabled()) { return null; } - - try { - return cache.get(registryName); - } catch (Exception e) { - LOGGER.error("failed to create token", e); - return null; + String address = host; + if (StringUtils.isEmpty(address)) { + address = registryName; + } + synchronized (LOCK) { + try { + return cache.get(address); + } catch (Exception e) { + LOGGER.error("failed to create token", e); + return null; + } } } diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java index 28311a0ebeb..b94fd9f3202 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java @@ -35,6 +35,7 @@ import org.apache.servicecomb.foundation.common.net.IpPort; import org.apache.servicecomb.foundation.common.utils.JsonUtils; import org.apache.servicecomb.foundation.vertx.AsyncResultCallback; +import org.apache.servicecomb.http.client.event.OperationEvents.UnAuthorizedOperationEvent; import org.apache.servicecomb.http.client.utils.ServiceCombServiceAvailableUtils; import org.apache.servicecomb.registry.api.event.MicroserviceInstanceChangedEvent; import org.apache.servicecomb.registry.api.registry.FindInstancesResponse; @@ -152,7 +153,7 @@ public Handler syncHandler(CountDownLatch countDownLatch, Clas return; } holder.setStatusCode(response.statusCode()); - sendUnAuthorizedEvent(response); + sendUnAuthorizedEvent(response, requestContext); response.exceptionHandler(e -> { LOGGER.error("error in processing response.", e); countDownLatch.countDown(); @@ -232,7 +233,7 @@ private Handler syncHandlerEx(CountDownLatch countDownLatch, Holde return; } - sendUnAuthorizedEvent(response); + sendUnAuthorizedEvent(response, requestContext); response.exceptionHandler(e -> { LOGGER.error("error in processing response.", e); countDownLatch.countDown(); @@ -247,12 +248,20 @@ private Handler syncHandlerEx(CountDownLatch countDownLatch, Holde }; } - private void sendUnAuthorizedEvent(HttpClientResponse response) { + private void sendUnAuthorizedEvent(HttpClientResponse response, RequestContext requestContext) { if (response.statusCode() == Status.UNAUTHORIZED.getStatusCode()) { - ServiceCenterEventBus.getEventBus().post(new NotPermittedEvent()); + ServiceCenterEventBus.getEventBus().post(new UnAuthorizedOperationEvent(getAddressWithProtocol(requestContext))); } } + private String getAddressWithProtocol(RequestContext requestContext) { + String ipAndPort = requestContext.getIpPort().toString(); + if (ipAndPort.startsWith("http")) { + return ipAndPort; + } + return "https://" + ipAndPort; + } + private Handler syncHandlerForInstances(CountDownLatch countDownLatch, MicroserviceInstances mInstances) { return restResponse -> { @@ -1007,7 +1016,7 @@ public Handler addressSyncHandler(CountDownLatch countDownLatc return; } holder.setStatusCode(response.statusCode()); - sendUnAuthorizedEvent(response); + sendUnAuthorizedEvent(response, restResponse.getRequestContext()); countDownLatch.countDown(); }; } From afcffd77d9baf8a0b0e4b7d4ba2fd78969d3cb0f Mon Sep 17 00:00:00 2001 From: chengyouling Date: Tue, 18 Nov 2025 09:30:11 +0800 Subject: [PATCH 11/14] delete unimport --- .../serviceregistry/client/http/ServiceRegistryClientImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java index b94fd9f3202..ff54002e184 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/client/http/ServiceRegistryClientImpl.java @@ -65,7 +65,6 @@ import org.apache.servicecomb.serviceregistry.client.IpPortManager; import org.apache.servicecomb.serviceregistry.client.ServiceRegistryClient; import org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig; -import org.apache.servicecomb.serviceregistry.event.NotPermittedEvent; import org.apache.servicecomb.registry.api.event.ServiceCenterEventBus; import org.apache.servicecomb.serviceregistry.task.HeartbeatResult; import org.apache.servicecomb.serviceregistry.task.MicroserviceInstanceHeartbeatTask; From 3f02f324da0cb36bda05748479674c3db3041ba2 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Tue, 18 Nov 2025 11:48:03 +0800 Subject: [PATCH 12/14] chassis supports address affinity --- .../client/common/AbstractAddressManager.java | 11 ++++++++ .../config/ConfigCenterConfig.java | 12 ++++++++ .../ConfigCenterConfigurationSourceImpl.java | 7 ++--- .../servicecomb/config/kie/KieConfig.java | 12 ++++++++ .../kie/KieConfigurationSourceImpl.java | 7 ++--- .../serviceregistry/client/IpPortManager.java | 4 +-- .../config/ServiceRegistryConfig.java | 11 ++++++++ .../config/ServiceRegistryConfigBuilder.java | 8 ++++++ .../ServiceRegistryAddressManager.java | 28 +++++++++++++++++++ 9 files changed, 88 insertions(+), 12 deletions(-) diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java index 1747d0f103c..508b523a0bc 100644 --- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java +++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Random; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -351,4 +352,14 @@ private boolean regionAndAZMatch(String ownRegion, String ownAvailableZone, Stri String engineAvailableZone) { return ownRegion.equalsIgnoreCase(engineRegion) && ownAvailableZone.equals(engineAvailableZone); } + + public void refreshAffinityAddress(Set sameZone, Set sameRegion) { + addressAutoRefreshed = true; + if (!sameZone.isEmpty()) { + availableZone.addAll(sameZone); + } + if (!sameRegion.isEmpty()) { + availableRegion.addAll(sameRegion); + } + } } diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfig.java b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfig.java index 430ab158925..daf3935aee4 100644 --- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfig.java +++ b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfig.java @@ -58,6 +58,10 @@ public final class ConfigCenterConfig { private static final String CLIENT_SOCKET_TIMEOUT = "servicecomb.config.client.timeout.socket"; + private static final String REGION = "servicecomb.datacenter.region"; + + private static final String AVAILABLE_ZONE = "servicecomb.datacenter.availableZone"; + private ConfigCenterConfig() { } @@ -154,4 +158,12 @@ public int getConnectionRequestTimeout(Configuration configuration) { public int getSocketTimeout(Configuration configuration) { return configuration.getInt(CLIENT_SOCKET_TIMEOUT, 5000); } + + public String getRegion() { + return finalConfig.getString(REGION, ""); + } + + public String getAvailableZone() { + return finalConfig.getString(AVAILABLE_ZONE, ""); + } } diff --git a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java index e0b508ae533..37e315212d2 100644 --- a/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java +++ b/dynamic-config/config-cc/src/main/java/org/apache/servicecomb/config/ConfigCenterConfigurationSourceImpl.java @@ -54,7 +54,6 @@ import com.google.common.eventbus.Subscribe; import com.netflix.config.ConcurrentCompositeConfiguration; -import com.netflix.config.DynamicPropertyFactory; import com.netflix.config.WatchedUpdateListener; import com.netflix.config.WatchedUpdateResult; @@ -204,13 +203,11 @@ private ConfigCenterAddressManager configCenterAddressManager() { } private String getRegion() { - return DynamicPropertyFactory.getInstance(). - getStringProperty("servicecomb.datacenter.region", "").get(); + return ConfigCenterConfig.INSTANCE.getRegion(); } private String getAvailableZone() { - return DynamicPropertyFactory.getInstance(). - getStringProperty("servicecomb.datacenter.availableZone", "").get(); + return ConfigCenterConfig.INSTANCE.getAvailableZone(); } private void updateConfiguration(WatchedUpdateResult result) { diff --git a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfig.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfig.java index 872165f51eb..e556c778e8e 100644 --- a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfig.java +++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfig.java @@ -75,6 +75,10 @@ public class KieConfig { private static final String CUSTOM_LABEL_VALUE_DEFAULT = ""; + private static final String REGION = "servicecomb.datacenter.region"; + + private static final String AVAILABLE_ZONE = "servicecomb.datacenter.availableZone"; + private KieConfig() { } @@ -185,4 +189,12 @@ public String getProxyUsername() { public String getProxyPasswd() { return finalConfig.getString(VertxConst.PROXY_PASSWD, null); } + + public String getRegion() { + return finalConfig.getString(REGION, ""); + } + + public String getAvailableZone() { + return finalConfig.getString(AVAILABLE_ZONE, ""); + } } diff --git a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java index 7d37423f43b..683a81b8394 100644 --- a/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java +++ b/dynamic-config/config-kie/src/main/java/org/apache/servicecomb/config/kie/KieConfigurationSourceImpl.java @@ -53,7 +53,6 @@ import com.google.common.eventbus.Subscribe; import com.netflix.config.ConcurrentCompositeConfiguration; -import com.netflix.config.DynamicPropertyFactory; import com.netflix.config.WatchedUpdateListener; import com.netflix.config.WatchedUpdateResult; @@ -178,10 +177,8 @@ private static RequestAuthHeaderProvider getRequestAuthHeaderProvider(List addresses = defaultIpPort.stream().map(IpPort::toString).collect(Collectors.toList()); - addressManger = new ServiceRegistryAddressManager(addresses, getRegion(), getAvailableZone(), - EventManager.getEventBus()); + addressManger = new ServiceRegistryAddressManager(addresses, "", "", EventManager.getEventBus()); + addressManger.constructAffinityAddress(serviceRegistryConfig.getOriginAddress(), getRegion(), getAvailableZone()); classificationAddress = new ClassificationAddress(serviceRegistryConfig, instanceCacheManager); LOGGER.info("Initial service center address is {}", getAvailableAddress()); } diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java index 4e5b3a825dd..7cf3dafe2fb 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfig.java @@ -132,6 +132,8 @@ public class ServiceRegistryConfig { private Function serviceRegistryClientConstructor = serviceRegistry -> new ServiceRegistryClientImpl(this); + private List originAddress; + public ServiceRegistryConfig() { } @@ -446,4 +448,13 @@ public ServiceRegistryConfig setServiceRegistryClientConstructor( public ServiceRegistryClient createServiceRegistryClient(ServiceRegistry serviceRegistry) { return this.serviceRegistryClientConstructor.apply(serviceRegistry); } + + public List getOriginAddress() { + return originAddress; + } + + public ServiceRegistryConfig setOriginAddress(List originAddress) { + this.originAddress = originAddress; + return this; + } } diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java index ae6b7fd080f..647337db378 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/config/ServiceRegistryConfigBuilder.java @@ -46,12 +46,15 @@ class ServiceRegistryConfigBuilder { private boolean ssl; + private List originAddress; + public ServiceRegistryConfig build() { return new ServiceRegistryConfig() .setHttpVersion(getHttpVersion()) .setInstances(getInstances()) .setIpPort(getIpPort()) .setSsl(isSsl()) + .setOriginAddress(getOriginAddress()) .setClientName(RegistryHttpClientOptionsSPI.CLIENT_NAME) .setWatchClientName(RegistryWatchHttpClientOptionsSPI.CLIENT_NAME) .setConnectionTimeout(getConnectionTimeout()) @@ -110,11 +113,16 @@ public boolean isSsl() { return this.ssl; } + public List getOriginAddress() { + return originAddress; + } + public ArrayList getIpPort() { List uriList = Objects .requireNonNull(Deployment.getSystemBootStrapInfo(ServiceCenterDefaultDeploymentProvider.SYSTEM_KEY_SERVICE_CENTER), "no sc address found!") .getAccessURL(); + this.originAddress = uriList; ArrayList ipPortList = new ArrayList<>(); uriList.forEach(anUriList -> { try { diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java index 25036cb1791..8ebb169b7ed 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java @@ -18,9 +18,13 @@ package org.apache.servicecomb.serviceregistry.refresh; import java.net.URI; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.apache.commons.lang3.StringUtils; import org.apache.servicecomb.foundation.common.net.IpPort; +import org.apache.servicecomb.foundation.common.net.NetUtils; import org.apache.servicecomb.foundation.common.net.URIEndpointObject; import org.apache.servicecomb.http.client.common.AbstractAddressManager; import org.apache.servicecomb.http.client.event.RefreshEndpointEvent; @@ -31,6 +35,10 @@ public class ServiceRegistryAddressManager extends AbstractAddressManager { private static final String URI_PREFIX = "rest://"; + private static final String ZONE = "availableZone"; + + private static final String REGION = "region"; + public ServiceRegistryAddressManager(List addresses, String ownRegion, String ownAvailableZone, EventBus eventBus) { super(addresses, ownRegion, ownAvailableZone); @@ -55,4 +63,24 @@ public IpPort transformIpPort(String address) { public void onRefreshEndpointEvent(RefreshEndpointEvent event) { refreshEndpoint(event, RefreshEndpointEvent.SERVICE_CENTER_NAME); } + + public void constructAffinityAddress(List addresses, String ownRegion, String ownAvailableZone) { + boolean isAffinityAddress = addresses.stream().anyMatch(addr -> addr.contains(ZONE) || addr.contains(REGION)); + if (!isAffinityAddress || (StringUtils.isEmpty(ownRegion) && StringUtils.isEmpty(ownAvailableZone))) { + return; + } + String regionAndZone = "region=" + ownRegion + "&availableZone=" + ownAvailableZone; + Set sameZone = new HashSet<>(); + Set sameRegion = new HashSet<>(); + for (String address : addresses) { + URI uri = URI.create(address); + String ipPort = NetUtils.parseIpPort(uri).toString(); + if (address.toLowerCase().contains(regionAndZone.toLowerCase())) { + sameZone.add(ipPort); + } else { + sameRegion.add(ipPort); + } + } + refreshAffinityAddress(sameZone, sameRegion); + } } From 0309c824b000c5d2f5fb8c3d892af959e39c09ee Mon Sep 17 00:00:00 2001 From: chengyouling Date: Mon, 24 Nov 2025 14:53:27 +0800 Subject: [PATCH 13/14] remove synchronized --- .../serviceregistry/auth/TokenCacheManager.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java index 269211c37d9..31d6a0ee911 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/auth/TokenCacheManager.java @@ -56,8 +56,6 @@ public final class TokenCacheManager { private TokenCache tokenCache; - private static final Object LOCK = new Object(); - public static TokenCacheManager getInstance() { return INSTANCE; } @@ -188,13 +186,11 @@ public String getToken(String host) { if (StringUtils.isEmpty(address)) { address = registryName; } - synchronized (LOCK) { - try { - return cache.get(address); - } catch (Exception e) { - LOGGER.error("failed to create token", e); - return null; - } + try { + return cache.get(address); + } catch (Exception e) { + LOGGER.error("failed to create token", e); + return null; } } From db0eb350fa2497505fc0642129800b65d8f976a9 Mon Sep 17 00:00:00 2001 From: chengyouling Date: Mon, 24 Nov 2025 17:44:42 +0800 Subject: [PATCH 14/14] change region/zone match --- .../refresh/ServiceRegistryAddressManager.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java index 8ebb169b7ed..69f11ed5cde 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/serviceregistry/refresh/ServiceRegistryAddressManager.java @@ -27,6 +27,7 @@ import org.apache.servicecomb.foundation.common.net.NetUtils; import org.apache.servicecomb.foundation.common.net.URIEndpointObject; import org.apache.servicecomb.http.client.common.AbstractAddressManager; +import org.apache.servicecomb.http.client.common.URLEndPoint; import org.apache.servicecomb.http.client.event.RefreshEndpointEvent; import com.google.common.eventbus.EventBus; @@ -69,13 +70,12 @@ public void constructAffinityAddress(List addresses, String ownRegion, S if (!isAffinityAddress || (StringUtils.isEmpty(ownRegion) && StringUtils.isEmpty(ownAvailableZone))) { return; } - String regionAndZone = "region=" + ownRegion + "&availableZone=" + ownAvailableZone; Set sameZone = new HashSet<>(); Set sameRegion = new HashSet<>(); for (String address : addresses) { URI uri = URI.create(address); String ipPort = NetUtils.parseIpPort(uri).toString(); - if (address.toLowerCase().contains(regionAndZone.toLowerCase())) { + if (isMatchRegionAndZone(address, ownRegion, ownAvailableZone)) { sameZone.add(ipPort); } else { sameRegion.add(ipPort); @@ -83,4 +83,16 @@ public void constructAffinityAddress(List addresses, String ownRegion, S } refreshAffinityAddress(sameZone, sameRegion); } + + private boolean isMatchRegionAndZone(String address, String ownRegion, String ownAvailableZone) { + try { + URLEndPoint endPoint = new URLEndPoint(address); + if (!StringUtils.equals(ownRegion, endPoint.getFirst(REGION))) { + return false; + } + return StringUtils.equals(ownAvailableZone, endPoint.getFirst(ZONE)); + } catch (Exception e) { + return false; + } + } }