You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2020/07/10 07:36:41 UTC
[servicecomb-java-chassis] branch master updated: [SCB-2035]Use
vertx Json and Pojo model to replace own serizalization mechanism
This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push:
new 08676b5 [SCB-2035]Use vertx Json and Pojo model to replace own serizalization mechanism
08676b5 is described below
commit 08676b5ff8590560d02c508c881c25c340678a29
Author: Jun Gan <ju...@gmail.com>
AuthorDate: Mon Jul 6 21:28:28 2020 -0400
[SCB-2035]Use vertx Json and Pojo model to replace own serizalization mechanism
---
.../zeroconfig/ZeroConfigRegistration.java | 6 +-
.../zeroconfig/ZeroConfigRegistryConstants.java | 11 --
.../servicecomb/zeroconfig/client/ClientUtil.java | 106 ++++++---------
.../zeroconfig/client/ZeroConfigClient.java | 35 ++---
.../server/ServerMicroserviceInstance.java | 14 +-
.../servicecomb/zeroconfig/server/ServerUtil.java | 149 ++++++---------------
.../server/ZeroConfigRegistryService.java | 33 +++--
.../server/TestZeroConfigRegistryService.java | 49 ++-----
8 files changed, 134 insertions(+), 269 deletions(-)
diff --git a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/ZeroConfigRegistration.java b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/ZeroConfigRegistration.java
index 22b56dd..62d9c75 100644
--- a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/ZeroConfigRegistration.java
+++ b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/ZeroConfigRegistration.java
@@ -40,8 +40,6 @@ public class ZeroConfigRegistration implements Registration {
private static final Logger LOGGER = LoggerFactory.getLogger(ZeroConfigRegistration.class);
- public static ZeroConfigRegistration INSTANCE = new ZeroConfigRegistration();
-
private static final String NAME = "zero-config registration";
private ZeroConfigClient zeroConfigClient = ZeroConfigClient.INSTANCE;
@@ -54,8 +52,8 @@ public class ZeroConfigRegistration implements Registration {
@Override
public void init() {
zeroConfigClient.init();
- ServerUtil.init();
- ClientUtil.init();
+ ServerUtil.INSTANCE.init();
+ ClientUtil.INSTANCE.init();
}
@Override
diff --git a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/ZeroConfigRegistryConstants.java b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/ZeroConfigRegistryConstants.java
index c720b7c..4e175bf 100644
--- a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/ZeroConfigRegistryConstants.java
+++ b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/ZeroConfigRegistryConstants.java
@@ -43,23 +43,12 @@ public interface ZeroConfigRegistryConstants {
String HEARTBEAT_EVENT = "heartbeat";
// Microservice & Instance Attributes
- String APP_ID = "appId";
- String SERVICE_NAME = "serviceName";
- String VERSION = "version";
String SERVICE_ID = "serviceId";
- String STATUS = "status";
- String SCHEMA_IDS = "schemas";
String INSTANCE_ID = "instanceId";
- String ENDPOINTS = "endpoints";
- String HOST_NAME = "hostName";
- String INSTANCE_HEARTBEAT_RESPONSE_MESSAGE_OK = "OK";
// others
String MAP_STRING_LEFT = "{";
String MAP_STRING_RIGHT = "}";
- String MAP_ELEMENT_SPILITER = ",";
- String MAP_KV_SPILITER = "=";
- String LIST_STRING_SPLITER = "$";
String UUID_SPLITER = "-";
String SERVICE_ID_SPLITER = "/";
String ENDPOINT_PREFIX_REST = "rest";
diff --git a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/client/ClientUtil.java b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/client/ClientUtil.java
index 8cf40b3..9b1fc9f 100644
--- a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/client/ClientUtil.java
+++ b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/client/ClientUtil.java
@@ -16,6 +16,7 @@
*/
package org.apache.servicecomb.zeroconfig.client;
+import io.vertx.core.json.Json;
import org.apache.servicecomb.registry.api.registry.Microservice;
import org.apache.servicecomb.registry.api.registry.MicroserviceInstance;
import org.apache.servicecomb.registry.api.registry.MicroserviceInstanceStatus;
@@ -28,11 +29,8 @@ import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
-import java.util.HashMap;
-import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.*;
@@ -41,33 +39,27 @@ public class ClientUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ClientUtil.class);
- private static ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+ public static final ClientUtil INSTANCE = new ClientUtil();
- private static Microservice microserviceSelf = new Microservice();
+ private ServerMicroserviceInstance serviceInstanceForHeartbeat;
- private static Map<String, String> serviceInstanceMapForHeartbeat = null;
+ private MulticastSocket multicastSocket;
+ private InetAddress group;
- private static MulticastSocket multicastSocket;
-
- public static Microservice getMicroserviceSelf() {
- return microserviceSelf;
+ public ServerMicroserviceInstance getServiceInstanceForHeartbeat() {
+ return serviceInstanceForHeartbeat;
}
- public static void setMicroserviceSelf(Microservice microserviceSelf) {
- ClientUtil.microserviceSelf = microserviceSelf;
+ public void setServiceInstanceForHeartbeat(
+ ServerMicroserviceInstance serviceInstanceForHeartbeat) {
+ this.serviceInstanceForHeartbeat = serviceInstanceForHeartbeat;
}
- public static Map<String, String> getServiceInstanceMapForHeartbeat() {
- return serviceInstanceMapForHeartbeat;
- }
+ private ClientUtil(){}
- public static void setServiceInstanceMapForHeartbeat(
- Map<String, String> serviceInstanceMapForHeartbeat) {
- ClientUtil.serviceInstanceMapForHeartbeat = serviceInstanceMapForHeartbeat;
- }
-
- public static synchronized void init() {
+ public synchronized void init() {
try {
+ group = InetAddress.getByName(GROUP);
multicastSocket = new MulticastSocket();
multicastSocket.setLoopbackMode(false);
multicastSocket.setTimeToLive(TIME_TO_LIVE);
@@ -75,52 +67,40 @@ public class ClientUtil {
LOGGER.error("Failed to create MulticastSocket object", e);
}
- Runnable heartbeatRunnable = new Runnable() {
- @Override
- public void run() {
- if (serviceInstanceMapForHeartbeat != null && !serviceInstanceMapForHeartbeat.isEmpty()) {
- // after first registration succeeds
- try {
- byte[] heartbeatEventDataBytes = serviceInstanceMapForHeartbeat.toString().getBytes();
- DatagramPacket instanceDataPacket = new DatagramPacket(heartbeatEventDataBytes,
- heartbeatEventDataBytes.length,
- InetAddress.getByName(GROUP), PORT);
-
- multicastSocket.send(instanceDataPacket);
- } catch (Exception e) {
- LOGGER.error("Failed to send heartbeat event for object: {}",
- serviceInstanceMapForHeartbeat, e);
- }
- }
- }
- };
- executor.scheduleAtFixedRate(heartbeatRunnable, CLIENT_DELAY, HEALTH_CHECK_INTERVAL,
+ Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(this::runHeartbeatTask, CLIENT_DELAY, HEALTH_CHECK_INTERVAL,
TimeUnit.SECONDS);
}
- public static Map<String, String> convertToRegisterDataModel(String serviceId,
- String microserviceInstanceId,
+ private void runHeartbeatTask(){
+ if (serviceInstanceForHeartbeat != null) {
+ // after first registration succeeds
+ try {
+ byte[] heartbeatEventDataBytes = Json.encode(serviceInstanceForHeartbeat).getBytes();
+ DatagramPacket instanceDataPacket = new DatagramPacket(heartbeatEventDataBytes,
+ heartbeatEventDataBytes.length, group, PORT);
+
+ multicastSocket.send(instanceDataPacket);
+ } catch (Exception e) {
+ LOGGER.error("Failed to send heartbeat event for object: {}",
+ serviceInstanceForHeartbeat.toString(), e);
+ }
+ }
+ }
+
+ public static ServerMicroserviceInstance convertToRegisterDataModel(
MicroserviceInstance microserviceInstance, Microservice microservice) {
- Map<String, String> serviceInstanceTextAttributesMap = new HashMap<>();
-
- serviceInstanceTextAttributesMap.put(EVENT, REGISTER_EVENT);
- serviceInstanceTextAttributesMap.put(VERSION, microservice.getVersion());
- serviceInstanceTextAttributesMap.put(SERVICE_ID, serviceId);
- serviceInstanceTextAttributesMap.put(INSTANCE_ID, microserviceInstanceId);
- serviceInstanceTextAttributesMap.put(STATUS, microserviceInstance.getStatus().toString());
- serviceInstanceTextAttributesMap.put(APP_ID, microservice.getAppId());
- serviceInstanceTextAttributesMap.put(SERVICE_NAME, microservice.getServiceName());
-
- String hostName = microserviceInstance.getHostName();
- serviceInstanceTextAttributesMap.put(HOST_NAME, hostName);
-
- // schema1$schema2
- serviceInstanceTextAttributesMap
- .put(ENDPOINTS, String.join(LIST_STRING_SPLITER, microserviceInstance.getEndpoints()));
- serviceInstanceTextAttributesMap
- .put(SCHEMA_IDS, String.join(LIST_STRING_SPLITER, microservice.getSchemas()));
-
- return serviceInstanceTextAttributesMap;
+ ServerMicroserviceInstance instance = new ServerMicroserviceInstance();
+ instance.setEvent(REGISTER_EVENT);
+ instance.setVersion(microservice.getVersion());
+ instance.setServiceId(microservice.getServiceId());
+ instance.setInstanceId(microserviceInstance.getInstanceId());
+ instance.setStatus(microserviceInstance.getStatus().toString());
+ instance.setAppId(microservice.getAppId());
+ instance.setServiceName(microservice.getServiceName());
+ instance.setHostName(microserviceInstance.getHostName());
+ instance.setEndpoints(microserviceInstance.getEndpoints());
+ instance.setSchemas(microservice.getSchemas());
+ return instance;
}
public static MicroserviceInstance convertToClientMicroserviceInstance(
diff --git a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/client/ZeroConfigClient.java b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/client/ZeroConfigClient.java
index acc1272..5804de8 100644
--- a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/client/ZeroConfigClient.java
+++ b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/client/ZeroConfigClient.java
@@ -17,6 +17,7 @@
package org.apache.servicecomb.zeroconfig.client;
import com.google.common.annotations.VisibleForTesting;
+import io.vertx.core.json.Json;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
@@ -114,28 +115,27 @@ public class ZeroConfigClient {
}
public boolean register() {
- Map<String, String> data = prepareRegisterData();
- String serviceInstanceId = doRegister(data);
+ String serviceInstanceId = doRegister(ClientUtil.convertToRegisterDataModel(selfMicroserviceInstance, selfMicroservice));
return StringUtils.isNotEmpty(serviceInstanceId);
}
- private String doRegister(Map<String, String> serviceInstanceDataMap) {
+ private String doRegister(ServerMicroserviceInstance instance) {
try {
- byte[] instanceData = serviceInstanceDataMap.toString().getBytes(ENCODE);
+ byte[] instanceData = Json.encode(instance).getBytes(ENCODE);
DatagramPacket instanceDataPacket = new DatagramPacket(instanceData, instanceData.length,
InetAddress.getByName(GROUP), PORT);
this.multicastSocket.send(instanceDataPacket);
// set this variable for heartbeat itself status
- serviceInstanceDataMap.put(EVENT, HEARTBEAT_EVENT);
- ClientUtil.setServiceInstanceMapForHeartbeat(serviceInstanceDataMap);
+ instance.setEvent(HEARTBEAT_EVENT);
+ ClientUtil.INSTANCE.setServiceInstanceForHeartbeat(instance);
} catch (IOException e) {
LOGGER.error(
"Failed to Multicast Microservice Instance Registration Event in Zero-Config mode. servcieId: {} instanceId:{}",
- serviceInstanceDataMap.get(SERVICE_ID), serviceInstanceDataMap.get(INSTANCE_ID), e);
+ instance.getServiceId(), instance.getInstanceId(), e);
return null;
}
- return serviceInstanceDataMap.get(INSTANCE_ID);
+ return instance.getInstanceId();
}
public boolean unregister() {
@@ -203,19 +203,6 @@ public class ZeroConfigClient {
}
}
- private String getEndpointForMicroservice(String microserviceId) {
- ServerMicroserviceInstance serverMicroserviceInstance = zeroConfigRegistryService
- .getMicroservice(microserviceId);
- LOGGER.info("Retrieve endpoint for serve rMicroservice Instance: {}",
- serverMicroserviceInstance);
- if (serverMicroserviceInstance != null && !serverMicroserviceInstance.getEndpoints()
- .isEmpty()) {
- return serverMicroserviceInstance.getEndpoints().get(0)
- .replace(ENDPOINT_PREFIX_REST, ENDPOINT_PREFIX_HTTP);
- }
- return null;
- }
-
public MicroserviceInstance findMicroserviceInstance(String serviceId, String instanceId) {
ServerMicroserviceInstance instance = this.zeroConfigRegistryService
.findServiceInstance(serviceId, instanceId);
@@ -282,12 +269,6 @@ public class ZeroConfigClient {
return latestVersionInstance;
}
- private Map<String, String> prepareRegisterData() {
- // Convert to Multicast data format
- return ClientUtil.convertToRegisterDataModel(selfMicroservice.getServiceId(),
- selfMicroserviceInstance.getInstanceId(), selfMicroserviceInstance, selfMicroservice);
- }
-
private ServerMicroserviceInstance preUnregisterCheck() {
ServerMicroserviceInstance instance = zeroConfigRegistryService
.findServiceInstance(selfMicroserviceInstance.getServiceId(),
diff --git a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ServerMicroserviceInstance.java b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ServerMicroserviceInstance.java
index f967477..595f39a 100644
--- a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ServerMicroserviceInstance.java
+++ b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ServerMicroserviceInstance.java
@@ -22,6 +22,8 @@ import java.util.List;
public class ServerMicroserviceInstance {
+ private String event;
+
private String appId;
private String serviceName;
@@ -125,10 +127,19 @@ public class ServerMicroserviceInstance {
this.schemas = schemas;
}
+ public String getEvent() {
+ return event;
+ }
+
+ public void setEvent(String event) {
+ this.event = event;
+ }
+
@Override
public String toString() {
return "ServerMicroserviceInstance{" +
- "appId='" + appId + '\'' +
+ "event='" + event + '\'' +
+ ", appId='" + appId + '\'' +
", serviceName='" + serviceName + '\'' +
", version='" + version + '\'' +
", instanceId='" + instanceId + '\'' +
@@ -140,4 +151,5 @@ public class ServerMicroserviceInstance {
", lastHeartbeatTimeStamp=" + lastHeartbeatTimeStamp +
'}';
}
+
}
diff --git a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ServerUtil.java b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ServerUtil.java
index c8eb8e9..afec26b 100644
--- a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ServerUtil.java
+++ b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ServerUtil.java
@@ -16,6 +16,7 @@
*/
package org.apache.servicecomb.zeroconfig.server;
+import io.vertx.core.json.Json;
import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
import org.apache.servicecomb.zeroconfig.client.ClientUtil;
@@ -29,13 +30,9 @@ import java.net.MulticastSocket;
import java.net.UnknownHostException;
import java.time.Instant;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.*;
@@ -44,50 +41,38 @@ public class ServerUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ServerUtil.class);
- public static MulticastSocket multicastSocket;
+ public static final ServerUtil INSTANCE = new ServerUtil();
- private static ZeroConfigRegistryService zeroConfigRegistryService;
-
- private static InetAddress group;
-
- private static ScheduledExecutorService scheduledExecutor = Executors
- .newSingleThreadScheduledExecutor();
+ public MulticastSocket multicastSocket;
+ private ZeroConfigRegistryService zeroConfigRegistryService;
+ private InetAddress group;
// 1st key: serviceId, 2nd key: instanceId
public static Map<String, Map<String, ServerMicroserviceInstance>> microserviceInstanceMap = new ConcurrentHashMapEx<>();
- public static synchronized void init() {
- zeroConfigRegistryService = new ZeroConfigRegistryService();
+ private ServerUtil(){}
+
+ public synchronized void init() {
+ this.zeroConfigRegistryService = new ZeroConfigRegistryService();
try {
- group = InetAddress.getByName(GROUP);
+ this.group = InetAddress.getByName(GROUP);
} catch (UnknownHostException e) {
LOGGER.error("Unknown host exception when creating MulticastSocket group" + e);
}
- startEventListenerTask();
- startInstanceHealthCheckerTask();
- }
-
- private static void startEventListenerTask() {
- ExecutorService listenerExecutor = Executors.newSingleThreadExecutor();
- listenerExecutor.submit(() -> {
+ Executors.newSingleThreadExecutor().submit(() -> {
startListenerForRegisterUnregisterEvent();
});
+ Executors.newSingleThreadScheduledExecutor()
+ .scheduleAtFixedRate(this::runInstanceHealthCheckerTask, SERVER_DELAY, HEALTH_CHECK_INTERVAL, TimeUnit.SECONDS);
}
- private static void startInstanceHealthCheckerTask() {
- Runnable runnable = new Runnable() {
- @Override
- public void run() {
- if (!microserviceInstanceMap.isEmpty()) {
- List<ServerMicroserviceInstance> unhealthyInstanceList = findUnhealthyInstances();
- if (!unhealthyInstanceList.isEmpty()) {
- removeDeadInstance(unhealthyInstanceList);
- }
- }
+ private void runInstanceHealthCheckerTask() {
+ if (!microserviceInstanceMap.isEmpty()) {
+ List<ServerMicroserviceInstance> unhealthyInstanceList = findUnhealthyInstances();
+ if (!unhealthyInstanceList.isEmpty()) {
+ removeDeadInstance(unhealthyInstanceList);
}
- };
- scheduledExecutor
- .scheduleAtFixedRate(runnable, SERVER_DELAY, HEALTH_CHECK_INTERVAL, TimeUnit.SECONDS);
+ }
}
private static List<ServerMicroserviceInstance> findUnhealthyInstances() {
@@ -121,64 +106,12 @@ public class ServerUtil {
}
}
- public static ServerMicroserviceInstance convertToServerMicroserviceInstance(
- Map<String, String> serviceInstanceAttributeMap) {
- return buildServerMicroserviceInstanceFromMap(serviceInstanceAttributeMap);
- }
-
- private static ServerMicroserviceInstance buildServerMicroserviceInstanceFromMap(
- Map<String, String> serviceAttributeMap) {
- ServerMicroserviceInstance serverMicroserviceInstance = new ServerMicroserviceInstance();
- serverMicroserviceInstance.setInstanceId(serviceAttributeMap.get(INSTANCE_ID));
- serverMicroserviceInstance.setServiceId(serviceAttributeMap.get(SERVICE_ID));
- serverMicroserviceInstance.setStatus(serviceAttributeMap.get(STATUS));
- serverMicroserviceInstance.setHostName(serviceAttributeMap.get(HOST_NAME));
- serverMicroserviceInstance.setAppId(serviceAttributeMap.get(APP_ID));
- serverMicroserviceInstance.setServiceName(serviceAttributeMap.get(SERVICE_NAME));
- serverMicroserviceInstance.setVersion(serviceAttributeMap.get(VERSION));
- // list type attributes
- serverMicroserviceInstance
- .setEndpoints(convertStringToList(serviceAttributeMap.get(ENDPOINTS)));
- serverMicroserviceInstance.setSchemas(convertStringToList(serviceAttributeMap.get(SCHEMA_IDS)));
- return serverMicroserviceInstance;
- }
-
- // rest://127.0.0.1:8080$rest://127.0.0.1:8081
- // schemaId1$schemaId2
- private static List<String> convertStringToList(String listString) {
- List<String> resultList = new ArrayList<>();
- if (listString != null && !listString.isEmpty()) {
- if (listString.contains(LIST_STRING_SPLITER)) {
- resultList = Arrays.asList(listString.split("\\$"));
- } else {
- resultList.add(listString);
- }
- }
- return resultList;
- }
-
- private static Map<String, String> getMapFromString(String inputStr) {
- Map<String, String> map = new HashMap<>();
- String str = inputStr.substring(1, inputStr.length() - 1);
- String[] keyValue = str.split(MAP_ELEMENT_SPILITER);
- for (int i = 0; i < keyValue.length; i++) {
- String[] str2 = keyValue[i].split(MAP_KV_SPILITER);
- if (str2.length - 1 == 0) {
- map.put(str2[0].trim(), "");
- } else {
- map.put(str2[0].trim(), str2[1].trim());
- }
- }
- return map;
- }
-
- private static void initMulticastSocket() throws IOException {
- multicastSocket = new MulticastSocket(PORT);
- group = InetAddress.getByName(GROUP);
- multicastSocket.joinGroup(group); // need to join the group to be able to receive the data
+ private void initMulticastSocket() throws IOException {
+ this.multicastSocket = new MulticastSocket(PORT);
+ this.multicastSocket.joinGroup(this.group); // need to join the group to be able to receive the data
}
- private static void startListenerForRegisterUnregisterEvent() {
+ private void startListenerForRegisterUnregisterEvent() {
try {
byte[] buffer = new byte[DATA_PACKET_BUFFER_SIZE];
initMulticastSocket();
@@ -215,7 +148,8 @@ public class ServerUtil {
}
}
- private static void handleReceivedEvent(String receivedString) {
+ @SuppressWarnings("unchecked")
+ private void handleReceivedEvent(String receivedString) {
if (receivedString.length() < 2
|| !receivedString.startsWith(MAP_STRING_LEFT) || !receivedString
.endsWith(MAP_STRING_RIGHT)) {
@@ -223,25 +157,25 @@ public class ServerUtil {
return;
}
- Map<String, String> receivedStringMap = getMapFromString(receivedString);
- String event = receivedStringMap.get(EVENT);
+ ServerMicroserviceInstance receivedInstance = Json.decodeValue(receivedString, ServerMicroserviceInstance.class);
+ String event = receivedInstance.getEvent();
if (StringUtils.isEmpty(event)) {
- LOGGER.warn("There is no Event property defined. {}", receivedStringMap);
+ LOGGER.warn("There is no Event property defined. {}", receivedInstance);
return;
}
switch (event) {
case REGISTER_EVENT:
- LOGGER.info("Received REGISTER event{}", receivedStringMap);
- zeroConfigRegistryService.registerMicroserviceInstance(receivedStringMap);
+ LOGGER.info("Received REGISTER event: {}", receivedInstance);
+ zeroConfigRegistryService.registerMicroserviceInstance(receivedInstance);
break;
case UNREGISTER_EVENT:
- LOGGER.info("Received UNREGISTER event{}", receivedStringMap);
- zeroConfigRegistryService.unregisterMicroserviceInstance(receivedStringMap);
+ LOGGER.info("Received UNREGISTER event: {}", receivedInstance);
+ zeroConfigRegistryService.unregisterMicroserviceInstance(receivedInstance);
break;
case HEARTBEAT_EVENT:
- if (!isSelfServiceInstance(receivedStringMap)) {
- zeroConfigRegistryService.heartbeat(receivedStringMap);
+ if (!this.isSelfServiceInstance(receivedInstance)) {
+ zeroConfigRegistryService.heartbeat(receivedInstance);
}
break;
default:
@@ -249,19 +183,18 @@ public class ServerUtil {
}
}
- private static boolean isSelfServiceInstance(Map<String, String> receivedStringMap) {
- Map<String, String> serviceInstanceMapForHeartbeat = ClientUtil
- .getServiceInstanceMapForHeartbeat();
- if (serviceInstanceMapForHeartbeat == null) {
+ private boolean isSelfServiceInstance(ServerMicroserviceInstance receivedInstance) {
+ ServerMicroserviceInstance serviceInstanceForHeartbeat = ClientUtil.INSTANCE.getServiceInstanceForHeartbeat();
+ if (serviceInstanceForHeartbeat == null) {
return false;
} else {
// service instance itself
- String selfServiceId = serviceInstanceMapForHeartbeat.get(SERVICE_ID);
- String selfInstanceId = serviceInstanceMapForHeartbeat.get(INSTANCE_ID);
+ String selfServiceId = serviceInstanceForHeartbeat.getServiceId();
+ String selfInstanceId = serviceInstanceForHeartbeat.getInstanceId();
// received event for other service instance
- String serviceId = receivedStringMap.get(SERVICE_ID);
- String instanceId = receivedStringMap.get(INSTANCE_ID);
+ String serviceId = receivedInstance.getServiceId();
+ String instanceId = receivedInstance.getInstanceId();
return selfServiceId.equals(serviceId) && selfInstanceId.equals(instanceId);
}
diff --git a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ZeroConfigRegistryService.java b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ZeroConfigRegistryService.java
index fb726a6..f026edc 100644
--- a/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ZeroConfigRegistryService.java
+++ b/service-registry/registry-zero-config/src/main/java/org/apache/servicecomb/zeroconfig/server/ZeroConfigRegistryService.java
@@ -31,10 +31,10 @@ public class ZeroConfigRegistryService {
private static final Logger LOGGER = LoggerFactory.getLogger(ZeroConfigRegistryService.class);
- public void registerMicroserviceInstance(Map<String, String> serviceAttributeMap) {
- String instanceId = serviceAttributeMap.get(INSTANCE_ID);
- String serviceId = serviceAttributeMap.get(SERVICE_ID);
- String serviceName = serviceAttributeMap.get(SERVICE_NAME);
+ public void registerMicroserviceInstance(ServerMicroserviceInstance receivedInstance) {
+ String instanceId = receivedInstance.getInstanceId();
+ String serviceId = receivedInstance.getServiceId();
+ String serviceName = receivedInstance.getServiceName();
if (serviceId == null || serviceName == null || instanceId == null) {
throw new IllegalArgumentException("Invalid serviceId, serviceId=" + serviceId +
@@ -42,9 +42,6 @@ public class ZeroConfigRegistryService {
+ instanceId);
}
- // convert to server side ServerMicroserviceInstance object
- ServerMicroserviceInstance newServerMicroserviceInstance = ServerUtil
- .convertToServerMicroserviceInstance(serviceAttributeMap);
Map<String, ServerMicroserviceInstance> innerInstanceMap = ServerUtil.microserviceInstanceMap.
computeIfAbsent(serviceId, id -> new ConcurrentHashMap<>());
@@ -55,15 +52,15 @@ public class ZeroConfigRegistryService {
LOGGER
.info("Register a new instance for serviceId: {}, instanceId: {}, status: {}, name: {}",
serviceId,
- instanceId, newServerMicroserviceInstance.getStatus(),
- newServerMicroserviceInstance.getServiceName());
- innerInstanceMap.put(instanceId, newServerMicroserviceInstance);
+ instanceId, receivedInstance.getStatus(),
+ receivedInstance.getServiceName());
+ innerInstanceMap.put(instanceId, receivedInstance);
}
}
- public void unregisterMicroserviceInstance(Map<String, String> serviceAttributeMap) {
- String unregisterServiceId = serviceAttributeMap.get(SERVICE_ID);
- String unregisterInstanceId = serviceAttributeMap.get(INSTANCE_ID);
+ public void unregisterMicroserviceInstance(ServerMicroserviceInstance receivedInstance) {
+ String unregisterServiceId = receivedInstance.getServiceId();
+ String unregisterInstanceId = receivedInstance.getInstanceId();
if (unregisterServiceId == null || unregisterInstanceId == null) {
throw new IllegalArgumentException(
@@ -107,9 +104,9 @@ public class ZeroConfigRegistryService {
}
// for scenario: when other service started before this one start
- public void heartbeat(Map<String, String> heartbeatEventMap) {
- String serviceId = heartbeatEventMap.get(SERVICE_ID);
- String instanceId = heartbeatEventMap.get(INSTANCE_ID);
+ public void heartbeat(ServerMicroserviceInstance receivedInstance) {
+ String serviceId = receivedInstance.getServiceId();
+ String instanceId = receivedInstance.getInstanceId();
Map<String, ServerMicroserviceInstance> serverMicroserviceInstanceMap = ServerUtil.microserviceInstanceMap
.get(serviceId);
@@ -118,11 +115,11 @@ public class ZeroConfigRegistryService {
ServerMicroserviceInstance instance = serverMicroserviceInstanceMap.get(instanceId);
instance.setLastHeartbeatTimeStamp(Instant.now());
} else {
- heartbeatEventMap.put(EVENT, REGISTER_EVENT);
+ receivedInstance.setEvent(REGISTER_EVENT);
LOGGER.info(
"Received HEARTBEAT event from serviceId: {}, instancdId: {} for the first time. Register it instead.",
serviceId, instanceId);
- this.registerMicroserviceInstance(heartbeatEventMap);
+ this.registerMicroserviceInstance(receivedInstance);
}
}
diff --git a/service-registry/registry-zero-config/src/test/java/org/apache/servicecomb/zeroconfig/server/TestZeroConfigRegistryService.java b/service-registry/registry-zero-config/src/test/java/org/apache/servicecomb/zeroconfig/server/TestZeroConfigRegistryService.java
index ed73d44..6320178 100644
--- a/service-registry/registry-zero-config/src/test/java/org/apache/servicecomb/zeroconfig/server/TestZeroConfigRegistryService.java
+++ b/service-registry/registry-zero-config/src/test/java/org/apache/servicecomb/zeroconfig/server/TestZeroConfigRegistryService.java
@@ -26,16 +26,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.APP_ID;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.ENDPOINTS;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.HOST_NAME;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.INSTANCE_ID;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.SCHEMA_IDS;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.SERVICE_ID;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.SERVICE_NAME;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.STATUS;
-import static org.apache.servicecomb.zeroconfig.ZeroConfigRegistryConstants.VERSION;
-
public class TestZeroConfigRegistryService {
ZeroConfigRegistryService target;
@@ -52,7 +42,6 @@ public class TestZeroConfigRegistryService {
String status = "UP";
String host = "host";
String schemaId1 = "schemaId1";
- ;
String endpoint1 = "endpoint1";
@Before
@@ -61,25 +50,11 @@ public class TestZeroConfigRegistryService {
target = new ZeroConfigRegistryService();
}
- private Map<String, String> prepareServiceAttributeMap(boolean withServiceId) {
- Map<String, String> map = new ConcurrentHashMapEx<>();
- map.put(APP_ID, appId);
- if (withServiceId) {
- map.put(SERVICE_ID, serviceId);
- }
- map.put(INSTANCE_ID, instanceId);
- map.put(VERSION, version);
- map.put(STATUS, status);
- map.put(SERVICE_NAME, serviceName);
- map.put(HOST_NAME, host);
- map.put(ENDPOINTS, endpoint1);
- map.put(SCHEMA_IDS, schemaId1);
- return map;
- }
-
- private ServerMicroserviceInstance prepareServerServiceInstance(String serviceInstanceId) {
+ private ServerMicroserviceInstance prepareServerServiceInstance(boolean withServiceId, String serviceInstanceId) {
ServerMicroserviceInstance serverServiceInstance = new ServerMicroserviceInstance();
- serverServiceInstance.setServiceId(serviceId);
+ if (withServiceId){
+ serverServiceInstance.setServiceId(serviceId);
+ }
serverServiceInstance.setInstanceId(serviceInstanceId);
serverServiceInstance.setServiceName(serviceName);
serverServiceInstance.setAppId(appId);
@@ -104,9 +79,9 @@ public class TestZeroConfigRegistryService {
boolean multipleInstances) {
Map<String, Map<String, ServerMicroserviceInstance>> map = new ConcurrentHashMapEx<>();
Map<String, ServerMicroserviceInstance> instanceIdMap = new ConcurrentHashMapEx<>();
- instanceIdMap.put(instanceId, prepareServerServiceInstance(instanceId));
+ instanceIdMap.put(instanceId, prepareServerServiceInstance(true, instanceId));
if (multipleInstances) {
- instanceIdMap.put(instanceId1, prepareServerServiceInstance(instanceId1));
+ instanceIdMap.put(instanceId1, prepareServerServiceInstance(true, instanceId1));
}
map.put(serviceId, instanceIdMap);
return map;
@@ -121,14 +96,14 @@ public class TestZeroConfigRegistryService {
@Test(expected = IllegalArgumentException.class)
public void test_registerMicroserviceInstance_whenServiceIdIsNull_shouldThrowIllegalArgumentException() {
- target.registerMicroserviceInstance(prepareServiceAttributeMap(false));
+ target.registerMicroserviceInstance(prepareServerServiceInstance(false, instanceId));
}
@Test
public void test_registerMicroserviceInstance_whenInstanceNotExist_shouldRegisterSuccessfully() {
ServerUtil.microserviceInstanceMap = prepareEmptyServiceInstanceMap();
- target.registerMicroserviceInstance(prepareServiceAttributeMap(true));
+ target.registerMicroserviceInstance(prepareServerServiceInstance(true, instanceId));
Assert.assertTrue(ServerUtil.microserviceInstanceMap.containsKey(serviceId));
Assert.assertTrue(ServerUtil.microserviceInstanceMap.get(serviceId).containsKey(instanceId));
@@ -138,7 +113,7 @@ public class TestZeroConfigRegistryService {
public void test_registerMicroserviceInstance_whenInstanceExist_shouldRegisterSuccessfully() {
ServerUtil.microserviceInstanceMap = prepareServiceInstanceMap(false);
- target.registerMicroserviceInstance(prepareServiceAttributeMap(true));
+ target.registerMicroserviceInstance(prepareServerServiceInstance(true, instanceId));
Assert.assertTrue(ServerUtil.microserviceInstanceMap.containsKey(serviceId));
Assert.assertTrue(ServerUtil.microserviceInstanceMap.get(serviceId).containsKey(instanceId));
@@ -147,14 +122,14 @@ public class TestZeroConfigRegistryService {
@Test(expected = IllegalArgumentException.class)
public void test_unregisterMicroserviceInstance_whenServiceIdIsNull_shouldThrowIllegalArgumentException() {
- target.unregisterMicroserviceInstance(prepareServiceAttributeMap(false));
+ target.unregisterMicroserviceInstance(prepareServerServiceInstance(false, instanceId));
}
@Test
public void test_unregisterMicroserviceInstance_withServiceIdAndInstanceId_and_multipleInstance_shouldRemoveInstance() {
ServerUtil.microserviceInstanceMap = prepareServiceInstanceMap(true);
- target.unregisterMicroserviceInstance(prepareServiceAttributeMap(true));
+ target.unregisterMicroserviceInstance(prepareServerServiceInstance(true, instanceId));
Assert.assertTrue(ServerUtil.microserviceInstanceMap.containsKey(serviceId));
Assert.assertTrue(ServerUtil.microserviceInstanceMap.get(serviceId).containsKey(instanceId1));
@@ -165,7 +140,7 @@ public class TestZeroConfigRegistryService {
public void test_unregisterMicroserviceInstance_withServiceIdAndInstanceId_and_singleInstance_shouldRemoveService() {
ServerUtil.microserviceInstanceMap = prepareServiceInstanceMap(false);
- target.unregisterMicroserviceInstance(prepareServiceAttributeMap(true));
+ target.unregisterMicroserviceInstance(prepareServerServiceInstance(true, instanceId));
Assert.assertFalse(ServerUtil.microserviceInstanceMap.containsKey(serviceId));
}