This is an automated email from the ASF dual-hosted git repository.

zhangzicheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new a62a04c84 [ISSUE #4686] ApolloClientRegisterRepository active offline 
(#4855)
a62a04c84 is described below

commit a62a04c844d5fddcaea565846ffc9e63839dbc1e
Author: xuziyang <[email protected]>
AuthorDate: Mon Jul 17 14:46:20 2023 +0800

    [ISSUE #4686] ApolloClientRegisterRepository active offline (#4855)
    
    Co-authored-by: xiaoyu <[email protected]>
---
 .../ApolloClientServerRegisterRepository.java      | 40 +++++++++++++++++++---
 .../register/client/apollo/ApolloClient.java       | 15 ++++++++
 .../apollo/ApolloClientRegisterRepository.java     | 21 ++++++++++++
 .../register/client/apollo/ApolloConfig.java       | 21 ++++++++++++
 4 files changed, 93 insertions(+), 4 deletions(-)

diff --git 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-apollo/src/main/java/org/apache/shenyu/register/client/server/apollo/ApolloClientServerRegisterRepository.java
 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-apollo/src/main/java/org/apache/shenyu/register/client/server/apollo/ApolloClientServerRegisterRepository.java
index 613a28c15..d2d78b70e 100644
--- 
a/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-apollo/src/main/java/org/apache/shenyu/register/client/server/apollo/ApolloClientServerRegisterRepository.java
+++ 
b/shenyu-register-center/shenyu-register-client-server/shenyu-register-client-server-apollo/src/main/java/org/apache/shenyu/register/client/server/apollo/ApolloClientServerRegisterRepository.java
@@ -28,6 +28,7 @@ import 
org.apache.shenyu.register.client.server.api.ShenyuClientServerRegisterRe
 import org.apache.shenyu.register.common.config.ShenyuRegisterCenterConfig;
 import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
 import org.apache.shenyu.register.common.dto.URIRegisterDTO;
+import org.apache.shenyu.register.common.enums.EventType;
 import org.apache.shenyu.register.common.path.RegisterPathConstants;
 import org.apache.shenyu.spi.Join;
 
@@ -36,6 +37,7 @@ import java.util.Optional;
 import java.util.Properties;
 import java.util.Set;
 
+
 /**
  * apollo register center.
  */
@@ -84,18 +86,43 @@ public class ApolloClientServerRegisterRepository 
implements ShenyuClientServerR
         }
 
         // monitor metadata changes
+        subscribeMetadata();
+        // monitor uri changes
+        subscribeUri();
+    }
+
+    private void subscribeMetadata() {
         this.config.addChangeListener(changeEvent -> {
             for (String changedKey : changeEvent.changedKeys()) {
+                // apollo has a bug and may push events that are not 
monitored, so there is this judgment.
+                if 
(!changedKey.startsWith(RegisterPathConstants.REGISTER_METADATA_INSTANCE_ROOT_PATH))
 {
+                    continue;
+                }
                 ConfigChange configChange = changeEvent.getChange(changedKey);
                 this.publishMetadata(configChange.getNewValue());
             }
         }, null, 
Collections.singleton(RegisterPathConstants.REGISTER_METADATA_INSTANCE_ROOT_PATH));
+    }
 
-        // monitor uri changes
+    private void subscribeUri() {
         this.config.addChangeListener(changeEvent -> {
             for (String changedKey : changeEvent.changedKeys()) {
+                // apollo has a bug and may push events that are not 
monitored, so there is this judgment.
+                if 
(!changedKey.startsWith(RegisterPathConstants.REGISTER_URI_INSTANCE_ROOT_PATH)) 
{
+                    continue;
+                }
                 ConfigChange configChange = changeEvent.getChange(changedKey);
-                this.publishRegisterURI(configChange.getNewValue());
+                switch (configChange.getChangeType()) {
+                    case ADDED:
+                    case MODIFIED:
+                        this.publishRegisterURI(configChange.getNewValue());
+                        break;
+                    case DELETED:
+                        this.publishUnRegisterURI(configChange.getOldValue());
+                        break;
+                    default:
+                        break;
+                }
             }
         }, null, 
Collections.singleton(RegisterPathConstants.REGISTER_URI_INSTANCE_ROOT_PATH));
     }
@@ -105,8 +132,13 @@ public class ApolloClientServerRegisterRepository 
implements ShenyuClientServerR
     }
 
     private void publishRegisterURI(final String uriMetadata) {
-        URIRegisterDTO uriRegisterDTO = 
GsonUtils.getInstance().fromJson(uriMetadata, URIRegisterDTO.class);
-        publisher.publish(Lists.newArrayList(uriRegisterDTO));
+        
publisher.publish(Lists.newArrayList(GsonUtils.getInstance().fromJson(uriMetadata,
 URIRegisterDTO.class)));
+    }
+
+    private void publishUnRegisterURI(final String uriMetadata) {
+        URIRegisterDTO uriOffline = 
GsonUtils.getInstance().fromJson(uriMetadata, URIRegisterDTO.class);
+        uriOffline.setEventType(EventType.OFFLINE);
+        publisher.publish(Lists.newArrayList(uriOffline));
     }
 
     @Override
diff --git 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloClient.java
 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloClient.java
index 8cd201b01..ec870d034 100644
--- 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloClient.java
+++ 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloClient.java
@@ -107,6 +107,21 @@ public class ApolloClient {
         );
     }
 
+    /**
+     * remove item from namespace.
+     * @param key item key
+     */
+    public void removeItem(final String key) {
+        this.apolloOpenApiClient.removeItem(
+                apolloConfig.getAppId(),
+                apolloConfig.getEnv(),
+                apolloConfig.getClusterName(),
+                apolloConfig.getNamespace(),
+                key,
+                apolloConfig.getOperator()
+        );
+    }
+
     /**
      * publish item list in namespace.
      * @param releaseTitle publish release title
diff --git 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloClientRegisterRepository.java
 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloClientRegisterRepository.java
index 2633bb948..bbf6ed682 100644
--- 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloClientRegisterRepository.java
+++ 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloClientRegisterRepository.java
@@ -54,6 +54,7 @@ public class ApolloClientRegisterRepository implements 
ShenyuClientRegisterRepos
         String clusterName = properties.getProperty("clusterName", 
ConfigConsts.CLUSTER_NAME_DEFAULT);
         String namespace = properties.getProperty("namespace", 
ConfigConsts.NAMESPACE_APPLICATION);
         String portalUrl = properties.getProperty("portalUrl");
+        String operator = properties.getProperty("operator", "apollo");
 
         ApolloConfig apolloConfig = new ApolloConfig();
         apolloConfig.setAppId(appId);
@@ -62,6 +63,7 @@ public class ApolloClientRegisterRepository implements 
ShenyuClientRegisterRepos
         apolloConfig.setEnv(env);
         apolloConfig.setClusterName(clusterName);
         apolloConfig.setNamespace(namespace);
+        apolloConfig.setOperator(operator);
 
         this.apolloClient = new ApolloClient(apolloConfig);
     }
@@ -80,6 +82,14 @@ public class ApolloClientRegisterRepository implements 
ShenyuClientRegisterRepos
         LogUtils.info(LOGGER, "{} apollo client register uri success: {}", 
rpcType, registerDTO);
     }
 
+    @Override
+    public void offline(final URIRegisterDTO offlineDTO) {
+        String rpcType = offlineDTO.getRpcType();
+        String contextPath = 
ContextPathUtils.buildRealNode(offlineDTO.getContextPath(), 
offlineDTO.getAppName());
+        unRegister(rpcType, contextPath, offlineDTO);
+        LogUtils.info(LOGGER, "{} apollo client unRegister uri success: {}", 
rpcType, offlineDTO);
+    }
+
     private void registerURI(final String rpcType,
                              final String contextPath,
                              final URIRegisterDTO registerDTO) {
@@ -91,6 +101,17 @@ public class ApolloClientRegisterRepository implements 
ShenyuClientRegisterRepos
         LOGGER.info("register uri data success: {}", realNode);
     }
 
+    private void unRegister(final String rpcType,
+                            final String contextPath,
+                            final URIRegisterDTO offlineDTO) {
+        String uriNodeName = buildURINodeName(offlineDTO);
+        String uriPath = RegisterPathConstants.buildURIParentPath(rpcType, 
contextPath);
+        String realNode = RegisterPathConstants.buildRealNode(uriPath, 
uriNodeName);
+        apolloClient.createOrUpdateItem(realNode, 
GsonUtils.getInstance().toJson(offlineDTO), "offline uri");
+        apolloClient.publishNamespace("publish config", "");
+        LOGGER.info("unRegister uri data success: {}", realNode);
+    }
+
     private String buildURINodeName(final URIRegisterDTO registerDTO) {
         String host = registerDTO.getHost();
         int port = registerDTO.getPort();
diff --git 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloConfig.java
 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloConfig.java
index 33ba22674..735572fb8 100644
--- 
a/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloConfig.java
+++ 
b/shenyu-register-center/shenyu-register-client/shenyu-register-client-apollo/src/main/java/org/apache/shenyu/register/client/apollo/ApolloConfig.java
@@ -51,6 +51,11 @@ public class ApolloConfig {
      */
     private String token;
 
+    /**
+     * operator.
+     */
+    private String operator;
+
     /**
      * get appId.
      * @return appId
@@ -146,4 +151,20 @@ public class ApolloConfig {
     public void setToken(final String token) {
         this.token = token;
     }
+
+    /**
+     * get operator.
+     * @return operator
+     */
+    public String getOperator() {
+        return operator;
+    }
+
+    /**
+     * set operator.
+     * @param operator operator
+     */
+    public void setOperator(final String operator) {
+        this.operator = operator;
+    }
 }

Reply via email to