You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2018/11/18 12:23:03 UTC

[incubator-skywalking] branch master updated: OAP server testing module. (#1931)

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

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new afd6164  OAP server testing module. (#1931)
afd6164 is described below

commit afd616433588644addb8498bbe6734e1f5e85803
Author: 彭勇升 pengys <80...@qq.com>
AuthorDate: Sun Nov 18 20:22:56 2018 +0800

    OAP server testing module. (#1931)
    
    * OAP server testing module.
    
    #1930
    
    * #Missing delete code.
---
 oap-server/pom.xml                                 |  1 +
 .../ClusterModuleKubernetesProvider.java           |  4 +-
 .../skywalking/oap/server/core/CoreModule.java     |  6 +--
 .../oap/server/core/CoreModuleProvider.java        |  7 +--
 .../oap/server/core/alarm/AlarmEntrance.java       |  4 +-
 .../oap/server/core/alarm/AlarmModule.java         |  6 +--
 .../core/analysis/worker/IndicatorProcess.java     |  2 +-
 .../analysis/worker/IndicatorRemoteWorker.java     |  2 +-
 .../core/analysis/worker/PersistenceWorker.java    |  2 +-
 .../server/core/analysis/worker/RecordProcess.java |  2 +-
 .../oap/server/core/cache/CacheUpdateTimer.java    |  4 +-
 .../server/core/cache/EndpointInventoryCache.java  |  2 +-
 .../core/cache/NetworkAddressInventoryCache.java   |  2 +-
 .../core/cache/ServiceInstanceInventoryCache.java  |  2 +-
 .../server/core/cache/ServiceInventoryCache.java   |  2 +-
 .../oap/server/core/cluster/ClusterModule.java     |  6 +--
 .../server/core/query/AggregationQueryService.java | 12 ++---
 .../oap/server/core/query/AlarmQueryService.java   |  2 +-
 .../server/core/query/MetadataQueryService.java    |  6 +--
 .../oap/server/core/query/MetricQueryService.java  |  2 +-
 .../oap/server/core/query/QueryModule.java         |  4 +-
 .../oap/server/core/query/TopologyBuilder.java     |  4 +-
 .../server/core/query/TopologyQueryService.java    |  8 ++--
 .../oap/server/core/query/TraceQueryService.java   | 10 ++--
 .../service/EndpointInventoryRegister.java         |  2 +-
 .../service/NetworkAddressInventoryRegister.java   |  6 +--
 .../service/ServiceInstanceInventoryRegister.java  |  2 +-
 .../register/service/ServiceInventoryRegister.java |  2 +-
 .../core/register/worker/InventoryProcess.java     |  2 +-
 .../register/worker/RegisterPersistentWorker.java  |  2 +-
 .../core/register/worker/RegisterRemoteWorker.java |  2 +-
 .../server/core/remote/RemoteSenderService.java    |  2 +-
 .../server/core/remote/RemoteServiceHandler.java   |  2 +-
 .../core/remote/client/RemoteClientManager.java    |  4 +-
 .../oap/server/core/storage/PersistenceTimer.java  |  2 +-
 .../oap/server/core/storage/StorageModule.java     |  6 +--
 .../server/core/storage/model/ModelInstaller.java  |  4 +-
 .../core/storage/ttl/DataTTLKeeperTimer.java       |  8 ++--
 .../oap/server/library/module/BootstrapFlow.java   |  9 +---
 .../library/module/DuplicateProviderException.java |  3 +-
 .../oap/server/library/module/ModuleDefine.java    | 28 +++++------
 ...viderException.java => ModuleDefineHolder.java} | 13 ++++--
 .../oap/server/library/module/ModuleManager.java   |  9 ++--
 .../oap/server/library/module/ModuleProvider.java  | 43 ++++++++---------
 ...derException.java => ModuleProviderHolder.java} | 11 +++--
 .../library/module/ModuleServiceHolder.java}       | 15 +++---
 .../library/module/ProviderNotFoundException.java  |  2 +-
 .../module/ServiceNotProvidedException.java        |  2 +-
 .../oap/server/library/module/BaseModuleA.java     |  7 ++-
 .../oap/server/library/module/BaseModuleB.java     |  6 +--
 .../server/library/module/ModuleManagerTest.java   |  4 +-
 .../oap/server/library/module/TestModule.java      |  6 +--
 .../oap/query/graphql/GraphQLQueryProvider.java    |  2 +-
 .../query/graphql/resolver/AggregationQuery.java   |  2 +-
 .../oap/query/graphql/resolver/AlarmQuery.java     |  2 +-
 .../oap/query/graphql/resolver/MetadataQuery.java  |  2 +-
 .../oap/query/graphql/resolver/MetricQuery.java    |  2 +-
 .../oap/query/graphql/resolver/TopologyQuery.java  |  2 +-
 .../oap/query/graphql/resolver/TraceQuery.java     |  2 +-
 .../module/IstioTelemetryReceiverModule.java       |  6 +--
 .../provider/IstioTelemetryReceiverProvider.java   |  7 +--
 .../oap/server/receiver/jvm/module/JVMModule.java  |  6 +--
 .../receiver/jvm/provider/JVMModuleProvider.java   |  2 +-
 .../provider/handler/JVMMetricsServiceHandler.java |  2 +-
 .../server/receiver/mesh/CoreRegisterLinker.java   |  6 +--
 .../server/receiver/mesh/MeshReceiverModule.java   |  4 +-
 .../server/receiver/mesh/MeshReceiverProvider.java |  7 +--
 .../receiver/mesh/TelemetryDataDispatcher.java     | 10 ++--
 .../receiver/register/module/RegisterModule.java   |  6 +--
 .../register/provider/RegisterModuleProvider.java  |  4 +-
 .../v5/grpc/ApplicationRegisterHandler.java        |  2 +-
 .../v5/grpc/InstanceDiscoveryServiceHandler.java   |  8 ++--
 .../grpc/NetworkAddressRegisterServiceHandler.java |  2 +-
 .../v5/grpc/ServiceNameDiscoveryHandler.java       |  2 +-
 .../v5/rest/ApplicationRegisterServletHandler.java |  2 +-
 .../v5/rest/InstanceDiscoveryServletHandler.java   |  4 +-
 .../v5/rest/InstanceHeartBeatServletHandler.java   |  6 +--
 .../rest/NetworkAddressRegisterServletHandler.java |  2 +-
 .../rest/ServiceNameDiscoveryServiceHandler.java   |  2 +-
 .../server/receiver/trace/module/TraceModule.java  |  4 +-
 .../trace/provider/TraceModuleProvider.java        |  4 +-
 .../listener/endpoint/MultiScopesSpanListener.java |  8 ++--
 .../listener/segment/SegmentSpanListener.java      |  4 +-
 .../service/ServiceMappingSpanListener.java        |  4 +-
 .../standardization/ReferenceIdExchanger.java      |  6 +--
 .../parser/standardization/SpanIdExchanger.java    |  6 +--
 .../oap/server/starter/OAPServerStartUp.java       |  3 +-
 .../storage/plugin/jdbc/h2/H2StorageProvider.java  |  5 +-
 oap-server/server-testing/pom.xml                  | 40 ++++++++++++++++
 .../testing/module/ModuleDefineTesting.java}       | 16 +++----
 .../testing/module/ModuleManagerTesting.java}      | 21 +++++----
 .../testing/module/ModuleProviderTesting.java}     | 22 +++++----
 .../testing/module/ModuleManagerTestCase.java      | 54 ++++++++++++++++++++++
 .../server-testing/src/test/resources/log4j2.xml   | 31 +++++++++++++
 94 files changed, 374 insertions(+), 264 deletions(-)

diff --git a/oap-server/pom.xml b/oap-server/pom.xml
index 20e4648..86f5d81 100644
--- a/oap-server/pom.xml
+++ b/oap-server/pom.xml
@@ -36,6 +36,7 @@
         <module>server-starter</module>
         <module>server-query-plugin</module>
         <module>server-alarm-plugin</module>
+        <module>server-testing</module>
     </modules>
 
     <properties>
diff --git a/oap-server/server-cluster-plugin/cluster-kubernetes-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/kubernetes/ClusterModuleKubernetesProvider.java b/oap-server/server-cluster-plugin/cluster-kubernetes-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/kubernetes/ClusterModuleKubernetesProvider.java
index 659e2ab..f1d0d07 100644
--- a/oap-server/server-cluster-plugin/cluster-kubernetes-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/kubernetes/ClusterModuleKubernetesProvider.java
+++ b/oap-server/server-cluster-plugin/cluster-kubernetes-plugin/src/main/java/org/apache/skywalking/oap/server/cluster/plugin/kubernetes/ClusterModuleKubernetesProvider.java
@@ -23,10 +23,8 @@ import org.apache.skywalking.oap.server.cluster.plugin.kubernetes.dependencies.U
 import org.apache.skywalking.oap.server.core.cluster.ClusterModule;
 import org.apache.skywalking.oap.server.core.cluster.ClusterNodesQuery;
 import org.apache.skywalking.oap.server.core.cluster.ClusterRegister;
-import org.apache.skywalking.oap.server.library.module.ModuleConfig;
+import org.apache.skywalking.oap.server.library.module.*;
 import org.apache.skywalking.oap.server.library.module.ModuleDefine;
-import org.apache.skywalking.oap.server.library.module.ModuleProvider;
-import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
 
 /**
  * Use kubernetes to manage all instances in Skywalking cluster.
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java
index d720cb6..dade6d0 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java
@@ -29,7 +29,7 @@ import org.apache.skywalking.oap.server.core.remote.client.RemoteClientManager;
 import org.apache.skywalking.oap.server.core.server.*;
 import org.apache.skywalking.oap.server.core.source.SourceReceiver;
 import org.apache.skywalking.oap.server.core.storage.model.IModelGetter;
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * @author peng-yongsheng
@@ -38,8 +38,8 @@ public class CoreModule extends ModuleDefine {
 
     public static final String NAME = "core";
 
-    @Override public String name() {
-        return NAME;
+    public CoreModule() {
+        super(NAME);
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
index b116fec..b1181da 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
@@ -64,11 +64,8 @@ import org.apache.skywalking.oap.server.core.storage.PersistenceTimer;
 import org.apache.skywalking.oap.server.core.storage.annotation.StorageAnnotationListener;
 import org.apache.skywalking.oap.server.core.storage.model.IModelGetter;
 import org.apache.skywalking.oap.server.core.storage.ttl.DataTTLKeeperTimer;
-import org.apache.skywalking.oap.server.library.module.ModuleConfig;
+import org.apache.skywalking.oap.server.library.module.*;
 import org.apache.skywalking.oap.server.library.module.ModuleDefine;
-import org.apache.skywalking.oap.server.library.module.ModuleProvider;
-import org.apache.skywalking.oap.server.library.module.ModuleStartException;
-import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
 import org.apache.skywalking.oap.server.library.server.ServerException;
 import org.apache.skywalking.oap.server.library.server.grpc.GRPCServer;
 import org.apache.skywalking.oap.server.library.server.jetty.JettyServer;
@@ -190,7 +187,7 @@ public class CoreModuleProvider extends ModuleProvider {
         }
 
         RemoteInstance gRPCServerInstance = new RemoteInstance(moduleConfig.getGRPCHost(), moduleConfig.getGRPCPort(), true);
-        this.getManager().find(ClusterModule.NAME).getService(ClusterRegister.class).registerRemote(gRPCServerInstance);
+        this.getManager().find(ClusterModule.NAME).provider().getService(ClusterRegister.class).registerRemote(gRPCServerInstance);
 
         PersistenceTimer.INSTANCE.start(getManager());
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmEntrance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmEntrance.java
index b8da041..3992841 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmEntrance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmEntrance.java
@@ -71,8 +71,8 @@ public class AlarmEntrance {
             initLock.lock();
             try {
                 if (serviceInventoryCache == null) {
-                    serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
-                    indicatorNotify = moduleManager.find(AlarmModule.NAME).getService(IndicatorNotify.class);
+                    serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
+                    indicatorNotify = moduleManager.find(AlarmModule.NAME).provider().getService(IndicatorNotify.class);
                     indicatorNotify.init(new AlarmStandardPersistence());
                 }
             } finally {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
index e7cb96d..8357727 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmModule.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * Alarm module define the main bridge entrance of the alarm implementor.
@@ -30,8 +30,8 @@ import org.apache.skywalking.oap.server.library.module.ModuleDefine;
 public class AlarmModule extends ModuleDefine {
     public static final String NAME = "alarm";
 
-    @Override public String name() {
-        return NAME;
+    public AlarmModule() {
+        super(NAME);
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/IndicatorProcess.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/IndicatorProcess.java
index e7d67f9..8b5a0b9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/IndicatorProcess.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/IndicatorProcess.java
@@ -44,7 +44,7 @@ public enum IndicatorProcess {
         String modelName = StorageEntityAnnotationUtils.getModelName(indicatorClass);
         Class<? extends StorageBuilder> builderClass = StorageEntityAnnotationUtils.getBuilder(indicatorClass);
 
-        StorageDAO storageDAO = moduleManager.find(StorageModule.NAME).getService(StorageDAO.class);
+        StorageDAO storageDAO = moduleManager.find(StorageModule.NAME).provider().getService(StorageDAO.class);
         IIndicatorDAO indicatorDAO;
         try {
             indicatorDAO = storageDAO.newIndicatorDao(builderClass.newInstance());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/IndicatorRemoteWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/IndicatorRemoteWorker.java
index 2a100c0..320c2de 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/IndicatorRemoteWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/IndicatorRemoteWorker.java
@@ -41,7 +41,7 @@ public class IndicatorRemoteWorker extends AbstractWorker<Indicator> {
     IndicatorRemoteWorker(int workerId, ModuleManager moduleManager, AbstractWorker<Indicator> nextWorker,
         String modelName) {
         super(workerId);
-        this.remoteSender = moduleManager.find(CoreModule.NAME).getService(RemoteSenderService.class);
+        this.remoteSender = moduleManager.find(CoreModule.NAME).provider().getService(RemoteSenderService.class);
         this.nextWorker = nextWorker;
         this.modelName = modelName;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/PersistenceWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/PersistenceWorker.java
index b9e67f0..a35f2a8 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/PersistenceWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/PersistenceWorker.java
@@ -38,7 +38,7 @@ public abstract class PersistenceWorker<INPUT extends StorageData, CACHE extends
     PersistenceWorker(ModuleManager moduleManager, int workerId, int batchSize) {
         super(workerId);
         this.batchSize = batchSize;
-        this.batchDAO = moduleManager.find(StorageModule.NAME).getService(IBatchDAO.class);
+        this.batchDAO = moduleManager.find(StorageModule.NAME).provider().getService(IBatchDAO.class);
     }
 
     void onWork(INPUT input) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/RecordProcess.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/RecordProcess.java
index 838136d..0ed70f2 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/RecordProcess.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/RecordProcess.java
@@ -45,7 +45,7 @@ public enum RecordProcess {
         String modelName = StorageEntityAnnotationUtils.getModelName(recordClass);
         Class<? extends StorageBuilder> builderClass = StorageEntityAnnotationUtils.getBuilder(recordClass);
 
-        StorageDAO storageDAO = moduleManager.find(StorageModule.NAME).getService(StorageDAO.class);
+        StorageDAO storageDAO = moduleManager.find(StorageModule.NAME).provider().getService(StorageDAO.class);
         IRecordDAO recordDAO;
         try {
             recordDAO = storageDAO.newRecordDao(builderClass.newInstance());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/CacheUpdateTimer.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/CacheUpdateTimer.java
index 3f06ecc..5aa9dbd 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/CacheUpdateTimer.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/CacheUpdateTimer.java
@@ -53,8 +53,8 @@ public enum CacheUpdateTimer {
     }
 
     private void update(ModuleManager moduleManager) {
-        IServiceInventoryCacheDAO serviceInventoryCacheDAO = moduleManager.find(StorageModule.NAME).getService(IServiceInventoryCacheDAO.class);
-        ServiceInventoryCache serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
+        IServiceInventoryCacheDAO serviceInventoryCacheDAO = moduleManager.find(StorageModule.NAME).provider().getService(IServiceInventoryCacheDAO.class);
+        ServiceInventoryCache serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
         List<ServiceInventory> serviceInventories = serviceInventoryCacheDAO.loadLastMappingUpdate();
 
         serviceInventories.forEach(serviceInventory -> {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/EndpointInventoryCache.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/EndpointInventoryCache.java
index 7fee3bb..a7e7127 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/EndpointInventoryCache.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/EndpointInventoryCache.java
@@ -55,7 +55,7 @@ public class EndpointInventoryCache implements Service {
 
     private IEndpointInventoryCacheDAO getCacheDAO() {
         if (isNull(cacheDAO)) {
-            cacheDAO = moduleManager.find(StorageModule.NAME).getService(IEndpointInventoryCacheDAO.class);
+            cacheDAO = moduleManager.find(StorageModule.NAME).provider().getService(IEndpointInventoryCacheDAO.class);
         }
         return cacheDAO;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/NetworkAddressInventoryCache.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/NetworkAddressInventoryCache.java
index bbcd66e..d9cd2fe 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/NetworkAddressInventoryCache.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/NetworkAddressInventoryCache.java
@@ -49,7 +49,7 @@ public class NetworkAddressInventoryCache implements Service {
 
     private INetworkAddressInventoryCacheDAO getCacheDAO() {
         if (isNull(cacheDAO)) {
-            this.cacheDAO = moduleManager.find(StorageModule.NAME).getService(INetworkAddressInventoryCacheDAO.class);
+            this.cacheDAO = moduleManager.find(StorageModule.NAME).provider().getService(INetworkAddressInventoryCacheDAO.class);
         }
         return this.cacheDAO;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInstanceInventoryCache.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInstanceInventoryCache.java
index deac60b..c328e61 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInstanceInventoryCache.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInstanceInventoryCache.java
@@ -59,7 +59,7 @@ public class ServiceInstanceInventoryCache implements Service {
 
     private IServiceInstanceInventoryCacheDAO getCacheDAO() {
         if (isNull(cacheDAO)) {
-            this.cacheDAO = moduleManager.find(StorageModule.NAME).getService(IServiceInstanceInventoryCacheDAO.class);
+            this.cacheDAO = moduleManager.find(StorageModule.NAME).provider().getService(IServiceInstanceInventoryCacheDAO.class);
         }
         return this.cacheDAO;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInventoryCache.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInventoryCache.java
index 4aa798c..a38cb2e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInventoryCache.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cache/ServiceInventoryCache.java
@@ -56,7 +56,7 @@ public class ServiceInventoryCache implements Service {
 
     private IServiceInventoryCacheDAO getCacheDAO() {
         if (isNull(cacheDAO)) {
-            this.cacheDAO = moduleManager.find(StorageModule.NAME).getService(IServiceInventoryCacheDAO.class);
+            this.cacheDAO = moduleManager.find(StorageModule.NAME).provider().getService(IServiceInventoryCacheDAO.class);
         }
         return this.cacheDAO;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
index a4499dc..c4c826a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.cluster;
 
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * @author peng-yongsheng
@@ -27,8 +27,8 @@ public class ClusterModule extends ModuleDefine {
 
     public static final String NAME = "cluster";
 
-    @Override public String name() {
-        return NAME;
+    public ClusterModule() {
+        super(NAME);
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java
index 6e247c6..742203f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java
@@ -44,7 +44,7 @@ public class AggregationQueryService implements Service {
 
     private IAggregationQueryDAO getAggregationQueryDAO() {
         if (aggregationQueryDAO == null) {
-            aggregationQueryDAO = moduleManager.find(StorageModule.NAME).getService(IAggregationQueryDAO.class);
+            aggregationQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(IAggregationQueryDAO.class);
         }
         return aggregationQueryDAO;
     }
@@ -53,7 +53,7 @@ public class AggregationQueryService implements Service {
         final long endTB, final Order order) throws IOException {
         List<TopNEntity> topNEntities = getAggregationQueryDAO().getServiceTopN(indName, ValueColumnIds.INSTANCE.getValueCName(indName), topN, step, startTB, endTB, order);
         for (TopNEntity entity : topNEntities) {
-            ServiceInventory inventory = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class).get(Integer.valueOf(entity.getId()));
+            ServiceInventory inventory = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class).get(Integer.valueOf(entity.getId()));
             if (inventory != null) {
                 entity.setName(inventory.getName());
             }
@@ -65,7 +65,7 @@ public class AggregationQueryService implements Service {
         final long startTB, final long endTB, final Order order) throws IOException {
         List<TopNEntity> topNEntities = getAggregationQueryDAO().getAllServiceInstanceTopN(indName, ValueColumnIds.INSTANCE.getValueCName(indName), topN, step, startTB, endTB, order);
         for (TopNEntity entity : topNEntities) {
-            ServiceInstanceInventory inventory = moduleManager.find(CoreModule.NAME).getService(ServiceInstanceInventoryCache.class).get(Integer.valueOf(entity.getId()));
+            ServiceInstanceInventory inventory = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class).get(Integer.valueOf(entity.getId()));
             if (inventory != null) {
                 entity.setName(inventory.getName());
             }
@@ -77,7 +77,7 @@ public class AggregationQueryService implements Service {
         final Step step, final long startTB, final long endTB, final Order order) throws IOException {
         List<TopNEntity> topNEntities = getAggregationQueryDAO().getServiceInstanceTopN(serviceId, indName, ValueColumnIds.INSTANCE.getValueCName(indName), topN, step, startTB, endTB, order);
         for (TopNEntity entity : topNEntities) {
-            ServiceInstanceInventory inventory = moduleManager.find(CoreModule.NAME).getService(ServiceInstanceInventoryCache.class).get(Integer.valueOf(entity.getId()));
+            ServiceInstanceInventory inventory = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class).get(Integer.valueOf(entity.getId()));
             if (inventory != null) {
                 entity.setName(inventory.getName());
             }
@@ -89,7 +89,7 @@ public class AggregationQueryService implements Service {
         final long startTB, final long endTB, final Order order) throws IOException {
         List<TopNEntity> topNEntities = getAggregationQueryDAO().getAllEndpointTopN(indName, ValueColumnIds.INSTANCE.getValueCName(indName), topN, step, startTB, endTB, order);
         for (TopNEntity entity : topNEntities) {
-            EndpointInventory inventory = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class).get(Integer.valueOf(entity.getId()));
+            EndpointInventory inventory = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class).get(Integer.valueOf(entity.getId()));
             if (inventory != null) {
                 entity.setName(inventory.getName());
             }
@@ -101,7 +101,7 @@ public class AggregationQueryService implements Service {
         final Step step, final long startTB, final long endTB, final Order order) throws IOException {
         List<TopNEntity> topNEntities = getAggregationQueryDAO().getEndpointTopN(serviceId, indName, ValueColumnIds.INSTANCE.getValueCName(indName), topN, step, startTB, endTB, order);
         for (TopNEntity entity : topNEntities) {
-            EndpointInventory inventory = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class).get(Integer.valueOf(entity.getId()));
+            EndpointInventory inventory = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class).get(Integer.valueOf(entity.getId()));
             if (inventory != null) {
                 entity.setName(inventory.getName());
             }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java
index ab8f956..9533cbe 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java
@@ -43,7 +43,7 @@ public class AlarmQueryService implements Service {
 
     private IAlarmQueryDAO getAlarmQueryDAO() {
         if (alarmQueryDAO == null) {
-            alarmQueryDAO = moduleManager.find(StorageModule.NAME).getService(IAlarmQueryDAO.class);
+            alarmQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(IAlarmQueryDAO.class);
         }
         return alarmQueryDAO;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java
index 252ce72..6390827 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java
@@ -45,21 +45,21 @@ public class MetadataQueryService implements org.apache.skywalking.oap.server.li
 
     private IMetadataQueryDAO getMetadataQueryDAO() {
         if (metadataQueryDAO == null) {
-            metadataQueryDAO = moduleManager.find(StorageModule.NAME).getService(IMetadataQueryDAO.class);
+            metadataQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(IMetadataQueryDAO.class);
         }
         return metadataQueryDAO;
     }
 
     private ServiceInventoryCache getServiceInventoryCache() {
         if (serviceInventoryCache == null) {
-            serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
+            serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
         }
         return serviceInventoryCache;
     }
 
     private EndpointInventoryCache getEndpointInventoryCache() {
         if (endpointInventoryCache == null) {
-            endpointInventoryCache = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class);
+            endpointInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class);
         }
         return endpointInventoryCache;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java
index cd83c2f..0d62c4e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java
@@ -50,7 +50,7 @@ public class MetricQueryService implements Service {
 
     private IMetricQueryDAO getMetricQueryDAO() {
         if (metricQueryDAO == null) {
-            metricQueryDAO = moduleManager.find(StorageModule.NAME).getService(IMetricQueryDAO.class);
+            metricQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(IMetricQueryDAO.class);
         }
         return metricQueryDAO;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/QueryModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/QueryModule.java
index bbba731..5821e4f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/QueryModule.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/QueryModule.java
@@ -29,8 +29,8 @@ public class QueryModule extends ModuleDefine {
 
     private static final String NAME = "query";
 
-    @Override public String name() {
-        return NAME;
+    public QueryModule() {
+        super(NAME);
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
index c518c10..c9d10f4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
@@ -40,8 +40,8 @@ class TopologyBuilder {
     private final IComponentLibraryCatalogService componentLibraryCatalogService;
 
     TopologyBuilder(ModuleManager moduleManager) {
-        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
-        this.componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).getService(IComponentLibraryCatalogService.class);
+        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
+        this.componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).provider().getService(IComponentLibraryCatalogService.class);
     }
 
     Topology build(List<Call> serviceRelationClientCalls, List<Call> serviceRelationServerCalls) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
index 6e5dc1d..33031ab 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
@@ -51,28 +51,28 @@ public class TopologyQueryService implements Service {
 
     private IMetadataQueryDAO getMetadataQueryDAO() {
         if (metadataQueryDAO == null) {
-            metadataQueryDAO = moduleManager.find(StorageModule.NAME).getService(IMetadataQueryDAO.class);
+            metadataQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(IMetadataQueryDAO.class);
         }
         return metadataQueryDAO;
     }
 
     private ITopologyQueryDAO getTopologyQueryDAO() {
         if (topologyQueryDAO == null) {
-            topologyQueryDAO = moduleManager.find(StorageModule.NAME).getService(ITopologyQueryDAO.class);
+            topologyQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(ITopologyQueryDAO.class);
         }
         return topologyQueryDAO;
     }
 
     private IComponentLibraryCatalogService getComponentLibraryCatalogService() {
         if (componentLibraryCatalogService == null) {
-            componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).getService(IComponentLibraryCatalogService.class);
+            componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).provider().getService(IComponentLibraryCatalogService.class);
         }
         return componentLibraryCatalogService;
     }
 
     private EndpointInventoryCache getEndpointInventoryCache() {
         if (endpointInventoryCache == null) {
-            endpointInventoryCache = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class);
+            endpointInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class);
         }
         return endpointInventoryCache;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java
index d475b96..b506e15 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java
@@ -54,35 +54,35 @@ public class TraceQueryService implements Service {
 
     private ITraceQueryDAO getTraceQueryDAO() {
         if (traceQueryDAO == null) {
-            this.traceQueryDAO = moduleManager.find(StorageModule.NAME).getService(ITraceQueryDAO.class);
+            this.traceQueryDAO = moduleManager.find(StorageModule.NAME).provider().getService(ITraceQueryDAO.class);
         }
         return traceQueryDAO;
     }
 
     private ServiceInventoryCache getServiceInventoryCache() {
         if (serviceInventoryCache == null) {
-            this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
+            this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
         }
         return serviceInventoryCache;
     }
 
     private EndpointInventoryCache getEndpointInventoryCache() {
         if (endpointInventoryCache == null) {
-            this.endpointInventoryCache = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class);
+            this.endpointInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class);
         }
         return endpointInventoryCache;
     }
 
     private NetworkAddressInventoryCache getNetworkAddressInventoryCache() {
         if (networkAddressInventoryCache == null) {
-            this.networkAddressInventoryCache = moduleManager.find(CoreModule.NAME).getService(NetworkAddressInventoryCache.class);
+            this.networkAddressInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(NetworkAddressInventoryCache.class);
         }
         return networkAddressInventoryCache;
     }
 
     private IComponentLibraryCatalogService getComponentLibraryCatalogService() {
         if (componentLibraryCatalogService == null) {
-            this.componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).getService(IComponentLibraryCatalogService.class);
+            this.componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).provider().getService(IComponentLibraryCatalogService.class);
         }
         return componentLibraryCatalogService;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/EndpointInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/EndpointInventoryRegister.java
index 5a000a6..d490b6c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/EndpointInventoryRegister.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/EndpointInventoryRegister.java
@@ -45,7 +45,7 @@ public class EndpointInventoryRegister implements IEndpointInventoryRegister {
 
     private EndpointInventoryCache getCacheService() {
         if (isNull(cacheService)) {
-            cacheService = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class);
+            cacheService = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class);
         }
         return cacheService;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/NetworkAddressInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/NetworkAddressInventoryRegister.java
index db72c87..cccb7bc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/NetworkAddressInventoryRegister.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/NetworkAddressInventoryRegister.java
@@ -46,21 +46,21 @@ public class NetworkAddressInventoryRegister implements INetworkAddressInventory
 
     private NetworkAddressInventoryCache getNetworkAddressInventoryCache() {
         if (isNull(networkAddressInventoryCache)) {
-            this.networkAddressInventoryCache = moduleManager.find(CoreModule.NAME).getService(NetworkAddressInventoryCache.class);
+            this.networkAddressInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(NetworkAddressInventoryCache.class);
         }
         return this.networkAddressInventoryCache;
     }
 
     private IServiceInventoryRegister getServiceInventoryRegister() {
         if (isNull(serviceInventoryRegister)) {
-            this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInventoryRegister.class);
+            this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
         }
         return this.serviceInventoryRegister;
     }
 
     private IServiceInstanceInventoryRegister getServiceInstanceInventoryRegister() {
         if (isNull(serviceInstanceInventoryRegister)) {
-            this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInstanceInventoryRegister.class);
+            this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
         }
         return this.serviceInstanceInventoryRegister;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java
index c6b0e5e..cf57cb7 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInstanceInventoryRegister.java
@@ -45,7 +45,7 @@ public class ServiceInstanceInventoryRegister implements IServiceInstanceInvento
 
     private ServiceInstanceInventoryCache getServiceInstanceInventoryCache() {
         if (isNull(serviceInstanceInventoryCache)) {
-            serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInstanceInventoryCache.class);
+            serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class);
         }
         return serviceInstanceInventoryCache;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java
index 24d0c92..d5a94df 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/service/ServiceInventoryRegister.java
@@ -45,7 +45,7 @@ public class ServiceInventoryRegister implements IServiceInventoryRegister {
 
     private ServiceInventoryCache getServiceInventoryCache() {
         if (isNull(serviceInventoryCache)) {
-            this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
+            this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
         }
         return serviceInventoryCache;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/InventoryProcess.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/InventoryProcess.java
index ad6c787..cd6f35f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/InventoryProcess.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/InventoryProcess.java
@@ -52,7 +52,7 @@ public enum InventoryProcess {
 
         Class<? extends StorageBuilder> builderClass = StorageEntityAnnotationUtils.getBuilder(inventoryClass);
 
-        StorageDAO storageDAO = moduleManager.find(StorageModule.NAME).getService(StorageDAO.class);
+        StorageDAO storageDAO = moduleManager.find(StorageModule.NAME).provider().getService(StorageDAO.class);
         IRegisterDAO registerDAO;
         try {
             registerDAO = storageDAO.newRegisterDao(builderClass.newInstance());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterPersistentWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterPersistentWorker.java
index 57c663d..b315074 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterPersistentWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterPersistentWorker.java
@@ -49,7 +49,7 @@ public class RegisterPersistentWorker extends AbstractWorker<RegisterSource> {
         this.modelName = modelName;
         this.sources = new HashMap<>();
         this.registerDAO = registerDAO;
-        this.registerLockDAO = moduleManager.find(StorageModule.NAME).getService(IRegisterLockDAO.class);
+        this.registerLockDAO = moduleManager.find(StorageModule.NAME).provider().getService(IRegisterLockDAO.class);
         this.scope = scope;
         this.dataCarrier = new DataCarrier<>("IndicatorPersistentWorker." + modelName, 1, 10000);
         this.dataCarrier.consume(new RegisterPersistentWorker.PersistentConsumer(this), 1);
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterRemoteWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterRemoteWorker.java
index f8d14dd..1bf3e41 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterRemoteWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterRemoteWorker.java
@@ -38,7 +38,7 @@ public class RegisterRemoteWorker extends AbstractWorker<RegisterSource> {
 
     RegisterRemoteWorker(int workerId, ModuleManager moduleManager, AbstractWorker<RegisterSource> nextWorker) {
         super(workerId);
-        this.remoteSender = moduleManager.find(CoreModule.NAME).getService(RemoteSenderService.class);
+        this.remoteSender = moduleManager.find(CoreModule.NAME).provider().getService(RemoteSenderService.class);
         this.nextWorker = nextWorker;
     }
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteSenderService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteSenderService.java
index e91e45e..a028546 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteSenderService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteSenderService.java
@@ -42,7 +42,7 @@ public class RemoteSenderService implements Service {
     }
 
     public void send(int nextWorkId, StreamData streamData, Selector selector) {
-        RemoteClientManager clientManager = moduleManager.find(CoreModule.NAME).getService(RemoteClientManager.class);
+        RemoteClientManager clientManager = moduleManager.find(CoreModule.NAME).provider().getService(RemoteClientManager.class);
 
         RemoteClient remoteClient;
         switch (selector) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteServiceHandler.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteServiceHandler.java
index 16bcccf..92b2a87 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteServiceHandler.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/RemoteServiceHandler.java
@@ -45,7 +45,7 @@ public class RemoteServiceHandler extends RemoteServiceGrpc.RemoteServiceImplBas
 
     @Override public StreamObserver<RemoteMessage> call(StreamObserver<Empty> responseObserver) {
         if (Objects.isNull(streamDataClassGetter)) {
-            streamDataClassGetter = moduleManager.find(CoreModule.NAME).getService(StreamDataClassGetter.class);
+            streamDataClassGetter = moduleManager.find(CoreModule.NAME).provider().getService(StreamDataClassGetter.class);
         }
 
         return new StreamObserver<RemoteMessage>() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
index 57e2f4c..129b517 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/RemoteClientManager.java
@@ -48,8 +48,8 @@ public class RemoteClientManager implements Service {
     }
 
     public void start() {
-        this.clusterNodesQuery = moduleManager.find(ClusterModule.NAME).getService(ClusterNodesQuery.class);
-        this.streamDataClassGetter = moduleManager.find(CoreModule.NAME).getService(StreamDataClassGetter.class);
+        this.clusterNodesQuery = moduleManager.find(ClusterModule.NAME).provider().getService(ClusterNodesQuery.class);
+        this.streamDataClassGetter = moduleManager.find(CoreModule.NAME).provider().getService(StreamDataClassGetter.class);
         Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(this::refresh, 5, 5, TimeUnit.SECONDS);
     }
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/PersistenceTimer.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/PersistenceTimer.java
index 4d8ebd7..63d3a81 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/PersistenceTimer.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/PersistenceTimer.java
@@ -45,7 +45,7 @@ public enum PersistenceTimer {
         //TODO timer value config
 //        final long timeInterval = EsConfig.Es.Persistence.Timer.VALUE * 1000;
         final long timeInterval = 3;
-        IBatchDAO batchDAO = moduleManager.find(StorageModule.NAME).getService(IBatchDAO.class);
+        IBatchDAO batchDAO = moduleManager.find(StorageModule.NAME).provider().getService(IBatchDAO.class);
 
         if (!isStarted) {
             Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
index 1665cc1..02a896e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
@@ -20,7 +20,7 @@ package org.apache.skywalking.oap.server.core.storage;
 
 import org.apache.skywalking.oap.server.core.storage.cache.*;
 import org.apache.skywalking.oap.server.core.storage.query.*;
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * @author peng-yongsheng
@@ -29,8 +29,8 @@ public class StorageModule extends ModuleDefine {
 
     public static final String NAME = "storage";
 
-    @Override public String name() {
-        return NAME;
+    public StorageModule() {
+        super(NAME);
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java
index efd9026..1c3b463 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java
@@ -40,8 +40,8 @@ public abstract class ModelInstaller {
     }
 
     public final void install(Client client) throws StorageException {
-        IModelGetter modelGetter = moduleManager.find(CoreModule.NAME).getService(IModelGetter.class);
-        DownsamplingConfigService downsamplingConfigService = moduleManager.find(CoreModule.NAME).getService(DownsamplingConfigService.class);
+        IModelGetter modelGetter = moduleManager.find(CoreModule.NAME).provider().getService(IModelGetter.class);
+        DownsamplingConfigService downsamplingConfigService = moduleManager.find(CoreModule.NAME).provider().getService(DownsamplingConfigService.class);
 
         List<Model> models = modelGetter.getModels();
         List<Model> downsamplingModels = new ArrayList<>();
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/ttl/DataTTLKeeperTimer.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/ttl/DataTTLKeeperTimer.java
index 2d920ad..861dd7b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/ttl/DataTTLKeeperTimer.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/ttl/DataTTLKeeperTimer.java
@@ -58,7 +58,7 @@ public enum DataTTLKeeperTimer {
 
     public void start(ModuleManager moduleManager) {
         this.moduleManager = moduleManager;
-        this.clusterNodesQuery = moduleManager.find(ClusterModule.NAME).getService(ClusterNodesQuery.class);
+        this.clusterNodesQuery = moduleManager.find(ClusterModule.NAME).provider().getService(ClusterNodesQuery.class);
 
         Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
             new RunnableWithExceptionProtection(this::delete,
@@ -79,8 +79,8 @@ public enum DataTTLKeeperTimer {
         logger.info("Metrics in day dimension before {}, are going to be removed.", timeBuckets.dayTimeBucketBefore);
         logger.info("Metrics in month dimension before {}, are going to be removed.", timeBuckets.monthTimeBucketBefore);
 
-        IModelGetter modelGetter = moduleManager.find(CoreModule.NAME).getService(IModelGetter.class);
-        DownsamplingConfigService downsamplingConfigService = moduleManager.find(CoreModule.NAME).getService(DownsamplingConfigService.class);
+        IModelGetter modelGetter = moduleManager.find(CoreModule.NAME).provider().getService(IModelGetter.class);
+        DownsamplingConfigService downsamplingConfigService = moduleManager.find(CoreModule.NAME).provider().getService(DownsamplingConfigService.class);
         List<Model> models = modelGetter.getModels();
         models.forEach(model -> {
             if (model.isIndicator()) {
@@ -115,7 +115,7 @@ public enum DataTTLKeeperTimer {
 
     private void execute(String modelName, long timeBucketBefore, String timeBucketColumnName) {
         try {
-            moduleManager.find(StorageModule.NAME).getService(IHistoryDeleteDAO.class).deleteHistory(modelName, timeBucketColumnName, timeBucketBefore);
+            moduleManager.find(StorageModule.NAME).provider().getService(IHistoryDeleteDAO.class).deleteHistory(modelName, timeBucketColumnName, timeBucketBefore);
         } catch (IOException e) {
             logger.warn("History delete failure, error message: {}", e.getMessage());
         }
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
index e41e2be..80187dd 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/BootstrapFlow.java
@@ -18,14 +18,9 @@
 
 package org.apache.skywalking.oap.server.library.module;
 
+import java.util.*;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import org.slf4j.*;
 
 /**
  * @author wu-sheng, peng-yongsheng
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
index c313267..fa34ba5 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
@@ -16,10 +16,9 @@
  *
  */
 
-
 package org.apache.skywalking.oap.server.library.module;
 
-public class DuplicateProviderException extends Exception {
+public class DuplicateProviderException extends RuntimeException {
     public DuplicateProviderException(String message) {
         super(message);
     }
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
index c9e5e12..301cc8b 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java
@@ -27,16 +27,24 @@ import org.slf4j.*;
  *
  * @author wu-sheng, peng-yongsheng
  */
-public abstract class ModuleDefine {
+public abstract class ModuleDefine implements ModuleProviderHolder {
 
     private static final Logger logger = LoggerFactory.getLogger(ModuleDefine.class);
 
-    private LinkedList<ModuleProvider> loadedProviders = new LinkedList<>();
+    private final LinkedList<ModuleProvider> loadedProviders = new LinkedList<>();
+
+    private final String name;
+
+    public ModuleDefine(String name) {
+        this.name = name;
+    }
 
     /**
      * @return the module name
      */
-    public abstract String name();
+    public final String name() {
+        return name;
+    }
 
     /**
      * @return the {@link Service} provided by this module.
@@ -68,7 +76,7 @@ public abstract class ModuleDefine {
                     throw new ProviderNotFoundException(e);
                 }
                 newProvider.setManager(moduleManager);
-                newProvider.setModule(this);
+                newProvider.setModuleDefine(this);
                 loadedProviders.add(newProvider);
             }
         }
@@ -129,19 +137,13 @@ public abstract class ModuleDefine {
         return loadedProviders;
     }
 
-    public final ModuleProvider provider() throws DuplicateProviderException {
+    @Override public final ModuleProvider provider() throws DuplicateProviderException, ProviderNotFoundException {
         if (loadedProviders.size() > 1) {
             throw new DuplicateProviderException(this.name() + " module exist " + loadedProviders.size() + " providers");
+        } else if (loadedProviders.size() == 0) {
+            throw new ProviderNotFoundException("There is no module provider in " + this.name() + " module!");
         }
 
         return loadedProviders.getFirst();
     }
-
-    public final <T extends Service> T getService(Class<T> serviceType) throws ServiceNotProvidedRuntimeException {
-        try {
-            return provider().getService(serviceType);
-        } catch (DuplicateProviderException | ServiceNotProvidedException e) {
-            throw new ServiceNotProvidedRuntimeException(e.getMessage());
-        }
-    }
 }
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefineHolder.java
similarity index 81%
copy from oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
copy to oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefineHolder.java
index c313267..314f7a9 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefineHolder.java
@@ -16,11 +16,14 @@
  *
  */
 
-
 package org.apache.skywalking.oap.server.library.module;
 
-public class DuplicateProviderException extends Exception {
-    public DuplicateProviderException(String message) {
-        super(message);
-    }
+/**
+ * @author peng-yongsheng
+ */
+public interface ModuleDefineHolder {
+
+    boolean has(String moduleName);
+
+    ModuleProviderHolder find(String moduleName) throws ModuleNotFoundRuntimeException;
 }
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleManager.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleManager.java
index 02f09dc..90cf325 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleManager.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleManager.java
@@ -25,9 +25,10 @@ import java.util.*;
  *
  * @author wu-sheng, peng-yongsheng
  */
-public class ModuleManager {
+public class ModuleManager implements ModuleDefineHolder {
+
     private boolean isInPrepareStage = true;
-    private Map<String, ModuleDefine> loadedModules = new HashMap<>();
+    private final Map<String, ModuleDefine> loadedModules = new HashMap<>();
 
     /**
      * Init the given modules
@@ -65,11 +66,11 @@ public class ModuleManager {
         bootstrapFlow.notifyAfterCompleted();
     }
 
-    public boolean has(String moduleName) {
+    @Override public boolean has(String moduleName) {
         return loadedModules.get(moduleName) != null;
     }
 
-    public ModuleDefine find(String moduleName) throws ModuleNotFoundRuntimeException {
+    @Override public ModuleProviderHolder find(String moduleName) throws ModuleNotFoundRuntimeException {
         assertPreparedStage();
         ModuleDefine module = loadedModules.get(moduleName);
         if (module != null)
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProvider.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProvider.java
index 9873303..2201584 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProvider.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProvider.java
@@ -19,30 +19,23 @@
 package org.apache.skywalking.oap.server.library.module;
 
 import java.util.*;
+import lombok.Setter;
 
 /**
  * The <code>ModuleProvider</code> is an implementation of a {@link ModuleDefine}.
  *
- * And each module can have one or more implementation, which depends on `application.yml`
+ * And each moduleDefine can have one or more implementation, which depends on `application.yml`
  *
  * @author wu-sheng, peng-yongsheng
  */
-public abstract class ModuleProvider {
-    private ModuleManager manager;
-    private ModuleDefine module;
-    private Map<Class<? extends Service>, Service> services = new HashMap<>();
+public abstract class ModuleProvider implements ModuleServiceHolder {
+    @Setter private ModuleManager manager;
+    @Setter private ModuleDefine moduleDefine;
+    private final Map<Class<? extends Service>, Service> services = new HashMap<>();
 
     public ModuleProvider() {
     }
 
-    void setManager(ModuleManager manager) {
-        this.manager = manager;
-    }
-
-    void setModule(ModuleDefine module) {
-        this.module = module;
-    }
-
     protected final ModuleManager getManager() {
         return manager;
     }
@@ -53,7 +46,7 @@ public abstract class ModuleProvider {
     public abstract String name();
 
     /**
-     * @return the module name
+     * @return the moduleDefine name
      */
     public abstract Class<? extends ModuleDefine> module();
 
@@ -63,12 +56,12 @@ public abstract class ModuleProvider {
     public abstract ModuleConfig createConfigBeanIfAbsent();
 
     /**
-     * In prepare stage, the module should initialize things which are irrelative other modules.
+     * In prepare stage, the moduleDefine should initialize things which are irrelative other modules.
      */
     public abstract void prepare() throws ServiceNotProvidedException, ModuleStartException;
 
     /**
-     * In start stage, the module has been ready for interop.
+     * In start stage, the moduleDefine has been ready for interop.
      */
     public abstract void start() throws ServiceNotProvidedException, ModuleStartException;
 
@@ -78,14 +71,14 @@ public abstract class ModuleProvider {
     public abstract void notifyAfterCompleted() throws ServiceNotProvidedException, ModuleStartException;
 
     /**
-     * @return module names which does this module require?
+     * @return moduleDefine names which does this moduleDefine require?
      */
     public abstract String[] requiredModules();
 
     /**
-     * Register a implementation for the service of this module provider.
+     * Register a implementation for the service of this moduleDefine provider.
      */
-    protected final void registerServiceImplementation(Class<? extends Service> serviceType,
+    @Override public final void registerServiceImplementation(Class<? extends Service> serviceType,
         Service service) throws ServiceNotProvidedException {
         if (serviceType.isInstance(service)) {
             this.services.put(serviceType, service);
@@ -97,7 +90,7 @@ public abstract class ModuleProvider {
     /**
      * Make sure all required services have been implemented.
      *
-     * @param requiredServices must be implemented by the module.
+     * @param requiredServices must be implemented by the moduleDefine.
      * @throws ServiceNotProvidedException when exist unimplemented service.
      */
     void requiredCheck(Class<? extends Service>[] requiredServices) throws ServiceNotProvidedException {
@@ -111,25 +104,25 @@ public abstract class ModuleProvider {
         }
 
         if (requiredServices.length != services.size()) {
-            throw new ServiceNotProvidedException("The " + this.name() + " provider in " + module.name() + " module provide more service implementations than ModuleDefine requirements.");
+            throw new ServiceNotProvidedException("The " + this.name() + " provider in " + moduleDefine.name() + " moduleDefine provide more service implementations than ModuleDefine requirements.");
         }
     }
 
-    public @SuppressWarnings("unchecked") <T extends Service> T getService(
+    @Override public @SuppressWarnings("unchecked") <T extends Service> T getService(
         Class<T> serviceType) throws ServiceNotProvidedException {
         Service serviceImpl = services.get(serviceType);
         if (serviceImpl != null) {
             return (T)serviceImpl;
         }
 
-        throw new ServiceNotProvidedException("Service " + serviceType.getName() + " should not be provided, based on module define.");
+        throw new ServiceNotProvidedException("Service " + serviceType.getName() + " should not be provided, based on moduleDefine define.");
     }
 
     ModuleDefine getModule() {
-        return module;
+        return moduleDefine;
     }
 
     String getModuleName() {
-        return module.name();
+        return moduleDefine.name();
     }
 }
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProviderHolder.java
similarity index 83%
copy from oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
copy to oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProviderHolder.java
index c313267..1d3ff9c 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/DuplicateProviderException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleProviderHolder.java
@@ -16,11 +16,12 @@
  *
  */
 
-
 package org.apache.skywalking.oap.server.library.module;
 
-public class DuplicateProviderException extends Exception {
-    public DuplicateProviderException(String message) {
-        super(message);
-    }
+/**
+ * @author peng-yongsheng
+ */
+public interface ModuleProviderHolder {
+
+    ModuleServiceHolder provider() throws DuplicateProviderException, ProviderNotFoundException;
 }
diff --git a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/TestModule.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleServiceHolder.java
similarity index 74%
copy from oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/TestModule.java
copy to oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleServiceHolder.java
index f2b325d..b55d65d 100644
--- a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/TestModule.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleServiceHolder.java
@@ -16,18 +16,15 @@
  *
  */
 
-
 package org.apache.skywalking.oap.server.library.module;
 
 /**
- * @author wu-sheng
+ * @author peng-yongsheng
  */
-public class TestModule extends ModuleDefine {
-    @Override public String name() {
-        return "Test";
-    }
+public interface ModuleServiceHolder {
+
+    void registerServiceImplementation(Class<? extends Service> serviceType,
+        Service service) throws ServiceNotProvidedException;
 
-    @Override public Class<? extends Service>[] services() {
-        return new Class[0];
-    }
+    <T extends Service> T getService(Class<T> serviceType) throws ServiceNotProvidedException;
 }
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ProviderNotFoundException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ProviderNotFoundException.java
index 63d45a0..bb9edd6 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ProviderNotFoundException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ProviderNotFoundException.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.library.module;
 
-public class ProviderNotFoundException extends Exception {
+public class ProviderNotFoundException extends RuntimeException {
     public ProviderNotFoundException(String message) {
         super(message);
     }
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ServiceNotProvidedException.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ServiceNotProvidedException.java
index 4ebfe45..9d7a882 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ServiceNotProvidedException.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ServiceNotProvidedException.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.library.module;
 
-public class ServiceNotProvidedException extends Exception {
+public class ServiceNotProvidedException extends RuntimeException {
     public ServiceNotProvidedException(String message) {
         super(message);
     }
diff --git a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleA.java b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleA.java
index 98cf2a2..308c12e 100644
--- a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleA.java
+++ b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleA.java
@@ -16,15 +16,15 @@
  *
  */
 
-
 package org.apache.skywalking.oap.server.library.module;
 
 /**
  * @author wu-sheng
  */
 public class BaseModuleA extends ModuleDefine {
-    @Override public String name() {
-        return "BaseA";
+
+    public BaseModuleA() {
+        super("BaseA");
     }
 
     @Override public Class<? extends Service>[] services() {
@@ -36,6 +36,5 @@ public class BaseModuleA extends ModuleDefine {
     }
 
     public interface ServiceABusiness2 extends Service {
-
     }
 }
diff --git a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleB.java b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleB.java
index c864081..f7171dd 100644
--- a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleB.java
+++ b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/BaseModuleB.java
@@ -16,15 +16,15 @@
  *
  */
 
-
 package org.apache.skywalking.oap.server.library.module;
 
 /**
  * @author wu-sheng
  */
 public class BaseModuleB extends ModuleDefine {
-    @Override public String name() {
-        return "BaseB";
+
+    public BaseModuleB() {
+        super("BaseB");
     }
 
     @Override public Class<? extends Service>[] services() {
diff --git a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/ModuleManagerTest.java b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/ModuleManagerTest.java
index 25bea7c..2be2338 100644
--- a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/ModuleManagerTest.java
+++ b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/ModuleManagerTest.java
@@ -18,10 +18,8 @@
 
 package org.apache.skywalking.oap.server.library.module;
 
-import org.junit.Assert;
-import org.junit.Test;
-
 import java.util.Properties;
+import org.junit.*;
 
 /**
  * @author wu-sheng
diff --git a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/TestModule.java b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/TestModule.java
index f2b325d..0d1d803 100644
--- a/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/TestModule.java
+++ b/oap-server/server-library/library-module/src/test/java/org/apache/skywalking/oap/server/library/module/TestModule.java
@@ -16,15 +16,15 @@
  *
  */
 
-
 package org.apache.skywalking.oap.server.library.module;
 
 /**
  * @author wu-sheng
  */
 public class TestModule extends ModuleDefine {
-    @Override public String name() {
-        return "Test";
+
+    public TestModule() {
+        super("Test");
     }
 
     @Override public Class<? extends Service>[] services() {
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java
index 7288c43..c834daf 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java
@@ -72,7 +72,7 @@ public class GraphQLQueryProvider extends ModuleProvider {
     }
 
     @Override public void start() throws ServiceNotProvidedException, ModuleStartException {
-        JettyHandlerRegister service = getManager().find(CoreModule.NAME).getService(JettyHandlerRegister.class);
+        JettyHandlerRegister service = getManager().find(CoreModule.NAME).provider().getService(JettyHandlerRegister.class);
         service.addHandler(new GraphQLQueryHandler(config.getPath(), graphQL));
     }
 
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
index fabbc2d..3122274 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
@@ -41,7 +41,7 @@ public class AggregationQuery implements GraphQLQueryResolver {
 
     private AggregationQueryService getQueryService() {
         if (queryService == null) {
-            this.queryService = moduleManager.find(CoreModule.NAME).getService(AggregationQueryService.class);
+            this.queryService = moduleManager.find(CoreModule.NAME).provider().getService(AggregationQueryService.class);
         }
         return queryService;
     }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
index 3a30e8f..2cfac23 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
@@ -41,7 +41,7 @@ public class AlarmQuery implements GraphQLQueryResolver {
 
     private AlarmQueryService getQueryService() {
         if (queryService == null) {
-            this.queryService = moduleManager.find(CoreModule.NAME).getService(AlarmQueryService.class);
+            this.queryService = moduleManager.find(CoreModule.NAME).provider().getService(AlarmQueryService.class);
         }
         return queryService;
     }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java
index 4203eb2..c7ae17e 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java
@@ -42,7 +42,7 @@ public class MetadataQuery implements GraphQLQueryResolver {
 
     private MetadataQueryService getMetadataQueryService() {
         if (metadataQueryService == null) {
-            this.metadataQueryService = moduleManager.find(CoreModule.NAME).getService(MetadataQueryService.class);
+            this.metadataQueryService = moduleManager.find(CoreModule.NAME).provider().getService(MetadataQueryService.class);
         }
         return metadataQueryService;
     }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
index 429d32f..498b62e 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
@@ -41,7 +41,7 @@ public class MetricQuery implements GraphQLQueryResolver {
 
     private MetricQueryService getMetricQueryService() {
         if (metricQueryService == null) {
-            this.metricQueryService = moduleManager.find(CoreModule.NAME).getService(MetricQueryService.class);
+            this.metricQueryService = moduleManager.find(CoreModule.NAME).provider().getService(MetricQueryService.class);
         }
         return metricQueryService;
     }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
index 2073b77..de9f504 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
@@ -41,7 +41,7 @@ public class TopologyQuery implements GraphQLQueryResolver {
 
     private TopologyQueryService getQueryService() {
         if (queryService == null) {
-            this.queryService = moduleManager.find(CoreModule.NAME).getService(TopologyQueryService.class);
+            this.queryService = moduleManager.find(CoreModule.NAME).provider().getService(TopologyQueryService.class);
         }
         return queryService;
     }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
index aca728e..7bc4fe5 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
@@ -43,7 +43,7 @@ public class TraceQuery implements GraphQLQueryResolver {
 
     private TraceQueryService getQueryService() {
         if (queryService == null) {
-            this.queryService = moduleManager.find(CoreModule.NAME).getService(TraceQueryService.class);
+            this.queryService = moduleManager.find(CoreModule.NAME).provider().getService(TraceQueryService.class);
         }
         return queryService;
     }
diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/module/IstioTelemetryReceiverModule.java b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/module/IstioTelemetryReceiverModule.java
index dd91b72..ad9f127 100644
--- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/module/IstioTelemetryReceiverModule.java
+++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/module/IstioTelemetryReceiverModule.java
@@ -20,11 +20,11 @@ package org.apache.skywalking.oap.server.receiver.istio.telemetry.module;
 
 import org.apache.skywalking.oap.server.library.module.ModuleDefine;
 
-public class IstioTelemetryReceiverModule  extends ModuleDefine {
+public class IstioTelemetryReceiverModule extends ModuleDefine {
     public static final String NAME = "istio-telemetry";
 
-    @Override public String name() {
-        return NAME;
+    public IstioTelemetryReceiverModule() {
+        super(NAME);
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryReceiverProvider.java b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryReceiverProvider.java
index 5ac2f15..13a55ff 100644
--- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryReceiverProvider.java
+++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryReceiverProvider.java
@@ -21,11 +21,8 @@ package org.apache.skywalking.oap.server.receiver.istio.telemetry.provider;
 import org.apache.skywalking.aop.server.receiver.mesh.MeshReceiverModule;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister;
-import org.apache.skywalking.oap.server.library.module.ModuleConfig;
+import org.apache.skywalking.oap.server.library.module.*;
 import org.apache.skywalking.oap.server.library.module.ModuleDefine;
-import org.apache.skywalking.oap.server.library.module.ModuleProvider;
-import org.apache.skywalking.oap.server.library.module.ModuleStartException;
-import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
 import org.apache.skywalking.oap.server.receiver.istio.telemetry.module.IstioTelemetryReceiverModule;
 
 public class IstioTelemetryReceiverProvider extends ModuleProvider {
@@ -45,7 +42,7 @@ public class IstioTelemetryReceiverProvider extends ModuleProvider {
     }
 
     @Override public void start() throws ServiceNotProvidedException, ModuleStartException {
-        GRPCHandlerRegister service = getManager().find(CoreModule.NAME).getService(GRPCHandlerRegister.class);
+        GRPCHandlerRegister service = getManager().find(CoreModule.NAME).provider().getService(GRPCHandlerRegister.class);
         service.addHandler(new IstioTelemetryGRPCHandler());
     }
 
diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/module/JVMModule.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/module/JVMModule.java
index 16c7211..ed81b94 100644
--- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/module/JVMModule.java
+++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/module/JVMModule.java
@@ -18,15 +18,15 @@
 
 package org.apache.skywalking.oap.server.receiver.jvm.module;
 
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * @author peng-yongsheng
  */
 public class JVMModule extends ModuleDefine {
 
-    @Override public String name() {
-        return "receiver-jvm";
+    public JVMModule() {
+        super("receiver-jvm");
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java
index dfb7626..64a70fe 100644
--- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java
+++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java
@@ -45,7 +45,7 @@ public class JVMModuleProvider extends ModuleProvider {
     }
 
     @Override public void start() {
-        GRPCHandlerRegister grpcHandlerRegister = getManager().find(CoreModule.NAME).getService(GRPCHandlerRegister.class);
+        GRPCHandlerRegister grpcHandlerRegister = getManager().find(CoreModule.NAME).provider().getService(GRPCHandlerRegister.class);
         grpcHandlerRegister.addHandler(new JVMMetricsServiceHandler(getManager()));
     }
 
diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricsServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricsServiceHandler.java
index f2c7c77..55d49e6 100644
--- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricsServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricsServiceHandler.java
@@ -39,7 +39,7 @@ public class JVMMetricsServiceHandler extends JVMMetricsServiceGrpc.JVMMetricsSe
     private final SourceReceiver sourceReceiver;
 
     public JVMMetricsServiceHandler(ModuleManager moduleManager) {
-        this.sourceReceiver = moduleManager.find(CoreModule.NAME).getService(SourceReceiver.class);
+        this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
     }
 
     @Override public void collect(JVMMetrics request, StreamObserver<Downstream> responseObserver) {
diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/CoreRegisterLinker.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/CoreRegisterLinker.java
index 2868b82..bbd768e 100644
--- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/CoreRegisterLinker.java
+++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/CoreRegisterLinker.java
@@ -39,21 +39,21 @@ public class CoreRegisterLinker {
 
     public static IServiceInventoryRegister getServiceInventoryRegister() {
         if (SERVICE_INVENTORY_REGISTER == null) {
-            SERVICE_INVENTORY_REGISTER = MODULE_MANAGER.find(CoreModule.NAME).getService(IServiceInventoryRegister.class);
+            SERVICE_INVENTORY_REGISTER = MODULE_MANAGER.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
         }
         return SERVICE_INVENTORY_REGISTER;
     }
 
     public static IServiceInstanceInventoryRegister getServiceInstanceInventoryRegister() {
         if (SERVICE_INSTANCE_INVENTORY_REGISTER == null) {
-            SERVICE_INSTANCE_INVENTORY_REGISTER = MODULE_MANAGER.find(CoreModule.NAME).getService(IServiceInstanceInventoryRegister.class);
+            SERVICE_INSTANCE_INVENTORY_REGISTER = MODULE_MANAGER.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
         }
         return SERVICE_INSTANCE_INVENTORY_REGISTER;
     }
 
     public static IEndpointInventoryRegister getEndpointInventoryRegister() {
         if (ENDPOINT_INVENTORY_REGISTER == null) {
-            ENDPOINT_INVENTORY_REGISTER = MODULE_MANAGER.find(CoreModule.NAME).getService(IEndpointInventoryRegister.class);
+            ENDPOINT_INVENTORY_REGISTER = MODULE_MANAGER.find(CoreModule.NAME).provider().getService(IEndpointInventoryRegister.class);
         }
         return ENDPOINT_INVENTORY_REGISTER;
     }
diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshReceiverModule.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshReceiverModule.java
index 5809afb..0d9e596 100644
--- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshReceiverModule.java
+++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshReceiverModule.java
@@ -23,8 +23,8 @@ import org.apache.skywalking.oap.server.library.module.ModuleDefine;
 public class MeshReceiverModule extends ModuleDefine {
     public static final String NAME = "service-mesh";
 
-    @Override public String name() {
-        return NAME;
+    public MeshReceiverModule() {
+        super("service-mesh");
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshReceiverProvider.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshReceiverProvider.java
index e96b03c..cbafbf7 100644
--- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshReceiverProvider.java
+++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshReceiverProvider.java
@@ -21,11 +21,8 @@ package org.apache.skywalking.aop.server.receiver.mesh;
 import java.io.IOException;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister;
-import org.apache.skywalking.oap.server.library.module.ModuleConfig;
+import org.apache.skywalking.oap.server.library.module.*;
 import org.apache.skywalking.oap.server.library.module.ModuleDefine;
-import org.apache.skywalking.oap.server.library.module.ModuleProvider;
-import org.apache.skywalking.oap.server.library.module.ModuleStartException;
-import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
 
 public class MeshReceiverProvider extends ModuleProvider {
     private MeshModuleConfig config;
@@ -58,7 +55,7 @@ public class MeshReceiverProvider extends ModuleProvider {
             throw new ModuleStartException(e.getMessage(), e);
         }
         CoreRegisterLinker.setModuleManager(getManager());
-        GRPCHandlerRegister service = getManager().find(CoreModule.NAME).getService(GRPCHandlerRegister.class);
+        GRPCHandlerRegister service = getManager().find(CoreModule.NAME).provider().getService(GRPCHandlerRegister.class);
         service.addHandler(new MeshGRPCHandler());
     }
 
diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
index 7c9e749..4f3e54b 100644
--- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
+++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
@@ -64,11 +64,11 @@ public class TelemetryDataDispatcher {
 
     public static void setCache(MeshDataBufferFileCache cache, ModuleManager moduleManager) {
         CACHE = cache;
-        SERVICE_CACHE = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
-        SERVICE_INSTANCE_CACHE = moduleManager.find(CoreModule.NAME).getService(ServiceInstanceInventoryCache.class);
-        SOURCE_RECEIVER = moduleManager.find(CoreModule.NAME).getService(SourceReceiver.class);
-        SERVICE_INSTANCE_INVENTORY_REGISTER = moduleManager.find(CoreModule.NAME).getService(IServiceInstanceInventoryRegister.class);
-        SERVICE_INVENTORY_REGISTER = moduleManager.find(CoreModule.NAME).getService(IServiceInventoryRegister.class);
+        SERVICE_CACHE = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
+        SERVICE_INSTANCE_CACHE = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class);
+        SOURCE_RECEIVER = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
+        SERVICE_INSTANCE_INVENTORY_REGISTER = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
+        SERVICE_INVENTORY_REGISTER = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
     }
 
     public static void preProcess(ServiceMeshMetric data) {
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/module/RegisterModule.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/module/RegisterModule.java
index a5d5d0a..5df3e47 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/module/RegisterModule.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/module/RegisterModule.java
@@ -18,15 +18,15 @@
 
 package org.apache.skywalking.oap.server.receiver.register.module;
 
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * @author peng-yongsheng
  */
 public class RegisterModule extends ModuleDefine {
 
-    @Override public String name() {
-        return "receiver-register";
+    public RegisterModule() {
+        super("receiver-register");
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/RegisterModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/RegisterModuleProvider.java
index ffaa49c..c40a433 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/RegisterModuleProvider.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/RegisterModuleProvider.java
@@ -49,13 +49,13 @@ public class RegisterModuleProvider extends ModuleProvider {
     }
 
     @Override public void start() {
-        GRPCHandlerRegister grpcHandlerRegister = getManager().find(CoreModule.NAME).getService(GRPCHandlerRegister.class);
+        GRPCHandlerRegister grpcHandlerRegister = getManager().find(CoreModule.NAME).provider().getService(GRPCHandlerRegister.class);
         grpcHandlerRegister.addHandler(new ApplicationRegisterHandler(getManager()));
         grpcHandlerRegister.addHandler(new InstanceDiscoveryServiceHandler(getManager()));
         grpcHandlerRegister.addHandler(new ServiceNameDiscoveryHandler(getManager()));
         grpcHandlerRegister.addHandler(new NetworkAddressRegisterServiceHandler(getManager()));
 
-        JettyHandlerRegister jettyHandlerRegister = getManager().find(CoreModule.NAME).getService(JettyHandlerRegister.class);
+        JettyHandlerRegister jettyHandlerRegister = getManager().find(CoreModule.NAME).provider().getService(JettyHandlerRegister.class);
         jettyHandlerRegister.addHandler(new ApplicationRegisterServletHandler(getManager()));
         jettyHandlerRegister.addHandler(new InstanceDiscoveryServletHandler(getManager()));
         jettyHandlerRegister.addHandler(new InstanceHeartBeatServletHandler(getManager()));
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/ApplicationRegisterHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/ApplicationRegisterHandler.java
index 224a2c2..44eec83 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/ApplicationRegisterHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/ApplicationRegisterHandler.java
@@ -36,7 +36,7 @@ public class ApplicationRegisterHandler extends ApplicationRegisterServiceGrpc.A
     private final IServiceInventoryRegister serviceInventoryRegister;
 
     public ApplicationRegisterHandler(ModuleManager moduleManager) {
-        serviceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInventoryRegister.class);
+        serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
     }
 
     @Override
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/InstanceDiscoveryServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/InstanceDiscoveryServiceHandler.java
index 5da0182..b7893a8 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/InstanceDiscoveryServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/InstanceDiscoveryServiceHandler.java
@@ -45,10 +45,10 @@ public class InstanceDiscoveryServiceHandler extends InstanceDiscoveryServiceGrp
     private final IServiceInstanceInventoryRegister serviceInstanceInventoryRegister;
 
     public InstanceDiscoveryServiceHandler(ModuleManager moduleManager) {
-        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
-        this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInstanceInventoryCache.class);
-        this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInventoryRegister.class);
-        this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInstanceInventoryRegister.class);
+        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
+        this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class);
+        this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
+        this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
     }
 
     @Override
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/NetworkAddressRegisterServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/NetworkAddressRegisterServiceHandler.java
index 023d6c6..5c88d63 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/NetworkAddressRegisterServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/NetworkAddressRegisterServiceHandler.java
@@ -37,7 +37,7 @@ public class NetworkAddressRegisterServiceHandler extends NetworkAddressRegister
     private final INetworkAddressInventoryRegister networkAddressInventoryRegister;
 
     public NetworkAddressRegisterServiceHandler(ModuleManager moduleManager) {
-        this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).getService(INetworkAddressInventoryRegister.class);
+        this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(INetworkAddressInventoryRegister.class);
     }
 
     @Override
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/ServiceNameDiscoveryHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/ServiceNameDiscoveryHandler.java
index ae531e2..f628c88 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/ServiceNameDiscoveryHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/grpc/ServiceNameDiscoveryHandler.java
@@ -38,7 +38,7 @@ public class ServiceNameDiscoveryHandler extends ServiceNameDiscoveryServiceGrpc
     private final IEndpointInventoryRegister inventoryService;
 
     public ServiceNameDiscoveryHandler(ModuleManager moduleManager) {
-        this.inventoryService = moduleManager.find(CoreModule.NAME).getService(IEndpointInventoryRegister.class);
+        this.inventoryService = moduleManager.find(CoreModule.NAME).provider().getService(IEndpointInventoryRegister.class);
     }
 
     @Override public void discovery(ServiceNameCollection request,
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/ApplicationRegisterServletHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/ApplicationRegisterServletHandler.java
index edc551a..49f4f35 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/ApplicationRegisterServletHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/ApplicationRegisterServletHandler.java
@@ -40,7 +40,7 @@ public class ApplicationRegisterServletHandler extends JettyJsonHandler {
     private static final String APPLICATION_ID = "i";
 
     public ApplicationRegisterServletHandler(ModuleManager moduleManager) {
-        serviceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInventoryRegister.class);
+        serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
     }
 
     @Override public String pathSpec() {
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceDiscoveryServletHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceDiscoveryServletHandler.java
index 4b8ba9e..81fc664 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceDiscoveryServletHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceDiscoveryServletHandler.java
@@ -49,8 +49,8 @@ public class InstanceDiscoveryServletHandler extends JettyJsonHandler {
     private static final String OS_INFO = "oi";
 
     public InstanceDiscoveryServletHandler(ModuleManager moduleManager) {
-        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
-        this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInstanceInventoryRegister.class);
+        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
+        this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
     }
 
     @Override public String pathSpec() {
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceHeartBeatServletHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceHeartBeatServletHandler.java
index df2a7fe..34c3971 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceHeartBeatServletHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/InstanceHeartBeatServletHandler.java
@@ -47,9 +47,9 @@ public class InstanceHeartBeatServletHandler extends JettyJsonHandler {
     private static final String HEARTBEAT_TIME = "ht";
 
     public InstanceHeartBeatServletHandler(ModuleManager moduleManager) {
-        this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInstanceInventoryRegister.class);
-        this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInstanceInventoryCache.class);
-        this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInventoryRegister.class);
+        this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
+        this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class);
+        this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
     }
 
     @Override public String pathSpec() {
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/NetworkAddressRegisterServletHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/NetworkAddressRegisterServletHandler.java
index 41ec38a..88dc510 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/NetworkAddressRegisterServletHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/NetworkAddressRegisterServletHandler.java
@@ -40,7 +40,7 @@ public class NetworkAddressRegisterServletHandler extends JettyJsonHandler {
     private static final String ADDRESS_ID = "i";
 
     public NetworkAddressRegisterServletHandler(ModuleManager moduleManager) {
-        this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).getService(INetworkAddressInventoryRegister.class);
+        this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(INetworkAddressInventoryRegister.class);
     }
 
     @Override public String pathSpec() {
diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/ServiceNameDiscoveryServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/ServiceNameDiscoveryServiceHandler.java
index 248dc61..c9b09d4 100644
--- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/ServiceNameDiscoveryServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v5/rest/ServiceNameDiscoveryServiceHandler.java
@@ -47,7 +47,7 @@ public class ServiceNameDiscoveryServiceHandler extends JettyJsonHandler {
     private static final String ELEMENT = "el";
 
     public ServiceNameDiscoveryServiceHandler(ModuleManager moduleManager) {
-        this.inventoryService = moduleManager.find(CoreModule.NAME).getService(IEndpointInventoryRegister.class);
+        this.inventoryService = moduleManager.find(CoreModule.NAME).provider().getService(IEndpointInventoryRegister.class);
     }
 
     @Override public String pathSpec() {
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/module/TraceModule.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/module/TraceModule.java
index 6b0558f..887850e 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/module/TraceModule.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/module/TraceModule.java
@@ -25,8 +25,8 @@ import org.apache.skywalking.oap.server.library.module.ModuleDefine;
  */
 public class TraceModule extends ModuleDefine {
 
-    @Override public String name() {
-        return "receiver-trace";
+    public TraceModule() {
+        super("receiver-trace");
     }
 
     @Override public Class[] services() {
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java
index 0a2a739..de32457 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java
@@ -63,8 +63,8 @@ public class TraceModuleProvider extends ModuleProvider {
         listenerManager.add(new ServiceMappingSpanListener.Factory());
         listenerManager.add(new SegmentSpanListener.Factory());
 
-        GRPCHandlerRegister grpcHandlerRegister = getManager().find(CoreModule.NAME).getService(GRPCHandlerRegister.class);
-        JettyHandlerRegister jettyHandlerRegister = getManager().find(CoreModule.NAME).getService(JettyHandlerRegister.class);
+        GRPCHandlerRegister grpcHandlerRegister = getManager().find(CoreModule.NAME).provider().getService(GRPCHandlerRegister.class);
+        JettyHandlerRegister jettyHandlerRegister = getManager().find(CoreModule.NAME).provider().getService(JettyHandlerRegister.class);
         try {
             SegmentParse.Producer segmentProducer = new SegmentParse.Producer(getManager(), listenerManager);
             grpcHandlerRegister.addHandler(new TraceSegmentServiceHandler(segmentProducer));
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
index e5434ae..305878a 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
@@ -56,12 +56,12 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe
     private long minuteTimeBucket;
 
     private MultiScopesSpanListener(ModuleManager moduleManager) {
-        this.sourceReceiver = moduleManager.find(CoreModule.NAME).getService(SourceReceiver.class);
+        this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
         this.entrySourceBuilders = new LinkedList<>();
         this.exitSourceBuilders = new LinkedList<>();
-        this.instanceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInstanceInventoryCache.class);
-        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
-        this.endpointInventoryCache = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class);
+        this.instanceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class);
+        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
+        this.endpointInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class);
     }
 
     @Override public boolean containsPoint(Point point) {
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java
index 5cf3c0b..08bd305 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java
@@ -42,8 +42,8 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener
     private int firstEndpointId = 0;
 
     private SegmentSpanListener(ModuleManager moduleManager) {
-        this.sourceReceiver = moduleManager.find(CoreModule.NAME).getService(SourceReceiver.class);
-        this.serviceNameCacheService = moduleManager.find(CoreModule.NAME).getService(EndpointInventoryCache.class);
+        this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
+        this.serviceNameCacheService = moduleManager.find(CoreModule.NAME).provider().getService(EndpointInventoryCache.class);
     }
 
     @Override public boolean containsPoint(Point point) {
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java
index a6ca9ee..d67d2a2 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java
@@ -41,8 +41,8 @@ public class ServiceMappingSpanListener implements EntrySpanListener {
     private List<ServiceMapping> serviceMappings = new LinkedList<>();
 
     private ServiceMappingSpanListener(ModuleManager moduleManager) {
-        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInventoryCache.class);
-        this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IServiceInventoryRegister.class);
+        this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
+        this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
     }
 
     @Override public boolean containsPoint(Point point) {
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
index 3fd93ea..7169ea3 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
@@ -47,9 +47,9 @@ public class ReferenceIdExchanger implements IdExchanger<ReferenceDecorator> {
     }
 
     private ReferenceIdExchanger(ModuleManager moduleManager) {
-        this.endpointInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IEndpointInventoryRegister.class);
-        this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).getService(INetworkAddressInventoryRegister.class);
-        this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).getService(ServiceInstanceInventoryCache.class);
+        this.endpointInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IEndpointInventoryRegister.class);
+        this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(INetworkAddressInventoryRegister.class);
+        this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class);
     }
 
     @Override public boolean exchange(ReferenceDecorator standardBuilder, int serviceId) {
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanIdExchanger.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanIdExchanger.java
index b19d9e6..7e7f6a1 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanIdExchanger.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanIdExchanger.java
@@ -47,9 +47,9 @@ public class SpanIdExchanger implements IdExchanger<SpanDecorator> {
     }
 
     private SpanIdExchanger(ModuleManager moduleManager) {
-        this.endpointInventoryRegister = moduleManager.find(CoreModule.NAME).getService(IEndpointInventoryRegister.class);
-        this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).getService(INetworkAddressInventoryRegister.class);
-        this.componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).getService(IComponentLibraryCatalogService.class);
+        this.endpointInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IEndpointInventoryRegister.class);
+        this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(INetworkAddressInventoryRegister.class);
+        this.componentLibraryCatalogService = moduleManager.find(CoreModule.NAME).provider().getService(IComponentLibraryCatalogService.class);
     }
 
     @Override public boolean exchange(SpanDecorator standardBuilder, int serviceId) {
diff --git a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java
index 8caf80b..3f8f29d 100644
--- a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java
+++ b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java
@@ -19,8 +19,7 @@
 package org.apache.skywalking.oap.server.starter;
 
 import org.apache.skywalking.oap.server.library.module.*;
-import org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader;
-import org.apache.skywalking.oap.server.starter.config.ConfigFileNotFoundException;
+import org.apache.skywalking.oap.server.starter.config.*;
 import org.slf4j.*;
 
 /**
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java
index c6c52df..8677afd 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/H2StorageProvider.java
@@ -37,11 +37,8 @@ import org.apache.skywalking.oap.server.core.storage.query.ITopologyQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.query.ITraceQueryDAO;
 import org.apache.skywalking.oap.server.library.client.ClientException;
 import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
-import org.apache.skywalking.oap.server.library.module.ModuleConfig;
+import org.apache.skywalking.oap.server.library.module.*;
 import org.apache.skywalking.oap.server.library.module.ModuleDefine;
-import org.apache.skywalking.oap.server.library.module.ModuleProvider;
-import org.apache.skywalking.oap.server.library.module.ModuleStartException;
-import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
 import org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao.H2AggregationQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao.H2AlarmQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao.H2BatchDAO;
diff --git a/oap-server/server-testing/pom.xml b/oap-server/server-testing/pom.xml
new file mode 100644
index 0000000..f20f18d
--- /dev/null
+++ b/oap-server/server-testing/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>oap-server</artifactId>
+        <groupId>org.apache.skywalking</groupId>
+        <version>6.0.0-beta-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>server-testing</artifactId>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>library-module</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java b/oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleDefineTesting.java
similarity index 67%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
copy to oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleDefineTesting.java
index a4499dc..53ebee4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
+++ b/oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleDefineTesting.java
@@ -16,22 +16,22 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.cluster;
+package org.apache.skywalking.oap.server.testing.module;
 
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * @author peng-yongsheng
  */
-public class ClusterModule extends ModuleDefine {
+public class ModuleDefineTesting implements ModuleProviderHolder {
 
-    public static final String NAME = "cluster";
+    private final ModuleProviderTesting moduleProvider;
 
-    @Override public String name() {
-        return NAME;
+    public ModuleDefineTesting() {
+        this.moduleProvider = new ModuleProviderTesting();
     }
 
-    @Override public Class[] services() {
-        return new Class[] {ClusterRegister.class, ClusterNodesQuery.class};
+    @Override public ModuleServiceHolder provider() {
+        return moduleProvider;
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java b/oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleManagerTesting.java
similarity index 57%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
copy to oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleManagerTesting.java
index a4499dc..3138003 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
+++ b/oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleManagerTesting.java
@@ -16,22 +16,27 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.cluster;
+package org.apache.skywalking.oap.server.testing.module;
 
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import java.util.*;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * @author peng-yongsheng
  */
-public class ClusterModule extends ModuleDefine {
+public class ModuleManagerTesting implements ModuleDefineHolder {
 
-    public static final String NAME = "cluster";
+    private final Map<String, ModuleProviderHolder> modules = new HashMap<>();
 
-    @Override public String name() {
-        return NAME;
+    @Override public boolean has(String moduleName) {
+        return false;
     }
 
-    @Override public Class[] services() {
-        return new Class[] {ClusterRegister.class, ClusterNodesQuery.class};
+    @Override public ModuleProviderHolder find(String moduleName) throws ModuleNotFoundRuntimeException {
+        return modules.get(moduleName);
+    }
+
+    public void put(String moduleName, ModuleProviderHolder moduleProviderHolder) {
+        modules.put(moduleName, moduleProviderHolder);
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java b/oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleProviderTesting.java
similarity index 50%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
copy to oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleProviderTesting.java
index a4499dc..29fe3bc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/ClusterModule.java
+++ b/oap-server/server-testing/src/main/java/org/apache/skywalking/oap/server/testing/module/ModuleProviderTesting.java
@@ -16,22 +16,28 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.cluster;
+package org.apache.skywalking.oap.server.testing.module;
 
-import org.apache.skywalking.oap.server.library.module.ModuleDefine;
+import java.util.*;
+import org.apache.skywalking.oap.server.library.module.*;
 
 /**
  * @author peng-yongsheng
  */
-public class ClusterModule extends ModuleDefine {
+public class ModuleProviderTesting implements ModuleServiceHolder {
 
-    public static final String NAME = "cluster";
+    private final Map<Class<? extends Service>, Service> services = new HashMap<>();
 
-    @Override public String name() {
-        return NAME;
+    @Override public void registerServiceImplementation(Class<? extends Service> serviceType,
+        Service service) throws ServiceNotProvidedException {
+        if (serviceType.isInstance(service)) {
+            this.services.put(serviceType, service);
+        } else {
+            throw new ServiceNotProvidedException(serviceType + " is not implemented by " + service);
+        }
     }
 
-    @Override public Class[] services() {
-        return new Class[] {ClusterRegister.class, ClusterNodesQuery.class};
+    @Override public <T extends Service> T getService(Class<T> serviceType) throws ServiceNotProvidedException {
+        return (T)services.get(serviceType);
     }
 }
diff --git a/oap-server/server-testing/src/test/java/org/apache/skywalking/oap/server/testing/module/ModuleManagerTestCase.java b/oap-server/server-testing/src/test/java/org/apache/skywalking/oap/server/testing/module/ModuleManagerTestCase.java
new file mode 100644
index 0000000..1a673e3
--- /dev/null
+++ b/oap-server/server-testing/src/test/java/org/apache/skywalking/oap/server/testing/module/ModuleManagerTestCase.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.testing.module;
+
+import org.apache.skywalking.oap.server.library.module.Service;
+import org.junit.*;
+
+/**
+ * @author peng-yongsheng
+ */
+public class ModuleManagerTestCase {
+
+    @Test
+    public void test() {
+        String moduleName = "test";
+
+        ModuleManagerTesting moduleManager = new ModuleManagerTesting();
+
+        ModuleDefineTesting moduleDefine = new ModuleDefineTesting();
+        moduleManager.put(moduleName, moduleDefine);
+
+        Assert.assertEquals(moduleDefine, moduleManager.find(moduleName));
+
+        TestServiceImpl testService = new TestServiceImpl();
+        moduleDefine.provider().registerServiceImplementation(TestService.class, testService);
+
+        TestService service = moduleManager.find(moduleName).provider().getService(TestService.class);
+        Assert.assertEquals(testService, service);
+    }
+
+    interface TestService extends Service {
+
+    }
+
+    class TestServiceImpl implements TestService {
+
+    }
+}
diff --git a/oap-server/server-testing/src/test/resources/log4j2.xml b/oap-server/server-testing/src/test/resources/log4j2.xml
new file mode 100644
index 0000000..4151264
--- /dev/null
+++ b/oap-server/server-testing/src/test/resources/log4j2.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  ~
+  -->
+
+<Configuration status="DEBUG">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout charset="UTF-8" pattern="%d - %c - %L [%t] %-5p %x - %m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="DEBUG">
+            <AppenderRef ref="Console"/>
+        </Root>
+    </Loggers>
+</Configuration>