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;
+ }
}