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