diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 5788af888b0..d566e7e2728 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -36,7 +36,7 @@ jobs: - name: Set up jdk uses: actions/setup-java@v3 with: - java-version: '17' + java-version: '17.0.2' distribution: 'temurin' - name: Set up Maven uses: stCarolas/setup-maven@v4.5 diff --git a/.github/workflows/unit-test-jdk17.yml b/.github/workflows/unit-test-jdk17.yml index 1e66fae5368..ebc920c237a 100644 --- a/.github/workflows/unit-test-jdk17.yml +++ b/.github/workflows/unit-test-jdk17.yml @@ -33,7 +33,7 @@ jobs: - name: Set up jdk uses: actions/setup-java@v3 with: - java-version: '17' + java-version: '17.0.2' distribution: 'temurin' - name: Compilation and Installation run: mvn -B -Dcheckstyle.skip -Dspotbugs.skip=true clean install -Pit diff --git a/.github/workflows/unit-test-jdk21.yml b/.github/workflows/unit-test-jdk21.yml index 0f83cf44428..96c73067bcb 100644 --- a/.github/workflows/unit-test-jdk21.yml +++ b/.github/workflows/unit-test-jdk21.yml @@ -33,7 +33,7 @@ jobs: - name: Set up jdk uses: actions/setup-java@v3 with: - java-version: '21' + java-version: '21.0.7' distribution: 'temurin' - name: Compilation and Installation run: mvn -B -Dcheckstyle.skip -Dspotbugs.skip=true clean install -Pit \ No newline at end of file diff --git a/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java b/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java index 696199b64fc..733511b73a2 100644 --- a/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java +++ b/core/src/main/java/org/apache/servicecomb/core/definition/ServiceRegistryListener.java @@ -29,6 +29,7 @@ import org.apache.servicecomb.registry.api.event.CreateMicroserviceEvent; import org.apache.servicecomb.registry.api.event.CreateMicroserviceVersionEvent; import org.apache.servicecomb.registry.api.event.DestroyMicroserviceEvent; +import org.apache.servicecomb.registry.api.event.RefreshRemoteSwaggerEvent; import org.apache.servicecomb.registry.api.registry.Microservice; import org.apache.servicecomb.registry.consumer.MicroserviceVersion; import org.apache.servicecomb.registry.consumer.MicroserviceVersions; @@ -133,4 +134,11 @@ public void onCreateMicroserviceVersion(CreateMicroserviceVersionEvent event) { public void destroy() { scbEngine.getEventBus().unregister(this); } + + @EnableExceptionPropagation + @SubscriberOrder(-800) + @Subscribe + public void onRefreshRemoteSwaggerEvent(RefreshRemoteSwaggerEvent event) { + scbEngine.getSwaggerLoader().removeRemoteSwagger(event); + } } diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/event/RefreshRemoteSwaggerEvent.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/event/RefreshRemoteSwaggerEvent.java new file mode 100644 index 00000000000..b8baf10ea67 --- /dev/null +++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/api/event/RefreshRemoteSwaggerEvent.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.registry.api.event; + +import java.util.List; + +public class RefreshRemoteSwaggerEvent { + private final List serviceIds; + + private final String appId; + + private final String serviceName; + + public RefreshRemoteSwaggerEvent(List serviceIds, String appId, String serviceName) { + this.serviceIds = serviceIds; + this.appId = appId; + this.serviceName = serviceName; + } + + public List getServiceIds() { + return serviceIds; + } + + public String getAppId() { + return appId; + } + + public String getServiceName() { + return serviceName; + } +} diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/consumer/MicroserviceVersions.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/consumer/MicroserviceVersions.java index c84925a4783..c44e319e8d0 100644 --- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/consumer/MicroserviceVersions.java +++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/consumer/MicroserviceVersions.java @@ -33,6 +33,7 @@ import org.apache.servicecomb.registry.api.event.CreateMicroserviceEvent; import org.apache.servicecomb.registry.api.event.DestroyMicroserviceEvent; import org.apache.servicecomb.registry.api.event.MicroserviceInstanceChangedEvent; +import org.apache.servicecomb.registry.api.event.RefreshRemoteSwaggerEvent; import org.apache.servicecomb.registry.api.registry.MicroserviceInstance; import org.apache.servicecomb.registry.api.registry.MicroserviceInstanceStatus; import org.apache.servicecomb.registry.api.registry.MicroserviceInstances; @@ -41,8 +42,10 @@ import org.apache.servicecomb.registry.definition.MicroserviceNameParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; import com.google.common.annotations.VisibleForTesting; +import com.netflix.config.DynamicPropertyFactory; public class MicroserviceVersions { private static final Logger LOGGER = LoggerFactory.getLogger(MicroserviceVersions.class); @@ -183,6 +186,9 @@ public void pullInstances() { return; } + // send refresh remote swagger info + sendRefreshRemoteSwaggerEvent(); + pulledInstances = microserviceInstances.getInstancesResponse().getInstances(); pulledInstances.sort(Comparator.comparing(MicroserviceInstance::getInstanceId)); String rev = microserviceInstances.getRevision(); @@ -190,6 +196,22 @@ public void pullInstances() { safeSetInstances(pulledInstances, rev); } + private void sendRefreshRemoteSwaggerEvent() { + boolean refreshEnabled = DynamicPropertyFactory.getInstance() + .getBooleanProperty("servicecomb.remote.swagger.refresh.enabled", false).get(); + if (!refreshEnabled) { + return; + } + List serviceIds = new ArrayList<>(); + if (CollectionUtils.isEmpty(pulledInstances)) { + return; + } + for (MicroserviceInstance instance : pulledInstances) { + serviceIds.add(instance.getServiceId()); + } + appManager.getEventBus().post(new RefreshRemoteSwaggerEvent(serviceIds, appId, shortName)); + } + protected MicroserviceInstances findServiceInstances() { return DiscoveryManager.INSTANCE.findServiceInstances(appId, shortName, diff --git a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/swagger/SwaggerLoader.java b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/swagger/SwaggerLoader.java index 6c49ae44208..c0553e9da42 100644 --- a/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/swagger/SwaggerLoader.java +++ b/foundations/foundation-registry/src/main/java/org/apache/servicecomb/registry/swagger/SwaggerLoader.java @@ -30,6 +30,7 @@ import org.apache.servicecomb.foundation.common.utils.ResourceUtil; import org.apache.servicecomb.registry.DiscoveryManager; import org.apache.servicecomb.registry.RegistrationManager; +import org.apache.servicecomb.registry.api.event.RefreshRemoteSwaggerEvent; import org.apache.servicecomb.registry.api.registry.Microservice; import org.apache.servicecomb.registry.api.registry.MicroserviceInstance; import org.apache.servicecomb.registry.definition.MicroserviceNameParser; @@ -37,6 +38,7 @@ import org.apache.servicecomb.swagger.generator.SwaggerGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Charsets; @@ -197,7 +199,6 @@ private Swagger loadFromRemote(Microservice microservice, Collection serviceIds = event.getServiceIds(); + if (CollectionUtils.isEmpty(serviceIds)) { + return; + } + List matchKey = remoteSwagger.keySet().stream().filter(key -> { + for (String serviceId : serviceIds) { + if (key.startsWith(serviceId)) { + return true; + } + } + return false; + }).toList(); + for (String key : matchKey) { + remoteSwagger.remove(key); + LOGGER.info("remove local appid=[{}], serviceName=[{}], swagger [{}]", event.getAppId(), + event.getServiceName(), key); + } + } }