You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@eventmesh.apache.org by jo...@apache.org on 2023/01/14 01:03:21 UTC

[incubator-eventmesh] branch master updated: [ISSUE #2576] Enhanced Configuration management (#2917)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new fc7825e3a [ISSUE #2576] Enhanced Configuration management (#2917)
fc7825e3a is described below

commit fc7825e3a00bb24683d150c36bcfad6c5c0bd1d7
Author: eight-nines <73...@users.noreply.github.com>
AuthorDate: Sat Jan 14 09:03:15 2023 +0800

    [ISSUE #2576] Enhanced Configuration management (#2917)
    
    * [ISSUE #2576]Enhancement the config manage for project
    
    * [1] test code
    
    * EventMeshServer config improve
    
    * Extract the key prefix of the @ConfigFiled field into @Config
    
    * Improve configuration management of SPI implementations
    [1] config improve of RocketMQProducerImpl and RocketMQConsumerImpl
    [2] config UT of RocketMQProducerImpl and RocketMQConsumerImpl
    
    * Improve configuration management of SPI implementations
    [1] extensionInstance config init process improve
    [2] RocketMQProducerImpl and RocketMQConsumerImpl config UT improve
    
    * Improve configuration management of Kafka SPI Impl
    [1] KafkaConsumerImpl and KafkaProducerImpl config improve
    [2] KafkaConsumerImpl and KafkaProducerImpl config UT
    
    * Improve configuration management of Redis SPI Impl
    [1] RedisProperties config improve
    
    * Improve configuration management of Redis SPI Impl
    [1] RedisProperties config and UT improve
    [2] New parser ConvertProperties
    [3] To fix a bug where parser convertEnum could not parse null values
    
    * Fix config UT of Redis SPI Impl
    
    * Tweak Convert's code framework, for ease of enhancement (#2784)
    
    [1] Split the converter classes in Convert into separate files
    [2] Add the converter field to ConfigFiled, used to specify the converter class of the field
    
    * Improve configuration management of Knative SPI Impl (#2791)
    
    [1] KnativeConsumerImpl and KnativeProducerImpl config improve
    [2] KnativeConsumerImpl and KnativeProducerImpl config UT
    
    * Improve configuration management of Pravega SPI Impl
    
    [1] PravegaConsumerImpl and PravegaProducerImpl config improve
    [2] PravegaConsumerImpl and PravegaProducerImpl config UT
    [3] add new converter URIConverter
    
    * Improve configuration management of Pulsar SPI Impl
    
    [1] PulsarConsumerImpl and PulsarProducerImpl config improve
    [2] PulsarConsumerImpl and PulsarProducerImpl config UT
    
    * Improve configuration management of Rabbitmq SPI Impl
    
    [1] RabbitmqConsumer and RabbitmqProducer config improve
    [2] RabbitmqConsumer and RabbitmqProducer config UT
    
    * Improve configuration management of Prometheus SPI Impl
    
    [1] PrometheusMetricsRegistry config improve
    [2] PrometheusMetricsRegistry config UT
    
    * Improve configuration management of AuthHttpBasic SPI Impl
    
    [1] AuthHttpBasicService config improve
    [2] AuthHttpBasicService config UT
    
    * Enhance configuration management capabilities - @ConfigFiled
    
    [1] Add two properties to @ConfigFiled,findEnv / notNull, and the configuration file parsing capabilities that go with them
    [2] Delete @NotNull and replace it with @ConfigFiled.notNull
    
    * Improve configuration management of Pinpoint SPI Impl
    
    [1] PinpointTraceService config improve
    [2] PinpointTraceService config UT
    
    * Improve configuration management of Zipkin SPI Impl
    
    [1] ZipkinTraceService config improve
    [2] ZipkinTraceService config UT
    
    * Add repeatable functionality to @Config
    
    For tagging multiple configuration fields on a class
    
    * Improve configuration management of TracePlugin
    
    [1] ExporterConfiguration config improve
    [2] ExporterConfiguration config UT
    
    * Improve configuration management of WebHook
    
    [1] WebHook config improve
    [2] WebHook config UT
    
    * Add field beNumber for @ConfigFiled
    
    [1] If String config field not a number, an exception is thrown
    
    * Change the configuration management class CommonConfiguration to a new framework
    
    [1] Replace the CommonConfiguration field modifier public with private
    [2] Use getter/setter methods to access it
    
    * Change CommonConfiguration subclass to new framework
    
    [1] EventMeshHTTPConfiguration/EventMeshGrpcConfiguration/EventMeshTCPConfiguration
    
    * Change CommonConfiguration and subclass to new framework
    
    [1] EventMeshHTTPConfiguration/EventMeshGrpcConfiguration/EventMeshTCPConfiguration
    
    * Add field notEmpty for @ConfigFiled
    
    [1] If it cannot be empty but is empty, an exception is thrown
    
    * Change the SPI RocketMQ config to new framework
    
    * Change the SPI kafka config to new framework
    
    * Change the SPI Redis config to new framework
    
    * Change the SPI knative config to new framework
    
    * Change the SPI pravega config to new framework
    
    * Change the SPI pulsar config to new framework
    
    * Change the SPI rabbitmq config to new framework
    
    * Change the SPI Prometheus config to new framework
    
    * Change the SPI auth-http-basic config to new framework
    
    * Change the SPI trace-api config to new framework
    
    * Change the SPI pinpoint config to new framework
    
    * Change the SPI zipkin config to new framework
    
    * Use getter/setter methods to access EventMeshGrpcConfiguration
    
    * Use getter/setter methods to access EventMeshHTTPConfiguration
    
    * Enhanced Configuration management
    
    * remove temporary blocking @Ignore
    
    * fix styleCheck
    
    * fix UT
    
    * rename ConfigService method
    
    * Revision review comments
    
    * Fixed code review comments
    [1] save the last accessible status of reflection field and recovery it after custom operation
    
    * Fixed code review comments
    [1] CLASS_PATH_PREFIX/FILE_PATH_PREFIX constants optimization
    [2] Some other code details optimization
    
    * Fixed code review comments
    [1] add UT for ConfigService#getConfig(ConfigInfo configInfo)
    
    Co-authored-by: githublaohu <23...@qq.com>
    Co-authored-by: mike_xwm <mi...@126.com>
---
 eventmesh-common/build.gradle                      |   1 +
 .../common/config/CommonConfiguration.java         | 198 +++-------
 .../apache/eventmesh/common/config/Config.java}    |  48 +--
 .../eventmesh/common/config/ConfigFiled.java       |  80 ++++
 .../apache/eventmesh/common/config/ConfigInfo.java |  37 +-
 .../common/config/ConfigMonitorService.java        |  73 ++++
 .../eventmesh/common/config/ConfigService.java     | 184 +++++++++
 .../common/config/ConfigurationWrapper.java        | 183 ---------
 .../apache/eventmesh/common/config/FileLoad.java   |  90 +++++
 .../eventmesh/common/config/convert/Convert.java   |  28 +-
 .../common/config/convert/ConvertInfo.java         |  21 +-
 .../common/config/convert/ConvertValue.java        |  78 ++++
 .../common/config/convert/ConverterMap.java        | 146 ++++++++
 .../convert/converter/BaseDataTypeConverter.java   | 100 +++++
 .../config/convert/converter/DateConverter.java    |  35 +-
 .../config/convert/converter/EnumConverter.java    |  27 +-
 .../convert/converter/IPAddressConverter.java      |  37 +-
 .../config/convert/converter/ListConverter.java    |  97 +++++
 .../convert/converter/LocalDateConverter.java      |  27 +-
 .../convert/converter/LocalDateTimeConverter.java  |  24 +-
 .../config/convert/converter/MapConverter.java     |  67 ++++
 .../config/convert/converter/ObjectConverter.java  | 212 +++++++++++
 .../convert/converter/PropertiesConverter.java     |  53 +++
 .../config/convert/converter/StringConverter.java  |  25 +-
 .../config/convert/converter/URIConverter.java     |  22 +-
 .../common/config/CommonConfigurationTest.java     |  56 ++-
 .../eventmesh/common/config/ConfigServiceTest.java |  93 +++++
 .../common/utils/PropertiesUtilsTest.java          |  13 +-
 .../src/test/resources/configuration.properties    |  35 +-
 .../kafka/config/ClientConfiguration.java          |  50 ++-
 .../kafka/config/ConfigurationWrapper.java         |  83 ----
 .../kafka/consumer/KafkaConsumerImpl.java          |  16 +-
 .../kafka/producer/KafkaProducerImpl.java          |  16 +-
 .../kafka/config/ClientConfigurationTest.java      |  74 ++++
 .../src/test/resources/kafka-client.properties     |  30 ++
 .../knative/config/ClientConfiguration.java        |  50 ++-
 .../knative/config/ConfigurationWrapper.java       |  72 ----
 .../knative/consumer/KnativeConsumerImpl.java      |  14 +-
 .../knative/producer/KnativeProducerImpl.java      |  14 +-
 .../knative/config/ClientConfigurationTest.java    |  51 +++
 .../knative/consumer/KnativeConsumerImplTest.java  |   5 +-
 .../knative/producer/KnativeProducerImplTest.java  |   4 +-
 .../src/test/resources/knative-client.properties}  |   4 +-
 .../connector/pravega/PravegaConsumerImpl.java     |  15 +-
 .../connector/pravega/PravegaProducerImpl.java     |  14 +-
 .../connector/pravega/client/PravegaClient.java    |  23 +-
 .../pravega/config/PravegaConnectorConfig.java     |  92 ++---
 .../config/PravegaConnectorConfigWrapper.java      |  72 ----
 .../pravega/client/PravegaClientTest.java          |  11 +-
 .../pravega/config/PravegaConnectorConfigTest.java |  69 ++--
 .../test/resources/pravega-connector.properties    |  16 +-
 .../pulsar/common/EventMeshConstants.java          |  22 --
 .../pulsar/config/ClientConfiguration.java         |  37 +-
 .../pulsar/config/ConfigurationWrapper.java        |  74 ----
 .../pulsar/consumer/PulsarConsumerImpl.java        |  13 +-
 .../connector/pulsar/producer/ProducerImpl.java    |  11 +-
 .../pulsar/producer/PulsarProducerImpl.java        |  14 +-
 .../pulsar/config/ClientConfigurationTest.java     |  52 +++
 .../src/test/resources/pulsar-client.properties}   |   4 +-
 .../connector/rabbitmq/config/ConfigKey.java       |  32 --
 .../rabbitmq/config/ConfigurationHolder.java       |  49 ++-
 .../rabbitmq/config/ConfigurationWrapper.java      |  67 ----
 .../rabbitmq/consumer/RabbitmqConsumer.java        |  12 +-
 .../rabbitmq/producer/RabbitmqProducer.java        |  12 +-
 .../connector/rabbitmq/RabbitmqServer.java         |   6 +-
 .../rabbitmq/config/ConfigurationHolderTest.java   |  62 +++
 .../src/test/resources/rabbitmq-client.properties  |  12 +-
 .../connector/redis/client/RedissonClient.java     |  62 +--
 .../connector/redis/config/ConfigOptions.java      |  51 ---
 .../redis/config/ConfigurationWrapper.java         |  74 ----
 .../connector/redis/config/RedisProperties.java    |  55 +--
 .../redis/config/RedisPropertiesTest.java          |  47 +++
 .../src/test/resources/redis-client.properties     |   7 +-
 .../connector/rocketmq/admin/RocketMQAdmin.java    |   5 +-
 .../connector/rocketmq/admin/command/Command.java  |  56 +++
 .../rocketmq/config/ClientConfiguration.java       | 196 ++--------
 .../rocketmq/config/ConfigurationWrapper.java      |  68 ----
 .../rocketmq/consumer/RocketMQConsumerImpl.java    |  27 +-
 .../rocketmq/producer/RocketMQProducerImpl.java    |  10 +-
 .../rocketmq/config/ClientConfigurationTest.java   |  65 ++++
 .../src/test/resources/rocketmq-client.properties  |  15 +
 .../src/main/resources/application.properties      |   2 +-
 .../eventmesh-metrics-prometheus/build.gradle      |   2 +-
 .../prometheus/PrometheusMetricsRegistry.java      |  13 +-
 .../prometheus/config/PrometheusConfiguration.java |  59 +--
 .../config/PrometheusConfigurationTest.java        |  16 +-
 .../src/test/resources/prometheus.properties       |   2 +-
 .../src/test/java/ConsulRegistryServiceTest.java   |   2 +-
 .../etcd/service/EtcdRegistryServiceTest.java      |   2 +-
 .../nacos/service/NacosRegistryService.java        |   1 +
 .../nacos/service/NacosRegistryServiceTest.java    |   2 +-
 .../service/ZookeeperRegistryServiceTest.java      |   2 +-
 eventmesh-runtime/conf/eventmesh.properties        |   2 +-
 .../admin/handler/ConfigurationHandler.java        |   8 +-
 .../runtime/boot/EventMeshGrpcBootstrap.java       |  10 +-
 .../runtime/boot/EventMeshGrpcServer.java          |  42 ++-
 .../runtime/boot/EventMeshHTTPServer.java          | 105 +++---
 .../runtime/boot/EventMeshHttpBootstrap.java       |  13 +-
 .../eventmesh/runtime/boot/EventMeshServer.java    |  20 +-
 .../eventmesh/runtime/boot/EventMeshStartup.java   |  12 +-
 .../eventmesh/runtime/boot/EventMeshTCPServer.java |   1 -
 .../runtime/boot/EventMeshTcpBootstrap.java        |  13 +-
 .../eventmesh/runtime/boot/SSLContextFactory.java  |   6 +-
 .../configuration/EventMeshGrpcConfiguration.java  | 263 +++----------
 .../configuration/EventMeshHTTPConfiguration.java  | 416 ++++-----------------
 .../configuration/EventMeshTCPConfiguration.java   | 219 ++---------
 .../protocol/grpc/consumer/ConsumerManager.java    |   2 +-
 .../protocol/grpc/consumer/EventMeshConsumer.java  |   1 -
 .../protocol/grpc/push/WebhookPushRequest.java     |   2 +-
 .../core/protocol/grpc/retry/GrpcRetryer.java      |  33 +-
 .../protocol/grpc/service/ConsumerService.java     |   8 +-
 .../protocol/grpc/service/HeartbeatService.java    |   2 +-
 .../protocol/grpc/service/ProducerService.java     |   6 +-
 .../http/processor/BatchSendMessageProcessor.java  |  18 +-
 .../processor/BatchSendMessageV2Processor.java     |   6 +-
 .../processor/LocalSubscribeEventProcessor.java    |   8 +-
 .../processor/RemoteSubscribeEventProcessor.java   |   6 +-
 .../processor/RemoteUnSubscribeEventProcessor.java |   8 +-
 .../http/processor/ReplyMessageProcessor.java      |   6 +-
 .../http/processor/SendAsyncEventProcessor.java    |   4 +-
 .../http/processor/SendAsyncMessageProcessor.java  |   6 +-
 .../processor/SendAsyncRemoteEventProcessor.java   |   4 +-
 .../http/processor/SendSyncMessageProcessor.java   |   6 +-
 .../http/processor/SubscribeProcessor.java         |   4 +-
 .../http/processor/inf/AbstractEventProcessor.java |   4 +-
 .../core/protocol/http/retry/HttpRetryer.java      |   8 +-
 .../tcp/client/group/ClientGroupWrapper.java       |   3 +-
 .../controller/ClientManageControllerTest.java     |  21 +-
 .../QueryRecommendEventMeshHandlerTest.java        |   7 +-
 .../runtime/boot/EventMeshServerTest.java          | 114 ++++++
 .../eventmesh/runtime/client/common/Server.java    |   8 +-
 .../EventMeshGrpcConfigurationTest.java            |  93 +++++
 .../EventMeshHTTPConfigurationTest.java            | 108 ++++++
 .../EventMeshTCPConfigurationTest.java             |  95 +++++
 .../eventmesh/runtime/util/HttpTinyClientTest.java |   1 +
 .../src/test/resources/configuration.properties    | 106 ++++++
 .../EventMeshMessageTCPSubClient.java              |   4 +-
 .../eventmesh/api/common/ConfigurationWrapper.java |  59 ---
 .../api/common/ConfigurationWrapperTest.java       |  53 ---
 .../src/test/resources/testpath/test1.properties   |  17 -
 .../build.gradle                                   |   3 +
 .../auth/http/basic/config/AuthConfigs.java        |  43 +--
 .../auth/http/basic/impl/AuthHttpBasicService.java |  22 +-
 .../auth/http/basic/config/AuthConfigsTest.java    |  23 +-
 .../http/basic/impl/AuthHttpBasicServiceTest.java  |   6 +-
 .../src/test/resources/auth-http-basic.properties  |   4 +-
 .../eventmesh/spi/EventMeshExtensionFactory.java   |  20 +-
 .../trace/api/common/EventMeshTraceConstants.java  |   5 -
 .../trace/api/config/ExporterConfiguration.java    |  98 +----
 .../api/config/ExporterConfigurationTest.java      |  32 +-
 .../src/test/resources/exporter.properties         |   9 +-
 .../eventmesh/trace/jaeger/JaegerTraceService.java |  33 +-
 .../trace/jaeger/common/JaegerConstants.java       |   4 -
 .../trace/jaeger/config/JaegerConfiguration.java   |  77 +---
 .../trace/jaeger/JaegerTraceServiceTest.java       |   8 +-
 .../jaeger/config/JaegerConfigurationTest.java     |  25 +-
 .../src/test/resources/exporter.properties         |   6 +-
 .../eventmesh-trace-pinpoint/build.gradle          |   3 +
 .../trace/pinpoint/PinpointTraceService.java       |  36 +-
 .../trace/pinpoint/common/PinpointConstants.java   |  12 -
 .../pinpoint/config/PinpointConfiguration.java     |  91 +----
 .../trace/pinpoint/PinpointTraceServiceTest.java   |   9 +-
 .../pinpoint/config/PinpointConfigurationTest.java |  36 +-
 .../exporter/PinpointSpanExporterTest.java         |  20 +-
 .../src/test/resources/exporter.properties         |   6 +-
 .../eventmesh/trace/zipkin/ZipkinTraceService.java |  36 +-
 .../trace/zipkin/common/ZipkinConstants.java       |   4 +-
 .../trace/zipkin/config/ZipkinConfiguration.java   |  78 +---
 .../trace/zipkin/ZipkinTraceServiceTest.java       |   9 +-
 .../zipkin/config/ZipkinConfigurationTest.java     |  51 +++
 .../src/test/resources/exporter.properties         |   6 +-
 .../src/test/resources/zipkin.properties           |   5 +-
 .../eventmesh-webhook-admin/build.gradle           |   8 +-
 .../admin/AdminWebHookConfigOperationManage.java   |  33 +-
 .../webhook/config/AdminConfiguration.java         |  40 +-
 .../AdminWebHookConfigOperationManageTest.java     |  23 +-
 .../webhook/config/AdminConfigurationTest.java     |  35 +-
 .../src/test/resources/eventmesh.properties        |  28 ++
 .../webhook/api/WebHookOperationConstant.java      |   4 +-
 .../webhook/receive/WebHookController.java         |  22 +-
 .../receive/config/ReceiveConfiguration.java       |  41 +-
 .../receive/storage/HookConfigOperationManage.java |  32 +-
 .../receive/config/ReceiveConfigurationTest.java   |  51 +++
 .../src/test/resources/eventmesh.properties        |  30 ++
 184 files changed, 4001 insertions(+), 3332 deletions(-)

diff --git a/eventmesh-common/build.gradle b/eventmesh-common/build.gradle
index 59fe1587d..c4f6e5e4d 100644
--- a/eventmesh-common/build.gradle
+++ b/eventmesh-common/build.gradle
@@ -46,6 +46,7 @@ dependencies {
     implementation "javax.annotation:javax.annotation-api:1.3.2"
 
     implementation "com.github.stefanbirkner:system-rules"
+    implementation "org.yaml:snakeyaml"
 
     compileOnly 'org.projectlombok:lombok'
     annotationProcessor 'org.projectlombok:lombok'
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
index e0ed6960b..fcd06da90 100644
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/CommonConfiguration.java
@@ -17,187 +17,105 @@
 
 package org.apache.eventmesh.common.config;
 
-import org.apache.eventmesh.common.utils.AssertUtils;
 import org.apache.eventmesh.common.utils.ConfigurationContextUtil;
 import org.apache.eventmesh.common.utils.IPUtils;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.collections4.CollectionUtils;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
 
-import com.google.common.base.Preconditions;
+import org.assertj.core.util.Strings;
 
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 @Data
+@NoArgsConstructor
+@Config(prefix = "eventMesh")
 public class CommonConfiguration {
-    private transient String eventMeshEnv = "P";
-    private transient String eventMeshIDC = "FT";
-    private transient String eventMeshCluster = "LS";
-    
-    private transient String eventMeshName = "";
-    private transient List<String> eventMeshProvideServerProtocols;
-    private transient String sysID = "5477";
-    private transient String eventMeshConnectorPluginType = "rocketmq";
-    private transient String eventMeshSecurityPluginType = "security";
-    private transient String eventMeshRegistryPluginType = "namesrv";
-    private transient List<String> eventMeshMetricsPluginType;
-    private transient String eventMeshTracePluginType;
-
-    private transient String namesrvAddr = "";
-    private transient String eventMeshRegistryPluginUsername = "";
-    private transient String eventMeshRegistryPluginPassword = "";
-    private transient Integer eventMeshRegisterIntervalInMills = 10 * 1000;
-    private transient Integer eventMeshFetchRegistryAddrInterval = 10 * 1000;
-    private transient String eventMeshServerIp = null;
-    private transient boolean eventMeshServerSecurityEnable = false;
-    
-    private transient boolean eventMeshServerRegistryEnable = false;
-    
-    private transient boolean eventMeshServerTraceEnable = false;
-
-    protected transient ConfigurationWrapper configurationWrapper;
-
-    private transient String eventMeshWebhookOrigin = "eventmesh." + eventMeshIDC;
-
-    public CommonConfiguration(ConfigurationWrapper configurationWrapper) {
-        this.configurationWrapper = configurationWrapper;
-    }
-
-    public String getMeshGroup() {
-        return String.join("-", this.eventMeshEnv, this.eventMeshCluster, this.sysID);
-    }
-    
+    @ConfigFiled(field = "sysid", beNumber = true, notEmpty = true)
+    private String sysID = "5477";
 
-    public void init() {
+    @ConfigFiled(field = "server.env", notEmpty = true)
+    private String eventMeshEnv = "P";
 
-        if (configurationWrapper != null) {
-            eventMeshEnv = checkNotEmpty(ConfKeys.KEYS_EVENTMESH_ENV);
+    @ConfigFiled(field = "server.idc", notEmpty = true)
+    private String eventMeshIDC = "FT";
 
-            sysID = checkNumeric(ConfKeys.KEYS_EVENTMESH_SYSID);
+    @ConfigFiled(field = "server.name", notEmpty = true)
+    private String eventMeshName = "";
 
-            eventMeshCluster = checkNotEmpty(ConfKeys.KEYS_EVENTMESH_SERVER_CLUSTER);
+    @ConfigFiled(field = "server.cluster", notEmpty = true)
+    private String eventMeshCluster = "LS";
 
-            eventMeshName = checkNotEmpty(ConfKeys.KEYS_EVENTMESH_SERVER_NAME);
+    @ConfigFiled(field = "server.hostIp", reload = true)
+    private String eventMeshServerIp = null;
 
-            eventMeshIDC = checkNotEmpty(ConfKeys.KEYS_EVENTMESH_IDC);
+    @ConfigFiled(field = "registry.plugin.server-addr", notEmpty = true)
+    private String namesrvAddr = "";
 
-            eventMeshServerIp = get(ConfKeys.KEYS_EVENTMESH_SERVER_HOST_IP, IPUtils::getLocalAddress);
 
-            eventMeshConnectorPluginType = checkNotEmpty(ConfKeys.KEYS_ENENTMESH_CONNECTOR_PLUGIN_TYPE);
+    @ConfigFiled(field = "trace.plugin", notEmpty = true)
+    private String eventMeshTracePluginType;
 
-            eventMeshServerSecurityEnable = Boolean.parseBoolean(get(ConfKeys.KEYS_EVENTMESH_SECURITY_ENABLED, () -> "false"));
+    @ConfigFiled(field = "metrics.plugin", notEmpty = true)
+    private List<String> eventMeshMetricsPluginType;
 
-            eventMeshSecurityPluginType = checkNotEmpty(ConfKeys.KEYS_ENENTMESH_SECURITY_PLUGIN_TYPE);
+    @ConfigFiled(field = "registry.plugin.type", notEmpty = true)
+    private String eventMeshRegistryPluginType = "namesrv";
 
-            eventMeshServerRegistryEnable = Boolean.parseBoolean(get(ConfKeys.KEYS_EVENTMESH_REGISTRY_ENABLED, () -> "false"));
+    @ConfigFiled(field = "security.plugin.type", notEmpty = true)
+    private String eventMeshSecurityPluginType = "security";
 
-            eventMeshRegistryPluginType = checkNotEmpty(ConfKeys.KEYS_ENENTMESH_REGISTRY_PLUGIN_TYPE);
+    @ConfigFiled(field = "connector.plugin.type", notEmpty = true)
+    private String eventMeshConnectorPluginType = "rocketmq";
 
-            namesrvAddr = checkNotEmpty(ConfKeys.KEYS_EVENTMESH_REGISTRY_PULGIN_SERVER_ADDR);
 
-            eventMeshRegistryPluginUsername = 
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_REGISTRY_PULGIN_USERNAME, "");
+    @ConfigFiled(field = "registry.plugin.username")
+    private String eventMeshRegistryPluginUsername = "";
 
-            eventMeshRegistryPluginPassword = 
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_REGISTRY_PULGIN_PASSWORD, "");
+    @ConfigFiled(field = "registry.plugin.password")
+    private String eventMeshRegistryPluginPassword = "";
 
-            String metricsPluginType = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_METRICS_PLUGIN_TYPE);
-            if (StringUtils.isNotEmpty(metricsPluginType)) {
-                eventMeshMetricsPluginType = Arrays
-                        .stream(metricsPluginType.split(","))
-                        .filter(StringUtils::isNotBlank)
-                        .map(String::trim)
-                        .collect(Collectors.toList());
-            }
+    @ConfigFiled(field = "server.registry.registerIntervalInMills")
+    private Integer eventMeshRegisterIntervalInMills = 10 * 1000;
 
-            eventMeshProvideServerProtocols = getProvideServerProtocols();
+    @ConfigFiled(field = "server.registry.fetchRegistryAddrIntervalInMills")
+    private Integer eventMeshFetchRegistryAddrInterval = 10 * 1000;
 
-            eventMeshServerTraceEnable = Boolean.parseBoolean(get(ConfKeys.KEYS_EVENTMESH_TRACE_ENABLED, () -> "false"));
-            if (eventMeshServerTraceEnable) {
-                eventMeshTracePluginType = checkNotEmpty(ConfKeys.KEYS_EVENTMESH_TRACE_PLUGIN_TYPE);
-            }
-        }
-    }
-
-    private String checkNotEmpty(String key) {
-        String value = configurationWrapper.getProp(key);
-        if (value != null) {
-            value = StringUtils.deleteWhitespace(value);
-        }
-        AssertUtils.notBlack(value, key + " is invalidated");
-        return value;
-    }
 
-    private String checkNumeric(String key) {
-        String value = configurationWrapper.getProp(key);
-        if (value != null) {
-            value = StringUtils.deleteWhitespace(value);
-        }
-        Preconditions.checkState(StringUtils.isNotEmpty(value) && StringUtils.isNumeric(value), key + " is invalidated");
-        return value;
-    }
+    @ConfigFiled(field = "server.trace.enabled")
+    private boolean eventMeshServerTraceEnable = false;
 
-    private String get(String key, Supplier<String> defaultValueSupplier) {
-        String value = configurationWrapper.getProp(key);
-        if (value != null) {
-            value = StringUtils.deleteWhitespace(value);
-        }
-        return StringUtils.isEmpty(value) ? defaultValueSupplier.get() : value;
-    }
+    @ConfigFiled(field = "server.security.enabled")
+    private boolean eventMeshServerSecurityEnable = false;
 
-    public List<String> getProvideServerProtocols() {
-        String provideProtocols = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_PROVIDE_PROTOCOLS);
-        if (StringUtils.isNotEmpty(provideProtocols)) {
-            return Arrays.stream(provideProtocols.split(",")).filter(StringUtils::isNotBlank).map(String::trim).collect(Collectors.toList());
-        } else {
-            return Collections.singletonList(ConfigurationContextUtil.HTTP);
-        }
-    }
+    @ConfigFiled(field = "server.registry.enabled")
+    private boolean eventMeshServerRegistryEnable = false;
 
-    static class ConfKeys {
-        public static final String KEYS_EVENTMESH_ENV = "eventMesh.server.env";
 
-        public static final String KEYS_EVENTMESH_IDC = "eventMesh.server.idc";
+    @ConfigFiled(field = "server.provide.protocols", reload = true)
+    private List<String> eventMeshProvideServerProtocols;
 
-        public static final String KEYS_EVENTMESH_SYSID = "eventMesh.sysid";
 
-        public static final String KEYS_EVENTMESH_SERVER_CLUSTER = "eventMesh.server.cluster";
+    @ConfigFiled(reload = true)
+    private String eventMeshWebhookOrigin;
 
-        public static final String KEYS_EVENTMESH_SERVER_NAME = "eventMesh.server.name";
+    @ConfigFiled(reload = true)
+    private String meshGroup;
 
-        public static final String KEYS_EVENTMESH_SERVER_PROVIDE_PROTOCOLS = "eventMesh.server.provide.protocols";
+    public void reload() {
+        this.eventMeshWebhookOrigin = "eventmesh." + eventMeshIDC;
 
-        public static final String KEYS_EVENTMESH_SERVER_HOST_IP = "eventMesh.server.hostIp";
-
-        public static final String KEYS_EVENTMESH_SERVER_REGISTER_INTERVAL = "eventMesh.server.registry.registerIntervalInMills";
-
-        public static final String KEYS_EVENTMESH_SERVER_FETCH_REGISTRY_ADDR_INTERVAL = "eventMesh.server.registry.fetchRegistryAddrIntervalInMills";
-
-        public static final String KEYS_ENENTMESH_CONNECTOR_PLUGIN_TYPE = "eventMesh.connector.plugin.type";
-
-        public static final String KEYS_EVENTMESH_SECURITY_ENABLED = "eventMesh.server.security.enabled";
-
-        public static final String KEYS_ENENTMESH_SECURITY_PLUGIN_TYPE = "eventMesh.security.plugin.type";
-
-        public static final String KEYS_EVENTMESH_REGISTRY_ENABLED = "eventMesh.registry.plugin.enabled";
-
-        public static final String KEYS_ENENTMESH_REGISTRY_PLUGIN_TYPE = "eventMesh.registry.plugin.type";
-
-        public static final String KEYS_EVENTMESH_REGISTRY_PULGIN_SERVER_ADDR = "eventMesh.registry.plugin.server-addr";
-
-        public static final String KEYS_EVENTMESH_REGISTRY_PULGIN_USERNAME = "eventMesh.registry.plugin.username";
-
-        public static final String KEYS_EVENTMESH_REGISTRY_PULGIN_PASSWORD = "eventMesh.registry.plugin.password";
-
-        public static final String KEYS_EVENTMESH_METRICS_PLUGIN_TYPE = "eventMesh.metrics.plugin";
+        if (Strings.isNullOrEmpty(this.eventMeshServerIp)) {
+            this.eventMeshServerIp = IPUtils.getLocalAddress();
+        }
 
-        public static final String KEYS_EVENTMESH_TRACE_ENABLED = "eventMesh.server.trace.enabled";
+        if (CollectionUtils.isEmpty(eventMeshProvideServerProtocols)) {
+            this.eventMeshProvideServerProtocols = Collections.singletonList(ConfigurationContextUtil.HTTP);
+        }
 
-        public static final String KEYS_EVENTMESH_TRACE_PLUGIN_TYPE = "eventMesh.trace.plugin";
+        meshGroup = String.join("-", this.eventMeshEnv, this.eventMeshCluster, this.sysID);
     }
 }
\ No newline at end of file
diff --git a/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/ConfigurationWrapperTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/Config.java
similarity index 51%
rename from eventmesh-common/src/test/java/org/apache/eventmesh/common/config/ConfigurationWrapperTest.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/Config.java
index 56ce9191c..b6c7cc132 100644
--- a/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/ConfigurationWrapperTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/Config.java
@@ -17,32 +17,38 @@
 
 package org.apache.eventmesh.common.config;
 
-import java.io.File;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Record information about the configuration class to be converted
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Repeatable(Config.Configs.class)
+public @interface Config {
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+    String field() default "";
 
-public class ConfigurationWrapperTest {
+    String path() default "";
 
-    private ConfigurationWrapper wraper;
+    String prefix() default "";
 
-    @Before
-    public void before() {
-        String file = ConfigurationWrapperTest.class.getResource("/configuration.properties").getFile();
-        File f = new File(file);
-        wraper = new ConfigurationWrapper(f.getParent(), f.getName(), false);
-    }
+    String hump() default ".";
 
-    @Test
-    public void testGetProp() {
-        Assert.assertEquals("value1", wraper.getProp("eventMesh.server.env"));
-        Assert.assertEquals("value2", wraper.getProp("eventMesh.server.idc"));
-    }
+    boolean removePrefix() default true;
 
-    @Test(expected = NullPointerException.class)
-    public void construct() {
-        ConfigurationWrapper newWrapper = new ConfigurationWrapper(null, "eventmesh.properties", false);
-    }
+    boolean monitor() default false;
 
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target(ElementType.TYPE)
+    @interface Configs {
+        Config[] value();
+    }
 }
+
+
+
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigFiled.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigFiled.java
new file mode 100644
index 000000000..d7c398e2d
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigFiled.java
@@ -0,0 +1,80 @@
+/*
+ * 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.eventmesh.common.config;
+
+import org.apache.eventmesh.common.config.convert.ConvertValue.DefaultConverter;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Record information about the field in the configuration class to be converted
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.FIELD})
+public @interface ConfigFiled {
+
+    /**
+     * @return The key name of the configuration file
+     */
+    String field() default "";
+
+    /**
+     * Note : When reload is true, the class must have a reload method
+     *
+     * @return Whether to reload. This parameter is used when other fields are associated
+     */
+    boolean reload() default false;
+
+    /**
+     * In some special cases, used to specify the converter class of the field
+     *
+     * @return field converter
+     */
+    Class<?> converter() default DefaultConverter.class;
+
+    /**
+     * if the configuration filed is empty, try to read from env, by field
+     *
+     * @return Whether to try to read from env if the configuration filed is empty
+     */
+    boolean findEnv() default false;
+
+    /**
+     * If it cannot be null but is null, an exception is thrown
+     *
+     * @return Whether the field can be null
+     */
+    boolean notNull() default false;
+
+    /**
+     * If it cannot be empty but is empty, an exception is thrown
+     *
+     * @return Whether the field can be empty
+     */
+    boolean notEmpty() default false;
+
+    /**
+     * If it's not a number, an exception is thrown
+     *
+     * @return Whether the field must be number
+     */
+    boolean beNumber() default false;
+}
diff --git a/eventmesh-webhook/eventmesh-webhook-admin/build.gradle b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigInfo.java
similarity index 54%
copy from eventmesh-webhook/eventmesh-webhook-admin/build.gradle
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigInfo.java
index ce7104d52..39c4624cd 100644
--- a/eventmesh-webhook/eventmesh-webhook-admin/build.gradle
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigInfo.java
@@ -15,18 +15,35 @@
  * limitations under the License.
  */
 
-dependencies {
+package org.apache.eventmesh.common.config;
 
-    implementation project(":eventmesh-common")
-    implementation project(":eventmesh-webhook:eventmesh-webhook-api")
+import java.lang.reflect.Field;
 
-    implementation 'org.slf4j:slf4j-api'
-    implementation "com.alibaba.nacos:nacos-client"
-    implementation "com.fasterxml.jackson.core:jackson-databind"
-    implementation "com.fasterxml.jackson.core:jackson-core"
-    implementation "com.fasterxml.jackson.core:jackson-annotations"
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
-    testImplementation project(":eventmesh-webhook:eventmesh-webhook-api")
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ConfigInfo {
 
+    public static final String HUMP_SPOT = "spot";
+    public static final String HUMP_ROD = "rod";
 
-}
+    private String path;
+    private String field;
+    private String prefix;
+    private String hump;
+    private boolean monitor;
+    private boolean removePrefix;
+
+    private Class<?> clazz;
+    private Object object;
+    private String filePath;
+
+    Field objectField;
+    Object instance;
+}
\ No newline at end of file
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigMonitorService.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigMonitorService.java
new file mode 100644
index 000000000..36e39d3fa
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigMonitorService.java
@@ -0,0 +1,73 @@
+/*
+ * 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.eventmesh.common.config;
+
+import org.apache.eventmesh.common.ThreadPoolFactory;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class ConfigMonitorService {
+
+    private static final long TIME_INTERVAL = 30 * 1000L;
+
+    private final List<ConfigInfo> configInfoList = new ArrayList<>();
+
+    private final ScheduledExecutorService configLoader = ThreadPoolFactory
+        .createSingleScheduledExecutor("eventMesh-configLoader-");
+
+    {
+        configLoader.scheduleAtFixedRate(this::load, TIME_INTERVAL, TIME_INTERVAL, TimeUnit.MILLISECONDS);
+    }
+
+    public void monitor(ConfigInfo configInfo) {
+        configInfoList.add(configInfo);
+    }
+
+    public void load() {
+        for (ConfigInfo configInfo : configInfoList) {
+            try {
+                Object object = ConfigService.getInstance().getConfig(configInfo);
+                if (configInfo.getObject().equals(object)) {
+                    continue;
+                }
+
+                Field field = configInfo.getObjectField();
+                boolean isAccessible = field.isAccessible();
+                try {
+                    field.setAccessible(true);
+                    field.set(configInfo.getInstance(), object);
+                } finally {
+                    field.setAccessible(isAccessible);
+                }
+
+                configInfo.setObject(object);
+                log.info("config reload success: {}", object);
+            } catch (Exception e) {
+                log.error("config reload failed", e);
+            }
+        }
+    }
+
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
new file mode 100644
index 000000000..a2250a2d4
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
@@ -0,0 +1,184 @@
+/*
+ * 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.eventmesh.common.config;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Objects;
+import java.util.Properties;
+
+import org.assertj.core.util.Strings;
+
+import lombok.Getter;
+
+
+public class ConfigService {
+
+    private static final ConfigService INSTANCE = new ConfigService();
+
+    public static final String CLASS_PATH_PREFIX = "classPath://";
+    public static final String FILE_PATH_PREFIX = "file://";
+
+    /**
+     * Unified configuration Properties corresponding to eventmesh.properties
+     */
+    private Properties properties = new Properties();
+
+    @Getter
+    private String rootPath;
+
+    private static final ConfigMonitorService configMonitorService = new ConfigMonitorService();
+
+    private String configPath;
+
+
+    public static ConfigService getInstance() {
+        return INSTANCE;
+    }
+
+    public ConfigService() {
+    }
+
+    public ConfigService setConfigPath(String configPath) {
+        this.configPath = configPath;
+        return this;
+    }
+
+    public void setRootConfig(String path) throws Exception {
+        ConfigInfo configInfo = new ConfigInfo();
+        rootPath = path;
+        configInfo.setPath(rootPath);
+        properties = this.getConfig(configInfo);
+    }
+
+    public Properties getRootConfig() {
+        return this.properties;
+    }
+
+    public <T> T buildConfigInstance(Class<?> clazz) {
+        Config[] configArray = clazz.getAnnotationsByType(Config.class);
+        if (configArray.length == 0) {
+            try {
+                return this.getConfig(ConfigInfo.builder()
+                        .clazz(clazz)
+                        .hump(ConfigInfo.HUMP_SPOT)
+                        .build());
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        Config config = configArray[0];
+        try {
+            // todo Complete all attributes
+            ConfigInfo configInfo = new ConfigInfo();
+            configInfo.setClazz(clazz);
+            configInfo.setPath(config.path());
+            configInfo.setHump(config.hump());
+            configInfo.setPrefix(config.prefix());
+            configInfo.setMonitor(config.monitor());
+
+            return this.getConfig(configInfo);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void populateConfigForObject(Object object) throws IllegalAccessException, NoSuchFieldException, IOException {
+        Class<?> clazz = object.getClass();
+        Config[] configArray = clazz.getAnnotationsByType(Config.class);
+        if (configArray.length == 0) {
+            return;
+        }
+
+        for (Config config : configArray) {
+            populateConfig(object, clazz, config);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> T getConfig(ConfigInfo configInfo) throws IOException {
+        Object object;
+
+        if (Objects.isNull(configInfo.getPath()) || StringUtils.isEmpty(configInfo.getPath().trim())) {
+            object = FileLoad.getPropertiesFileLoad().getConfig(properties, configInfo);
+        } else {
+            String path = configInfo.getPath();
+            String filePath;
+
+            if (path.startsWith(CLASS_PATH_PREFIX)) {
+                filePath = Objects.requireNonNull(
+                        ConfigService.class.getResource("/" + path.substring(CLASS_PATH_PREFIX.length()))
+                ).getPath();
+            } else if (path.startsWith(FILE_PATH_PREFIX)) {
+                filePath = path.substring(FILE_PATH_PREFIX.length());
+            } else {
+                filePath = this.configPath + path;
+            }
+
+            File file = new File(filePath);
+            if (!file.exists()) {
+                throw new RuntimeException("file is not exists");
+            }
+
+            String suffix = path.substring(path.lastIndexOf('.') + 1);
+            configInfo.setFilePath(filePath);
+            object = FileLoad.getFileLoad(suffix).getConfig(configInfo);
+        }
+        return (T) object;
+    }
+
+    private void populateConfig(Object object, Class<?> clazz, Config config)
+            throws NoSuchFieldException, IOException, IllegalAccessException {
+        ConfigInfo configInfo = new ConfigInfo();
+        configInfo.setField(config.field());
+        configInfo.setMonitor(config.monitor());
+
+        Field field = clazz.getDeclaredField(configInfo.getField());
+        Class<?> fieldClazz = field.getType();
+        configInfo.setClazz(fieldClazz);
+
+        Config[] configArray = fieldClazz.getAnnotationsByType(Config.class);
+        if (configArray.length != 0 && !Strings.isNullOrEmpty(configArray[0].prefix())) {
+            config = configArray[0];
+            configInfo.setPrefix(config.prefix());
+            configInfo.setPath(config.path());
+            configInfo.setPrefix(config.prefix());
+            configInfo.setHump(config.hump());
+        }
+
+        Object configObject = this.getConfig(configInfo);
+
+        boolean isAccessible = field.isAccessible();
+        try {
+            field.setAccessible(true);
+            field.set(object, configObject);
+        } finally {
+            field.setAccessible(isAccessible);
+        }
+        if (configInfo.isMonitor()) {
+            configInfo.setObjectField(field);
+            configInfo.setInstance(object);
+            configInfo.setObject(configObject);
+            configMonitorService.monitor(configInfo);
+        }
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigurationWrapper.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigurationWrapper.java
deleted file mode 100644
index 3df946709..000000000
--- a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigurationWrapper.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * 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.eventmesh.common.config;
-
-import org.apache.eventmesh.common.file.FileChangeContext;
-import org.apache.eventmesh.common.file.FileChangeListener;
-import org.apache.eventmesh.common.file.WatchFileManager;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Properties;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.Preconditions;
-
-public class ConfigurationWrapper {
-
-    public static final Logger LOG = LoggerFactory.getLogger(ConfigurationWrapper.class);
-
-    private final transient String directoryPath;
-
-    private final transient String fileName;
-
-    private final transient Properties properties = new Properties();
-
-    private final transient String file;
-
-    private final transient boolean reload;
-
-
-    private final transient FileChangeListener fileChangeListener = new FileChangeListener() {
-        @Override
-        public void onChanged(FileChangeContext changeContext) {
-            load();
-        }
-
-        @Override
-        public boolean support(FileChangeContext changeContext) {
-            return changeContext.getWatchEvent().context().toString().contains(fileName);
-        }
-    };
-
-    private static final ObjectMapper objectMapper = new ObjectMapper();
-
-    public ConfigurationWrapper(String directoryPath, String fileName, boolean reload) {
-        Objects.requireNonNull(directoryPath, "please configure environment variable 'confPath'");
-        Objects.requireNonNull(fileName, "please configure environment variable 'fileName'");
-
-        this.directoryPath = directoryPath
-                .replace('/', File.separator.charAt(0))
-                .replace('\\', File.separator.charAt(0));
-        this.fileName = fileName;
-        this.file = (directoryPath + File.separator + fileName)
-                .replace('/', File.separator.charAt(0))
-                .replace('\\', File.separator.charAt(0));
-        this.reload = reload;
-        init();
-    }
-
-    private void init() {
-        load();
-        if (this.reload) {
-            WatchFileManager.registerFileChangeListener(directoryPath, fileChangeListener);
-            Runtime.getRuntime().addShutdownHook(new Thread(() -> {
-                if (LOG.isInfoEnabled()) {
-                    LOG.info("Configuration reload task closed");
-                }
-                WatchFileManager.deregisterFileChangeListener(directoryPath);
-            }));
-        }
-    }
-
-    private void load() {
-        Objects.requireNonNull(file, "properties can not be null");
-
-        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),
-                StandardCharsets.UTF_8))) {
-            if (LOG.isInfoEnabled()) {
-                LOG.info("loading config: {}", file);
-            }
-            properties.load(reader);
-        } catch (IOException e) {
-            LOG.error("loading properties [{}] error", file, e);
-        }
-    }
-
-    public String getProp(String key) {
-        return getProp(key, null);
-    }
-
-    /**
-     * get key value if value is null then return defaultValue
-     * @param key key
-     * @param defaultValue defaultValue
-     * @return string
-     */
-    public String getProp(String key, String defaultValue) {
-        return StringUtils.isEmpty(key) ? defaultValue : properties.getProperty(key, defaultValue);
-    }
-
-    public int getIntProp(String configKey, int defaultValue) {
-        Objects.requireNonNull(configKey, "configKey can not be null");
-
-        String configValue = StringUtils.deleteWhitespace(getProp(configKey));
-        if (StringUtils.isEmpty(configValue)) {
-            return defaultValue;
-        }
-
-        Preconditions.checkState(StringUtils.isNumeric(configValue),
-                String.format("key:%s, value:%s error", configKey, configValue));
-        return Integer.parseInt(configValue);
-    }
-
-    public boolean getBoolProp(String configKey, boolean defaultValue) {
-        Objects.requireNonNull(configKey, "configKey can not be null");
-
-        String configValue = StringUtils.deleteWhitespace(getProp(configKey));
-        if (StringUtils.isEmpty(configValue)) {
-            return defaultValue;
-        }
-        return Boolean.parseBoolean(configValue);
-    }
-
-    private String removePrefix(String key, String prefix, boolean removePrefix) {
-        Objects.requireNonNull(key, "key can not be null");
-        Objects.requireNonNull(prefix, "prefix can not be null");
-
-        String newPrefix = prefix.endsWith(".") ? prefix : prefix + ".";
-        return removePrefix ? key.replace(newPrefix, "") : key;
-    }
-
-    public Properties getPropertiesByConfig(String prefix, boolean isRemovePrefix) {
-        Objects.requireNonNull(prefix, "prefix can not be null");
-
-        Properties properties = new Properties();
-        for (Entry<Object, Object> entry : this.properties.entrySet()) {
-            String key = (String) entry.getKey();
-            if (key.startsWith(prefix)) {
-                properties.put(removePrefix(key, prefix, isRemovePrefix), entry.getValue());
-            }
-        }
-        return properties;
-    }
-
-    @SuppressWarnings("unchecked")
-    public <T> T getPropertiesByConfig(String prefix, Class<?> clazz, boolean removePrefix) {
-        Objects.requireNonNull(prefix, "prefix can not be null");
-        Objects.requireNonNull(clazz, "clazz can not be null");
-
-        return (T) objectMapper.convertValue(getPropertiesByConfig(prefix, removePrefix), clazz);
-    }
-
-    public Properties getProperties() {
-        return this.properties;
-    }
-
-}
\ No newline at end of file
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/FileLoad.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/FileLoad.java
new file mode 100644
index 000000000..05500a074
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/FileLoad.java
@@ -0,0 +1,90 @@
+/*
+ * 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.eventmesh.common.config;
+
+import org.apache.eventmesh.common.config.convert.Convert;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Objects;
+import java.util.Properties;
+
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * load config from file
+ */
+public interface FileLoad {
+
+    PropertiesFileLoad PROPERTIES_FILE_LOAD = new PropertiesFileLoad();
+
+    YamlFileLoad YAML_FILE_LOAD = new YamlFileLoad();
+
+    public static FileLoad getFileLoad(String fileType) {
+        if (Objects.equals("properties", fileType)) {
+            return PROPERTIES_FILE_LOAD;
+        } else if (Objects.equals("yaml", fileType)) {
+            return YAML_FILE_LOAD;
+        }
+        return PROPERTIES_FILE_LOAD;
+    }
+
+    static PropertiesFileLoad getPropertiesFileLoad() {
+        return PROPERTIES_FILE_LOAD;
+    }
+
+    static YamlFileLoad getYamlFileLoad() {
+        return YAML_FILE_LOAD;
+    }
+
+    <T> T getConfig(ConfigInfo configInfo) throws IOException;
+
+    class PropertiesFileLoad implements FileLoad {
+
+        private final Convert convert = new Convert();
+
+        @SuppressWarnings("unchecked")
+        public <T> T getConfig(ConfigInfo configInfo) throws IOException {
+            Properties properties = new Properties();
+            properties.load(new BufferedReader(new FileReader(configInfo.getFilePath())));
+            if (Objects.isNull(configInfo.getClazz())) {
+                return (T) properties;
+            }
+
+            return (T) convert.doConvert(configInfo, properties);
+        }
+
+        @SuppressWarnings("unchecked")
+        public <T> T getConfig(Properties properties, ConfigInfo configInfo) {
+            return (T) convert.doConvert(configInfo, properties);
+        }
+    }
+
+    class YamlFileLoad implements FileLoad {
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public <T> T getConfig(ConfigInfo configInfo) throws IOException {
+            Yaml yaml = new Yaml();
+            return (T) yaml.loadAs(new BufferedInputStream(new FileInputStream(configInfo.getFilePath())), configInfo.getClazz());
+        }
+    }
+}
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/Convert.java
similarity index 55%
copy from eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/Convert.java
index 275530328..84fbdc380 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/Convert.java
@@ -15,19 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.auth.http.basic.config;
+package org.apache.eventmesh.common.config.convert;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.apache.eventmesh.common.config.ConfigInfo;
 
-public class AuthConfigsTest {
+import java.util.Properties;
 
-    @Test
-    public void testGetConfigs() {
-        AuthConfigs configs = AuthConfigs.getConfigs();
-        String password = configs.getPassword();
-        String username = configs.getUsername();
-        Assert.assertEquals(password, "password");
-        Assert.assertEquals(username, "usera");
+/**
+ * Used to convert Config properties
+ */
+public class Convert {
+
+    public Object doConvert(ConfigInfo configInfo, Properties properties) {
+        Class<?> clazz = configInfo.getClazz();
+        ConvertInfo convertInfo = new ConvertInfo();
+        convertInfo.setConfigInfo(configInfo);
+        convertInfo.setProperties(properties);
+        convertInfo.setClazz(clazz);
+
+        ConvertValue<?> clazzConverter = ConverterMap.getClazzConverter(clazz);
+        return clazzConverter.convert(convertInfo);
     }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/common/EventMeshConstants.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConvertInfo.java
similarity index 65%
rename from eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/common/EventMeshConstants.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConvertInfo.java
index c1e1f9569..c3a867da9 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/common/EventMeshConstants.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConvertInfo.java
@@ -15,10 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.common;
+package org.apache.eventmesh.common.config.convert;
 
-public class EventMeshConstants {
+import org.apache.eventmesh.common.config.ConfigInfo;
 
-    public static final String EVENTMESH_CONF_FILE = "knative-client.properties";
+import java.lang.reflect.Field;
+import java.util.Properties;
 
+import lombok.Data;
+
+/**
+ * Records the information about the field to be converted
+ */
+@Data
+public class ConvertInfo {
+    char hump;
+    String key;
+    Field field;
+    Object value;
+    Class<?> clazz;
+    Properties properties;
+    ConfigInfo configInfo;
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConvertValue.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConvertValue.java
new file mode 100644
index 000000000..e3870759d
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConvertValue.java
@@ -0,0 +1,78 @@
+/*
+ * 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.eventmesh.common.config.convert;
+
+import org.apache.eventmesh.common.config.ConfigFiled;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Properties;
+
+/**
+ * convert convertInfo to obj
+ *
+ * @param <T> obj type
+ */
+public interface ConvertValue<T> {
+
+    T convert(ConvertInfo convertInfo);
+
+    /**
+     * @return Whether can to process null values
+     */
+    default boolean canHandleNullValue() {
+        return false;
+    }
+
+    /**
+     * @return The value converter needs
+     */
+    default Object processFieldValue(ConvertInfo convertInfo, String key, ConfigFiled configFiled) {
+        Properties properties = convertInfo.getProperties();
+        String value = properties.getProperty(key);
+
+        if (Objects.isNull(value)) {
+            return null;
+        }
+
+        value = value.trim();
+
+        boolean findEnv = configFiled.findEnv();
+        String fieldName = configFiled.field();
+
+        if (StringUtils.isBlank(value) && !StringUtils.isBlank(fieldName) && findEnv) {
+            value = Optional.ofNullable(System.getProperty(fieldName)).orElse(System.getenv(fieldName));
+        }
+
+        if (StringUtils.isBlank(value) && configFiled.notEmpty()) {
+            throw new RuntimeException(key + " can't be empty!");
+        }
+
+        return value;
+    }
+
+    class DefaultConverter implements ConvertValue<Object> {
+
+        @Override
+        public Object convert(ConvertInfo convertInfo) {
+            return null;
+        }
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConverterMap.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConverterMap.java
new file mode 100644
index 000000000..47ee0534d
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/ConverterMap.java
@@ -0,0 +1,146 @@
+/*
+ * 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.eventmesh.common.config.convert;
+
+import org.apache.eventmesh.common.config.ConfigFiled;
+import org.apache.eventmesh.common.config.convert.converter.BaseDataTypeConverter;
+import org.apache.eventmesh.common.config.convert.converter.DateConverter;
+import org.apache.eventmesh.common.config.convert.converter.EnumConverter;
+import org.apache.eventmesh.common.config.convert.converter.IPAddressConverter;
+import org.apache.eventmesh.common.config.convert.converter.ListConverter;
+import org.apache.eventmesh.common.config.convert.converter.LocalDateConverter;
+import org.apache.eventmesh.common.config.convert.converter.LocalDateTimeConverter;
+import org.apache.eventmesh.common.config.convert.converter.MapConverter;
+import org.apache.eventmesh.common.config.convert.converter.ObjectConverter;
+import org.apache.eventmesh.common.config.convert.converter.PropertiesConverter;
+import org.apache.eventmesh.common.config.convert.converter.StringConverter;
+import org.apache.eventmesh.common.config.convert.converter.URIConverter;
+
+import java.lang.reflect.Field;
+import java.net.URI;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.TreeMap;
+import java.util.Vector;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import inet.ipaddr.IPAddress;
+
+/**
+ * Use to map the field clazz and the converter for the field clazz
+ */
+public class ConverterMap {
+
+    public static final Logger LOGGER = LoggerFactory.getLogger(ConverterMap.class);
+
+    private static final ObjectConverter objectConverter = new ObjectConverter();
+
+    private static final Map<Class<?>, ConvertValue<?>> classToConverter = new HashMap<>();
+
+    static {
+        register(new URIConverter(), URI.class);
+        register(new EnumConverter(), Enum.class);
+        register(new DateConverter(), Date.class);
+        register(new StringConverter(), String.class);
+        register(new LocalDateConverter(), LocalDate.class);
+        register(new IPAddressConverter(), IPAddress.class);
+        register(new PropertiesConverter(), Properties.class);
+        register(new LocalDateTimeConverter(), LocalDateTime.class);
+        register(new ListConverter(), List.class, ArrayList.class, LinkedList.class, Vector.class);
+        register(new MapConverter(), Map.class, HashMap.class, TreeMap.class, LinkedHashMap.class);
+        register(new BaseDataTypeConverter.CharacterConverter(), Character.class, char.class);
+        register(new BaseDataTypeConverter.ByteConverter(), Byte.class, byte.class);
+        register(new BaseDataTypeConverter.ShortConverter(), Short.class, short.class);
+        register(new BaseDataTypeConverter.IntegerConverter(), Integer.class, int.class);
+        register(new BaseDataTypeConverter.LongConverter(), Long.class, long.class);
+        register(new BaseDataTypeConverter.FloatConverter(), Float.class, float.class);
+        register(new BaseDataTypeConverter.DoubleConverter(), Double.class, double.class);
+        register(new BaseDataTypeConverter.BooleanConverter(), Boolean.class, boolean.class);
+    }
+
+    public static void register(ConvertValue<?> convertValue, Class<?>... clazzs) {
+        for (Class<?> clazz : clazzs) {
+            classToConverter.put(clazz, convertValue);
+        }
+    }
+
+    /**
+     * Get the converter for the field
+     *
+     * @param field The field to be parsed
+     * @return the converter for the field
+     */
+    public static ConvertValue<?> getFieldConverter(Field field) {
+        Class<?> clazz = field.getType();
+        ConfigFiled configFiled = field.getAnnotation(ConfigFiled.class);
+
+        Class<?> converter1 = configFiled.converter();
+        if (!converter1.equals(ConvertValue.DefaultConverter.class)) {
+            if (!classToConverter.containsKey(converter1)) {
+                try {
+                    ConvertValue<?> convertValue = (ConvertValue<?>) converter1.newInstance();
+                    register(convertValue, converter1);
+                } catch (Exception e) {
+                    LOGGER.error("The converter failed to register.", e);
+                }
+            }
+
+            return classToConverter.get(converter1);
+        }
+
+        return getClazzConverter(clazz);
+    }
+
+    /**
+     * Get the converter for the clazz
+     *
+     * @param clazz The clazz to be parsed
+     * @return the converter for the clazz
+     */
+    public static ConvertValue<?> getClazzConverter(Class<?> clazz) {
+        ConvertValue<?> converter = classToConverter.get(clazz);
+        if (Objects.isNull(converter)) {
+            if (clazz.isEnum()) {
+                converter = classToConverter.get(Enum.class);
+            } else {
+                converter = objectConverter;
+            }
+        }
+
+        return converter;
+    }
+
+    public static Map<Class<?>, ConvertValue<?>> getClassToConverter() {
+        return classToConverter;
+    }
+
+    public static ObjectConverter getObjectConverter() {
+        return objectConverter;
+    }
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/BaseDataTypeConverter.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/BaseDataTypeConverter.java
new file mode 100644
index 000000000..053580c46
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/BaseDataTypeConverter.java
@@ -0,0 +1,100 @@
+/*
+ * 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.eventmesh.common.config.convert.converter;
+
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
+
+import java.util.Objects;
+
+/**
+ * Config field conversion class for base data types
+ */
+public class BaseDataTypeConverter {
+
+    public static class CharacterConverter implements ConvertValue<Character> {
+
+        @Override
+        public Character convert(ConvertInfo convertInfo) {
+            String value = (String) convertInfo.getValue();
+
+            return value.charAt(0);
+        }
+    }
+
+    public static class BooleanConverter implements ConvertValue<Boolean> {
+
+        @Override
+        public Boolean convert(ConvertInfo convertInfo) {
+            String value = (String) convertInfo.getValue();
+            if (Objects.equals(value.length(), 1)) {
+                return Objects.equals(convertInfo.getValue(), "1") ? Boolean.TRUE : Boolean.FALSE;
+            }
+
+            return Boolean.valueOf((String) convertInfo.getValue());
+        }
+    }
+
+    public static class ByteConverter implements ConvertValue<Byte> {
+
+        @Override
+        public Byte convert(ConvertInfo convertInfo) {
+            return Byte.valueOf((String) convertInfo.getValue());
+        }
+    }
+
+    public static class ShortConverter implements ConvertValue<Short> {
+
+        @Override
+        public Short convert(ConvertInfo convertInfo) {
+            return Short.valueOf((String) convertInfo.getValue());
+        }
+    }
+
+    public static class IntegerConverter implements ConvertValue<Integer> {
+
+        @Override
+        public Integer convert(ConvertInfo convertInfo) {
+            return Integer.valueOf((String) convertInfo.getValue());
+        }
+    }
+
+    public static class LongConverter implements ConvertValue<Long> {
+
+        @Override
+        public Long convert(ConvertInfo convertInfo) {
+            return Long.valueOf((String) convertInfo.getValue());
+        }
+    }
+
+    public static class FloatConverter implements ConvertValue<Float> {
+
+        @Override
+        public Float convert(ConvertInfo convertInfo) {
+            return Float.valueOf((String) convertInfo.getValue());
+        }
+    }
+
+    public static class DoubleConverter implements ConvertValue<Double> {
+
+        @Override
+        public Double convert(ConvertInfo convertInfo) {
+            return Double.valueOf((String) convertInfo.getValue());
+        }
+    }
+}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/DateConverter.java
similarity index 54%
copy from eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/DateConverter.java
index e5edc1261..4a864eb6b 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/DateConverter.java
@@ -15,31 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.consumer;
+package org.apache.eventmesh.common.config.convert.converter;
 
-import java.util.Properties;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
 
-import org.junit.Assert;
-import org.junit.Test;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
-public class KnativeConsumerImplTest {
-
-    @Test
-    public void testSubscribe() throws Exception {
-        Properties properties = new Properties();
-        final String topic = "messages";
-        properties.put("topic", topic);
+/**
+ * Config field conversion class for Date
+ */
+public class DateConverter implements ConvertValue<Date> {
 
-        // Create a Knative consumer:
-        KnativeConsumerImpl knativeConsumer = new KnativeConsumerImpl();
+    @Override
+    public Date convert(ConvertInfo convertInfo) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
         try {
-            knativeConsumer.init(properties);
-
-            // Subscribe:
-            knativeConsumer.subscribe(properties.getProperty("topic"));
-        } catch (Exception e) {
-            Assert.fail(e.getMessage());
+            return sdf.parse((String) convertInfo.getValue());
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
         }
     }
 }
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/EnumConverter.java
similarity index 57%
copy from eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/EnumConverter.java
index 275530328..513adf101 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/EnumConverter.java
@@ -15,19 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.auth.http.basic.config;
+package org.apache.eventmesh.common.config.convert.converter;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
 
-public class AuthConfigsTest {
+/**
+ * Config field conversion class for Enum
+ */
+public class EnumConverter implements ConvertValue<Enum<?>> {
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    @Override
+    public Enum<?> convert(ConvertInfo convertInfo) {
+        Class<Enum> enumType = (Class<Enum>) convertInfo.getField().getType();
+        String name = (String) convertInfo.getValue();
 
-    @Test
-    public void testGetConfigs() {
-        AuthConfigs configs = AuthConfigs.getConfigs();
-        String password = configs.getPassword();
-        String username = configs.getUsername();
-        Assert.assertEquals(password, "password");
-        Assert.assertEquals(username, "usera");
+        return Enum.valueOf(enumType, name);
     }
-}
+}
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/IPAddressConverter.java
similarity index 54%
copy from eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/IPAddressConverter.java
index e5edc1261..ee3ebae8c 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/IPAddressConverter.java
@@ -15,31 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.consumer;
+package org.apache.eventmesh.common.config.convert.converter;
 
-import java.util.Properties;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
 
-import org.junit.Assert;
-import org.junit.Test;
+import inet.ipaddr.AddressStringException;
+import inet.ipaddr.IPAddress;
+import inet.ipaddr.IPAddressString;
 
-public class KnativeConsumerImplTest {
-
-    @Test
-    public void testSubscribe() throws Exception {
-        Properties properties = new Properties();
-        final String topic = "messages";
-        properties.put("topic", topic);
-
-        // Create a Knative consumer:
-        KnativeConsumerImpl knativeConsumer = new KnativeConsumerImpl();
+/**
+ * Config field conversion class for IPAddress
+ */
+public class IPAddressConverter implements ConvertValue<IPAddress> {
 
+    @Override
+    public IPAddress convert(ConvertInfo convertInfo) {
         try {
-            knativeConsumer.init(properties);
-
-            // Subscribe:
-            knativeConsumer.subscribe(properties.getProperty("topic"));
-        } catch (Exception e) {
-            Assert.fail(e.getMessage());
+            return new IPAddressString((String) convertInfo.getValue()).toAddress();
+        } catch (AddressStringException e) {
+            throw new RuntimeException(e);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/ListConverter.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/ListConverter.java
new file mode 100644
index 000000000..fb7a2b066
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/ListConverter.java
@@ -0,0 +1,97 @@
+/*
+ * 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.eventmesh.common.config.convert.converter;
+
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
+import org.apache.eventmesh.common.config.convert.ConverterMap;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import com.google.common.base.Splitter;
+
+/**
+ * Config field conversion class for List
+ */
+public class ListConverter implements ConvertValue<List<Object>> {
+
+    public String separator = ",";
+
+    @Override
+    public boolean canHandleNullValue() {
+        return true;
+    }
+
+    public String getSeparator() {
+        return separator;
+    }
+
+    @Override
+    public List<Object> convert(ConvertInfo convertInfo) {
+        return convert(convertInfo, this.getSeparator());
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<Object> convert(ConvertInfo convertInfo, String separator) {
+        try {
+            if (convertInfo.getValue() == null) {
+                return new ArrayList<>();
+            }
+            List<Object> list;
+            if (Objects.equals(convertInfo.getField().getType(), List.class)) {
+                list = new ArrayList<>();
+            } else {
+                list = (List<Object>) convertInfo.getField().getType().newInstance();
+            }
+
+            Type parameterizedType = ((ParameterizedType) convertInfo.getField()
+                    .getGenericType()).getActualTypeArguments()[0];
+
+            ConvertValue<?> clazzConverter = ConverterMap.getClazzConverter((Class<?>) parameterizedType);
+
+            List<String> values = Splitter.on(separator).omitEmptyStrings().trimResults()
+                    .splitToList((String) convertInfo.getValue());
+            for (String value : values) {
+                convertInfo.setValue(value);
+                list.add(clazzConverter.convert(convertInfo));
+            }
+
+            return list;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public static class ListConverterSemi extends ListConverter {
+        public String separator = ";";
+
+        public String getSeparator() {
+            return separator;
+        }
+
+        @Override
+        public List<Object> convert(ConvertInfo convertInfo) {
+            return super.convert(convertInfo, this.getSeparator());
+        }
+    }
+}
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/LocalDateConverter.java
similarity index 55%
copy from eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/LocalDateConverter.java
index 275530328..b8c19ee0e 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/LocalDateConverter.java
@@ -15,19 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.auth.http.basic.config;
+package org.apache.eventmesh.common.config.convert.converter;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
 
-public class AuthConfigsTest {
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
-    @Test
-    public void testGetConfigs() {
-        AuthConfigs configs = AuthConfigs.getConfigs();
-        String password = configs.getPassword();
-        String username = configs.getUsername();
-        Assert.assertEquals(password, "password");
-        Assert.assertEquals(username, "usera");
+/**
+ * Config field conversion class for LocalDate
+ */
+public class LocalDateConverter implements ConvertValue<LocalDate> {
+
+    @Override
+    public LocalDate convert(ConvertInfo convertInfo) {
+        String value = (String) convertInfo.getValue();
+        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        return LocalDate.parse(value, timeFormatter);
     }
 }
diff --git a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfigurationTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/LocalDateTimeConverter.java
similarity index 56%
copy from eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfigurationTest.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/LocalDateTimeConverter.java
index 3afac9f25..e2423397e 100644
--- a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfigurationTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/LocalDateTimeConverter.java
@@ -15,16 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.metrics.prometheus.config;
+package org.apache.eventmesh.common.config.convert.converter;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
 
-public class PrometheusConfigurationTest {
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 
-    @Test
-    public void getEventMeshPrometheusPort() {
-        int eventMeshPrometheusPort = PrometheusConfiguration.getEventMeshPrometheusPort();
-        Assert.assertEquals(19090, eventMeshPrometheusPort);
+/**
+ * Config field conversion class for LocalDateTime
+ */
+public class LocalDateTimeConverter implements ConvertValue<LocalDateTime> {
+
+    @Override
+    public LocalDateTime convert(ConvertInfo convertInfo) {
+        String value = (String) convertInfo.getValue();
+        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+        return LocalDateTime.parse(value, timeFormatter);
     }
 }
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/MapConverter.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/MapConverter.java
new file mode 100644
index 000000000..0902a758f
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/MapConverter.java
@@ -0,0 +1,67 @@
+/*
+ * 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.eventmesh.common.config.convert.converter;
+
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
+import org.apache.eventmesh.common.config.convert.ConverterMap;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Config field conversion class for Map
+ */
+public class MapConverter implements ConvertValue<Map<String, Object>> {
+
+    @Override
+    public boolean canHandleNullValue() {
+        return true;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Map<String, Object> convert(ConvertInfo convertInfo) {
+        try {
+            String key = convertInfo.getKey() + convertInfo.getHump();
+            Map<String, Object> map;
+            if (Objects.equals(Map.class, convertInfo.getField().getType())) {
+                map = new HashMap<>();
+            } else {
+                map = (Map<String, Object>) convertInfo.getField().getType().newInstance();
+            }
+            Type parameterizedType = ((ParameterizedType) convertInfo.getField().getGenericType()).getActualTypeArguments()[1];
+            ConvertValue<?> clazzConverter = ConverterMap.getClazzConverter((Class<?>) parameterizedType);
+
+            for (Map.Entry<Object, Object> entry : convertInfo.getProperties().entrySet()) {
+                String propertiesKey = entry.getKey().toString();
+                if (propertiesKey.startsWith(key)) {
+                    String value = entry.getValue().toString();
+                    convertInfo.setValue(value);
+                    map.put(propertiesKey.replace(key, ""), clazzConverter.convert(convertInfo));
+                }
+            }
+            return map;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/ObjectConverter.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/ObjectConverter.java
new file mode 100644
index 000000000..421707a8d
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/ObjectConverter.java
@@ -0,0 +1,212 @@
+/*
+ * 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.eventmesh.common.config.convert.converter;
+
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
+import org.apache.eventmesh.common.config.ConfigInfo;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
+import org.apache.eventmesh.common.config.convert.ConverterMap;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Objects;
+
+import org.assertj.core.util.Strings;
+
+/**
+ * Config field conversion class for Configuration class
+ */
+public class ObjectConverter implements ConvertValue<Object> {
+
+    private String prefix;
+
+    private ConvertInfo convertInfo;
+
+    private Object object;
+
+    private char hump;
+
+    private Class<?> clazz;
+
+    private void init(ConfigInfo configInfo) {
+        String prefix = configInfo.getPrefix();
+        if (Objects.nonNull(prefix)) {
+            this.prefix = prefix.endsWith(".") ? prefix : prefix + ".";
+        }
+        this.hump = Objects.equals(configInfo.getHump(), ConfigInfo.HUMP_ROD) ? '_' : '.';
+        this.clazz = convertInfo.getClazz();
+        this.convertInfo.setHump(this.hump);
+    }
+
+    @Override
+    public Object convert(ConvertInfo convertInfo) {
+        try {
+            this.convertInfo = convertInfo;
+            this.object = convertInfo.getClazz().newInstance();
+            this.init(convertInfo.getConfigInfo());
+            this.setValue();
+
+            Class<?> superclass = convertInfo.getClazz();
+            for (; ; ) {
+                superclass = superclass.getSuperclass();
+                if (Objects.equals(superclass, Object.class) || Objects.isNull(superclass)) {
+                    break;
+                }
+
+                this.clazz = superclass;
+                this.prefix = null;
+                Config[] configArray = clazz.getAnnotationsByType(Config.class);
+                if (configArray.length != 0 && !Strings.isNullOrEmpty(configArray[0].prefix())) {
+                    String prefix = configArray[0].prefix();
+                    this.prefix = prefix.endsWith(".") ? prefix : prefix + ".";
+                    this.hump = Objects.equals(configArray[0].hump(), ConfigInfo.HUMP_ROD) ? '_' : '.';
+                    this.convertInfo.setHump(this.hump);
+                }
+
+                this.setValue();
+            }
+
+            return object;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void setValue() throws Exception {
+        boolean needReload = Boolean.FALSE;
+
+        for (Field field : this.clazz.getDeclaredFields()) {
+            if (Modifier.isStatic(field.getModifiers())) {
+                continue;
+            }
+
+            boolean isAccessible = field.isAccessible();
+            try {
+                field.setAccessible(true);
+
+                ConvertInfo convertInfo = this.convertInfo;
+                ConfigFiled configFiled = field.getAnnotation(ConfigFiled.class);
+                if (Objects.isNull(configFiled)) {
+                    continue;
+                }
+
+                String key = this.buildKey(configFiled);
+                needReload = this.checkNeedReload(needReload, configFiled);
+
+                ConvertValue<?> convertValue = ConverterMap.getFieldConverter(field);
+                Object fieldValue = convertValue.processFieldValue(convertInfo, key, configFiled);
+
+                if (!checkFieldValueBefore(configFiled, key, convertValue, fieldValue)) {
+                    continue;
+                }
+                convertInfo.setValue(fieldValue);
+                convertInfo.setField(field);
+                convertInfo.setKey(key);
+                Object convertedValue = convertValue.convert(convertInfo);
+
+                if (!checkFieldValueAfter(configFiled, key, convertedValue)) {
+                    continue;
+                }
+                field.set(object, convertedValue);
+            } finally {
+                field.setAccessible(isAccessible);
+            }
+        }
+
+        reloadConfigIfNeed(needReload);
+    }
+
+    private void reloadConfigIfNeed(boolean needReload) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+        if (needReload) {
+            Method method = this.clazz.getDeclaredMethod("reload", null);
+
+            boolean isAccessible = method.isAccessible();
+            try {
+                method.setAccessible(true);
+                method.invoke(this.object, null);
+            } finally {
+                method.setAccessible(isAccessible);
+            }
+        }
+    }
+
+    private boolean checkFieldValueAfter(ConfigFiled configFiled, String key, Object convertedValue) {
+        if (Objects.isNull(convertedValue)) {
+            if (configFiled.notNull()) {
+                throw new RuntimeException(key + " can not be null!");
+            }
+
+            return false;
+        }
+
+        if (configFiled.beNumber()) {
+            if (!StringUtils.isNumeric(String.valueOf(convertedValue))) {
+                throw new RuntimeException(key + " must be number!");
+            }
+        }
+
+        return true;
+    }
+
+    private boolean checkFieldValueBefore(ConfigFiled configFiled, String key, ConvertValue<?> convertValue, Object fieldValue) {
+        if (Objects.isNull(fieldValue) && !convertValue.canHandleNullValue()) {
+            if (configFiled.notNull()) {
+                throw new RuntimeException(key + " can not be null!");
+            }
+
+            return false;
+        }
+
+        return true;
+    }
+
+    private boolean checkNeedReload(boolean needReload, ConfigFiled configFiled) {
+        if (!needReload && configFiled != null && configFiled.reload()) {
+            needReload = Boolean.TRUE;
+        }
+
+        if (needReload) {
+            try {
+                this.clazz.getDeclaredMethod("reload", null);
+            } catch (NoSuchMethodException e) {
+                throw new RuntimeException("The field needs to be reloaded, but the reload method cannot be found.", e);
+            }
+        }
+
+        return needReload;
+    }
+
+    private String buildKey(ConfigFiled configFiled) {
+        String key;
+        StringBuilder keyPrefix = new StringBuilder(Objects.isNull(prefix) ? "" : prefix);
+
+        if (configFiled == null || configFiled.field().isEmpty() && keyPrefix.length() > 0) {
+            key = keyPrefix.deleteCharAt(keyPrefix.length() - 1).toString();
+        } else {
+            key = keyPrefix.append(configFiled.field()).toString();
+        }
+
+        return key;
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/PropertiesConverter.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/PropertiesConverter.java
new file mode 100644
index 000000000..e4dbf470d
--- /dev/null
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/PropertiesConverter.java
@@ -0,0 +1,53 @@
+/*
+ * 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.eventmesh.common.config.convert.converter;
+
+import org.apache.eventmesh.common.config.ConfigFiled;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
+import org.apache.eventmesh.common.utils.PropertiesUtils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Properties;
+
+/**
+ * Config field conversion class for Properties, by prefix
+ */
+public class PropertiesConverter implements ConvertValue<Properties> {
+
+    @Override
+    public Properties convert(ConvertInfo convertInfo) {
+        try {
+            return (Properties) convertInfo.getValue();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public Object processFieldValue(ConvertInfo convertInfo, String prefix, ConfigFiled configFiled) {
+        Properties properties = convertInfo.getProperties();
+
+        if (StringUtils.isBlank(prefix)) {
+            return null;
+        }
+
+        return PropertiesUtils.getPropertiesByPrefix(properties, prefix);
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/StringConverter.java
similarity index 61%
copy from eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
copy to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/StringConverter.java
index 275530328..330775d80 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/StringConverter.java
@@ -15,19 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.auth.http.basic.config;
+package org.apache.eventmesh.common.config.convert.converter;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
 
-public class AuthConfigsTest {
+import org.apache.commons.lang3.StringUtils;
 
-    @Test
-    public void testGetConfigs() {
-        AuthConfigs configs = AuthConfigs.getConfigs();
-        String password = configs.getPassword();
-        String username = configs.getUsername();
-        Assert.assertEquals(password, "password");
-        Assert.assertEquals(username, "usera");
+/**
+ * Config field conversion class for String
+ */
+public class StringConverter  implements ConvertValue<String> {
+
+    @Override
+    public String convert(ConvertInfo convertInfo) {
+        String value = (String) convertInfo.getValue();
+
+        return StringUtils.trim(value);
     }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/java/org/apache/eventmesh/connector/rocketmq/config/ConfigurationWrapperTest.java b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/URIConverter.java
similarity index 64%
rename from eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/java/org/apache/eventmesh/connector/rocketmq/config/ConfigurationWrapperTest.java
rename to eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/URIConverter.java
index 6d25baf7c..bbf951c68 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/java/org/apache/eventmesh/connector/rocketmq/config/ConfigurationWrapperTest.java
+++ b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/convert/converter/URIConverter.java
@@ -15,16 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.rocketmq.config;
+package org.apache.eventmesh.common.config.convert.converter;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.apache.eventmesh.common.config.convert.ConvertInfo;
+import org.apache.eventmesh.common.config.convert.ConvertValue;
 
-public class ConfigurationWrapperTest {
+import java.net.URI;
 
-    @Test
-    public void getProp() {
-        String namesrcAddr = ConfigurationWrapper.getProp("eventMesh.server.rocketmq.namesrvAddr");
-        Assert.assertNotNull(namesrcAddr);
+/**
+ * Config field conversion class for URI
+ */
+public class URIConverter implements ConvertValue<URI> {
+
+    @Override
+    public URI convert(ConvertInfo convertInfo) {
+        return URI.create((String) convertInfo.getValue());
     }
-}
\ No newline at end of file
+}
diff --git a/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/CommonConfigurationTest.java b/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/CommonConfigurationTest.java
index f131a8590..755ac1d5e 100644
--- a/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/CommonConfigurationTest.java
+++ b/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/CommonConfigurationTest.java
@@ -17,7 +17,8 @@
 
 package org.apache.eventmesh.common.config;
 
-import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -25,21 +26,52 @@ import org.junit.Test;
 
 public class CommonConfigurationTest {
 
-    private CommonConfiguration configuration;
+    public CommonConfiguration config;
 
     @Before
-    public void before() {
-        String file = ConfigurationWrapperTest.class.getResource("/configuration.properties").getFile();
-        File f = new File(file);
-        ConfigurationWrapper wraper = new ConfigurationWrapper(f.getParent(), f.getName(), false);
-        configuration = new CommonConfiguration(wraper);
+    public void beforeCommonConfigurationTest() throws Exception {
+        ConfigService configService = ConfigService.getInstance();
+        configService.setRootConfig("classPath://configuration.properties");
+
+        config = configService.buildConfigInstance(CommonConfiguration.class);
+
+        testGetCommonConfiguration();
     }
 
     @Test
-    public void testInit() {
-        configuration.init();
-        Assert.assertEquals("value1", configuration.getEventMeshEnv());
-        Assert.assertEquals("value2", configuration.getEventMeshIDC());
-        Assert.assertEquals("3", configuration.getSysID());
+    public void testGetCommonConfiguration() {
+        Assert.assertEquals("env-succeed!!!", config.getEventMeshEnv());
+        Assert.assertEquals("idc-succeed!!!", config.getEventMeshIDC());
+        Assert.assertEquals("cluster-succeed!!!", config.getEventMeshCluster());
+        Assert.assertEquals("name-succeed!!!", config.getEventMeshName());
+        Assert.assertEquals("816", config.getSysID());
+        Assert.assertEquals("connector-succeed!!!", config.getEventMeshConnectorPluginType());
+        Assert.assertEquals("security-succeed!!!", config.getEventMeshSecurityPluginType());
+        Assert.assertEquals("registry-succeed!!!", config.getEventMeshRegistryPluginType());
+        Assert.assertEquals("trace-succeed!!!", config.getEventMeshTracePluginType());
+        Assert.assertEquals("hostIp-succeed!!!", config.getEventMeshServerIp());
+        Assert.assertEquals("username-succeed!!!", config.getEventMeshRegistryPluginUsername());
+        Assert.assertEquals("password-succeed!!!", config.getEventMeshRegistryPluginPassword());
+
+        Assert.assertEquals(Integer.valueOf(816), config.getEventMeshRegisterIntervalInMills());
+        Assert.assertEquals(Integer.valueOf(1816), config.getEventMeshFetchRegistryAddrInterval());
+
+        List<String> list = new ArrayList<>();
+        list.add("metrics-succeed1!!!");
+        list.add("metrics-succeed2!!!");
+        list.add("metrics-succeed3!!!");
+        Assert.assertEquals(list, config.getEventMeshMetricsPluginType());
+
+        List<String> list1 = new ArrayList<>();
+        list1.add("TCP");
+        list1.add("HTTP");
+        list1.add("GRPC");
+        Assert.assertEquals(list1, config.getEventMeshProvideServerProtocols());
+
+        Assert.assertTrue(config.isEventMeshServerSecurityEnable());
+        Assert.assertTrue(config.isEventMeshServerRegistryEnable());
+        Assert.assertTrue(config.isEventMeshServerTraceEnable());
+
+        Assert.assertEquals("eventmesh.idc-succeed!!!", config.getEventMeshWebhookOrigin());
     }
 }
diff --git a/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/ConfigServiceTest.java b/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/ConfigServiceTest.java
new file mode 100644
index 000000000..3900bef9b
--- /dev/null
+++ b/eventmesh-common/src/test/java/org/apache/eventmesh/common/config/ConfigServiceTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.eventmesh.common.config;
+
+import static org.apache.eventmesh.common.config.ConfigService.CLASS_PATH_PREFIX;
+import static org.apache.eventmesh.common.config.ConfigService.FILE_PATH_PREFIX;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ConfigServiceTest {
+
+    private final String configFileName = "configuration.properties";
+
+    @Test
+    public void getConfigByRootConfig() throws Exception {
+
+        ConfigService configService = ConfigService.getInstance();
+        configService.setRootConfig(CLASS_PATH_PREFIX + configFileName);
+
+        ConfigInfo configInfo = new ConfigInfo();
+        configInfo.setClazz(CommonConfiguration.class);
+        configInfo.setPrefix(CommonConfiguration.class.getAnnotation(Config.class).prefix());
+
+        CommonConfiguration config = configService.getConfig(configInfo);
+        assertCommonConfiguration(config);
+    }
+
+    @Test
+    public void getConfigByClassPath() throws Exception {
+        ConfigService configService = ConfigService.getInstance();
+
+        ConfigInfo configInfo = new ConfigInfo();
+        configInfo.setPath(CLASS_PATH_PREFIX + configFileName);
+        configInfo.setClazz(CommonConfiguration.class);
+        configInfo.setPrefix(CommonConfiguration.class.getAnnotation(Config.class).prefix());
+
+        CommonConfiguration config = configService.getConfig(configInfo);
+        assertCommonConfiguration(config);
+    }
+
+    @Test
+    public void getConfigByFilePath() throws Exception {
+        ConfigService configService = ConfigService.getInstance();
+        String rootPath = new File(this.getClass().getResource("/" + configFileName)
+                .getPath()).getParent();
+
+        ConfigInfo configInfo = new ConfigInfo();
+        configInfo.setPath(FILE_PATH_PREFIX + rootPath + "/" + configFileName);
+        configInfo.setClazz(CommonConfiguration.class);
+        configInfo.setPrefix(CommonConfiguration.class.getAnnotation(Config.class).prefix());
+
+        CommonConfiguration config = configService.getConfig(configInfo);
+        assertCommonConfiguration(config);
+    }
+
+    @Test
+    public void getConfigByConfigPath() throws Exception {
+        ConfigService configService = ConfigService.getInstance();
+        String configPath = new File(this.getClass().getResource("/" + configFileName)
+                .getPath()).getParent();
+
+        configService.setConfigPath(configPath);
+        ConfigInfo configInfo = new ConfigInfo();
+        configInfo.setPath("/" + configFileName);
+        configInfo.setClazz(CommonConfiguration.class);
+        configInfo.setPrefix(CommonConfiguration.class.getAnnotation(Config.class).prefix());
+
+        CommonConfiguration config = configService.getConfig(configInfo);
+        assertCommonConfiguration(config);
+    }
+
+    public void assertCommonConfiguration(CommonConfiguration config) {
+        Assert.assertEquals("env-succeed!!!", config.getEventMeshEnv());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-common/src/test/java/org/apache/eventmesh/common/utils/PropertiesUtilsTest.java b/eventmesh-common/src/test/java/org/apache/eventmesh/common/utils/PropertiesUtilsTest.java
index 11cef7653..b03098110 100644
--- a/eventmesh-common/src/test/java/org/apache/eventmesh/common/utils/PropertiesUtilsTest.java
+++ b/eventmesh-common/src/test/java/org/apache/eventmesh/common/utils/PropertiesUtilsTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.eventmesh.common.utils;
 
-import org.apache.eventmesh.common.config.ConfigurationWrapperTest;
+import org.apache.eventmesh.common.config.ConfigService;
 
 import java.util.Enumeration;
 import java.util.Properties;
@@ -44,13 +44,16 @@ public class PropertiesUtilsTest {
     }
 
     @Test
-    public void testLoadPropertiesWhenFileExist() {
+    public void testLoadPropertiesWhenFileExist() throws Exception {
         Properties properties = new Properties();
-        String path = ConfigurationWrapperTest.class.getResource("/configuration.properties").getPath();
+        ConfigService configService = ConfigService.getInstance();
+        configService.setRootConfig("classPath://configuration.properties");
+        properties = configService.getRootConfig();
+        String path = configService.getRootPath();
         try {
             PropertiesUtils.loadPropertiesWhenFileExist(properties, path);
-            Assert.assertEquals(properties.get("eventMesh.server.env").toString(), "value1");
-            Assert.assertEquals(properties.get("eventMesh.server.idc").toString(), "value2");
+            Assert.assertEquals(properties.get("eventMesh.server.env").toString(), "env-succeed!!!");
+            Assert.assertEquals(properties.get("eventMesh.server.idc").toString(), "idc-succeed!!!");
         } catch (Exception e) {
             Assert.fail();
         }
diff --git a/eventmesh-common/src/test/resources/configuration.properties b/eventmesh-common/src/test/resources/configuration.properties
index fe3f749a1..47bbb1c36 100644
--- a/eventmesh-common/src/test/resources/configuration.properties
+++ b/eventmesh-common/src/test/resources/configuration.properties
@@ -14,16 +14,25 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-eventMesh.server.env=value1
-eventMesh.server.idc=value2
-eventMesh.sysid=3
-eventMesh.server.cluster=value4
-eventMesh.server.name=value5
-eventMesh.server.hostIp=value6
-eventMesh.connector.plugin.type=rocketmq
-eventMesh.security.plugin.type=acl
-eventMesh.registry.plugin.type=namesrv
-eventMesh.registry.plugin.server-addr=127.0.0.1:8848
-eventMesh.registry.plugin.username=nacos
-eventMesh.registry.plugin.password=nacos
-eventMesh.trace.plugin=zipkin
\ No newline at end of file
+eventMesh.server.env=env-succeed!!!
+eventMesh.server.idc=idc-succeed!!!
+eventMesh.sysid=816
+eventMesh.server.cluster=cluster-succeed!!!
+eventMesh.server.name=name-succeed!!!
+eventMesh.server.hostIp=hostIp-succeed!!!
+eventMesh.connector.plugin.type=connector-succeed!!!
+eventMesh.security.plugin.type=security-succeed!!!
+eventMesh.registry.plugin.type=registry-succeed!!!
+eventMesh.trace.plugin=trace-succeed!!!
+eventMesh.server.registry.registerIntervalInMills=816
+eventMesh.server.registry.fetchRegistryAddrIntervalInMills=1816
+eventMesh.metrics.plugin=metrics-succeed1!!!,metrics-succeed2!!!,metrics-succeed3!!!
+eventMesh.registry.plugin.server-addr=server-addr-succeed1!!!
+
+eventMesh.server.security.enabled=true
+eventMesh.server.registry.enabled=true
+eventMesh.server.trace.enabled=true
+
+eventMesh.server.provide.protocols=TCP,HTTP,GRPC
+eventMesh.registry.plugin.username=username-succeed!!!
+eventMesh.registry.plugin.password=password-succeed!!!
diff --git a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/config/ClientConfiguration.java b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/config/ClientConfiguration.java
index f185fcd7c..e8b9ee658 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/config/ClientConfiguration.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/config/ClientConfiguration.java
@@ -17,39 +17,57 @@
 
 package org.apache.eventmesh.connector.kafka.config;
 
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.base.Preconditions;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
+@Config(prefix = "eventMesh.server.kafka", path = "classPath://kafka-client.properties")
 public class ClientConfiguration {
 
+    @ConfigFiled(field = "namesrvAddr", notEmpty = true)
     public String namesrvAddr = "";
+
+    @ConfigFiled(field = "username")
     public String clientUserName = "username";
+
+    @ConfigFiled(field = "password")
     public String clientPass = "password";
+
+    @ConfigFiled(field = "client.consumeThreadMin")
     public Integer consumeThreadMin = 2;
+
+    @ConfigFiled(field = "client.consumeThreadMax")
     public Integer consumeThreadMax = 2;
+
+    @ConfigFiled(field = "client.consumeThreadPoolQueueSize")
     public Integer consumeQueueSize = 10000;
+
+    @ConfigFiled(field = "client.pullBatchSize")
     public Integer pullBatchSize = 32;
+
+    @ConfigFiled(field = "client.ackwindow")
     public Integer ackWindow = 1000;
+
+    @ConfigFiled(field = "client.pubwindow")
     public Integer pubWindow = 100;
+
+    @ConfigFiled(field = "client.comsumeTimeoutInMin")
     public long consumeTimeout = 0L;
+
+    @ConfigFiled(field = "client.pollNameServerInterval")
     public Integer pollNameServerInterval = 10 * 1000;
+
+    @ConfigFiled(field = "client.heartbeatBrokerInterval")
     public Integer heartbeatBrokerInterval = 30 * 1000;
-    public Integer rebalanceInterval = 20 * 1000;
-    public String clusterName = "";
-    public String accessKey = "";
-    public String secretKey = "";
 
-    public void init() {
-        String namesrvAddrStr = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_KAFKA_SERVER_PORT);
-        Preconditions.checkState(StringUtils.isNotEmpty(namesrvAddrStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_KAFKA_SERVER_PORT));
-        namesrvAddr = StringUtils.trim(namesrvAddrStr);
-    }
+    @ConfigFiled(field = "client.rebalanceInterval")
+    public Integer rebalanceInterval = 20 * 1000;
 
-    static class ConfKeys {
+    @ConfigFiled(field = "cluster")
+    public String clusterName = "";
 
-        public static String KEYS_EVENTMESH_KAFKA_SERVER_PORT = "eventMesh.server.kafka.port";
+    @ConfigFiled(field = "accessKey")
+    public String accessKey = "";
 
-    }
+    @ConfigFiled(field = "secretKey")
+    public String secretKey = "";
 }
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/config/ConfigurationWrapper.java b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/config/ConfigurationWrapper.java
deleted file mode 100644
index ecc7d1857..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/config/ConfigurationWrapper.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.eventmesh.connector.kafka.config;
-
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.connector.kafka.common.EventMeshConstants;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
-import java.util.Properties;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@UtilityClass
-public class ConfigurationWrapper {
-    public static final Logger logger = LoggerFactory.getLogger(ConfigurationWrapper.class);
-
-    private static final Properties properties = new Properties();
-
-    static {
-        loadProperties();
-    }
-
-    public String getProp(String key) {
-        return StringUtils.isEmpty(key) ? null : properties.getProperty(key, null);
-    }
-
-    /**
-     * Load kafka properties file from classpath and conf home.
-     * The properties defined in conf home will override classpath.
-     */
-    private void loadProperties() {
-        try (InputStream resourceAsStream = ConfigurationWrapper.class.getResourceAsStream(
-            "/" + EventMeshConstants.EVENTMESH_CONF_FILE)) {
-            if (resourceAsStream != null) {
-                properties.load(resourceAsStream);
-            }
-        } catch (IOException e) {
-            logger.error("Error while loading from classpath:", e);
-            throw new RuntimeException(String.format("Load %s.properties file from classpath error", EventMeshConstants.EVENTMESH_CONF_FILE));
-        }
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + EventMeshConstants.EVENTMESH_CONF_FILE;
-            if (new File(configPath).exists()) {
-                try (FileInputStream fileInputStream = new FileInputStream(configPath);
-                     InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
-                     BufferedReader reader = new BufferedReader(inputStreamReader)) {
-                    properties.load(reader);
-                }
-            }
-        } catch (IOException e) {
-            logger.error("Error while loading from conf home: ", e);
-            throw new IllegalArgumentException(String.format("Cannot load %s file from conf", EventMeshConstants.EVENTMESH_CONF_FILE));
-        }
-    }
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/consumer/KafkaConsumerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/consumer/KafkaConsumerImpl.java
index 8743ef334..59393778d 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/consumer/KafkaConsumerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/consumer/KafkaConsumerImpl.java
@@ -20,6 +20,8 @@ package org.apache.eventmesh.connector.kafka.consumer;
 import org.apache.eventmesh.api.AbstractContext;
 import org.apache.eventmesh.api.EventListener;
 import org.apache.eventmesh.api.consumer.Consumer;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.connector.kafka.config.ClientConfiguration;
 
 import org.apache.kafka.clients.consumer.ConsumerConfig;
 
@@ -28,15 +30,22 @@ import java.util.Properties;
 
 import io.cloudevents.CloudEvent;
 
+@Config(field = "clientConfiguration")
 public class KafkaConsumerImpl implements Consumer {
     private ConsumerImpl consumer;
 
+    /**
+     * Unified configuration class corresponding to kafka-client.properties
+     */
+    private ClientConfiguration clientConfiguration;
+
     @Override
     public synchronized void init(Properties props) throws Exception {
+        String namesrvAddr = clientConfiguration.namesrvAddr;
         String consumerGroup = props.getProperty("consumerGroup");
-        // Other config props
-        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
 
+        // Other config props
+        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, namesrvAddr);
         props.put(ConsumerConfig.GROUP_ID_CONFIG, consumerGroup);
         consumer = new ConsumerImpl(props);
     }
@@ -81,4 +90,7 @@ public class KafkaConsumerImpl implements Consumer {
         consumer.shutdown();
     }
 
+    public ClientConfiguration getClientConfiguration() {
+        return this.clientConfiguration;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/producer/KafkaProducerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/producer/KafkaProducerImpl.java
index f5c1355b2..49bccf42f 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/producer/KafkaProducerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/main/java/org/apache/eventmesh/connector/kafka/producer/KafkaProducerImpl.java
@@ -20,6 +20,8 @@ package org.apache.eventmesh.connector.kafka.producer;
 import org.apache.eventmesh.api.RequestReplyCallback;
 import org.apache.eventmesh.api.SendCallback;
 import org.apache.eventmesh.api.producer.Producer;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.connector.kafka.config.ClientConfiguration;
 
 import org.apache.kafka.clients.producer.ProducerConfig;
 
@@ -27,13 +29,21 @@ import java.util.Properties;
 
 import io.cloudevents.CloudEvent;
 
+@Config(field = "clientConfiguration")
 public class KafkaProducerImpl implements Producer {
 
     private ProducerImpl producer;
 
+    /**
+     * Unified configuration class corresponding to kafka-client.properties
+     */
+    private ClientConfiguration clientConfiguration;
+
     @Override
     public synchronized void init(Properties keyValue) {
-        keyValue.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
+        String namesrvAddr = clientConfiguration.namesrvAddr;
+
+        keyValue.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, namesrvAddr);
         this.producer = new ProducerImpl(keyValue);
     }
 
@@ -87,4 +97,8 @@ public class KafkaProducerImpl implements Producer {
     public void sendOneway(CloudEvent message) {
         producer.sendOneway(message);
     }
+
+    public ClientConfiguration getClientConfiguration() {
+        return this.clientConfiguration;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/test/java/org/apache/eventmesh/connector/kafka/config/ClientConfigurationTest.java b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/test/java/org/apache/eventmesh/connector/kafka/config/ClientConfigurationTest.java
new file mode 100644
index 000000000..24eacc325
--- /dev/null
+++ b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/test/java/org/apache/eventmesh/connector/kafka/config/ClientConfigurationTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.eventmesh.connector.kafka.config;
+
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
+import org.apache.eventmesh.connector.kafka.consumer.KafkaConsumerImpl;
+import org.apache.eventmesh.connector.kafka.producer.KafkaProducerImpl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * test config of Kafka SPI Impl
+ */
+public class ClientConfigurationTest {
+
+    /**
+     * test KafkaConsumerImpl config init when ConnectorPluginFactory get it
+     */
+    @Test
+    public void getConfigWhenKafkaConsumerImplInit() {
+        KafkaConsumerImpl consumer =
+                (KafkaConsumerImpl) ConnectorPluginFactory.getMeshMQPushConsumer("kafka");
+
+        ClientConfiguration config = consumer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    /**
+     * test KafkaProducerImpl config init when ConnectorPluginFactory get it
+     */
+    @Test
+    public void getConfigWhenKafkaProducerImplInit() {
+        KafkaProducerImpl producer =
+                (KafkaProducerImpl) ConnectorPluginFactory.getMeshMQProducer("kafka");
+
+        ClientConfiguration config = producer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    private void assertConfig(ClientConfiguration config) {
+        Assert.assertEquals(config.namesrvAddr, "127.0.0.1:9092;127.0.0.1:9092");
+        Assert.assertEquals(config.clientUserName, "username-succeed!!!");
+        Assert.assertEquals(config.clientPass, "password-succeed!!!");
+        Assert.assertEquals(config.consumeThreadMin, Integer.valueOf(1816));
+        Assert.assertEquals(config.consumeThreadMax, Integer.valueOf(2816));
+        Assert.assertEquals(config.consumeQueueSize, Integer.valueOf(3816));
+        Assert.assertEquals(config.pullBatchSize, Integer.valueOf(4816));
+        Assert.assertEquals(config.ackWindow, Integer.valueOf(5816));
+        Assert.assertEquals(config.pubWindow, Integer.valueOf(6816));
+        Assert.assertEquals(config.consumeTimeout, 7816);
+        Assert.assertEquals(config.pollNameServerInterval, Integer.valueOf(8816));
+        Assert.assertEquals(config.heartbeatBrokerInterval, Integer.valueOf(9816));
+        Assert.assertEquals(config.rebalanceInterval, Integer.valueOf(11816));
+        Assert.assertEquals(config.clusterName, "cluster-succeed!!!");
+        Assert.assertEquals(config.accessKey, "accessKey-succeed!!!");
+        Assert.assertEquals(config.secretKey, "secretKey-succeed!!!");
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/test/resources/kafka-client.properties b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/test/resources/kafka-client.properties
index 7afdf4c40..3b0c217e0 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-kafka/src/test/resources/kafka-client.properties
+++ b/eventmesh-connector-plugin/eventmesh-connector-kafka/src/test/resources/kafka-client.properties
@@ -16,3 +16,33 @@
 #
 #######################kafka-client##################
 eventMesh.server.kafka.namesrvAddr=127.0.0.1:9092;127.0.0.1:9092
+eventMesh.server.kafka.username=username-succeed!!!
+eventMesh.server.kafka.password=password-succeed!!!
+eventMesh.server.kafka.client.consumeThreadMin=1816
+eventMesh.server.kafka.client.consumeThreadMax=2816
+eventMesh.server.kafka.client.consumeThreadPoolQueueSize=3816
+eventMesh.server.kafka.client.pullBatchSize=4816
+eventMesh.server.kafka.client.ackwindow=5816
+eventMesh.server.kafka.client.pubwindow=6816
+eventMesh.server.kafka.client.comsumeTimeoutInMin=7816
+eventMesh.server.kafka.client.pollNameServerInterval=8816
+eventMesh.server.kafka.client.heartbeatBrokerInterval=9816
+eventMesh.server.kafka.client.rebalanceInterval=11816
+eventMesh.server.kafka.cluster=cluster-succeed!!!
+eventMesh.server.kafka.accessKey=accessKey-succeed!!!
+eventMesh.server.kafka.secretKey=secretKey-succeed!!!
+eventMesh.server.kafka.username=username-succeed!!!
+eventMesh.server.kafka.password=password-succeed!!!
+eventMesh.server.kafka.client.consumeThreadMin=1816
+eventMesh.server.kafka.client.consumeThreadMax=2816
+eventMesh.server.kafka.client.consumeThreadPoolQueueSize=3816
+eventMesh.server.kafka.client.pullBatchSize=4816
+eventMesh.server.kafka.client.ackwindow=5816
+eventMesh.server.kafka.client.pubwindow=6816
+eventMesh.server.kafka.client.comsumeTimeoutInMin=7816
+eventMesh.server.kafka.client.pollNameServerInterval=8816
+eventMesh.server.kafka.client.heartbeatBrokerInterval=9816
+eventMesh.server.kafka.client.rebalanceInterval=11816
+eventMesh.server.kafka.cluster=cluster-succeed!!!
+eventMesh.server.kafka.accessKey=accessKey-succeed!!!
+eventMesh.server.kafka.secretKey=secretKey-succeed!!!
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/config/ClientConfiguration.java b/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/config/ClientConfiguration.java
index 56855b813..6e741cf95 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/config/ClientConfiguration.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/config/ClientConfiguration.java
@@ -17,39 +17,35 @@
 
 package org.apache.eventmesh.connector.knative.config;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
+import org.apache.eventmesh.common.config.convert.converter.ListConverter.ListConverterSemi;
 
-import com.google.common.base.Preconditions;
-
-public class ClientConfiguration {
-
-
-    private transient String emurl;
-
-    private transient String serviceAddr;
+import java.util.List;
 
+import lombok.Data;
 
-    public String getEmurl() {
-        return emurl;
-    }
-
-    public String getServiceAddr() {
-        return serviceAddr;
-    }
+@Data
+@Config(prefix = "eventMesh.server.knative", path = "classPath://knative-client.properties")
+public class ClientConfiguration {
 
-    public void init() {
-        String serviceAddrStr = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_KNATIVE_SERVICE_ADDR);
-        Preconditions.checkState(StringUtils.isNotEmpty(serviceAddrStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_KNATIVE_SERVICE_ADDR));
-        serviceAddr = StringUtils.trim(serviceAddrStr);
-        String[] temp = serviceAddr.split(";");
-        emurl = temp[0];
-        serviceAddr = temp[1];
-    }
+    @ConfigFiled(field = "service", converter = ListConverterSemi.class)
+    public List<String> service;
 
-    static class ConfKeys {
+    /**
+     * In keeping with the old way of configuration parsing, the value is taken from the service field [0]
+     */
+    @ConfigFiled(reload = true)
+    public String emurl = "";
 
-        public static final String KEYS_EVENTMESH_KNATIVE_SERVICE_ADDR = "eventMesh.server.knative.service";
+    /**
+     * In keeping with the old way of configuration parsing, the value is taken from the service field [1]
+     */
+    @ConfigFiled(reload = true)
+    public String serviceAddr = "";
 
+    public void reload() {
+        emurl = this.service.get(0);
+        serviceAddr = this.service.get(1);
     }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/config/ConfigurationWrapper.java b/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/config/ConfigurationWrapper.java
deleted file mode 100644
index a6433e2cd..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/config/ConfigurationWrapper.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.eventmesh.connector.knative.config;
-
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.common.utils.PropertiesUtils;
-import org.apache.eventmesh.connector.knative.common.EventMeshConstants;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.Properties;
-
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@UtilityClass
-public class ConfigurationWrapper {
-
-    private static final Properties properties = new Properties();
-
-    static {
-        loadProperties();
-    }
-
-    public String getProp(String key) {
-        return StringUtils.isEmpty(key) ? null : properties.getProperty(key, null);
-    }
-
-    /**
-     * Load Knative properties file from classpath and conf home.
-     * The properties defined in conf home will override classpath.
-     */
-    private void loadProperties() {
-        try (InputStream resourceAsStream = ConfigurationWrapper.class.getResourceAsStream(
-                "/" + EventMeshConstants.EVENTMESH_CONF_FILE)) {
-            if (resourceAsStream != null) {
-                properties.load(resourceAsStream);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(String.format("Load %s.properties file from classpath error", EventMeshConstants.EVENTMESH_CONF_FILE), e);
-        }
-
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + EventMeshConstants.EVENTMESH_CONF_FILE;
-            if (new File(configPath).exists()) {
-                PropertiesUtils.loadPropertiesWhenFileExist(properties, configPath, StandardCharsets.UTF_8);
-            }
-        } catch (IOException e) {
-            throw new IllegalArgumentException(String.format("Cannot load %s file from conf", EventMeshConstants.EVENTMESH_CONF_FILE), e);
-        }
-    }
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImpl.java
index 56062779c..cc41ae448 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImpl.java
@@ -20,6 +20,7 @@ package org.apache.eventmesh.connector.knative.consumer;
 import org.apache.eventmesh.api.AbstractContext;
 import org.apache.eventmesh.api.EventListener;
 import org.apache.eventmesh.api.consumer.Consumer;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.knative.config.ClientConfiguration;
 
 import java.util.List;
@@ -30,6 +31,7 @@ import org.slf4j.LoggerFactory;
 
 import io.cloudevents.CloudEvent;
 
+@Config(field = "clientConfiguration")
 public class KnativeConsumerImpl implements Consumer {
 
     private static final Logger LOG = LoggerFactory.getLogger(KnativeConsumerImpl.class);
@@ -37,12 +39,16 @@ public class KnativeConsumerImpl implements Consumer {
     private transient PullConsumerImpl pullConsumer;
 
 
+    /**
+     * Unified configuration class corresponding to knative-client.properties
+     */
+    private ClientConfiguration clientConfiguration;
+
+    private static final Logger logger = LoggerFactory.getLogger(KnativeConsumerImpl.class);
 
     @Override
     public synchronized void init(Properties properties) throws Exception {
         // Load parameters from properties file:
-        final ClientConfiguration clientConfiguration = new ClientConfiguration();
-        clientConfiguration.init();
         properties.put("emUrl", clientConfiguration.getEmurl());
         properties.put("serviceAddr", clientConfiguration.getServiceAddr());
 
@@ -92,4 +98,8 @@ public class KnativeConsumerImpl implements Consumer {
     public void shutdown() {
         pullConsumer.shutdown();
     }
+
+    public ClientConfiguration getClientConfiguration() {
+        return this.clientConfiguration;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/producer/KnativeProducerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/producer/KnativeProducerImpl.java
index cda05dff0..3e3c5f076 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/producer/KnativeProducerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-knative/src/main/java/org/apache/eventmesh/connector/knative/producer/KnativeProducerImpl.java
@@ -21,22 +21,26 @@ import org.apache.eventmesh.api.RequestReplyCallback;
 import org.apache.eventmesh.api.SendCallback;
 import org.apache.eventmesh.api.exception.ConnectorRuntimeException;
 import org.apache.eventmesh.api.producer.Producer;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.knative.config.ClientConfiguration;
 
 import java.util.Properties;
 
 import io.cloudevents.CloudEvent;
 
+@Config(field = "clientConfiguration")
 public class KnativeProducerImpl implements Producer {
 
     private transient ProducerImpl producer;
 
+    /**
+     * Unified configuration class corresponding to knative-client.properties
+     */
+    private ClientConfiguration clientConfiguration;
+
     @Override
     public synchronized void init(Properties properties) throws Exception {
         // Load parameters from properties file:
-        final ClientConfiguration clientConfiguration = new ClientConfiguration();
-        clientConfiguration.init();
-
         properties.put("url", clientConfiguration.getServiceAddr());
         producer = new ProducerImpl(properties);
     }
@@ -90,4 +94,8 @@ public class KnativeProducerImpl implements Producer {
     public void setExtFields() {
         throw new ConnectorRuntimeException("SetExtFields is not supported");
     }
+
+    public ClientConfiguration getClientConfiguration() {
+        return this.clientConfiguration;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/config/ClientConfigurationTest.java b/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/config/ClientConfigurationTest.java
new file mode 100644
index 000000000..aa13b3a60
--- /dev/null
+++ b/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/config/ClientConfigurationTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.eventmesh.connector.knative.config;
+
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
+import org.apache.eventmesh.connector.knative.consumer.KnativeConsumerImpl;
+import org.apache.eventmesh.connector.knative.producer.KnativeProducerImpl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ClientConfigurationTest {
+
+    @Test
+    public void getConfigWhenKnativeConsumerInit() {
+        KnativeConsumerImpl consumer =
+                (KnativeConsumerImpl) ConnectorPluginFactory.getMeshMQPushConsumer("knative");
+
+        ClientConfiguration config = consumer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    @Test
+    public void getConfigWhenKnativeProducerInit() {
+        KnativeProducerImpl producer =
+                (KnativeProducerImpl) ConnectorPluginFactory.getMeshMQProducer("knative");
+
+        ClientConfiguration config = producer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    private void assertConfig(ClientConfiguration config) {
+        Assert.assertEquals(config.getEmurl(), "127.0.0.1");
+        Assert.assertEquals(config.getServiceAddr(), "cloudevents-player.default.127.0.0.1.sslip.io");
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java b/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
index e5edc1261..c5690fb75 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.eventmesh.connector.knative.consumer;
 
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
+
 import java.util.Properties;
 
 import org.junit.Assert;
@@ -31,7 +33,8 @@ public class KnativeConsumerImplTest {
         properties.put("topic", topic);
 
         // Create a Knative consumer:
-        KnativeConsumerImpl knativeConsumer = new KnativeConsumerImpl();
+        KnativeConsumerImpl knativeConsumer =
+                (KnativeConsumerImpl) ConnectorPluginFactory.getMeshMQPushConsumer("knative");
 
         try {
             knativeConsumer.init(properties);
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/producer/KnativeProducerImplTest.java b/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/producer/KnativeProducerImplTest.java
index 85c459beb..a4ca490aa 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/producer/KnativeProducerImplTest.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/producer/KnativeProducerImplTest.java
@@ -20,6 +20,7 @@ package org.apache.eventmesh.connector.knative.producer;
 import org.apache.eventmesh.api.SendCallback;
 import org.apache.eventmesh.api.SendResult;
 import org.apache.eventmesh.api.exception.OnExceptionContext;
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
 import org.apache.eventmesh.connector.knative.cloudevent.KnativeMessageFactory;
 import org.apache.eventmesh.connector.knative.cloudevent.impl.KnativeHeaders;
 
@@ -42,7 +43,8 @@ public class KnativeProducerImplTest {
         properties.put("data", "Hello Knative from EventMesh!");
 
         // Create a Knative producer:
-        KnativeProducerImpl knativehProducer = new KnativeProducerImpl();
+        KnativeProducerImpl knativehProducer =
+                (KnativeProducerImpl) ConnectorPluginFactory.getMeshMQProducer("knative");
 
         try {
             knativehProducer.init(properties);
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties b/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/resources/knative-client.properties
similarity index 84%
copy from eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties
copy to eventmesh-connector-plugin/eventmesh-connector-knative/src/test/resources/knative-client.properties
index 1261f30e2..8fec1c430 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties
+++ b/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/resources/knative-client.properties
@@ -14,5 +14,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-#######################rocketmq-client##################
-eventMesh.server.rocketmq.namesrvAddr=127.0.0.1:9876;127.0.0.1:9876
+#######################knative-client##################
+eventMesh.server.knative.service=127.0.0.1;cloudevents-player.default.127.0.0.1.sslip.io
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/PravegaConsumerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/PravegaConsumerImpl.java
index 5c06f6d4a..5415d328a 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/PravegaConsumerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/PravegaConsumerImpl.java
@@ -20,7 +20,9 @@ package org.apache.eventmesh.connector.pravega;
 import org.apache.eventmesh.api.AbstractContext;
 import org.apache.eventmesh.api.EventListener;
 import org.apache.eventmesh.api.consumer.Consumer;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.pravega.client.PravegaClient;
+import org.apache.eventmesh.connector.pravega.config.PravegaConnectorConfig;
 import org.apache.eventmesh.connector.pravega.exception.PravegaConnectorException;
 
 import java.util.List;
@@ -32,9 +34,15 @@ import io.cloudevents.CloudEvent;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
+@Config(field = "pravegaConnectorConfig")
 public class PravegaConsumerImpl implements Consumer {
     private static final AtomicBoolean started = new AtomicBoolean(false);
 
+    /**
+     * Unified configuration class corresponding to pravega-connector.properties
+     */
+    private PravegaConnectorConfig pravegaConnectorConfig;
+
     private boolean isBroadcast;
     private String instanceName;
     private String consumerGroup;
@@ -46,7 +54,8 @@ public class PravegaConsumerImpl implements Consumer {
         isBroadcast = Boolean.parseBoolean(keyValue.getProperty("isBroadcast", "false"));
         instanceName = keyValue.getProperty("instanceName", "");
         consumerGroup = keyValue.getProperty("consumerGroup", "");
-        client = PravegaClient.getInstance();
+
+        client = PravegaClient.getInstance(pravegaConnectorConfig);
     }
 
     @Override
@@ -92,4 +101,8 @@ public class PravegaConsumerImpl implements Consumer {
     public void registerEventListener(EventListener listener) {
         this.eventListener = listener;
     }
+
+    public PravegaConnectorConfig getClientConfiguration() {
+        return this.pravegaConnectorConfig;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/PravegaProducerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/PravegaProducerImpl.java
index a5aa1d290..58bd0b31b 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/PravegaProducerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/PravegaProducerImpl.java
@@ -23,7 +23,9 @@ import org.apache.eventmesh.api.SendResult;
 import org.apache.eventmesh.api.exception.ConnectorRuntimeException;
 import org.apache.eventmesh.api.exception.OnExceptionContext;
 import org.apache.eventmesh.api.producer.Producer;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.pravega.client.PravegaClient;
+import org.apache.eventmesh.connector.pravega.config.PravegaConnectorConfig;
 import org.apache.eventmesh.connector.pravega.exception.PravegaConnectorException;
 
 import java.util.Properties;
@@ -34,13 +36,19 @@ import io.cloudevents.CloudEvent;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
+@Config(field = "pravegaConnectorConfig")
 public class PravegaProducerImpl implements Producer {
     private final AtomicBoolean started = new AtomicBoolean(false);
     private PravegaClient client;
 
+    /**
+     * Unified configuration class corresponding to pravega-connector.properties
+     */
+    private PravegaConnectorConfig pravegaConnectorConfig;
+
     @Override
     public void init(Properties properties) throws Exception {
-        client = PravegaClient.getInstance();
+        client = PravegaClient.getInstance(pravegaConnectorConfig);
     }
 
     @Override
@@ -105,4 +113,8 @@ public class PravegaProducerImpl implements Producer {
     public void setExtFields() {
 
     }
+
+    public PravegaConnectorConfig getClientConfiguration() {
+        return this.pravegaConnectorConfig;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/client/PravegaClient.java b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/client/PravegaClient.java
index 5fd986320..ad353abca 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/client/PravegaClient.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/client/PravegaClient.java
@@ -57,6 +57,18 @@ public class PravegaClient {
 
     private static PravegaClient instance;
 
+    public static PravegaClient getInstance() {
+        return instance;
+    }
+
+    public static PravegaClient getInstance(PravegaConnectorConfig config) {
+        if (instance == null) {
+            instance = new PravegaClient(config);
+        }
+
+        return instance;
+    }
+
     private PravegaClient(PravegaConnectorConfig config) {
         this.config = config;
         streamManager = StreamManager.create(config.getControllerURI());
@@ -72,22 +84,15 @@ public class PravegaClient {
         readerGroupManager = ReaderGroupManager.withScope(config.getScope(), clientConfig);
     }
 
-    public static PravegaClient getInstance() {
-        if (instance == null) {
-            instance = new PravegaClient(PravegaConnectorConfig.getInstance());
-        }
-        return instance;
-    }
-
     protected static PravegaClient getNewInstance(PravegaConnectorConfig config) {
         return new PravegaClient(config);
     }
 
     public void start() {
         if (createScope()) {
-            log.info("Create Pravega scope[{}] success.", PravegaConnectorConfig.getInstance().getScope());
+            log.info("Create Pravega scope[{}] success.", config.getScope());
         } else {
-            log.info("Pravega scope[{}] has already been created.", PravegaConnectorConfig.getInstance().getScope());
+            log.info("Pravega scope[{}] has already been created.", config.getScope());
         }
     }
 
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfig.java b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfig.java
index 2954db4c1..b7c5ffbac 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfig.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfig.java
@@ -17,6 +17,9 @@
 
 package org.apache.eventmesh.connector.pravega.config;
 
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
+
 import org.apache.commons.lang3.StringUtils;
 
 import java.net.URI;
@@ -26,87 +29,38 @@ import lombok.Setter;
 
 @Getter
 @Setter
+@Config(prefix = "eventMesh.server.pravega", path = "classPath://pravega-connector.properties")
 public class PravegaConnectorConfig {
-    public static final String EVENTMESH_PRAVEGA_CONTROLLER_URI = "eventMesh.server.pravega.controller.uri";
-    public static final String EVENTMESH_PRAVEGA_SCOPE = "eventMesh.server.pravega.scope";
-    public static final String EVENTMESH_PRAVEGA_AUTH_ENABLED = "eventMesh.server.pravega.authEnabled";
-    public static final String EVENTMESH_PRAVEGA_USERNAME = "eventMesh.server.pravega.username";
-    public static final String EVENTMESH_PRAVEGA_PASSWORD = "eventMesh.server.pravega.password";
-    public static final String EVENTMESH_PRAVEGA_TLS_ENABLED = "eventMesh.server.pravega.tlsEnabled";
-    public static final String EVENTMESH_PRAVEGA_TRUSTSTORE = "eventMesh.server.pravega.truststore";
-    public static final String EVENTMESH_PRAVEGA_CLIENTPOOL_SIZE = "eventMesh.server.pravega.clientPool.size";
-    public static final String EVENTMESH_PRAVEGA_QUEUE_SIZE = "eventMesh.server.pravega.queue.size";
 
+    @ConfigFiled(field = "controller.uri")
     private URI controllerURI = URI.create("tcp://127.0.0.1:9090");
-    private String scope = "eventmesh-pravega";
-    private int clientPoolSize = 8;
-    private int queueSize = 512;
-    private boolean authEnabled = false;
-    private String username = "";
-    private String password = "";
-    private boolean tlsEnable = false;
-    private String truststore = "";
-
-    private static PravegaConnectorConfig INSTANCE = null;
-
-    private PravegaConnectorConfig() {
-    }
-
-    public static synchronized PravegaConnectorConfig getInstance() {
-        if (INSTANCE == null) {
-            INSTANCE = new PravegaConnectorConfig();
-            INSTANCE.init();
-        }
-        return INSTANCE;
-    }
-
-    private void init() {
-        String controllerURIStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_CONTROLLER_URI);
-        if (StringUtils.isNotBlank(controllerURIStr)) {
-            controllerURI = URI.create(StringUtils.trim(controllerURIStr));
-        }
 
-        String scopeStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_SCOPE);
-        if (StringUtils.isNotBlank(scopeStr)) {
-            scope = StringUtils.trim(scopeStr);
-        }
+    @ConfigFiled(field = "scope")
+    private String scope = "eventmesh-pravega";
 
-        String authEnableStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_AUTH_ENABLED);
-        if (StringUtils.isNotBlank(authEnableStr)) {
-            authEnabled = Boolean.parseBoolean(StringUtils.trim(authEnableStr));
-        }
+    @ConfigFiled(field = "clientPool.size")
+    private int clientPoolSize = 8;
 
-        String usernameStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_USERNAME);
-        if (StringUtils.isNotBlank(usernameStr)) {
-            username = StringUtils.trim(usernameStr);
-        }
+    @ConfigFiled(field = "queue.size")
+    private int queueSize = 512;
 
-        String passwordStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_PASSWORD);
-        if (StringUtils.isNotBlank(passwordStr)) {
-            password = StringUtils.trim(passwordStr);
-        }
+    @ConfigFiled(field = "authEnabled", reload = true)
+    private boolean authEnabled = false;
 
-        String tlsEnableStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_TLS_ENABLED);
-        if (StringUtils.isNotBlank(tlsEnableStr)) {
-            tlsEnable = Boolean.parseBoolean(StringUtils.trim(tlsEnableStr));
-        }
+    @ConfigFiled(field = "username")
+    private String username = "";
 
-        String truststoreStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_TRUSTSTORE);
-        if (StringUtils.isNotBlank(truststoreStr)) {
-            truststore = StringUtils.trim(truststoreStr);
-        }
+    @ConfigFiled(field = "password")
+    private String password = "";
 
-        String clientPoolSizeStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_CLIENTPOOL_SIZE);
-        if (StringUtils.isNumeric(clientPoolSizeStr)) {
-            clientPoolSize = Integer.parseInt(clientPoolSizeStr);
-        }
+    @ConfigFiled(field = "tlsEnabled")
+    private boolean tlsEnable = false;
 
-        String queueSizeStr = PravegaConnectorConfigWrapper.getProp(EVENTMESH_PRAVEGA_QUEUE_SIZE);
-        if (StringUtils.isNumeric(queueSizeStr)) {
-            queueSize = Integer.parseInt(queueSizeStr);
-        }
+    @ConfigFiled(field = "truststore")
+    private String truststore = "";
 
-        if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) {
+    public void reload() {
+        if (!authEnabled && StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) {
             authEnabled = true;
         }
     }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfigWrapper.java b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfigWrapper.java
deleted file mode 100644
index b3553f921..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/main/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfigWrapper.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.eventmesh.connector.pravega.config;
-
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.common.utils.PropertiesUtils;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@UtilityClass
-public class PravegaConnectorConfigWrapper {
-    public static final String PRAVEGA_CONF_FILE = "pravega-connector.properties";
-
-    private static final Properties properties = new Properties();
-
-    static {
-        loadProperties();
-    }
-
-    public String getProp(String key) {
-        return StringUtils.isEmpty(key) ? null : properties.getProperty(key, null);
-    }
-
-    /**
-     * Load Pravega properties file from classpath and conf home.
-     * The properties defined in conf home will override classpath.
-     */
-    private void loadProperties() {
-        String path = File.separator + PRAVEGA_CONF_FILE;
-        try (InputStream resourceAsStream = PravegaConnectorConfigWrapper.class.getResourceAsStream(path)) {
-            if (resourceAsStream != null) {
-                properties.load(resourceAsStream);
-            }
-        } catch (IOException e) {
-            log.error("Load {}.properties file from classpath error", path);
-            throw new RuntimeException(String.format("Load %s.properties file from classpath error", PRAVEGA_CONF_FILE));
-        }
-        String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + PRAVEGA_CONF_FILE;
-        try {
-            if (new File(configPath).exists()) {
-                PropertiesUtils.loadPropertiesWhenFileExist(properties, configPath);
-            }
-        } catch (IOException e) {
-            log.error("Cannot load {} file from conf", configPath);
-            throw new IllegalArgumentException(String.format("Cannot load %s file from conf", PRAVEGA_CONF_FILE));
-        }
-    }
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/java/org/apache/eventmesh/connector/pravega/client/PravegaClientTest.java b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/java/org/apache/eventmesh/connector/pravega/client/PravegaClientTest.java
index c1e5da5b4..f4673508a 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/java/org/apache/eventmesh/connector/pravega/client/PravegaClientTest.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/java/org/apache/eventmesh/connector/pravega/client/PravegaClientTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.fail;
 
 import org.apache.eventmesh.api.AsyncConsumeContext;
 import org.apache.eventmesh.api.EventListener;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.connector.pravega.config.PravegaConnectorConfig;
 
 import java.net.URI;
@@ -145,10 +146,12 @@ public class PravegaClientTest {
         assertTrue(pravegaClient.checkTopicExist("test1"));
     }
 
-    private PravegaClient getNewPravegaClient() {
-        config = PravegaConnectorConfig.getInstance();
-        config.setControllerURI(controllerURI);
-        return PravegaClient.getNewInstance(config);
+    public PravegaClient getNewPravegaClient() {
+        ConfigService configService = ConfigService.getInstance();
+
+        this.config = configService.buildConfigInstance(PravegaConnectorConfig.class);
+        this.config.setControllerURI(controllerURI);
+        return PravegaClient.getNewInstance(this.config);
     }
 
     private CloudEvent createCloudEvent() {
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfigTest.java b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfigTest.java
index ef638a638..4256f8caf 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfigTest.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/java/org/apache/eventmesh/connector/pravega/config/PravegaConnectorConfigTest.java
@@ -17,65 +17,44 @@
 
 package org.apache.eventmesh.connector.pravega.config;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
+import org.apache.eventmesh.connector.pravega.PravegaConsumerImpl;
+import org.apache.eventmesh.connector.pravega.PravegaProducerImpl;
 
 import java.net.URI;
 
-import org.junit.BeforeClass;
+import org.junit.Assert;
 import org.junit.Test;
 
 public class PravegaConnectorConfigTest {
 
-    private static PravegaConnectorConfig config;
-
-    @BeforeClass
-    public static void init() {
-        config = PravegaConnectorConfig.getInstance();
-    }
-
-    @Test
-    public void getControllerURI() {
-        assertEquals(URI.create("tcp://127.0.0.1:9090"), config.getControllerURI());
-    }
-
-    @Test
-    public void getScope() {
-        assertEquals("eventmesh-pravega", config.getScope());
-    }
-
-    @Test
-    public void isAuthEnabled() {
-        assertFalse(config.isAuthEnabled());
-    }
-
-    @Test
-    public void getUsername() {
-        assertEquals("", config.getUsername());
-    }
-
     @Test
-    public void getPassword() {
-        assertEquals("", config.getPassword());
-    }
+    public void getConfigWhenPravegaConsumerInit() {
+        PravegaConsumerImpl consumer =
+                (PravegaConsumerImpl) ConnectorPluginFactory.getMeshMQPushConsumer("pravega");
 
-    @Test
-    public void isTslEnabled() {
-        assertFalse(config.isTlsEnable());
+        PravegaConnectorConfig config = consumer.getClientConfiguration();
+        assertConfig(config);
     }
 
     @Test
-    public void getTruststore() {
-        assertEquals("", config.getTruststore());
-    }
+    public void getConfigWhenPravegaProducerInit() {
+        PravegaProducerImpl producer =
+                (PravegaProducerImpl) ConnectorPluginFactory.getMeshMQProducer("pravega");
 
-    @Test
-    public void getClientPoolSize() {
-        assertEquals(8, config.getClientPoolSize());
+        PravegaConnectorConfig config = producer.getClientConfiguration();
+        assertConfig(config);
     }
 
-    @Test
-    public void getQueueSize() {
-        assertEquals(512, config.getQueueSize());
+    private void assertConfig(PravegaConnectorConfig config) {
+        Assert.assertEquals(config.getControllerURI(), URI.create("tcp://127.0.0.1:816"));
+        Assert.assertEquals(config.getScope(), "scope-success!!!");
+        Assert.assertTrue(config.isAuthEnabled());
+        Assert.assertEquals(config.getUsername(), "username-success!!!");
+        Assert.assertEquals(config.getPassword(), "password-success!!!");
+        Assert.assertTrue(config.isTlsEnable());
+        Assert.assertEquals(config.getTruststore(), "truststore-success!!!");
+        Assert.assertEquals(config.getClientPoolSize(), 816);
+        Assert.assertEquals(config.getQueueSize(), 1816);
     }
 }
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/resources/pravega-connector.properties b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/resources/pravega-connector.properties
index 25fa6f0af..5bb5e5490 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/resources/pravega-connector.properties
+++ b/eventmesh-connector-plugin/eventmesh-connector-pravega/src/test/resources/pravega-connector.properties
@@ -15,12 +15,12 @@
 # limitations under the License.
 #
 #######################pravega-client##################
-eventMesh.server.pravega.controller.uri=tcp://127.0.0.1:9090
-eventMesh.server.pravega.scope=eventmesh-pravega
+eventMesh.server.pravega.controller.uri=tcp://127.0.0.1:816
+eventMesh.server.pravega.scope=scope-success!!!
 eventMesh.server.pravega.authEnabled=false
-eventMesh.server.pravega.username=
-eventMesh.server.pravega.password=
-eventMesh.server.pravega.tlsEnabled=false
-eventMesh.server.pravega.truststore=
-eventMesh.server.pravega.clientPool.size=8
-eventMesh.server.pravega.queue.size=512
\ No newline at end of file
+eventMesh.server.pravega.username=username-success!!!
+eventMesh.server.pravega.password=password-success!!!
+eventMesh.server.pravega.tlsEnabled=true
+eventMesh.server.pravega.truststore=truststore-success!!!
+eventMesh.server.pravega.clientPool.size=816
+eventMesh.server.pravega.queue.size=1816
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/common/EventMeshConstants.java b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/common/EventMeshConstants.java
deleted file mode 100644
index 9049608a9..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/common/EventMeshConstants.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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.eventmesh.connector.pulsar.common;
-
-public class EventMeshConstants {
-    public static final String EVENTMESH_CONF_FILE = "pulsar-client.properties";
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/config/ClientConfiguration.java b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/config/ClientConfiguration.java
index ae0bc5626..9410debf5 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/config/ClientConfiguration.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/config/ClientConfiguration.java
@@ -17,44 +17,23 @@
 
 package org.apache.eventmesh.connector.pulsar.config;
 
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.base.Preconditions;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
 import lombok.Getter;
 import lombok.Setter;
 
 @Getter
 @Setter
+@Config(prefix = "eventMesh.server.pulsar", path = "classPath://pulsar-client.properties")
 public class ClientConfiguration {
 
+    @ConfigFiled(field = "service")
     private String serviceAddr;
-    private String authPlugin;
-    private String authParams;
-
-    private static ClientConfiguration INSTANCE = null;
 
-    public void init() {
-        String serviceAddrStr = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_PULSAR_SERVICE_ADDR);
-        Preconditions.checkState(StringUtils.isNotEmpty(serviceAddrStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_PULSAR_SERVICE_ADDR));
-        serviceAddr = StringUtils.trim(serviceAddrStr);
-        authPlugin = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_PULSAR_AUTH_PLUGIN);
-        authParams = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_PULSAR_AUTH_PARAMS);
-    }
-
-    public static ClientConfiguration getInstance() {
-        if (INSTANCE == null) {
-            INSTANCE = new ClientConfiguration();
-            INSTANCE.init();
-        }
-        return INSTANCE;
-    }
-
-    static class ConfKeys {
-        public static final String KEYS_EVENTMESH_PULSAR_SERVICE_ADDR = "eventMesh.server.pulsar.service";
-        public static final String KEYS_EVENTMESH_PULSAR_AUTH_PLUGIN = "eventMesh.server.pulsar.authPlugin";
-        public static final String KEYS_EVENTMESH_PULSAR_AUTH_PARAMS = "eventMesh.server.pulsar.authParams";
-    }
+    @ConfigFiled(field = "authPlugin")
+    private String authPlugin;
 
+    @ConfigFiled(field = "authParams")
+    private String authParams;
 }
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/config/ConfigurationWrapper.java b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/config/ConfigurationWrapper.java
deleted file mode 100644
index ca2ccd0aa..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/config/ConfigurationWrapper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.eventmesh.connector.pulsar.config;
-
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.connector.pulsar.common.EventMeshConstants;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@UtilityClass
-public class ConfigurationWrapper {
-
-    private static final Properties properties = new Properties();
-
-    static {
-        loadProperties();
-    }
-
-    public String getProp(String key) {
-        return StringUtils.isEmpty(key) ? null : properties.getProperty(key, null);
-    }
-
-    /**
-     * Load Pulsar properties file from classpath and conf home.
-     * The properties defined in conf home will override classpath.
-     */
-    private void loadProperties() {
-        try (InputStream resourceAsStream = ConfigurationWrapper.class.getResourceAsStream(
-            "/" + EventMeshConstants.EVENTMESH_CONF_FILE)) {
-            if (resourceAsStream != null) {
-                properties.load(resourceAsStream);
-            }
-        } catch (IOException e) {
-            log.error("Load {}.properties file from classpath error", EventMeshConstants.EVENTMESH_CONF_FILE, e);
-            throw new RuntimeException(String.format("Load %s.properties file from classpath error", EventMeshConstants.EVENTMESH_CONF_FILE));
-        }
-
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + EventMeshConstants.EVENTMESH_CONF_FILE;
-            if (new File(configPath).exists()) {
-                properties.load(new BufferedReader(new FileReader(configPath)));
-            }
-        } catch (IOException e) {
-            log.error("Cannot load {} file from conf.", EventMeshConstants.EVENTMESH_CONF_FILE, e);
-            throw new IllegalArgumentException(String.format("Cannot load %s file from conf", EventMeshConstants.EVENTMESH_CONF_FILE));
-        }
-    }
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/consumer/PulsarConsumerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/consumer/PulsarConsumerImpl.java
index f2a621ab9..fba1f8a6d 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/consumer/PulsarConsumerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/consumer/PulsarConsumerImpl.java
@@ -24,6 +24,7 @@ import org.apache.eventmesh.api.EventMeshAsyncConsumeContext;
 import org.apache.eventmesh.api.consumer.Consumer;
 import org.apache.eventmesh.api.exception.ConnectorRuntimeException;
 import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.pulsar.config.ClientConfiguration;
 
 import org.apache.pulsar.client.api.ClientBuilder;
@@ -45,6 +46,7 @@ import com.google.common.base.Preconditions;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
+@Config(field = "clientConfiguration")
 public class PulsarConsumerImpl implements Consumer {
 
     private final AtomicBoolean started = new AtomicBoolean(false);
@@ -53,12 +55,15 @@ public class PulsarConsumerImpl implements Consumer {
     private org.apache.pulsar.client.api.Consumer<byte[]> consumer;
     private EventListener eventListener;
 
+    /**
+     * Unified configuration class corresponding to pulsar-client.properties
+     */
+    private ClientConfiguration clientConfiguration;
+
     @Override
     public void init(Properties properties) throws Exception {
         this.properties = properties;
 
-        final ClientConfiguration clientConfiguration = ClientConfiguration.getInstance();
-
         try {
             ClientBuilder clientBuilder = PulsarClient.builder()
                 .serviceUrl(clientConfiguration.getServiceAddr());
@@ -160,4 +165,8 @@ public class PulsarConsumerImpl implements Consumer {
               String.format("Failed to close the pulsar client with exception: %s", ex.getMessage()));
         }
     }
+
+    public ClientConfiguration getClientConfiguration() {
+        return this.clientConfiguration;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/producer/ProducerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/producer/ProducerImpl.java
index e49ef3b39..2d90ebaa8 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/producer/ProducerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/producer/ProducerImpl.java
@@ -36,10 +36,13 @@ public class ProducerImpl extends AbstractProducer {
     private ClientConfiguration config;
     private PulsarClientWrapper pulsarClient;
 
+    public ProducerImpl(final Properties properties, ClientConfiguration config) {
+        this(properties);
+        setConfig(config);
+    }
+
     public ProducerImpl(final Properties properties) {
         super(properties);
-        this.config = new ClientConfiguration();
-        this.config.init();
     }
 
     public void publish(CloudEvent cloudEvent, SendCallback sendCallback) {
@@ -73,4 +76,8 @@ public class ProducerImpl extends AbstractProducer {
     public boolean isClosed() {
         return !this.isStarted();
     }
+
+    public void setConfig(ClientConfiguration config) {
+        this.config = config;
+    }
 }
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/producer/PulsarProducerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/producer/PulsarProducerImpl.java
index 64c08847e..063c1439e 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/producer/PulsarProducerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/main/java/org/apache/eventmesh/connector/pulsar/producer/PulsarProducerImpl.java
@@ -21,18 +21,26 @@ import org.apache.eventmesh.api.RequestReplyCallback;
 import org.apache.eventmesh.api.SendCallback;
 import org.apache.eventmesh.api.exception.ConnectorRuntimeException;
 import org.apache.eventmesh.api.producer.Producer;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.connector.pulsar.config.ClientConfiguration;
 
 import java.util.Properties;
 
 import io.cloudevents.CloudEvent;
 
+@Config(field = "clientConfiguration")
 public class PulsarProducerImpl implements Producer {
 
     private ProducerImpl producer;
 
+    /**
+     * Unified configuration class corresponding to pulsar-client.properties
+     */
+    private ClientConfiguration clientConfiguration;
+
     @Override
     public synchronized void init(Properties properties) {
-        producer = new ProducerImpl(properties);
+        producer = new ProducerImpl(properties, clientConfiguration);
     }
 
     @Override
@@ -84,4 +92,8 @@ public class PulsarProducerImpl implements Producer {
     public void setExtFields() {
         throw new ConnectorRuntimeException("SetExtFields is not supported");
     }
+
+    public ClientConfiguration getClientConfiguration() {
+        return this.clientConfiguration;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/test/java/org/apache/eventmesh/connector/pulsar/config/ClientConfigurationTest.java b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/test/java/org/apache/eventmesh/connector/pulsar/config/ClientConfigurationTest.java
new file mode 100644
index 000000000..493cd167a
--- /dev/null
+++ b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/test/java/org/apache/eventmesh/connector/pulsar/config/ClientConfigurationTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.eventmesh.connector.pulsar.config;
+
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
+import org.apache.eventmesh.connector.pulsar.consumer.PulsarConsumerImpl;
+import org.apache.eventmesh.connector.pulsar.producer.PulsarProducerImpl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ClientConfigurationTest {
+
+    @Test
+    public void getConfigWhenPulsarConsumerInit() {
+        PulsarConsumerImpl consumer =
+                (PulsarConsumerImpl) ConnectorPluginFactory.getMeshMQPushConsumer("pulsar");
+
+        ClientConfiguration config = consumer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    @Test
+    public void getConfigWhenPulsarProducerInit() {
+        PulsarProducerImpl producer =
+                (PulsarProducerImpl) ConnectorPluginFactory.getMeshMQProducer("pulsar");
+
+        ClientConfiguration config = producer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    private void assertConfig(ClientConfiguration config) {
+        Assert.assertEquals(config.getServiceAddr(), "127.0.0.1:6650");
+        Assert.assertEquals(config.getAuthPlugin(), "authPlugin-success!!!");
+        Assert.assertEquals(config.getAuthParams(), "authParams-success!!!");
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/test/resources/pulsar-client.properties
similarity index 83%
copy from eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties
copy to eventmesh-connector-plugin/eventmesh-connector-pulsar/src/test/resources/pulsar-client.properties
index 9151c027e..645a5edb6 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties
+++ b/eventmesh-connector-plugin/eventmesh-connector-pulsar/src/test/resources/pulsar-client.properties
@@ -15,4 +15,6 @@
 # limitations under the License.
 #
 
-eventMesh.server.redis.serverAddress=redis://127.0.0.1:6379
\ No newline at end of file
+eventMesh.server.pulsar.service=127.0.0.1:6650
+eventMesh.server.pulsar.authPlugin=authPlugin-success!!!
+eventMesh.server.pulsar.authParams=authParams-success!!!
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigKey.java b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigKey.java
deleted file mode 100644
index 9173e5ffc..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigKey.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.eventmesh.connector.rabbitmq.config;
-
-public class ConfigKey {
-    public static final String HOST = "eventMesh.server.rabbitmq.host";
-    public static final String PORT = "eventMesh.server.rabbitmq.port";
-    public static final String USER_NAME = "eventMesh.server.rabbitmq.username";
-    public static final String PASSWD = "eventMesh.server.rabbitmq.passwd";
-    public static final String VIRTUAL_HOST = "eventMesh.server.rabbitmq.virtualHost";
-
-    public static final String EXCHANGE_TYPE = "eventMesh.server.rabbitmq.exchangeType";
-    public static final String EXCHANGE_NAME = "eventMesh.server.rabbitmq.exchangeName";
-    public static final String ROUTING_KEY = "eventMesh.server.rabbitmq.routingKey";
-    public static final String QUEUE_NAME = "eventMesh.server.rabbitmq.queueName";
-    public static final String AUTO_ACK = "eventMesh.server.rabbitmq.autoAck";
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationHolder.java b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationHolder.java
index 34a7e7189..7ac00ef0b 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationHolder.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationHolder.java
@@ -17,49 +17,44 @@
 
 package org.apache.eventmesh.connector.rabbitmq.config;
 
-import org.apache.eventmesh.common.utils.AssertUtils;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
 import com.rabbitmq.client.BuiltinExchangeType;
 
 import lombok.Data;
 
 @Data
+@Config(prefix = "eventMesh.server.rabbitmq", path = "classPath://rabbitmq-client.properties")
 public class ConfigurationHolder {
+
+    @ConfigFiled(field = "host")
     public String host;
+
+    @ConfigFiled(field = "port")
     public int port;
+
+    @ConfigFiled(field = "username")
     public String username;
+
+    @ConfigFiled(field = "passwd")
     public String passwd;
+
+    @ConfigFiled(field = "virtualHost")
     public String virtualHost;
 
+    @ConfigFiled(field = "exchangeType")
     public BuiltinExchangeType exchangeType;
+
+    @ConfigFiled(field = "exchangeName")
     public String exchangeName;
-    public String routingKey;
-    public String queueName;
-    public boolean autoAck;
 
-    public void init() {
-        this.host = getProperty(ConfigKey.HOST);
-        this.port = Integer.parseInt(getProperty(ConfigKey.PORT));
-        this.username = getProperty(ConfigKey.USER_NAME);
-        this.passwd = getProperty(ConfigKey.PASSWD);
-        this.virtualHost = ConfigurationWrapper.getProperty(ConfigKey.VIRTUAL_HOST);
-        this.exchangeType = BuiltinExchangeType.valueOf(getProperty(ConfigKey.EXCHANGE_TYPE));
-        this.exchangeName = getProperty(ConfigKey.EXCHANGE_NAME);
-        this.routingKey = getProperty(ConfigKey.ROUTING_KEY);
-        this.queueName = getProperty(ConfigKey.QUEUE_NAME);
-        this.autoAck = Boolean.parseBoolean(getProperty(ConfigKey.AUTO_ACK));
-    }
+    @ConfigFiled(field = "routingKey")
+    public String routingKey;
 
-    /**
-     * get property
-     *
-     * @param configKey config key
-     * @return property
-     */
-    private String getProperty(String configKey) {
-        String property = ConfigurationWrapper.getProperty(configKey);
-        AssertUtils.notBlack(property, String.format("%s error", configKey));
-        return property;
+    @ConfigFiled(field = "queueName")
+    public String queueName;
 
-    }
+    @ConfigFiled(field = "autoAck")
+    public boolean autoAck;
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationWrapper.java b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationWrapper.java
deleted file mode 100644
index 6a244977f..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationWrapper.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.eventmesh.connector.rabbitmq.config;
-
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.common.utils.PropertiesUtils;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.Properties;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class ConfigurationWrapper {
-
-    private static final String CONF_FILE = "rabbitmq-client.properties";
-
-    private static final Properties PROPERTIES = new Properties();
-
-    static {
-        loadProperties();
-    }
-
-    public static String getProperty(String key) {
-        return StringUtils.isEmpty(key)
-                ? null : PROPERTIES.getProperty(key, null);
-    }
-
-    private static void loadProperties() {
-        try (InputStream resourceAsStream = ConfigurationWrapper.class.getResourceAsStream(
-                "/" + CONF_FILE)) {
-            if (resourceAsStream != null) {
-                PROPERTIES.load(resourceAsStream);
-            }
-        } catch (IOException e) {
-            log.error("load file from classpath exception:", e);
-            throw new RuntimeException(String.format("Load %s file from classpath error", CONF_FILE));
-        }
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + CONF_FILE;
-            PropertiesUtils.loadPropertiesWhenFileExist(PROPERTIES, configPath, StandardCharsets.UTF_8);
-        } catch (IOException e) {
-            log.error("load file from conf exception:", e);
-            throw new IllegalArgumentException(String.format("Cannot load %s file from conf", CONF_FILE));
-        }
-    }
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/consumer/RabbitmqConsumer.java b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/consumer/RabbitmqConsumer.java
index 56124ab82..b2da7db84 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/consumer/RabbitmqConsumer.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/consumer/RabbitmqConsumer.java
@@ -21,6 +21,7 @@ import org.apache.eventmesh.api.AbstractContext;
 import org.apache.eventmesh.api.EventListener;
 import org.apache.eventmesh.api.consumer.Consumer;
 import org.apache.eventmesh.common.ThreadPoolFactory;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.rabbitmq.client.RabbitmqClient;
 import org.apache.eventmesh.connector.rabbitmq.client.RabbitmqConnectionFactory;
 import org.apache.eventmesh.connector.rabbitmq.config.ConfigurationHolder;
@@ -37,6 +38,7 @@ import io.cloudevents.CloudEvent;
 import com.rabbitmq.client.Channel;
 import com.rabbitmq.client.Connection;
 
+@Config(field = "configurationHolder")
 public class RabbitmqConsumer implements Consumer {
 
     private static final Logger logger = LoggerFactory.getLogger(RabbitmqConsumer.class);
@@ -51,7 +53,10 @@ public class RabbitmqConsumer implements Consumer {
 
     private volatile boolean started = false;
 
-    private final ConfigurationHolder configurationHolder = new ConfigurationHolder();
+    /**
+     * Unified configuration class corresponding to rabbitmq-client.properties
+     */
+    private ConfigurationHolder configurationHolder;
 
     private final ThreadPoolExecutor executor = ThreadPoolFactory.createThreadPoolExecutor(
             Runtime.getRuntime().availableProcessors() * 2,
@@ -92,7 +97,6 @@ public class RabbitmqConsumer implements Consumer {
 
     @Override
     public void init(Properties keyValue) throws Exception {
-        this.configurationHolder.init();
         this.rabbitmqClient = new RabbitmqClient(rabbitmqConnectionFactory);
         this.connection = rabbitmqClient.getConnection(configurationHolder.getHost(), configurationHolder.getUsername(),
                 configurationHolder.getPasswd(), configurationHolder.getPort(), configurationHolder.getVirtualHost());
@@ -131,4 +135,8 @@ public class RabbitmqConsumer implements Consumer {
     public void setRabbitmqConnectionFactory(RabbitmqConnectionFactory rabbitmqConnectionFactory) {
         this.rabbitmqConnectionFactory = rabbitmqConnectionFactory;
     }
+
+    public ConfigurationHolder getClientConfiguration() {
+        return this.configurationHolder;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/producer/RabbitmqProducer.java b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/producer/RabbitmqProducer.java
index 700c44792..f6e4e0041 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/producer/RabbitmqProducer.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/main/java/org/apache/eventmesh/connector/rabbitmq/producer/RabbitmqProducer.java
@@ -23,6 +23,7 @@ import org.apache.eventmesh.api.SendResult;
 import org.apache.eventmesh.api.exception.ConnectorRuntimeException;
 import org.apache.eventmesh.api.exception.OnExceptionContext;
 import org.apache.eventmesh.api.producer.Producer;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.rabbitmq.client.RabbitmqClient;
 import org.apache.eventmesh.connector.rabbitmq.client.RabbitmqConnectionFactory;
 import org.apache.eventmesh.connector.rabbitmq.cloudevent.RabbitmqCloudEvent;
@@ -41,6 +42,7 @@ import io.cloudevents.CloudEvent;
 import com.rabbitmq.client.Channel;
 import com.rabbitmq.client.Connection;
 
+@Config(field = "configurationHolder")
 public class RabbitmqProducer implements Producer {
 
     private static final Logger logger = LoggerFactory.getLogger(RabbitmqProducer.class);
@@ -55,7 +57,10 @@ public class RabbitmqProducer implements Producer {
 
     private volatile boolean started = false;
 
-    private final ConfigurationHolder configurationHolder = new ConfigurationHolder();
+    /**
+     * Unified configuration class corresponding to rabbitmq-client.properties
+     */
+    private ConfigurationHolder configurationHolder;
 
     @Override
     public boolean isStarted() {
@@ -88,7 +93,6 @@ public class RabbitmqProducer implements Producer {
 
     @Override
     public void init(Properties properties) throws Exception {
-        this.configurationHolder.init();
         this.rabbitmqClient = new RabbitmqClient(rabbitmqConnectionFactory);
         this.connection = rabbitmqClient.getConnection(configurationHolder.getHost(), configurationHolder.getUsername(),
                 configurationHolder.getPasswd(), configurationHolder.getPort(), configurationHolder.getVirtualHost());
@@ -158,4 +162,8 @@ public class RabbitmqProducer implements Producer {
     public void setRabbitmqConnectionFactory(RabbitmqConnectionFactory rabbitmqConnectionFactory) {
         this.rabbitmqConnectionFactory = rabbitmqConnectionFactory;
     }
+
+    public ConfigurationHolder getClientConfiguration() {
+        return this.configurationHolder;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/java/org/apache/eventmesh/connector/rabbitmq/RabbitmqServer.java b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/java/org/apache/eventmesh/connector/rabbitmq/RabbitmqServer.java
index a6287339d..ce36c3009 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/java/org/apache/eventmesh/connector/rabbitmq/RabbitmqServer.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/java/org/apache/eventmesh/connector/rabbitmq/RabbitmqServer.java
@@ -17,6 +17,7 @@
 
 package org.apache.eventmesh.connector.rabbitmq;
 
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
 import org.apache.eventmesh.connector.rabbitmq.consumer.RabbitmqConsumer;
 import org.apache.eventmesh.connector.rabbitmq.producer.RabbitmqProducer;
 
@@ -33,12 +34,13 @@ public class RabbitmqServer {
     public void setup() throws Exception {
         RabbitmqMockConnectionFactory rabbitmqMockConnectionFactory = new RabbitmqMockConnectionFactory();
 
-        rabbitmqConsumer = new RabbitmqConsumer();
+        rabbitmqConsumer =
+                (RabbitmqConsumer) ConnectorPluginFactory.getMeshMQPushConsumer("rabbitmq");
         rabbitmqConsumer.setRabbitmqConnectionFactory(rabbitmqMockConnectionFactory);
         rabbitmqConsumer.init(new Properties());
         rabbitmqConsumer.start();
 
-        rabbitmqProducer = new RabbitmqProducer();
+        rabbitmqProducer = (RabbitmqProducer) ConnectorPluginFactory.getMeshMQProducer("rabbitmq");
         rabbitmqProducer.setRabbitmqConnectionFactory(rabbitmqMockConnectionFactory);
         rabbitmqProducer.init(new Properties());
         rabbitmqProducer.start();
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationHolderTest.java b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationHolderTest.java
new file mode 100644
index 000000000..231703ecc
--- /dev/null
+++ b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/java/org/apache/eventmesh/connector/rabbitmq/config/ConfigurationHolderTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.eventmesh.connector.rabbitmq.config;
+
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
+import org.apache.eventmesh.connector.rabbitmq.consumer.RabbitmqConsumer;
+import org.apache.eventmesh.connector.rabbitmq.producer.RabbitmqProducer;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.rabbitmq.client.BuiltinExchangeType;
+
+public class ConfigurationHolderTest {
+
+    @Test
+    public void getConfigWhenRabbitmqConsumerInit() {
+        RabbitmqConsumer consumer =
+                (RabbitmqConsumer) ConnectorPluginFactory.getMeshMQPushConsumer("rabbitmq");
+
+        ConfigurationHolder config = consumer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    @Test
+    public void getConfigWhenRabbitmqProducerInit() {
+        RabbitmqProducer producer =
+                (RabbitmqProducer) ConnectorPluginFactory.getMeshMQProducer("rabbitmq");
+
+        ConfigurationHolder config = producer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    private void assertConfig(ConfigurationHolder config) {
+        Assert.assertEquals(config.getHost(), "127.0.0.1");
+        Assert.assertEquals(config.getPort(), 5672);
+        Assert.assertEquals(config.getUsername(), "username-success!!!");
+        Assert.assertEquals(config.getPasswd(), "passwd-success!!!");
+        Assert.assertEquals(config.getVirtualHost(), "virtualHost-success!!!");
+
+        Assert.assertEquals(config.getExchangeType(), BuiltinExchangeType.TOPIC);
+        Assert.assertEquals(config.getExchangeName(), "exchangeName-success!!!");
+        Assert.assertEquals(config.getRoutingKey(), "routingKey-success!!!");
+        Assert.assertEquals(config.getQueueName(), "queueName-success!!!");
+        Assert.assertTrue(config.isAutoAck());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/resources/rabbitmq-client.properties b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/resources/rabbitmq-client.properties
index b24967fa6..082fbe5b4 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/resources/rabbitmq-client.properties
+++ b/eventmesh-connector-plugin/eventmesh-connector-rabbitmq/src/test/resources/rabbitmq-client.properties
@@ -18,14 +18,14 @@
 ####################### rabbitmq server ##################
 eventMesh.server.rabbitmq.host=127.0.0.1
 eventMesh.server.rabbitmq.port=5672
-eventMesh.server.rabbitmq.username=root
-eventMesh.server.rabbitmq.passwd=123456
-eventMesh.server.rabbitmq.virtualHost=test
+eventMesh.server.rabbitmq.username=username-success!!!
+eventMesh.server.rabbitmq.passwd=passwd-success!!!
+eventMesh.server.rabbitmq.virtualHost=virtualHost-success!!!
 
 ####################### rabbitmq queue setting ##################
 # DIRECT, FANOUT, TOPIC, HEADERS
 eventMesh.server.rabbitmq.exchangeType=TOPIC
-eventMesh.server.rabbitmq.exchangeName=test
-eventMesh.server.rabbitmq.routingKey=test
-eventMesh.server.rabbitmq.queueName=test
+eventMesh.server.rabbitmq.exchangeName=exchangeName-success!!!
+eventMesh.server.rabbitmq.routingKey=routingKey-success!!!
+eventMesh.server.rabbitmq.queueName=queueName-success!!!
 eventMesh.server.rabbitmq.autoAck=true
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/client/RedissonClient.java b/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/client/RedissonClient.java
index 625086204..42891c26f 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/client/RedissonClient.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/client/RedissonClient.java
@@ -17,13 +17,10 @@
 
 package org.apache.eventmesh.connector.redis.client;
 
-import static org.apache.eventmesh.connector.redis.config.ConfigurationWrapper.getPropertiesByPrefix;
-import static org.apache.eventmesh.connector.redis.config.ConfigurationWrapper.getProperty;
-
 import org.apache.eventmesh.api.exception.ConnectorRuntimeException;
 import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.connector.redis.cloudevent.CloudEventCodec;
-import org.apache.eventmesh.connector.redis.config.ConfigOptions;
 import org.apache.eventmesh.connector.redis.config.RedisProperties;
 
 import java.util.Arrays;
@@ -59,39 +56,8 @@ public final class RedissonClient {
     }
 
     public static Redisson create() {
-        RedisProperties properties = new RedisProperties();
-        String serverTypeName = getProperty(ConfigOptions.SERVER_TYPE);
-        if (serverTypeName != null) {
-            try {
-                properties.setServerType(RedisProperties.ServerType.valueOf(serverTypeName));
-            } catch (Exception e) {
-                final String message = "Invalid Redis server type: " + properties.getServerType()
-                    + ", supported values are: "
-                    + Arrays.toString(RedisProperties.ServerType.values());
-                throw new ConnectorRuntimeException(message, e);
-            }
-        } else {
-            properties.setServerType(RedisProperties.ServerType.SINGLE);
-        }
-
-        String serverAddress = getProperty(ConfigOptions.SERVER_ADDRESS);
-        if (serverAddress != null) {
-            properties.setServerAddress(serverAddress);
-        } else {
-            throw new ConnectorRuntimeException("Lack Redis server address");
-        }
-
-        String serverMasterName = getProperty(ConfigOptions.SERVER_MASTER_NAME);
-        if (serverMasterName != null) {
-            properties.setServerMasterName(serverMasterName);
-        }
-
-        String serverPassword = getProperty(ConfigOptions.SERVER_PASSWORD);
-        if (serverPassword != null) {
-            properties.setServerPassword(serverPassword);
-        }
-
-        properties.setRedissonProperties(getPropertiesByPrefix(ConfigOptions.REDISSON_PROPERTIES_PREFIX));
+        ConfigService configService = ConfigService.getInstance();
+        RedisProperties properties = configService.buildConfigInstance(RedisProperties.class);
 
         return create(properties);
     }
@@ -102,8 +68,8 @@ public final class RedissonClient {
             serverType = properties.getServerType();
         } catch (IllegalArgumentException ie) {
             final String message = "Invalid Redis server type: " + properties.getServerType()
-                + ", supported values are: "
-                + Arrays.toString(RedisProperties.ServerType.values());
+                    + ", supported values are: "
+                    + Arrays.toString(RedisProperties.ServerType.values());
             throw new ConnectorRuntimeException(message, ie);
         }
 
@@ -122,24 +88,24 @@ public final class RedissonClient {
         switch (serverType) {
             case SINGLE:
                 config.useSingleServer()
-                    .setAddress(serverAddress)
-                    .setPassword(serverPassword);
+                        .setAddress(serverAddress)
+                        .setPassword(serverPassword);
                 break;
             case CLUSTER:
                 config.useClusterServers()
-                    .addNodeAddress(serverAddress.split(Constants.COMMA))
-                    .setPassword(serverPassword);
+                        .addNodeAddress(serverAddress.split(Constants.COMMA))
+                        .setPassword(serverPassword);
                 break;
             case SENTINEL:
                 config.useSentinelServers()
-                    .setMasterName(masterName)
-                    .addSentinelAddress(serverAddress)
-                    .setPassword(serverPassword);
+                        .setMasterName(masterName)
+                        .addSentinelAddress(serverAddress)
+                        .setPassword(serverPassword);
                 break;
             default:
                 final String message = "Invalid Redis server type: " + properties.getServerType()
-                    + ", supported values are: "
-                    + Arrays.toString(RedisProperties.ServerType.values());
+                        + ", supported values are: "
+                        + Arrays.toString(RedisProperties.ServerType.values());
                 throw new ConnectorRuntimeException(message);
         }
 
diff --git a/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/ConfigOptions.java b/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/ConfigOptions.java
deleted file mode 100644
index f882a866f..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/ConfigOptions.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.eventmesh.connector.redis.config;
-
-/**
- * Redis connector related configuration options.
- */
-public interface ConfigOptions {
-
-    /**
-     * The redis server configuration to be used, default is SINGLE.
-     */
-    String SERVER_TYPE = "eventMesh.server.redis.serverType";
-
-    /**
-     * The master server name used by Redis Sentinel servers and master change monitoring task, default is master.
-     */
-    String SERVER_MASTER_NAME = "eventMesh.server.redis.serverMasterName";
-
-    /**
-     * The address of the redis server following format -- host1:port1,host2:port2,……
-     */
-    String SERVER_ADDRESS = "eventMesh.server.redis.serverAddress";
-
-    /**
-     * The password for redis authentication.
-     */
-    String SERVER_PASSWORD = "eventMesh.server.redis.serverPassword";
-
-    /**
-     * The redisson options, redisson properties, please refer to the redisson manual.
-     * <p>
-     * For example, the redisson timeout property is configured as eventMesh.server.redis.redisson.timeout
-     */
-    String REDISSON_PROPERTIES_PREFIX = "eventMesh.server.redis.redisson";
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/ConfigurationWrapper.java b/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/ConfigurationWrapper.java
deleted file mode 100644
index 0bf743a78..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/ConfigurationWrapper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.eventmesh.connector.redis.config;
-
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.common.utils.PropertiesUtils;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class ConfigurationWrapper {
-
-    private static final String CONF_FILE = "redis-client.properties";
-
-    private static final Properties properties = new Properties();
-
-    static {
-        loadProperties();
-    }
-
-    public static String getProperty(String key) {
-        return StringUtils.isEmpty(key)
-            ? null : properties.getProperty(key, null);
-    }
-
-    public static Properties getPropertiesByPrefix(String prefix) {
-        if (StringUtils.isBlank(prefix)) {
-            return null;
-        }
-
-        return PropertiesUtils.getPropertiesByPrefix(properties, prefix);
-    }
-
-    private static void loadProperties() {
-        try (InputStream resourceAsStream = ConfigurationWrapper.class.getResourceAsStream(
-            "/" + CONF_FILE)) {
-            if (resourceAsStream != null) {
-                properties.load(resourceAsStream);
-            }
-        } catch (IOException e) {
-            log.error(String.format("Load %s file from classpath error", CONF_FILE), e);
-            throw new RuntimeException(String.format("Load %s file from classpath error", CONF_FILE));
-        }
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + CONF_FILE;
-            PropertiesUtils.loadPropertiesWhenFileExist(properties, configPath);
-        } catch (IOException e) {
-            log.error(String.format("Cannot load %s file from conf", CONF_FILE), e);
-            throw new IllegalArgumentException(String.format("Cannot load %s file from conf", CONF_FILE));
-        }
-    }
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/RedisProperties.java b/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/RedisProperties.java
index 7e5d7b20e..42906b1b0 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/RedisProperties.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-redis/src/main/java/org/apache/eventmesh/connector/redis/config/RedisProperties.java
@@ -17,75 +17,48 @@
 
 package org.apache.eventmesh.connector.redis.config;
 
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
+
 import java.util.Properties;
 
+import lombok.Data;
+
+@Data
+@Config(prefix = "eventMesh.server.redis", path = "classPath://redis-client.properties")
 public class RedisProperties {
 
     /**
      * The redis server configuration to be used.
      */
+    @ConfigFiled(field = "serverType")
     private ServerType serverType = ServerType.SINGLE;
 
     /**
      * The master server name used by Redis Sentinel servers and master change monitoring task.
      */
+    @ConfigFiled(field = "serverMasterName")
     private String serverMasterName = "master";
 
     /**
      * The address of the redis server following format -- host1:port1,host2:port2,……
      */
+    @ConfigFiled(field = "serverAddress")
     private String serverAddress;
 
     /**
      * The password for redis authentication.
      */
+    @ConfigFiled(field = "serverPassword")
     private String serverPassword;
 
     /**
-     * The redisson options, redisson properties, please refer to the redisson manual.
+     * The redisson options, redisson properties
+     * prefix is `eventMesh.server.redis.redisson`
      */
+    @ConfigFiled(field = "redisson")
     private Properties redissonProperties;
 
-    public ServerType getServerType() {
-        return serverType;
-    }
-
-    public void setServerType(ServerType serverType) {
-        this.serverType = serverType;
-    }
-
-    public String getServerAddress() {
-        return serverAddress;
-    }
-
-    public void setServerAddress(String serverAddress) {
-        this.serverAddress = serverAddress;
-    }
-
-    public String getServerPassword() {
-        return serverPassword;
-    }
-
-    public void setServerPassword(String serverPassword) {
-        this.serverPassword = serverPassword;
-    }
-
-    public String getServerMasterName() {
-        return serverMasterName;
-    }
-
-    public void setServerMasterName(String serverMasterName) {
-        this.serverMasterName = serverMasterName;
-    }
-
-    public Properties getRedissonProperties() {
-        return redissonProperties;
-    }
-
-    public void setRedissonProperties(Properties redissonProperties) {
-        this.redissonProperties = redissonProperties;
-    }
-
     public enum ServerType {
         SINGLE,
         CLUSTER,
diff --git a/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/java/org/apache/eventmesh/connector/redis/config/RedisPropertiesTest.java b/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/java/org/apache/eventmesh/connector/redis/config/RedisPropertiesTest.java
new file mode 100644
index 000000000..bded565b6
--- /dev/null
+++ b/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/java/org/apache/eventmesh/connector/redis/config/RedisPropertiesTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.eventmesh.connector.redis.config;
+
+import org.apache.eventmesh.common.config.ConfigService;
+
+import java.util.Properties;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RedisPropertiesTest {
+
+    @Test
+    public void getRedisProperties() {
+        ConfigService configService = ConfigService.getInstance();
+        RedisProperties config = configService.buildConfigInstance(RedisProperties.class);
+        assertConfig(config);
+    }
+
+    private void assertConfig(RedisProperties config) {
+        Assert.assertEquals(config.getServerAddress(), "redis://127.0.0.1:6379");
+        Assert.assertEquals(config.getServerType(), RedisProperties.ServerType.SINGLE);
+        Assert.assertEquals(config.getServerMasterName(), "serverMasterName-success!!!");
+
+        Properties properties = new Properties();
+        properties.put("threads", "816");
+        properties.put("nettyThreads", "1816");
+        Properties redissonProperties = config.getRedissonProperties();
+        Assert.assertEquals(redissonProperties, properties);
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties b/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties
index 9151c027e..08814f488 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties
+++ b/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties
@@ -14,5 +14,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
-eventMesh.server.redis.serverAddress=redis://127.0.0.1:6379
\ No newline at end of file
+eventMesh.server.redis.serverAddress=redis://127.0.0.1:6379
+eventMesh.server.redis.serverType=SINGLE
+eventMesh.server.redis.serverMasterName=serverMasterName-success!!!
+eventMesh.server.redis.redisson.threads=816
+eventMesh.server.redis.redisson.nettyThreads=1816
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/admin/RocketMQAdmin.java b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/admin/RocketMQAdmin.java
index 85857638a..4e5e918f0 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/admin/RocketMQAdmin.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/admin/RocketMQAdmin.java
@@ -21,6 +21,7 @@ package org.apache.eventmesh.connector.rocketmq.admin;
 
 import org.apache.eventmesh.api.admin.Admin;
 import org.apache.eventmesh.api.admin.TopicProperties;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.connector.rocketmq.config.ClientConfiguration;
 
 import org.apache.commons.lang3.StringUtils;
@@ -60,8 +61,8 @@ public class RocketMQAdmin implements Admin {
     public RocketMQAdmin(Properties properties) {
         isStarted = new AtomicBoolean(false);
 
-        final ClientConfiguration clientConfiguration = new ClientConfiguration();
-        clientConfiguration.init();
+        ConfigService configService = ConfigService.getInstance();
+        ClientConfiguration clientConfiguration = configService.buildConfigInstance(ClientConfiguration.class);
 
         nameServerAddr = clientConfiguration.namesrvAddr;
         clusterName = clientConfiguration.clusterName;
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/admin/command/Command.java b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/admin/command/Command.java
new file mode 100644
index 000000000..1ccf5ef60
--- /dev/null
+++ b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/admin/command/Command.java
@@ -0,0 +1,56 @@
+/*
+ * 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.eventmesh.connector.rocketmq.admin.command;
+
+import org.apache.eventmesh.common.config.ConfigService;
+import org.apache.eventmesh.connector.rocketmq.config.ClientConfiguration;
+
+import org.apache.rocketmq.acl.common.AclClientRPCHook;
+import org.apache.rocketmq.acl.common.SessionCredentials;
+import org.apache.rocketmq.remoting.RPCHook;
+import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
+
+import java.util.UUID;
+
+import lombok.Data;
+
+@Data
+public abstract class Command {
+    protected DefaultMQAdminExt adminExt;
+
+    protected String nameServerAddr;
+    protected String clusterName;
+
+    public void init() {
+        ConfigService configService = ConfigService.getInstance();
+        ClientConfiguration clientConfiguration = configService.buildConfigInstance(ClientConfiguration.class);
+
+        nameServerAddr = clientConfiguration.namesrvAddr;
+        clusterName = clientConfiguration.clusterName;
+        String accessKey = clientConfiguration.accessKey;
+        String secretKey = clientConfiguration.secretKey;
+
+        RPCHook rpcHook = new AclClientRPCHook(new SessionCredentials(accessKey, secretKey));
+        adminExt = new DefaultMQAdminExt(rpcHook);
+        String groupId = UUID.randomUUID().toString();
+        adminExt.setAdminExtGroup("admin_ext_group-" + groupId);
+        adminExt.setNamesrvAddr(nameServerAddr);
+    }
+
+    public abstract void execute() throws Exception;
+}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/config/ClientConfiguration.java b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/config/ClientConfiguration.java
index 8fb2d3f9c..547e3a6fe 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/config/ClientConfiguration.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/config/ClientConfiguration.java
@@ -17,185 +17,57 @@
 
 package org.apache.eventmesh.connector.rocketmq.config;
 
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.base.Preconditions;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
+@Config(prefix = "eventMesh.server.rocketmq", path = "classPath://rocketmq-client.properties")
 public class ClientConfiguration {
 
+    @ConfigFiled(field = "namesrvAddr", notEmpty = true)
     public String namesrvAddr = "";
+
+    @ConfigFiled(field = "username")
     public String clientUserName = "username";
+
+    @ConfigFiled(field = "password")
     public String clientPass = "password";
+
+    @ConfigFiled(field = "client.consumeThreadMin")
     public Integer consumeThreadMin = 2;
+
+    @ConfigFiled(field = "client.consumeThreadMax")
     public Integer consumeThreadMax = 2;
+
+    @ConfigFiled(field = "client.consumeThreadPoolQueueSize")
     public Integer consumeQueueSize = 10000;
+
+    @ConfigFiled(field = "client.pullBatchSize")
     public Integer pullBatchSize = 32;
+
+    @ConfigFiled(field = "client.ackwindow")
     public Integer ackWindow = 1000;
+
+    @ConfigFiled(field = "client.pubwindow")
     public Integer pubWindow = 100;
+
+    @ConfigFiled(field = "client.comsumeTimeoutInMin")
     public long consumeTimeout = 0L;
+
+    @ConfigFiled(field = "client.pollNameServerInterval")
     public Integer pollNameServerInterval = 10 * 1000;
+
+    @ConfigFiled(field = "client.heartbeatBrokerInterval")
     public Integer heartbeatBrokerInterval = 30 * 1000;
+
+    @ConfigFiled(field = "client.rebalanceInterval")
     public Integer rebalanceInterval = 20 * 1000;
-    public String clusterName = "";
-    public String accessKey = "";
-    public String secretKey = "";
 
-    public void init() {
-
-        String clientUserNameStr = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_USERNAME);
-        if (StringUtils.isNotBlank(clientUserNameStr)) {
-            clientUserName = StringUtils.trim(clientUserNameStr);
-        }
-
-        String clientPassStr = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_PASSWORD);
-        if (StringUtils.isNotBlank(clientPassStr)) {
-            clientPass = StringUtils.trim(clientPassStr);
-        }
-
-        String namesrvAddrStr = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_NAMESRV_ADDR);
-        Preconditions.checkState(StringUtils.isNotEmpty(namesrvAddrStr),
-            String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_NAMESRV_ADDR));
-        namesrvAddr = StringUtils.trim(namesrvAddrStr);
-
-        String consumeThreadPoolMinStr =
-            ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_MIN);
-        if (StringUtils.isNotEmpty(consumeThreadPoolMinStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(consumeThreadPoolMinStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_MIN));
-            consumeThreadMin = Integer.valueOf(consumeThreadPoolMinStr);
-        }
-
-        String consumeThreadPoolMaxStr =
-            ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_MAX);
-        if (StringUtils.isNotEmpty(consumeThreadPoolMaxStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(consumeThreadPoolMaxStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_MAX));
-            consumeThreadMax = Integer.valueOf(consumeThreadPoolMaxStr);
-        }
-
-        String consumerThreadPoolQueueSizeStr =
-            ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_QUEUESIZE);
-        if (StringUtils.isNotEmpty(consumerThreadPoolQueueSizeStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(consumerThreadPoolQueueSizeStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_QUEUESIZE));
-            consumeQueueSize = Integer.valueOf(consumerThreadPoolQueueSizeStr);
-        }
-
-        String clientAckWindowStr = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_ACK_WINDOW);
-        if (StringUtils.isNotEmpty(clientAckWindowStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(clientAckWindowStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_ACK_WINDOW));
-            ackWindow = Integer.valueOf(clientAckWindowStr);
-        }
-
-        String clientPubWindowStr = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_PUB_WINDOW);
-        if (StringUtils.isNotEmpty(clientPubWindowStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(clientPubWindowStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_PUB_WINDOW));
-            pubWindow = Integer.valueOf(clientPubWindowStr);
-        }
-
-        String consumeTimeoutStr =
-            ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_CONSUME_TIMEOUT);
-        if (StringUtils.isNotBlank(consumeTimeoutStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(consumeTimeoutStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_CONSUME_TIMEOUT));
-            consumeTimeout = Long.parseLong(consumeTimeoutStr);
-        }
-
-        String clientPullBatchSizeStr =
-            ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_PULL_BATCHSIZE);
-        if (StringUtils.isNotEmpty(clientPullBatchSizeStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(clientPullBatchSizeStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_PULL_BATCHSIZE));
-            pullBatchSize = Integer.valueOf(clientPullBatchSizeStr);
-        }
-
-        String clientPollNamesrvIntervalStr =
-            ConfigurationWrapper.getProp(
-                ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_POLL_NAMESRV_INTERVAL);
-        if (StringUtils.isNotEmpty(clientPollNamesrvIntervalStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(clientPollNamesrvIntervalStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_POLL_NAMESRV_INTERVAL));
-            pollNameServerInterval = Integer.valueOf(clientPollNamesrvIntervalStr);
-        }
-
-        String clientHeartbeatBrokerIntervalStr =
-            ConfigurationWrapper.getProp(
-                ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_HEARTBEAT_BROKER_INTERVAL);
-        if (StringUtils.isNotEmpty(clientHeartbeatBrokerIntervalStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(clientHeartbeatBrokerIntervalStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_HEARTBEAT_BROKER_INTERVAL));
-            heartbeatBrokerInterval = Integer.valueOf(clientHeartbeatBrokerIntervalStr);
-        }
-
-        String clientRebalanceIntervalIntervalStr =
-            ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_REBALANCE_INTERVAL);
-        if (StringUtils.isNotEmpty(clientRebalanceIntervalIntervalStr)) {
-            Preconditions.checkState(StringUtils.isNumeric(clientRebalanceIntervalIntervalStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLIENT_REBALANCE_INTERVAL));
-            rebalanceInterval = Integer.valueOf(clientRebalanceIntervalIntervalStr);
-        }
-
-        String cluster = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_CLUSTER);
-        if (StringUtils.isNotBlank(cluster)) {
-            clusterName = cluster;
-        }
-
-        String ak = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_ACCESS_KEY);
-        if (StringUtils.isNotBlank(ak)) {
-            accessKey = ak;
-        }
-
-        String sk = ConfigurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ROCKETMQ_SECRET_KEY);
-        if (StringUtils.isNotBlank(sk)) {
-            secretKey = sk;
-        }
-    }
-
-    static class ConfKeys {
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_NAMESRV_ADDR = "eventMesh.server.rocketmq.namesrvAddr";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_USERNAME = "eventMesh.server.rocketmq.username";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_PASSWORD = "eventMesh.server.rocketmq.password";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_MIN =
-            "eventMesh.server.rocketmq.client.consumeThreadMin";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_MAX =
-            "eventMesh.server.rocketmq.client.consumeThreadMax";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CONSUME_THREADPOOL_QUEUESIZE =
-            "eventMesh.server.rocketmq.client.consumeThreadPoolQueueSize";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CLIENT_ACK_WINDOW = "eventMesh.server.rocketmq.client.ackwindow";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CLIENT_PUB_WINDOW = "eventMesh.server.rocketmq.client.pubwindow";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CLIENT_CONSUME_TIMEOUT =
-            "eventMesh.server.rocketmq.client.comsumeTimeoutInMin";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CLIENT_PULL_BATCHSIZE =
-            "eventMesh.server.rocketmq.client.pullBatchSize";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CLIENT_POLL_NAMESRV_INTERVAL =
-            "eventMesh.server.rocketmq.client.pollNameServerInterval";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CLIENT_HEARTBEAT_BROKER_INTERVAL =
-            "eventMesh.server.rocketmq.client.heartbeatBrokerInterval";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CLIENT_REBALANCE_INTERVAL =
-            "eventMesh.server.rocketmq.client.rebalanceInterval";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_CLUSTER = "eventMesh.server.rocketmq.cluster";
-
-        public static final String KEYS_EVENTMESH_ROCKETMQ_ACCESS_KEY =
-            "eventMesh.server.rocketmq.accessKey";
+    @ConfigFiled(field = "cluster")
+    public String clusterName = "";
 
-        public static final String KEYS_EVENTMESH_ROCKETMQ_SECRET_KEY =
-            "eventMesh.server.rocketmq.secretKey";
+    @ConfigFiled(field = "accessKey")
+    public String accessKey = "";
 
-    }
+    @ConfigFiled(field = "secretKey")
+    public String secretKey = "";
 }
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/config/ConfigurationWrapper.java b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/config/ConfigurationWrapper.java
deleted file mode 100644
index af5faceb3..000000000
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/config/ConfigurationWrapper.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.eventmesh.connector.rocketmq.config;
-
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.common.utils.PropertiesUtils;
-import org.apache.eventmesh.connector.rocketmq.common.EventMeshConstants;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@UtilityClass
-public class ConfigurationWrapper {
-
-    private static final Properties properties = new Properties();
-
-    static {
-        loadProperties();
-    }
-
-    public String getProp(String key) {
-        return StringUtils.isEmpty(key) ? null : properties.getProperty(key, null);
-    }
-
-    /**
-     * Load rocketmq properties file from classpath and conf home.
-     * The properties defined in conf home will override classpath.
-     */
-    private void loadProperties() {
-        try (InputStream resourceAsStream = ConfigurationWrapper.class.getResourceAsStream(
-            "/" + EventMeshConstants.EVENTMESH_CONF_FILE)) {
-            if (resourceAsStream != null) {
-                properties.load(resourceAsStream);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(String.format("Load %s.properties file from classpath error", EventMeshConstants.EVENTMESH_CONF_FILE));
-        }
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + EventMeshConstants.EVENTMESH_CONF_FILE;
-            PropertiesUtils.loadPropertiesWhenFileExist(properties, configPath);
-        } catch (IOException e) {
-            throw new IllegalArgumentException(String.format("Cannot load %s file from conf", EventMeshConstants.EVENTMESH_CONF_FILE));
-        }
-    }
-}
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java
index a2630652a..245694924 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java
@@ -21,6 +21,7 @@ import org.apache.eventmesh.api.AbstractContext;
 import org.apache.eventmesh.api.EventListener;
 import org.apache.eventmesh.api.consumer.Consumer;
 import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.rocketmq.config.ClientConfiguration;
 
 import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
@@ -36,34 +37,35 @@ import io.cloudevents.CloudEvent;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
+@Config(field = "clientConfiguration")
 public class RocketMQConsumerImpl implements Consumer {
 
     public Logger messageLogger = LoggerFactory.getLogger("message");
 
     private PushConsumerImpl pushConsumer;
 
+    private ClientConfiguration clientConfiguration;
+
     @Override
     public synchronized void init(Properties keyValue) throws Exception {
-        final ClientConfiguration clientConfiguration = new ClientConfiguration();
-        clientConfiguration.init();
-        boolean isBroadcast = Boolean.parseBoolean(keyValue.getProperty(Constants.IS_BROADCAST));
+        boolean isBroadcast = Boolean.parseBoolean(keyValue.getProperty("isBroadcast"));
 
-        String consumerGroup = keyValue.getProperty(Constants.CONSUMER_GROUP);
+        String consumerGroup = keyValue.getProperty("consumerGroup");
         if (isBroadcast) {
             consumerGroup = Constants.BROADCAST_PREFIX + consumerGroup;
         }
 
         String namesrvAddr = clientConfiguration.namesrvAddr;
-        String instanceName = keyValue.getProperty(Constants.INSTANCE_NAME);
+        String instanceName = keyValue.getProperty("instanceName");
         Properties properties = new Properties();
-        properties.put(Constants.ACCESS_POINTS, namesrvAddr);
-        properties.put(Constants.REGION, Constants.NAMESPACE);
-        properties.put(Constants.INSTANCE_NAME, instanceName);
-        properties.put(Constants.CONSUMER_ID, consumerGroup);
+        properties.put("ACCESS_POINTS", namesrvAddr);
+        properties.put("REGION", "namespace");
+        properties.put("instanceName", instanceName);
+        properties.put("CONSUMER_ID", consumerGroup);
         if (isBroadcast) {
-            properties.put(Constants.MESSAGE_MODEL, MessageModel.BROADCASTING.name());
+            properties.put("MESSAGE_MODEL", MessageModel.BROADCASTING.name());
         } else {
-            properties.put(Constants.MESSAGE_MODEL, MessageModel.CLUSTERING.name());
+            properties.put("MESSAGE_MODEL", MessageModel.CLUSTERING.name());
         }
 
         pushConsumer = new PushConsumerImpl(properties);
@@ -113,4 +115,7 @@ public class RocketMQConsumerImpl implements Consumer {
         return pushConsumer.attributes();
     }
 
+    public ClientConfiguration getClientConfiguration() {
+        return clientConfiguration;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java
index 1dbca5926..ca3761ad1 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java
+++ b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java
@@ -21,6 +21,7 @@ import org.apache.eventmesh.api.RequestReplyCallback;
 import org.apache.eventmesh.api.SendCallback;
 import org.apache.eventmesh.api.producer.Producer;
 import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.connector.rocketmq.common.EventMeshConstants;
 import org.apache.eventmesh.connector.rocketmq.config.ClientConfiguration;
 
@@ -36,14 +37,15 @@ import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
 @SuppressWarnings("deprecation")
+@Config(field = "clientConfiguration")
 public class RocketMQProducerImpl implements Producer {
 
     private ProducerImpl producer;
 
+    private ClientConfiguration clientConfiguration;
+
     @Override
     public synchronized void init(Properties keyValue) {
-        final ClientConfiguration clientConfiguration = new ClientConfiguration();
-        clientConfiguration.init();
         String producerGroup = keyValue.getProperty(Constants.PRODUCER_GROUP);
 
         String omsNamesrv = clientConfiguration.namesrvAddr;
@@ -114,4 +116,8 @@ public class RocketMQProducerImpl implements Producer {
     public void sendOneway(CloudEvent message) {
         producer.sendOneway(message);
     }
+
+    public ClientConfiguration getClientConfiguration() {
+        return clientConfiguration;
+    }
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/java/org/apache/eventmesh/connector/rocketmq/config/ClientConfigurationTest.java b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/java/org/apache/eventmesh/connector/rocketmq/config/ClientConfigurationTest.java
new file mode 100644
index 000000000..e2a4eba28
--- /dev/null
+++ b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/java/org/apache/eventmesh/connector/rocketmq/config/ClientConfigurationTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.eventmesh.connector.rocketmq.config;
+
+import org.apache.eventmesh.api.factory.ConnectorPluginFactory;
+import org.apache.eventmesh.connector.rocketmq.consumer.RocketMQConsumerImpl;
+import org.apache.eventmesh.connector.rocketmq.producer.RocketMQProducerImpl;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ClientConfigurationTest {
+
+    @Test
+    public void getConfigWhenRocketMQConsumerInit() {
+        RocketMQConsumerImpl consumer =
+                (RocketMQConsumerImpl) ConnectorPluginFactory.getMeshMQPushConsumer("rocketmq");
+
+        ClientConfiguration config = consumer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    @Test
+    public void getConfigWhenRocketMQProducerInit() {
+        RocketMQProducerImpl producer =
+                (RocketMQProducerImpl) ConnectorPluginFactory.getMeshMQProducer("rocketmq");
+
+        ClientConfiguration config = producer.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    private void assertConfig(ClientConfiguration config) {
+        Assert.assertEquals(config.namesrvAddr, "127.0.0.1:9876;127.0.0.1:9876");
+        Assert.assertEquals(config.clientUserName, "username-succeed!!!");
+        Assert.assertEquals(config.clientPass, "password-succeed!!!");
+        Assert.assertEquals(config.consumeThreadMin, Integer.valueOf(1816));
+        Assert.assertEquals(config.consumeThreadMax, Integer.valueOf(2816));
+        Assert.assertEquals(config.consumeQueueSize, Integer.valueOf(3816));
+        Assert.assertEquals(config.pullBatchSize, Integer.valueOf(4816));
+        Assert.assertEquals(config.ackWindow, Integer.valueOf(5816));
+        Assert.assertEquals(config.pubWindow, Integer.valueOf(6816));
+        Assert.assertEquals(config.consumeTimeout, 7816);
+        Assert.assertEquals(config.pollNameServerInterval, Integer.valueOf(8816));
+        Assert.assertEquals(config.heartbeatBrokerInterval, Integer.valueOf(9816));
+        Assert.assertEquals(config.rebalanceInterval, Integer.valueOf(11816));
+        Assert.assertEquals(config.clusterName, "cluster-succeed!!!");
+        Assert.assertEquals(config.accessKey, "accessKey-succeed!!!");
+        Assert.assertEquals(config.secretKey, "secretKey-succeed!!!");
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties
index 1261f30e2..e9e78992d 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties
+++ b/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties
@@ -16,3 +16,18 @@
 #
 #######################rocketmq-client##################
 eventMesh.server.rocketmq.namesrvAddr=127.0.0.1:9876;127.0.0.1:9876
+eventMesh.server.rocketmq.username=username-succeed!!!
+eventMesh.server.rocketmq.password=password-succeed!!!
+eventMesh.server.rocketmq.client.consumeThreadMin=1816
+eventMesh.server.rocketmq.client.consumeThreadMax=2816
+eventMesh.server.rocketmq.client.consumeThreadPoolQueueSize=3816
+eventMesh.server.rocketmq.client.pullBatchSize=4816
+eventMesh.server.rocketmq.client.ackwindow=5816
+eventMesh.server.rocketmq.client.pubwindow=6816
+eventMesh.server.rocketmq.client.comsumeTimeoutInMin=7816
+eventMesh.server.rocketmq.client.pollNameServerInterval=8816
+eventMesh.server.rocketmq.client.heartbeatBrokerInterval=9816
+eventMesh.server.rocketmq.client.rebalanceInterval=11816
+eventMesh.server.rocketmq.cluster=cluster-succeed!!!
+eventMesh.server.rocketmq.accessKey=accessKey-succeed!!!
+eventMesh.server.rocketmq.secretKey=secretKey-succeed!!!
\ No newline at end of file
diff --git a/eventmesh-examples/src/main/resources/application.properties b/eventmesh-examples/src/main/resources/application.properties
index 259e49e89..962106f5c 100644
--- a/eventmesh-examples/src/main/resources/application.properties
+++ b/eventmesh-examples/src/main/resources/application.properties
@@ -18,7 +18,7 @@ server.port=8088
 server.name=orderapp
 eventmesh.ip=127.0.0.1
 eventmesh.http.port=10105
-eventmesh.tcp.port=10000
+eventmesh.tcp.port=10002
 eventmesh.grpc.port=10205
 eventmesh.selector.type=nacos
 eventmesh.selector.nacos.address=127.0.0.1:8848
diff --git a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/build.gradle b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/build.gradle
index 2257341b3..237a1f8de 100644
--- a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/build.gradle
+++ b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/build.gradle
@@ -22,7 +22,7 @@ dependencies {
     implementation 'org.apache.commons:commons-lang3'
     implementation 'com.google.guava:guava'
 
-    // todo:Can we remove some dependency?
+    // todo: Can we remove some dependency?
     implementation 'io.opentelemetry:opentelemetry-api'
     implementation 'io.opentelemetry:opentelemetry-sdk'
     implementation 'io.opentelemetry:opentelemetry-sdk-metrics'
diff --git a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/main/java/org/apache/eventmesh/metrics/prometheus/PrometheusMetricsRegistry.java b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/main/java/org/apache/eventmesh/metrics/prometheus/PrometheusMetricsRegistry.java
index 60e5d587b..99e79923c 100644
--- a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/main/java/org/apache/eventmesh/metrics/prometheus/PrometheusMetricsRegistry.java
+++ b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/main/java/org/apache/eventmesh/metrics/prometheus/PrometheusMetricsRegistry.java
@@ -17,6 +17,7 @@
 
 package org.apache.eventmesh.metrics.prometheus;
 
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.metrics.api.MetricsRegistry;
 import org.apache.eventmesh.metrics.api.model.GrpcSummaryMetrics;
 import org.apache.eventmesh.metrics.api.model.HttpSummaryMetrics;
@@ -36,10 +37,16 @@ import io.prometheus.client.exporter.HTTPServer;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
+@Config(field = "prometheusConfiguration")
 public class PrometheusMetricsRegistry implements MetricsRegistry {
 
     private volatile HTTPServer prometheusHttpServer;
 
+    /**
+     * Unified configuration class corresponding to prometheus.properties
+     */
+    private PrometheusConfiguration prometheusConfiguration;
+
     @Override
     public void start() {
         if (prometheusHttpServer == null) {
@@ -48,7 +55,7 @@ public class PrometheusMetricsRegistry implements MetricsRegistry {
                     SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder().buildAndRegisterGlobal();
                     PrometheusCollector
                         .builder().setMetricProducer(sdkMeterProvider).buildAndRegister();
-                    int port = PrometheusConfiguration.getEventMeshPrometheusPort();
+                    int port = prometheusConfiguration.getEventMeshPrometheusPort();
                     try {
                         //Use the daemon thread to start an HTTP server to serve the default Prometheus registry.
                         prometheusHttpServer = new HTTPServer(port, true);
@@ -90,4 +97,8 @@ public class PrometheusMetricsRegistry implements MetricsRegistry {
     public void unRegister(Metric metric) {
         // todo: need to split the current metrics
     }
+
+    public PrometheusConfiguration getClientConfiguration() {
+        return this.prometheusConfiguration;
+    }
 }
diff --git a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/main/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfiguration.java b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/main/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfiguration.java
index eb76580dd..63e568830 100644
--- a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/main/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfiguration.java
+++ b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/main/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfiguration.java
@@ -17,62 +17,15 @@
 
 package org.apache.eventmesh.metrics.prometheus.config;
 
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.common.utils.PropertiesUtils;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
-import org.apache.commons.lang3.StringUtils;
+import lombok.Data;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@UtilityClass
+@Data
+@Config(prefix = "eventMesh.metrics.prometheus", path = "classPath://prometheus.properties")
 public class PrometheusConfiguration {
 
-    private static final String CONFIG_FILE = "prometheus.properties";
-    private static final Properties properties = new Properties();
-
+    @ConfigFiled(field = "port")
     private int eventMeshPrometheusPort = 19090;
-
-    static {
-        loadProperties();
-        initializeConfig();
-    }
-
-    public static int getEventMeshPrometheusPort() {
-        return eventMeshPrometheusPort;
-    }
-
-    private void initializeConfig() {
-        String eventMeshPrometheusPortStr = properties.getProperty("eventMesh.metrics.prometheus.port");
-        if (StringUtils.isNotEmpty(eventMeshPrometheusPortStr)) {
-            eventMeshPrometheusPort = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshPrometheusPortStr));
-        }
-    }
-
-    /**
-     * Load properties file from classpath and conf home.
-     * The properties defined in conf home will override classpath.
-     */
-    private void loadProperties() {
-        try (InputStream resourceAsStream = PrometheusConfiguration.class.getResourceAsStream(File.separator + CONFIG_FILE)) {
-            if (resourceAsStream != null) {
-                properties.load(resourceAsStream);
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(String.format("Load %s file from classpath error", CONFIG_FILE));
-        }
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + CONFIG_FILE;
-            PropertiesUtils.loadPropertiesWhenFileExist(properties, configPath);
-        } catch (IOException e) {
-            throw new IllegalArgumentException(String.format("Cannot load %s file from conf", CONFIG_FILE));
-        }
-    }
-
 }
diff --git a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfigurationTest.java b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfigurationTest.java
index 3afac9f25..0e076422d 100644
--- a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfigurationTest.java
+++ b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/java/org/apache/eventmesh/metrics/prometheus/config/PrometheusConfigurationTest.java
@@ -17,14 +17,24 @@
 
 package org.apache.eventmesh.metrics.prometheus.config;
 
+import org.apache.eventmesh.metrics.api.MetricsPluginFactory;
+import org.apache.eventmesh.metrics.prometheus.PrometheusMetricsRegistry;
+
 import org.junit.Assert;
 import org.junit.Test;
 
 public class PrometheusConfigurationTest {
 
     @Test
-    public void getEventMeshPrometheusPort() {
-        int eventMeshPrometheusPort = PrometheusConfiguration.getEventMeshPrometheusPort();
-        Assert.assertEquals(19090, eventMeshPrometheusPort);
+    public void getConfigWhenPrometheusMetricsRegistryInit() {
+        PrometheusMetricsRegistry registry =
+                (PrometheusMetricsRegistry) MetricsPluginFactory.getMetricsRegistry("prometheus");
+
+        PrometheusConfiguration config = registry.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    private void assertConfig(PrometheusConfiguration config) {
+        Assert.assertEquals(config.getEventMeshPrometheusPort(), 19091);
     }
 }
diff --git a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/resources/prometheus.properties b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/resources/prometheus.properties
index d4fb5a13c..dd5ec0b83 100644
--- a/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/resources/prometheus.properties
+++ b/eventmesh-metrics-plugin/eventmesh-metrics-prometheus/src/test/resources/prometheus.properties
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-eventMesh.metrics.prometheus.port=19090
\ No newline at end of file
+eventMesh.metrics.prometheus.port=19091
\ No newline at end of file
diff --git a/eventmesh-registry-plugin/eventmesh-registry-consul/src/test/java/ConsulRegistryServiceTest.java b/eventmesh-registry-plugin/eventmesh-registry-consul/src/test/java/ConsulRegistryServiceTest.java
index e4c5f3307..5d8eab163 100644
--- a/eventmesh-registry-plugin/eventmesh-registry-consul/src/test/java/ConsulRegistryServiceTest.java
+++ b/eventmesh-registry-plugin/eventmesh-registry-consul/src/test/java/ConsulRegistryServiceTest.java
@@ -48,7 +48,7 @@ public class ConsulRegistryServiceTest {
     @Before
     public void registryTest() {
         consulRegistryService = new ConsulRegistryService();
-        CommonConfiguration configuration = new CommonConfiguration(null);
+        CommonConfiguration configuration = new CommonConfiguration();
         ConfigurationContextUtil.putIfAbsent(ConfigurationContextUtil.HTTP, configuration);
         configuration.setNamesrvAddr("127.0.0.1:8500");
         Mockito.when(eventMeshRegisterInfo.getEventMeshClusterName()).thenReturn("eventmesh");
diff --git a/eventmesh-registry-plugin/eventmesh-registry-etcd/src/test/java/org/apache/eventmesh/registry/etcd/service/EtcdRegistryServiceTest.java b/eventmesh-registry-plugin/eventmesh-registry-etcd/src/test/java/org/apache/eventmesh/registry/etcd/service/EtcdRegistryServiceTest.java
index fb080b71b..e7406e0a9 100644
--- a/eventmesh-registry-plugin/eventmesh-registry-etcd/src/test/java/org/apache/eventmesh/registry/etcd/service/EtcdRegistryServiceTest.java
+++ b/eventmesh-registry-plugin/eventmesh-registry-etcd/src/test/java/org/apache/eventmesh/registry/etcd/service/EtcdRegistryServiceTest.java
@@ -48,7 +48,7 @@ public class EtcdRegistryServiceTest {
     @Before
     public void setUp() {
         etcdRegistryService = new EtcdRegistryService();
-        CommonConfiguration configuration = new CommonConfiguration(null);
+        CommonConfiguration configuration = new CommonConfiguration();
         configuration.setNamesrvAddr("127.0.0.1:2379");
         ConfigurationContextUtil.putIfAbsent(ConfigurationContextUtil.HTTP, configuration);
 
diff --git a/eventmesh-registry-plugin/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/service/NacosRegistryService.java b/eventmesh-registry-plugin/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/service/NacosRegistryService.java
index cc94d6161..428400f94 100644
--- a/eventmesh-registry-plugin/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/service/NacosRegistryService.java
+++ b/eventmesh-registry-plugin/eventmesh-registry-nacos/src/main/java/org/apache/eventmesh/registry/nacos/service/NacosRegistryService.java
@@ -79,6 +79,7 @@ public class NacosRegistryService implements RegistryService {
             if (StringUtils.isBlank(commonConfiguration.getNamesrvAddr())) {
                 throw new RegistryException("namesrvAddr cannot be null");
             }
+
             this.serverAddr = commonConfiguration.getNamesrvAddr();
             this.username = commonConfiguration.getEventMeshRegistryPluginUsername();
             this.password = commonConfiguration.getEventMeshRegistryPluginPassword();
diff --git a/eventmesh-registry-plugin/eventmesh-registry-nacos/src/test/java/org/apache/eventmesh/registry/nacos/service/NacosRegistryServiceTest.java b/eventmesh-registry-plugin/eventmesh-registry-nacos/src/test/java/org/apache/eventmesh/registry/nacos/service/NacosRegistryServiceTest.java
index e1a5fb3f6..d2e361a94 100644
--- a/eventmesh-registry-plugin/eventmesh-registry-nacos/src/test/java/org/apache/eventmesh/registry/nacos/service/NacosRegistryServiceTest.java
+++ b/eventmesh-registry-plugin/eventmesh-registry-nacos/src/test/java/org/apache/eventmesh/registry/nacos/service/NacosRegistryServiceTest.java
@@ -47,7 +47,7 @@ public class NacosRegistryServiceTest {
     @Before
     public void setUp() {
         nacosRegistryService = new NacosRegistryService();
-        CommonConfiguration configuration = new CommonConfiguration(null);
+        CommonConfiguration configuration = new CommonConfiguration();
         configuration.setNamesrvAddr("127.0.0.1");
         configuration.setEventMeshRegistryPluginPassword("nacos");
         configuration.setEventMeshRegistryPluginUsername("nacos");
diff --git a/eventmesh-registry-plugin/eventmesh-registry-zookeeper/src/test/java/org/apache/eventmesh/registry/zookeeper/service/ZookeeperRegistryServiceTest.java b/eventmesh-registry-plugin/eventmesh-registry-zookeeper/src/test/java/org/apache/eventmesh/registry/zookeeper/service/ZookeeperRegistryServiceTest.java
index a1337033e..99777f8c7 100644
--- a/eventmesh-registry-plugin/eventmesh-registry-zookeeper/src/test/java/org/apache/eventmesh/registry/zookeeper/service/ZookeeperRegistryServiceTest.java
+++ b/eventmesh-registry-plugin/eventmesh-registry-zookeeper/src/test/java/org/apache/eventmesh/registry/zookeeper/service/ZookeeperRegistryServiceTest.java
@@ -59,7 +59,7 @@ public class ZookeeperRegistryServiceTest {
         testingServer.start();
 
         zkRegistryService = new ZookeeperRegistryService();
-        CommonConfiguration configuration = new CommonConfiguration(null);
+        CommonConfiguration configuration = new CommonConfiguration();
         configuration.setNamesrvAddr("127.0.0.1:1500");
         configuration.setEventMeshName("eventmesh");
         ConfigurationContextUtil.putIfAbsent(ConfigurationContextUtil.HTTP, configuration);
diff --git a/eventmesh-runtime/conf/eventmesh.properties b/eventmesh-runtime/conf/eventmesh.properties
index 7a0cb514a..17bfab067 100644
--- a/eventmesh-runtime/conf/eventmesh.properties
+++ b/eventmesh-runtime/conf/eventmesh.properties
@@ -25,7 +25,7 @@ eventMesh.server.http.port=10105
 eventMesh.server.grpc.port=10205
 ########################## eventMesh tcp configuration ############################
 eventMesh.server.tcp.enabled=true
-eventMesh.server.tcp.port=10000
+eventMesh.server.tcp.port=10002
 eventMesh.server.tcp.readerIdleSeconds=120
 eventMesh.server.tcp.writerIdleSeconds=120
 eventMesh.server.tcp.allIdleSeconds=120
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ConfigurationHandler.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ConfigurationHandler.java
index a2b29f2ad..ee93ca5dd 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ConfigurationHandler.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ConfigurationHandler.java
@@ -96,11 +96,11 @@ public class ConfigurationHandler extends AbstractHttpHandler {
                 // TCP Configuration
                 eventMeshTCPConfiguration.eventMeshTcpServerPort,
                 // HTTP Configuration
-                eventMeshHTTPConfiguration.httpServerPort,
-                eventMeshHTTPConfiguration.eventMeshServerUseTls,
+                eventMeshHTTPConfiguration.getHttpServerPort(),
+                eventMeshHTTPConfiguration.isEventMeshServerUseTls(),
                 // gRPC Configuration
-                eventMeshGrpcConfiguration.grpcServerPort,
-                eventMeshGrpcConfiguration.eventMeshServerUseTls
+                eventMeshGrpcConfiguration.getGrpcServerPort(),
+                eventMeshGrpcConfiguration.isEventMeshServerUseTls()
             );
 
             String result = JsonUtils.toJson(getConfigurationResponse);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshGrpcBootstrap.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshGrpcBootstrap.java
index 6db1759b6..51a6ed5ee 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshGrpcBootstrap.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshGrpcBootstrap.java
@@ -17,7 +17,7 @@
 
 package org.apache.eventmesh.runtime.boot;
 
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.common.utils.ConfigurationContextUtil;
 import org.apache.eventmesh.runtime.configuration.EventMeshGrpcConfiguration;
 import org.apache.eventmesh.runtime.registry.Registry;
@@ -30,10 +30,12 @@ public class EventMeshGrpcBootstrap implements EventMeshBootstrap {
 
     private final Registry registry;
 
-    public EventMeshGrpcBootstrap(ConfigurationWrapper configurationWrapper, Registry registry) {
+    public EventMeshGrpcBootstrap(Registry registry) {
         this.registry = registry;
-        this.eventMeshGrpcConfiguration = new EventMeshGrpcConfiguration(configurationWrapper);
-        eventMeshGrpcConfiguration.init();
+
+        ConfigService configService = ConfigService.getInstance();
+        this.eventMeshGrpcConfiguration = configService.buildConfigInstance(EventMeshGrpcConfiguration.class);
+
         ConfigurationContextUtil.putIfAbsent(ConfigurationContextUtil.GRPC, eventMeshGrpcConfiguration);
     }
 
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshGrpcServer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshGrpcServer.java
index 66f99fd7b..089e66b17 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshGrpcServer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshGrpcServer.java
@@ -103,7 +103,7 @@ public class EventMeshGrpcServer {
 
         initHttpClientPool();
 
-        msgRateLimiter = RateLimiter.create(eventMeshGrpcConfiguration.eventMeshMsgReqNumPerSecond);
+        msgRateLimiter = RateLimiter.create(eventMeshGrpcConfiguration.getEventMeshMsgReqNumPerSecond());
 
         producerManager = new ProducerManager(this);
         producerManager.init();
@@ -114,7 +114,7 @@ public class EventMeshGrpcServer {
         grpcRetryer = new GrpcRetryer(this);
         grpcRetryer.init();
 
-        int serverPort = eventMeshGrpcConfiguration.grpcServerPort;
+        int serverPort = eventMeshGrpcConfiguration.getGrpcServerPort();
 
         server = ServerBuilder.forPort(serverPort)
             .addService(new ProducerService(this, sendMsgExecutor))
@@ -168,7 +168,7 @@ public class EventMeshGrpcServer {
         boolean registerResult = false;
         try {
             String endPoints = IPUtils.getLocalAddress()
-                + EventMeshConstants.IP_PORT_SEPARATOR + eventMeshGrpcConfiguration.grpcServerPort;
+                + EventMeshConstants.IP_PORT_SEPARATOR + eventMeshGrpcConfiguration.getGrpcServerPort();
             EventMeshRegisterInfo eventMeshRegisterInfo = new EventMeshRegisterInfo();
             eventMeshRegisterInfo.setEventMeshClusterName(eventMeshGrpcConfiguration.getEventMeshCluster());
             eventMeshRegisterInfo.setEventMeshName(eventMeshGrpcConfiguration.getEventMeshName() + "-"
@@ -185,7 +185,7 @@ public class EventMeshGrpcServer {
 
     private void unRegister() throws Exception {
         String endPoints = IPUtils.getLocalAddress()
-            + EventMeshConstants.IP_PORT_SEPARATOR + eventMeshGrpcConfiguration.grpcServerPort;
+            + EventMeshConstants.IP_PORT_SEPARATOR + eventMeshGrpcConfiguration.getGrpcServerPort();
         EventMeshUnRegisterInfo eventMeshUnRegisterInfo = new EventMeshUnRegisterInfo();
         eventMeshUnRegisterInfo.setEventMeshClusterName(eventMeshGrpcConfiguration.getEventMeshCluster());
         eventMeshUnRegisterInfo.setEventMeshName(eventMeshGrpcConfiguration.getEventMeshName());
@@ -240,29 +240,33 @@ public class EventMeshGrpcServer {
 
     private void initThreadPool() {
         BlockingQueue<Runnable> sendMsgThreadPoolQueue =
-            new LinkedBlockingQueue<Runnable>(eventMeshGrpcConfiguration.eventMeshServerSendMsgBlockQueueSize);
+            new LinkedBlockingQueue<Runnable>(eventMeshGrpcConfiguration.getEventMeshServerSendMsgBlockQueueSize());
 
-        sendMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(eventMeshGrpcConfiguration.eventMeshServerSendMsgThreadNum,
-            eventMeshGrpcConfiguration.eventMeshServerSendMsgThreadNum, sendMsgThreadPoolQueue,
-            "eventMesh-grpc-sendMsg-%d", true);
+        sendMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshGrpcConfiguration.getEventMeshServerSendMsgThreadNum(),
+                eventMeshGrpcConfiguration.getEventMeshServerSendMsgThreadNum(), sendMsgThreadPoolQueue,
+                "eventMesh-grpc-sendMsg-%d", true);
 
         BlockingQueue<Runnable> subscribeMsgThreadPoolQueue =
-            new LinkedBlockingQueue<Runnable>(eventMeshGrpcConfiguration.eventMeshServerSubscribeMsgBlockQueueSize);
+            new LinkedBlockingQueue<Runnable>(eventMeshGrpcConfiguration.getEventMeshServerSubscribeMsgBlockQueueSize());
 
-        clientMgmtExecutor = ThreadPoolFactory.createThreadPoolExecutor(eventMeshGrpcConfiguration.eventMeshServerSubscribeMsgThreadNum,
-            eventMeshGrpcConfiguration.eventMeshServerSubscribeMsgThreadNum, subscribeMsgThreadPoolQueue,
-            "eventMesh-grpc-clientMgmt-%d", true);
+        clientMgmtExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshGrpcConfiguration.getEventMeshServerSubscribeMsgThreadNum(),
+                eventMeshGrpcConfiguration.getEventMeshServerSubscribeMsgThreadNum(), subscribeMsgThreadPoolQueue,
+                "eventMesh-grpc-clientMgmt-%d", true);
 
         BlockingQueue<Runnable> pushMsgThreadPoolQueue =
-            new LinkedBlockingQueue<Runnable>(eventMeshGrpcConfiguration.eventMeshServerPushMsgBlockQueueSize);
+            new LinkedBlockingQueue<Runnable>(eventMeshGrpcConfiguration.getEventMeshServerPushMsgBlockQueueSize());
 
-        pushMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(eventMeshGrpcConfiguration.eventMeshServerPushMsgThreadNum,
-            eventMeshGrpcConfiguration.eventMeshServerPushMsgThreadNum, pushMsgThreadPoolQueue,
-            "eventMesh-grpc-pushMsg-%d", true);
+        pushMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshGrpcConfiguration.getEventMeshServerPushMsgThreadNum(),
+                eventMeshGrpcConfiguration.getEventMeshServerPushMsgThreadNum(), pushMsgThreadPoolQueue,
+                "eventMesh-grpc-pushMsg-%d", true);
 
-        replyMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(eventMeshGrpcConfiguration.eventMeshServerReplyMsgThreadNum,
-            eventMeshGrpcConfiguration.eventMeshServerReplyMsgThreadNum, sendMsgThreadPoolQueue,
-            "eventMesh-grpc-replyMsg-%d", true);
+        replyMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshGrpcConfiguration.getEventMeshServerReplyMsgThreadNum(),
+                eventMeshGrpcConfiguration.getEventMeshServerReplyMsgThreadNum(), sendMsgThreadPoolQueue,
+                "eventMesh-grpc-replyMsg-%d", true);
     }
 
     private void initHttpClientPool() {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java
index ec375a182..860b57f26 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java
@@ -116,7 +116,8 @@ public class EventMeshHTTPServer extends AbstractHTTPServer {
 
     public EventMeshHTTPServer(final EventMeshServer eventMeshServer,
                                final EventMeshHTTPConfiguration eventMeshHttpConfiguration) {
-        super(eventMeshHttpConfiguration.httpServerPort, eventMeshHttpConfiguration.eventMeshServerUseTls, eventMeshHttpConfiguration);
+        super(eventMeshHttpConfiguration.getHttpServerPort(),
+                eventMeshHttpConfiguration.isEventMeshServerUseTls(), eventMeshHttpConfiguration);
         this.eventMeshServer = eventMeshServer;
         this.eventMeshHttpConfiguration = eventMeshHttpConfiguration;
         this.registry = eventMeshServer.getRegistry();
@@ -140,47 +141,47 @@ public class EventMeshHTTPServer extends AbstractHTTPServer {
 
     private void initThreadPool() {
 
-        batchMsgExecutor =
-                ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerBatchMsgThreadNum,
-                        eventMeshHttpConfiguration.eventMeshServerBatchMsgThreadNum,
-                        new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.eventMeshServerBatchBlockQSize),
-                        "eventMesh-batchMsg-", true);
-
-        sendMsgExecutor =
-                ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerSendMsgThreadNum,
-                        eventMeshHttpConfiguration.eventMeshServerSendMsgThreadNum,
-                        new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.eventMeshServerSendMsgBlockQSize),
-                        "eventMesh-sendMsg-", true);
-
-        remoteMsgExecutor =
-                ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerRemoteMsgThreadNum,
-                        eventMeshHttpConfiguration.eventMeshServerRemoteMsgThreadNum,
-                        new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.eventMeshServerRemoteMsgBlockQSize),
-                        "eventMesh-remoteMsg-", true);
-
-        pushMsgExecutor =
-                ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerPushMsgThreadNum,
-                        eventMeshHttpConfiguration.eventMeshServerPushMsgThreadNum,
-                        new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.eventMeshServerPushMsgBlockQSize),
-                        "eventMesh-pushMsg-", true);
-
-        clientManageExecutor =
-                ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerClientManageThreadNum,
-                        eventMeshHttpConfiguration.eventMeshServerClientManageThreadNum,
-                        new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.eventMeshServerClientManageBlockQSize),
-                        "eventMesh-clientManage-", true);
-
-        adminExecutor =
-                ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerAdminThreadNum,
-                        eventMeshHttpConfiguration.eventMeshServerAdminThreadNum,
-                        new LinkedBlockingQueue<Runnable>(50), "eventMesh-admin-",
-                        true);
-
-        replyMsgExecutor =
-                ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerReplyMsgThreadNum,
-                        eventMeshHttpConfiguration.eventMeshServerReplyMsgThreadNum,
-                        new LinkedBlockingQueue<Runnable>(100),
-                        "eventMesh-replyMsg-", true);
+        batchMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshHttpConfiguration.getEventMeshServerBatchMsgThreadNum(),
+                eventMeshHttpConfiguration.getEventMeshServerBatchMsgThreadNum(),
+                new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.getEventMeshServerBatchBlockQSize()),
+                "eventMesh-batchMsg-", true);
+
+        sendMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshHttpConfiguration.getEventMeshServerSendMsgThreadNum(),
+                eventMeshHttpConfiguration.getEventMeshServerSendMsgThreadNum(),
+                new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.getEventMeshServerSendMsgBlockQSize()),
+                "eventMesh-sendMsg-", true);
+
+        remoteMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshHttpConfiguration.getEventMeshServerRemoteMsgThreadNum(),
+                eventMeshHttpConfiguration.getEventMeshServerRemoteMsgThreadNum(),
+                new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.getEventMeshServerRemoteMsgBlockQSize()),
+                "eventMesh-remoteMsg-", true);
+
+        pushMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshHttpConfiguration.getEventMeshServerPushMsgThreadNum(),
+                eventMeshHttpConfiguration.getEventMeshServerPushMsgThreadNum(),
+                new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.getEventMeshServerPushMsgBlockQSize()),
+                "eventMesh-pushMsg-", true);
+
+        clientManageExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshHttpConfiguration.getEventMeshServerClientManageThreadNum(),
+                eventMeshHttpConfiguration.getEventMeshServerClientManageThreadNum(),
+                new LinkedBlockingQueue<Runnable>(eventMeshHttpConfiguration.getEventMeshServerClientManageBlockQSize()),
+                "eventMesh-clientManage-", true);
+
+        adminExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshHttpConfiguration.getEventMeshServerAdminThreadNum(),
+                eventMeshHttpConfiguration.getEventMeshServerAdminThreadNum(),
+                new LinkedBlockingQueue<Runnable>(50), "eventMesh-admin-",
+                true);
+
+        replyMsgExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshHttpConfiguration.getEventMeshServerReplyMsgThreadNum(),
+                eventMeshHttpConfiguration.getEventMeshServerReplyMsgThreadNum(),
+                new LinkedBlockingQueue<Runnable>(100),
+                "eventMesh-replyMsg-", true);
     }
 
     public ThreadPoolExecutor getBatchMsgExecutor() {
@@ -227,8 +228,8 @@ public class EventMeshHTTPServer extends AbstractHTTPServer {
 
         initThreadPool();
 
-        msgRateLimiter = RateLimiter.create(eventMeshHttpConfiguration.eventMeshHttpMsgReqNumPerSecond);
-        batchRateLimiter = RateLimiter.create(eventMeshHttpConfiguration.eventMeshBatchMsgRequestNumPerSecond);
+        msgRateLimiter = RateLimiter.create(eventMeshHttpConfiguration.getEventMeshHttpMsgReqNumPerSecond());
+        batchRateLimiter = RateLimiter.create(eventMeshHttpConfiguration.getEventMeshBatchMsgRequestNumPerSecond());
 
         // The MetricsRegistry is singleton, so we can use factory method to get.
         final List<MetricsRegistry> metricsRegistries = Lists.newArrayList();
@@ -315,10 +316,11 @@ public class EventMeshHTTPServer extends AbstractHTTPServer {
         boolean registerResult = false;
         try {
             final String endPoints = IPUtils.getLocalAddress()
-                    + EventMeshConstants.IP_PORT_SEPARATOR + eventMeshHttpConfiguration.httpServerPort;
+                    + EventMeshConstants.IP_PORT_SEPARATOR + eventMeshHttpConfiguration.getHttpServerPort();
             final EventMeshRegisterInfo eventMeshRegisterInfo = new EventMeshRegisterInfo();
             eventMeshRegisterInfo.setEventMeshClusterName(eventMeshHttpConfiguration.getEventMeshCluster());
-            eventMeshRegisterInfo.setEventMeshName(eventMeshHttpConfiguration.getEventMeshName() + "-" + ConfigurationContextUtil.HTTP);
+            eventMeshRegisterInfo.setEventMeshName(eventMeshHttpConfiguration.getEventMeshName()
+                    + "-" + ConfigurationContextUtil.HTTP);
             eventMeshRegisterInfo.setEndPoint(endPoints);
             eventMeshRegisterInfo.setProtocolType(ConfigurationContextUtil.HTTP);
             registerResult = registry.register(eventMeshRegisterInfo);
@@ -331,7 +333,7 @@ public class EventMeshHTTPServer extends AbstractHTTPServer {
 
     private void unRegister() throws Exception {
         final String endPoints = IPUtils.getLocalAddress()
-                + EventMeshConstants.IP_PORT_SEPARATOR + eventMeshHttpConfiguration.httpServerPort;
+                + EventMeshConstants.IP_PORT_SEPARATOR + eventMeshHttpConfiguration.getHttpServerPort();
         final EventMeshUnRegisterInfo eventMeshUnRegisterInfo = new EventMeshUnRegisterInfo();
         eventMeshUnRegisterInfo.setEventMeshClusterName(eventMeshHttpConfiguration.getEventMeshCluster());
         eventMeshUnRegisterInfo.setEventMeshName(eventMeshHttpConfiguration.getEventMeshName());
@@ -394,14 +396,13 @@ public class EventMeshHTTPServer extends AbstractHTTPServer {
 
     private void initWebhook() throws Exception {
 
-        webhookExecutor =
-                ThreadPoolFactory.createThreadPoolExecutor(eventMeshHttpConfiguration.eventMeshServerWebhookThreadNum,
-                        eventMeshHttpConfiguration.eventMeshServerWebhookThreadNum, new LinkedBlockingQueue<Runnable>(100),
-                        "eventMesh-webhook-", true);
+        webhookExecutor = ThreadPoolFactory.createThreadPoolExecutor(
+                eventMeshHttpConfiguration.getEventMeshServerWebhookThreadNum(),
+                eventMeshHttpConfiguration.getEventMeshServerWebhookThreadNum(),
+                new LinkedBlockingQueue<Runnable>(100), "eventMesh-webhook-", true);
         final WebHookProcessor webHookProcessor = new WebHookProcessor();
 
         final WebHookController webHookController = new WebHookController();
-        webHookController.setConfigurationWrapper(eventMeshHttpConfiguration.getConfigurationWrapper());
         webHookController.init();
         webHookProcessor.setWebHookController(webHookController);
         this.getHandlerService().register(webHookProcessor, webhookExecutor);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHttpBootstrap.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHttpBootstrap.java
index 94a87cb09..d478400b7 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHttpBootstrap.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshHttpBootstrap.java
@@ -17,7 +17,7 @@
 
 package org.apache.eventmesh.runtime.boot;
 
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.common.utils.ConfigurationContextUtil;
 import org.apache.eventmesh.runtime.configuration.EventMeshHTTPConfiguration;
 import org.apache.eventmesh.runtime.registry.Registry;
@@ -32,15 +32,14 @@ public class EventMeshHttpBootstrap implements EventMeshBootstrap {
 
     private final Registry registry;
 
-    public EventMeshHttpBootstrap(EventMeshServer eventMeshServer,
-                                  ConfigurationWrapper configurationWrapper,
-                                  Registry registry) {
+    public EventMeshHttpBootstrap(EventMeshServer eventMeshServer, Registry registry) {
         this.eventMeshServer = eventMeshServer;
         this.registry = registry;
-        this.eventMeshHttpConfiguration = new EventMeshHTTPConfiguration(configurationWrapper);
-        eventMeshHttpConfiguration.init();
-        ConfigurationContextUtil.putIfAbsent(ConfigurationContextUtil.HTTP, eventMeshHttpConfiguration);
 
+        ConfigService configService = ConfigService.getInstance();
+        this.eventMeshHttpConfiguration = configService.buildConfigInstance(EventMeshHTTPConfiguration.class);
+
+        ConfigurationContextUtil.putIfAbsent(ConfigurationContextUtil.HTTP, eventMeshHttpConfiguration);
     }
 
     @Override
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java
index 1167d9df6..a6595a70e 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java
@@ -18,7 +18,7 @@
 package org.apache.eventmesh.runtime.boot;
 
 import org.apache.eventmesh.common.config.CommonConfiguration;
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.common.utils.ConfigurationContextUtil;
 import org.apache.eventmesh.runtime.acl.Acl;
 import org.apache.eventmesh.runtime.admin.controller.ClientManageController;
@@ -57,28 +57,26 @@ public class EventMeshServer {
 
     private static final String SERVER_STATE_MSG = "server state:{}";
 
-    public EventMeshServer(final ConfigurationWrapper configurationWrapper) throws Exception {
-        CommonConfiguration configuration = new CommonConfiguration(configurationWrapper);
-        configuration.init();
-        this.configuration = configuration;
+    public EventMeshServer() throws Exception {
+        ConfigService configService = ConfigService.getInstance();
+        this.configuration = configService.buildConfigInstance(CommonConfiguration.class);
+
         this.acl = new Acl();
         this.registry = new Registry();
         trace = new Trace(configuration.isEventMeshServerTraceEnable());
         this.connectorResource = new ConnectorResource();
+        trace = new Trace(configuration.isEventMeshServerTraceEnable());
 
         final List<String> provideServerProtocols = configuration.getEventMeshProvideServerProtocols();
         for (final String provideServerProtocol : provideServerProtocols) {
             if (ConfigurationContextUtil.HTTP.equals(provideServerProtocol)) {
-                BOOTSTRAP_LIST.add(new EventMeshHttpBootstrap(this,
-                        configurationWrapper, registry));
+                BOOTSTRAP_LIST.add(new EventMeshHttpBootstrap(this, registry));
             }
             if (ConfigurationContextUtil.TCP.equals(provideServerProtocol)) {
-                BOOTSTRAP_LIST.add(new EventMeshTcpBootstrap(this,
-                        configurationWrapper, registry));
+                BOOTSTRAP_LIST.add(new EventMeshTcpBootstrap(this, registry));
             }
             if (ConfigurationContextUtil.GRPC.equals(provideServerProtocol)) {
-                BOOTSTRAP_LIST.add(new EventMeshGrpcBootstrap(configurationWrapper,
-                        registry));
+                BOOTSTRAP_LIST.add(new EventMeshGrpcBootstrap(registry));
             }
         }
 
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshStartup.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshStartup.java
index 33622a585..986726c92 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshStartup.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshStartup.java
@@ -17,9 +17,11 @@
 
 package org.apache.eventmesh.runtime.boot;
 
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.runtime.constants.EventMeshConstants;
 
+import java.io.File;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -29,9 +31,11 @@ public class EventMeshStartup {
 
     public static void main(String[] args) throws Exception {
         try {
-            final EventMeshServer server = new EventMeshServer(
-                    new ConfigurationWrapper(EventMeshConstants.EVENTMESH_CONF_HOME,
-                    EventMeshConstants.EVENTMESH_CONF_FILE, false));
+            ConfigService.getInstance()
+                .setConfigPath(EventMeshConstants.EVENTMESH_CONF_HOME + File.separator)
+                .setRootConfig(EventMeshConstants.EVENTMESH_CONF_FILE);
+
+            EventMeshServer server = new EventMeshServer();
             server.start();
             Runtime.getRuntime().addShutdownHook(new Thread(() -> {
                 try {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
index c91c1346f..cc990db04 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java
@@ -207,7 +207,6 @@ public class EventMeshTCPServer extends AbstractRemotingServer {
 
 
         adminWebHookConfigOperationManage = new AdminWebHookConfigOperationManage();
-        adminWebHookConfigOperationManage.setConfigurationWrapper(eventMeshTCPConfiguration.getConfigurationWrapper());
         adminWebHookConfigOperationManage.init();
 
 
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTcpBootstrap.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTcpBootstrap.java
index fce57708c..eecbd1cf2 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTcpBootstrap.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshTcpBootstrap.java
@@ -17,7 +17,7 @@
 
 package org.apache.eventmesh.runtime.boot;
 
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.common.utils.ConfigurationContextUtil;
 import org.apache.eventmesh.runtime.configuration.EventMeshTCPConfiguration;
 import org.apache.eventmesh.runtime.registry.Registry;
@@ -32,15 +32,14 @@ public class EventMeshTcpBootstrap implements EventMeshBootstrap {
 
     private final Registry registry;
 
-    public EventMeshTcpBootstrap(EventMeshServer eventMeshServer,
-                                 ConfigurationWrapper configurationWrapper,
-                                 Registry registry) {
+    public EventMeshTcpBootstrap(EventMeshServer eventMeshServer, Registry registry) {
         this.eventMeshServer = eventMeshServer;
         this.registry = registry;
-        this.eventMeshTcpConfiguration = new EventMeshTCPConfiguration(configurationWrapper);
-        eventMeshTcpConfiguration.init();
-        ConfigurationContextUtil.putIfAbsent(ConfigurationContextUtil.TCP, eventMeshTcpConfiguration);
 
+        ConfigService configService = ConfigService.getInstance();
+        this.eventMeshTcpConfiguration = configService.buildConfigInstance(EventMeshTCPConfiguration.class);
+
+        ConfigurationContextUtil.putIfAbsent(ConfigurationContextUtil.TCP, eventMeshTcpConfiguration);
     }
 
     @Override
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/SSLContextFactory.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/SSLContextFactory.java
index 3132c094b..f11bb3aa3 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/SSLContextFactory.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/SSLContextFactory.java
@@ -58,9 +58,9 @@ public class SSLContextFactory {
         try (InputStream inputStream = Files.newInputStream(Paths.get(EventMeshConstants.EVENTMESH_CONF_HOME
                 + File.separator
                 + fileName), StandardOpenOption.READ)) {
-            protocol = eventMeshHttpConfiguration.eventMeshServerSSLProtocol;
-            fileName = eventMeshHttpConfiguration.eventMeshServerSSLCer;
-            password = eventMeshHttpConfiguration.eventMeshServerSSLPass;
+            protocol = eventMeshHttpConfiguration.getEventMeshServerSSLProtocol();
+            fileName = eventMeshHttpConfiguration.getEventMeshServerSSLCer();
+            password = eventMeshHttpConfiguration.getEventMeshServerSSLPass();
 
             char[] filePass = StringUtils.isNotBlank(password) ? password.toCharArray() : new char[0];
             final KeyStore keyStore = KeyStore.getInstance("JKS");
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshGrpcConfiguration.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshGrpcConfiguration.java
index 65142f632..20916e41e 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshGrpcConfiguration.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshGrpcConfiguration.java
@@ -18,240 +18,93 @@
 package org.apache.eventmesh.runtime.configuration;
 
 import org.apache.eventmesh.common.config.CommonConfiguration;
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 import org.apache.eventmesh.common.utils.IPUtils;
 
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.base.Preconditions;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
+@Data
+@NoArgsConstructor
+@Config(prefix = "eventMesh.server")
 public class EventMeshGrpcConfiguration extends CommonConfiguration {
 
-    public int grpcServerPort = 10205;
-
-    public int eventMeshSessionExpiredInMills = 60000;
-
-    public boolean eventMeshServerBatchMsgBatchEnabled = Boolean.TRUE;
-
-    public int eventMeshServerBatchMsgThreadNum = 10;
-
-    public int eventMeshServerSendMsgThreadNum = 8;
-
-    public int eventMeshServerPushMsgThreadNum = 8;
-
-    public int eventMeshServerReplyMsgThreadNum = 8;
-
-    public int eventMeshServerSubscribeMsgThreadNum = 4;
-
-    public int eventMeshServerRegistryThreadNum = 10;
-
-    public int eventMeshServerAdminThreadNum = 2;
-
-    public int eventMeshServerRetryThreadNum = 2;
-
-    public int eventMeshServerPullRegistryInterval = 30000;
-
-    public int eventMeshServerAsyncAccumulationThreshold = 1000;
-
-    public int eventMeshServerRetryBlockQueueSize = 10000;
-
-    public int eventMeshServerBatchBlockQueueSize = 1000;
-
-    public int eventMeshServerSendMsgBlockQueueSize = 1000;
-
-    public int eventMeshServerPushMsgBlockQueueSize = 1000;
-
-    public int eventMeshServerSubscribeMsgBlockQueueSize = 1000;
-
-    public int eventMeshServerBusyCheckInterval = 1000;
-
-    public boolean eventMeshServerConsumerEnabled = false;
-
-    public boolean eventMeshServerUseTls = false;
-
-    public int eventMeshBatchMsgRequestNumPerSecond = 20000;
-
-    public int eventMeshMsgReqNumPerSecond = 15000;
-
-    public String eventMeshIp = IPUtils.getLocalAddress();
-
-    public EventMeshGrpcConfiguration(ConfigurationWrapper configurationWrapper) {
-        super(configurationWrapper);
-    }
-
-    @Override
-    public void init() {
-        super.init();
-
-        if (configurationWrapper != null) {
-            String httpServerPortStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_GRPC_PORT);
-            Preconditions.checkState(StringUtils.isNotEmpty(httpServerPortStr) && StringUtils.isNumeric(httpServerPortStr),
-                String.format("%s error", ConfKeys.KEYS_EVENTMESH_SERVER_GRPC_PORT));
-            grpcServerPort = Integer.parseInt(StringUtils.deleteWhitespace(httpServerPortStr));
-
-            String eventMeshServerBatchMsgThreadNumStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_BATCHMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerBatchMsgThreadNumStr) && StringUtils.isNumeric(eventMeshServerBatchMsgThreadNumStr)) {
-                eventMeshServerBatchMsgThreadNum = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerBatchMsgThreadNumStr));
-            }
-
-            String eventMeshTcpSessionExpiredInMillsStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_SESSION_EXPIRED_TIME);
-            if (StringUtils.isNotEmpty(eventMeshTcpSessionExpiredInMillsStr) && StringUtils.isNumeric(eventMeshTcpSessionExpiredInMillsStr)) {
-                eventMeshSessionExpiredInMills = Integer.parseInt(eventMeshTcpSessionExpiredInMillsStr);
-            }
-
-            String eventMeshServerBatchMsgReqNumPerSecondStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_BATCHMSG_REQ_NUM_PER_SECOND);
-            if (StringUtils.isNotEmpty(eventMeshServerBatchMsgReqNumPerSecondStr)
-                && StringUtils.isNumeric(eventMeshServerBatchMsgReqNumPerSecondStr)) {
-                eventMeshBatchMsgRequestNumPerSecond = Integer.parseInt(eventMeshServerBatchMsgReqNumPerSecondStr);
-            }
-
-            String eventMeshServerBatchMsgBatchEnableStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_BATCHMSG_BATCH_ENABLED);
-            if (StringUtils.isNotBlank(eventMeshServerBatchMsgBatchEnableStr)) {
-                eventMeshServerBatchMsgBatchEnabled = Boolean.parseBoolean(eventMeshServerBatchMsgBatchEnableStr);
-            }
-
-            String eventMeshServerAsyncAccumulationThresholdStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ASYNC_ACCUMULATION_THRESHOLD);
-            if (StringUtils.isNotEmpty(eventMeshServerAsyncAccumulationThresholdStr)
-                && StringUtils.isNumeric(eventMeshServerAsyncAccumulationThresholdStr)) {
-                eventMeshServerAsyncAccumulationThreshold = Integer.parseInt(
-                    StringUtils.deleteWhitespace(eventMeshServerAsyncAccumulationThresholdStr));
-            }
-
-            String eventMeshServerSendMsgThreadNumStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_SENDMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerSendMsgThreadNumStr) && StringUtils.isNumeric(eventMeshServerSendMsgThreadNumStr)) {
-                eventMeshServerSendMsgThreadNum = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerSendMsgThreadNumStr));
-            }
-
-            String eventMeshServerReplyMsgThreadNumStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_REPLYMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerReplyMsgThreadNumStr) && StringUtils.isNumeric(eventMeshServerReplyMsgThreadNumStr)) {
-                eventMeshServerReplyMsgThreadNum = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerReplyMsgThreadNumStr));
-            }
-
-            String eventMeshServerPushMsgThreadNumStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_PUSHMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerPushMsgThreadNumStr) && StringUtils.isNumeric(eventMeshServerPushMsgThreadNumStr)) {
-                eventMeshServerPushMsgThreadNum = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerPushMsgThreadNumStr));
-            }
-
-            String eventMeshServerRegistryThreadNumStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_REGISTRY_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerRegistryThreadNumStr) && StringUtils.isNumeric(eventMeshServerRegistryThreadNumStr)) {
-                eventMeshServerRegistryThreadNum = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerRegistryThreadNumStr));
-            }
-
-            String eventMeshServerClientManageThreadNumStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_CLIENTMANAGE_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerClientManageThreadNumStr) && StringUtils.isNumeric(eventMeshServerClientManageThreadNumStr)) {
-                eventMeshServerSubscribeMsgThreadNum = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerClientManageThreadNumStr));
-            }
+    @ConfigFiled(field = "grpc.port", notNull = true, beNumber = true)
+    private int grpcServerPort = 10205;
 
-            String eventMeshServerPullRegistryIntervalStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_PULL_REGISTRY_INTERVAL);
-            if (StringUtils.isNotEmpty(eventMeshServerPullRegistryIntervalStr) && StringUtils.isNumeric(eventMeshServerPullRegistryIntervalStr)) {
-                eventMeshServerPullRegistryInterval = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerPullRegistryIntervalStr));
-            }
-
-            String eventMeshServerAdminThreadNumStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ADMIN_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerAdminThreadNumStr) && StringUtils.isNumeric(eventMeshServerAdminThreadNumStr)) {
-                eventMeshServerAdminThreadNum = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerAdminThreadNumStr));
-            }
-
-            String eventMeshServerRetryBlockQueueSizeStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_RETRY_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerRetryBlockQueueSizeStr) && StringUtils.isNumeric(eventMeshServerRetryBlockQueueSizeStr)) {
-                eventMeshServerRetryBlockQueueSize = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerRetryBlockQueueSizeStr));
-            }
-
-            String eventMeshServerBatchBlockQueueSizeStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_BATCHMSG_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerBatchBlockQueueSizeStr) && StringUtils.isNumeric(eventMeshServerBatchBlockQueueSizeStr)) {
-                eventMeshServerBatchBlockQueueSize = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerBatchBlockQueueSizeStr));
-            }
-
-            String eventMeshServerSendMsgBlockQueueSizeStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_SENDMSG_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerSendMsgBlockQueueSizeStr) && StringUtils.isNumeric(eventMeshServerSendMsgBlockQueueSizeStr)) {
-                eventMeshServerSendMsgBlockQueueSize = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerSendMsgBlockQueueSizeStr));
-            }
-
-            String eventMeshServerPushMsgBlockQueueSizeStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_PUSHMSG_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerPushMsgBlockQueueSizeStr) && StringUtils.isNumeric(eventMeshServerPushMsgBlockQueueSizeStr)) {
-                eventMeshServerPushMsgBlockQueueSize = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerPushMsgBlockQueueSizeStr));
-            }
-
-            String eventMeshServerClientManageBlockQueueSizeStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_CLIENTM_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerClientManageBlockQueueSizeStr)
-                && StringUtils.isNumeric(eventMeshServerClientManageBlockQueueSizeStr)) {
-                eventMeshServerSubscribeMsgBlockQueueSize = Integer.parseInt(
-                    StringUtils.deleteWhitespace(eventMeshServerClientManageBlockQueueSizeStr));
-            }
-
-            String eventMeshServerBusyCheckIntervalStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_BUSY_CHECK_INTERVAL);
-            if (StringUtils.isNotEmpty(eventMeshServerBusyCheckIntervalStr) && StringUtils.isNumeric(eventMeshServerBusyCheckIntervalStr)) {
-                eventMeshServerBusyCheckInterval = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerBusyCheckIntervalStr));
-            }
-
-            String eventMeshServerConsumerEnabledStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_CONSUMER_ENABLED);
-            if (StringUtils.isNotEmpty(eventMeshServerConsumerEnabledStr)) {
-                eventMeshServerConsumerEnabled = Boolean.parseBoolean(StringUtils.deleteWhitespace(eventMeshServerConsumerEnabledStr));
-            }
-
-            String eventMeshServerRetryThreadNumStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_RETRY_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerRetryThreadNumStr) && StringUtils.isNumeric(eventMeshServerRetryThreadNumStr)) {
-                eventMeshServerRetryThreadNum = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerRetryThreadNumStr));
-            }
-
-            String eventMeshServerUseTlsStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_TLS_ENABLED);
-            if (StringUtils.isNotEmpty(eventMeshServerUseTlsStr)) {
-                eventMeshServerUseTls = Boolean.parseBoolean(StringUtils.deleteWhitespace(eventMeshServerUseTlsStr));
-            }
-
-            String eventMeshMsgReqNumPerSecondStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_SERVER_MSG_REQ_NUM_PER_SECOND);
-            if (StringUtils.isNotEmpty(eventMeshMsgReqNumPerSecondStr) && StringUtils.isNumeric(eventMeshMsgReqNumPerSecondStr)) {
-                eventMeshMsgReqNumPerSecond = Integer.parseInt(eventMeshMsgReqNumPerSecondStr);
-            }
-        }
-    }
+    @ConfigFiled(field = "session.expiredInMills")
+    private int eventMeshSessionExpiredInMills = 60000;
 
-    static class ConfKeys {
+    @ConfigFiled(field = "batchmsg.batch.enabled")
+    private boolean eventMeshServerBatchMsgBatchEnabled = Boolean.TRUE;
 
-        public static final String KEYS_EVENTMESH_SERVER_GRPC_PORT = "eventMesh.server.grpc.port";
+    @ConfigFiled(field = "batchmsg.threads.num")
+    private int eventMeshServerBatchMsgThreadNum = 10;
 
-        public static final String KEYS_EVENTMESH_SERVER_SESSION_EXPIRED_TIME = "eventMesh.server.session.expiredInMills";
+    @ConfigFiled(field = "sendmsg.threads.num")
+    private int eventMeshServerSendMsgThreadNum = 8;
 
-        public static final String KEYS_EVENTMESH_BATCHMSG_THREAD_NUM = "eventMesh.server.batchmsg.threads.num";
+    @ConfigFiled(field = "pushmsg.threads.num")
+    private int eventMeshServerPushMsgThreadNum = 8;
 
-        public static final String KEYS_EVENTMESH_BATCHMSG_REQ_NUM_PER_SECOND = "eventMesh.server.batchmsg.reqNumPerSecond";
+    @ConfigFiled(field = "replymsg.threads.num")
+    private int eventMeshServerReplyMsgThreadNum = 8;
 
-        public static final String KEYS_EVENTMESH_BATCHMSG_BATCH_ENABLED = "eventMesh.server.batchmsg.batch.enabled";
+    @ConfigFiled(field = "clientmanage.threads.num")
+    private int eventMeshServerSubscribeMsgThreadNum = 4;
 
-        public static final String KEYS_EVENTMESH_ASYNC_ACCUMULATION_THRESHOLD = "eventMesh.server.async.accumulation.threshold";
+    @ConfigFiled(field = "registry.threads.num")
+    private int eventMeshServerRegistryThreadNum = 10;
 
-        public static final String KEY_EVENTMESH_BUSY_CHECK_INTERVAL = "eventMesh.server.busy.check.interval";
+    @ConfigFiled(field = "admin.threads.num")
+    private int eventMeshServerAdminThreadNum = 2;
 
-        public static final String KEYS_EVENTMESH_SENDMSG_THREAD_NUM = "eventMesh.server.sendmsg.threads.num";
+    @ConfigFiled(field = "retry.threads.num")
+    private int eventMeshServerRetryThreadNum = 2;
 
-        public static final String KEYS_EVENTMESH_REPLYMSG_THREAD_NUM = "eventMesh.server.replymsg.threads.num";
+    @ConfigFiled(field = "pull.registry.interval")
+    private int eventMeshServerPullRegistryInterval = 30000;
 
-        public static final String KEYS_EVENTMESH_PUSHMSG_THREAD_NUM = "eventMesh.server.pushmsg.threads.num";
+    @ConfigFiled(field = "async.accumulation.threshold")
+    private int eventMeshServerAsyncAccumulationThreshold = 1000;
 
-        public static final String KEYS_EVENTMESH_REGISTRY_THREAD_NUM = "eventMesh.server.registry.threads.num";
+    @ConfigFiled(field = "retry.blockQ.size")
+    private int eventMeshServerRetryBlockQueueSize = 10000;
 
-        public static final String KEYS_EVENTMESH_CLIENTMANAGE_THREAD_NUM = "eventMesh.server.clientmanage.threads.num";
+    @ConfigFiled(field = "batchmsg.blockQ.size")
+    private int eventMeshServerBatchBlockQueueSize = 1000;
 
-        public static final String KEYS_EVENTMESH_ADMIN_THREAD_NUM = "eventMesh.server.admin.threads.num";
+    @ConfigFiled(field = "sendmsg.blockQ.size")
+    private int eventMeshServerSendMsgBlockQueueSize = 1000;
 
-        public static final String KEY_EVENTMESH_RETRY_THREAD_NUM = "eventMesh.server.retry.threads.num";
+    @ConfigFiled(field = "pushmsg.blockQ.size")
+    private int eventMeshServerPushMsgBlockQueueSize = 1000;
 
-        public static final String KEYS_EVENTMESH_PULL_REGISTRY_INTERVAL = "eventMesh.server.pull.registry.interval";
+    @ConfigFiled(field = "clientM.blockQ.size")
+    private int eventMeshServerSubscribeMsgBlockQueueSize = 1000;
 
-        public static final String KEY_EVENTMESH_RETRY_BLOCKQ_SIZE = "eventMesh.server.retry.blockQ.size";
+    @ConfigFiled(field = "busy.check.interval")
+    private int eventMeshServerBusyCheckInterval = 1000;
 
-        public static final String KEY_EVENTMESH_BATCHMSG_BLOCKQ_SIZE = "eventMesh.server.batchmsg.blockQ.size";
+    @ConfigFiled(field = "consumer.enabled")
+    private boolean eventMeshServerConsumerEnabled = false;
 
-        public static final String KEY_EVENTMESH_SENDMSG_BLOCKQ_SIZE = "eventMesh.server.sendmsg.blockQ.size";
+    @ConfigFiled(field = "useTls.enabled")
+    private boolean eventMeshServerUseTls = false;
 
-        public static final String KEY_EVENTMESH_PUSHMSG_BLOCKQ_SIZE = "eventMesh.server.pushmsg.blockQ.size";
+    @ConfigFiled(field = "batchmsg.reqNumPerSecond")
+    private int eventMeshBatchMsgRequestNumPerSecond = 20000;
 
-        public static final String KEY_EVENTMESH_CLIENTM_BLOCKQ_SIZE = "eventMesh.server.clientM.blockQ.size";
+    @ConfigFiled(field = "http.msgReqnumPerSecond")
+    private int eventMeshMsgReqNumPerSecond = 15000;
 
-        public static final String KEY_EVENTMESH_CONSUMER_ENABLED = "eventMesh.server.consumer.enabled";
+    @ConfigFiled(field = "", reload = true)
+    private String eventMeshIp;
 
-        public static final String KEY_EVENTMESH_TLS_ENABLED = "eventMesh.server.useTls.enabled";
+    public void reload() {
+        super.reload();
 
-        public static final String KEY_EVENTMESH_SERVER_MSG_REQ_NUM_PER_SECOND = "eventMesh.server.http.msgReqnumPerSecond";
+        this.eventMeshIp = IPUtils.getLocalAddress();
     }
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshHTTPConfiguration.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshHTTPConfiguration.java
index f0415a7fa..226827e9b 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshHTTPConfiguration.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshHTTPConfiguration.java
@@ -18,389 +18,115 @@
 package org.apache.eventmesh.runtime.configuration;
 
 import org.apache.eventmesh.common.config.CommonConfiguration;
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
-
-import org.apache.commons.lang3.StringUtils;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
 import java.util.Collections;
 import java.util.List;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import inet.ipaddr.IPAddress;
-import inet.ipaddr.IPAddressString;
 
+@Data
+@NoArgsConstructor
+@Config(prefix = "eventMesh.server")
 public class EventMeshHTTPConfiguration extends CommonConfiguration {
 
-    public static final Logger logger = LoggerFactory.getLogger(EventMeshHTTPConfiguration.class);
-
-    public int httpServerPort = 10105;
-
-    public boolean eventMeshServerBatchMsgBatchEnabled = Boolean.TRUE;
-
-    public int eventMeshServerBatchMsgThreadNum = 10;
-
-    public int eventMeshServerSendMsgThreadNum = 8;
-
-    public int eventMeshServerRemoteMsgThreadNum = 8;
-
-    public int eventMeshServerPushMsgThreadNum = 8;
-
-    public int eventMeshServerReplyMsgThreadNum = 8;
-
-    public int eventMeshServerClientManageThreadNum = 4;
-
-    public int eventMeshServerRegistryThreadNum = 10;
-
-    public int eventMeshServerAdminThreadNum = 2;
-
-    public int eventMeshServerRetryThreadNum = 2;
-    
-    public int eventMeshServerWebhookThreadNum = 4;
-
-    public int eventMeshServerPullRegistryInterval = 30000;
-
-    public int eventMeshServerAsyncAccumulationThreshold = 1000;
-
-    public int eventMeshServerRetryBlockQSize = 10000;
-
-    public int eventMeshServerBatchBlockQSize = 1000;
-
-    public int eventMeshServerSendMsgBlockQSize = 1000;
-
-    public int eventMeshServerRemoteMsgBlockQSize = 1000;
-
-    public int eventMeshServerPushMsgBlockQSize = 1000;
-
-    public int eventMeshServerClientManageBlockQSize = 1000;
-
-    public int eventMeshServerBusyCheckInterval = 1000;
-
-    public boolean eventMeshServerConsumerEnabled = false;
-
-    public boolean eventMeshServerUseTls = false;
-
-    public String eventMeshServerSSLProtocol = "TLSv1.1";
-
-    public String eventMeshServerSSLCer = "sChat2.jks";
-
-    public String eventMeshServerSSLPass = "sNetty";
-
-    public int eventMeshHttpMsgReqNumPerSecond = 15000;
-
-    public int eventMeshBatchMsgRequestNumPerSecond = 20000;
-
-    public int eventMeshEventSize = 1000;
-
-    public int eventMeshEventBatchSize = 10;
-
-    public List<IPAddress> eventMeshIpv4BlackList = Collections.emptyList();
-
-    public List<IPAddress> eventMeshIpv6BlackList = Collections.emptyList();
-
-    public EventMeshHTTPConfiguration(ConfigurationWrapper configurationWrapper) {
-        super(configurationWrapper);
-    }
-
-    @Override
-    public void init() {
-        super.init();
-
-        if (configurationWrapper != null) {
-            String httpServerPortStr = configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_SERVER_HTTP_PORT);
-            Preconditions.checkState(StringUtils.isNotEmpty(httpServerPortStr)
-                    && StringUtils.isNumeric(httpServerPortStr), String.format("%s error", ConfKeys.KEYS_EVENTMESH_SERVER_HTTP_PORT));
-            httpServerPort = Integer.parseInt(StringUtils.deleteWhitespace(httpServerPortStr));
-
-            String eventMeshServerBatchMsgThreadNumStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_BATCHMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerBatchMsgThreadNumStr)
-                    && StringUtils.isNumeric(eventMeshServerBatchMsgThreadNumStr)) {
-                eventMeshServerBatchMsgThreadNum =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerBatchMsgThreadNumStr));
-            }
-
-            String eventMeshServerBatchMsgReqNumPerSecondStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_BATCHMSG_REQ_NUM_PER_SECOND);
-            if (StringUtils.isNotEmpty(eventMeshServerBatchMsgReqNumPerSecondStr)
-                    && StringUtils.isNumeric(eventMeshServerBatchMsgReqNumPerSecondStr)) {
-                eventMeshBatchMsgRequestNumPerSecond = Integer.parseInt(eventMeshServerBatchMsgReqNumPerSecondStr);
-            }
-
-            String eventMeshServerBatchMsgBatchEnableStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_BATCHMSG_BATCH_ENABLED);
-            if (StringUtils.isNotBlank(eventMeshServerBatchMsgBatchEnableStr)) {
-                eventMeshServerBatchMsgBatchEnabled = Boolean.parseBoolean(eventMeshServerBatchMsgBatchEnableStr);
-            }
-
-            String eventMeshServerAsyncAccumulationThresholdStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ASYNC_ACCUMULATION_THRESHOLD);
-            if (StringUtils.isNotEmpty(eventMeshServerAsyncAccumulationThresholdStr)
-                    && StringUtils.isNumeric(eventMeshServerAsyncAccumulationThresholdStr)) {
-                eventMeshServerAsyncAccumulationThreshold =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerAsyncAccumulationThresholdStr));
-            }
-
-            String eventMeshServerSendMsgThreadNumStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_SENDMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerSendMsgThreadNumStr)
-                    && StringUtils.isNumeric(eventMeshServerSendMsgThreadNumStr)) {
-                eventMeshServerSendMsgThreadNum =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerSendMsgThreadNumStr));
-            }
-
-            String eventMeshServerRemoteMsgThreadNumStr =
-                configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_REMOTEMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerRemoteMsgThreadNumStr)
-                && StringUtils.isNumeric(eventMeshServerRemoteMsgThreadNumStr)) {
-                eventMeshServerRemoteMsgThreadNum =
-                    Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerRemoteMsgThreadNumStr));
-            }
-
-            String eventMeshServerReplyMsgThreadNumStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_REPLYMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerReplyMsgThreadNumStr)
-                    && StringUtils.isNumeric(eventMeshServerReplyMsgThreadNumStr)) {
-                eventMeshServerReplyMsgThreadNum =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerReplyMsgThreadNumStr));
-            }
-
-            String eventMeshServerPushMsgThreadNumStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_PUSHMSG_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerPushMsgThreadNumStr)
-                    && StringUtils.isNumeric(eventMeshServerPushMsgThreadNumStr)) {
-                eventMeshServerPushMsgThreadNum =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerPushMsgThreadNumStr));
-            }
-
-            String eventMeshServerRegistryThreadNumStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_REGISTRY_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerRegistryThreadNumStr)
-                    && StringUtils.isNumeric(eventMeshServerRegistryThreadNumStr)) {
-                eventMeshServerRegistryThreadNum =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerRegistryThreadNumStr));
-            }
-
-            String eventMeshServerClientManageThreadNumStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_CLIENTMANAGE_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerClientManageThreadNumStr)
-                    && StringUtils.isNumeric(eventMeshServerClientManageThreadNumStr)) {
-                eventMeshServerClientManageThreadNum =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerClientManageThreadNumStr));
-            }
-
-            String eventMeshServerPullRegistryIntervalStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_PULL_REGISTRY_INTERVAL);
-            if (StringUtils.isNotEmpty(eventMeshServerPullRegistryIntervalStr)
-                    && StringUtils.isNumeric(eventMeshServerPullRegistryIntervalStr)) {
-                eventMeshServerPullRegistryInterval =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerPullRegistryIntervalStr));
-            }
-
-            String eventMeshServerAdminThreadNumStr =
-                    configurationWrapper.getProp(ConfKeys.KEYS_EVENTMESH_ADMIN_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerAdminThreadNumStr)
-                    && StringUtils.isNumeric(eventMeshServerAdminThreadNumStr)) {
-                eventMeshServerAdminThreadNum =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerAdminThreadNumStr));
-            }
-
-            String eventMeshServerRetryBlockQSizeStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_RETRY_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerRetryBlockQSizeStr)
-                    && StringUtils.isNumeric(eventMeshServerRetryBlockQSizeStr)) {
-                eventMeshServerRetryBlockQSize =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerRetryBlockQSizeStr));
-            }
-
-            String eventMeshServerBatchBlockQSizeStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_BATCHMSG_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerBatchBlockQSizeStr)
-                    && StringUtils.isNumeric(eventMeshServerBatchBlockQSizeStr)) {
-                eventMeshServerBatchBlockQSize =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerBatchBlockQSizeStr));
-            }
-
-            String eventMeshServerSendMsgBlockQSizeStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_SENDMSG_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerSendMsgBlockQSizeStr)
-                    && StringUtils.isNumeric(eventMeshServerSendMsgBlockQSizeStr)) {
-                eventMeshServerSendMsgBlockQSize =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerSendMsgBlockQSizeStr));
-            }
-
-            String eventMeshServerPushMsgBlockQSizeStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_PUSHMSG_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerPushMsgBlockQSizeStr)
-                    && StringUtils.isNumeric(eventMeshServerPushMsgBlockQSizeStr)) {
-                eventMeshServerPushMsgBlockQSize =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerPushMsgBlockQSizeStr));
-            }
-
-            String eventMeshServerClientManageBlockQSizeStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_CLIENTM_BLOCKQ_SIZE);
-            if (StringUtils.isNotEmpty(eventMeshServerClientManageBlockQSizeStr)
-                    && StringUtils.isNumeric(eventMeshServerClientManageBlockQSizeStr)) {
-                eventMeshServerClientManageBlockQSize =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerClientManageBlockQSizeStr));
-            }
-
-            String eventMeshServerBusyCheckIntervalStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_BUSY_CHECK_INTERVAL);
-            if (StringUtils.isNotEmpty(eventMeshServerBusyCheckIntervalStr)
-                    && StringUtils.isNumeric(eventMeshServerBusyCheckIntervalStr)) {
-                eventMeshServerBusyCheckInterval =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerBusyCheckIntervalStr));
-
-            }
-
-            String eventMeshServerConsumerEnabledStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_CONSUMER_ENABLED);
-            if (StringUtils.isNotEmpty(eventMeshServerConsumerEnabledStr)) {
-                eventMeshServerConsumerEnabled =
-                        Boolean.parseBoolean(StringUtils.deleteWhitespace(eventMeshServerConsumerEnabledStr));
-            }
-
-
-            String eventMeshServerRetryThreadNumStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_RETRY_THREAD_NUM);
-            if (StringUtils.isNotEmpty(eventMeshServerRetryThreadNumStr)
-                    && StringUtils.isNumeric(eventMeshServerRetryThreadNumStr)) {
-                eventMeshServerRetryThreadNum =
-                        Integer.parseInt(StringUtils.deleteWhitespace(eventMeshServerRetryThreadNumStr));
-
-            }
-
-            String eventMeshServerUseTlsStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_HTTPS_ENABLED);
-            if (StringUtils.isNotEmpty(eventMeshServerUseTlsStr)) {
-                eventMeshServerUseTls = Boolean.parseBoolean(StringUtils.deleteWhitespace(eventMeshServerUseTlsStr));
-            }
-
-            String eventMeshServerSslProtocolStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_HTTPS_SSL_PROTOCOL);
-            if (StringUtils.isNotEmpty(eventMeshServerSslProtocolStr)) {
-                eventMeshServerSSLProtocol = StringUtils.deleteWhitespace(eventMeshServerSslProtocolStr);
-            }
-
-            String eventMeshServerSslCerStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_HTTPS_SSL_CER);
-            if (StringUtils.isNotEmpty(eventMeshServerSslCerStr)) {
-                eventMeshServerSSLCer = StringUtils.deleteWhitespace(eventMeshServerSslCerStr);
-            }
-
-            String eventMeshServerSslPassStr = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_HTTPS_SSL_PASS);
-            if (StringUtils.isNotEmpty(eventMeshServerSslPassStr)) {
-                eventMeshServerSSLPass = StringUtils.deleteWhitespace(eventMeshServerSslPassStr);
-            }
-
-            String eventMeshHttpMsgReqNumPerSecondStr =
-                    configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_SERVER_MSG_REQ_NUM_PER_SECOND);
-            if (StringUtils.isNotEmpty(eventMeshHttpMsgReqNumPerSecondStr)
-                    && StringUtils.isNumeric(eventMeshHttpMsgReqNumPerSecondStr)) {
-                eventMeshHttpMsgReqNumPerSecond = Integer.parseInt(eventMeshHttpMsgReqNumPerSecondStr);
-
-            }
-
-            String eventSize = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_SERVER_EVENTSIZE);
-            if (StringUtils.isNotEmpty(eventSize) && StringUtils.isNumeric(eventSize)) {
-                eventMeshEventSize = Integer.parseInt(eventSize);
-            }
-
-            String eventBatchSize = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_SERVER_EVENT_BATCHSIZE);
-            if (StringUtils.isNotEmpty(eventBatchSize) && StringUtils.isNumeric(eventBatchSize)) {
-                eventMeshEventBatchSize = Integer.parseInt(eventBatchSize);
-            }
-
-            String ipv4BlackList = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_SERVER_IPV4_BLACK_LIST);
-            if (StringUtils.isNotEmpty(ipv4BlackList)) {
-                eventMeshIpv4BlackList = getBlacklist(ipv4BlackList);
-            }
-
-            String ipv6BlackList = configurationWrapper.getProp(ConfKeys.KEY_EVENTMESH_SERVER_IPV6_BLACK_LIST);
-            if (StringUtils.isNotEmpty(ipv6BlackList)) {
-                eventMeshIpv6BlackList = getBlacklist(ipv6BlackList);
-            }
-        }
-    }
-
-    private static List<IPAddress> getBlacklist(String cidrs) {
-        List<String> cidrList = Splitter.on(",").omitEmptyStrings()
-            .trimResults().splitToList(cidrs);
-
-        List<IPAddress> ipAddresses = Lists.newArrayList();
-        for (String cidr : cidrList) {
-            try {
-                ipAddresses.add(new IPAddressString(cidr).toAddress());
-            } catch (Exception e) {
-                logger.warn("Invalid cidr={}", cidr, e);
-            }
-        }
-        return ipAddresses;
-    }
+    @ConfigFiled(field = "http.port", notNull = true, beNumber = true)
+    private int httpServerPort = 10105;
 
-    static class ConfKeys {
+    @ConfigFiled(field = "batchmsg.batch.enabled")
+    private boolean eventMeshServerBatchMsgBatchEnabled = Boolean.TRUE;
 
-        public static final String KEYS_EVENTMESH_SERVER_HTTP_PORT = "eventMesh.server.http.port";
+    @ConfigFiled(field = "batchmsg.threads.num")
+    private int eventMeshServerBatchMsgThreadNum = 10;
 
-        public static final String KEYS_EVENTMESH_BATCHMSG_THREAD_NUM = "eventMesh.server.batchmsg.threads.num";
+    @ConfigFiled(field = "sendmsg.threads.num")
+    private int eventMeshServerSendMsgThreadNum = 8;
 
-        public static final String KEYS_EVENTMESH_BATCHMSG_REQ_NUM_PER_SECOND = "eventMesh.server.batchmsg.reqNumPerSecond";
+    @ConfigFiled(field = "remotemsg.threads.num")
+    private int eventMeshServerRemoteMsgThreadNum = 8;
 
-        public static final String KEYS_EVENTMESH_BATCHMSG_BATCH_ENABLED = "eventMesh.server.batchmsg.batch.enabled";
+    @ConfigFiled(field = "pushmsg.threads.num")
+    private int eventMeshServerPushMsgThreadNum = 8;
 
-        public static final String KEYS_EVENTMESH_ASYNC_ACCUMULATION_THRESHOLD = "eventMesh.server.async.accumulation.threshold";
+    @ConfigFiled(field = "replymsg.threads.num")
+    private int eventMeshServerReplyMsgThreadNum = 8;
 
-        public static final String KEY_EVENTMESH_BUSY_CHECK_INTERVAL = "eventMesh.server.busy.check.interval";
+    @ConfigFiled(field = "clientmanage.threads.num")
+    private int eventMeshServerClientManageThreadNum = 4;
 
-        public static final String KEYS_EVENTMESH_SENDMSG_THREAD_NUM = "eventMesh.server.sendmsg.threads.num";
+    @ConfigFiled(field = "registry.threads.num")
+    private int eventMeshServerRegistryThreadNum = 10;
 
-        public static final String KEYS_EVENTMESH_REMOTEMSG_THREAD_NUM = "eventMesh.server.remotemsg.threads.num";
+    @ConfigFiled(field = "admin.threads.num")
+    private int eventMeshServerAdminThreadNum = 2;
 
-        public static final String KEYS_EVENTMESH_REPLYMSG_THREAD_NUM = "eventMesh.server.replymsg.threads.num";
+    @ConfigFiled(field = "retry.threads.num")
+    private int eventMeshServerRetryThreadNum = 2;
 
-        public static final String KEYS_EVENTMESH_PUSHMSG_THREAD_NUM = "eventMesh.server.pushmsg.threads.num";
+    @ConfigFiled(field = "")
+    private int eventMeshServerWebhookThreadNum = 4;
 
-        public static final String KEYS_EVENTMESH_REGISTRY_THREAD_NUM = "eventMesh.server.registry.threads.num";
+    @ConfigFiled(field = "pull.registry.interval")
+    private int eventMeshServerPullRegistryInterval = 30000;
 
-        public static final String KEYS_EVENTMESH_CLIENTMANAGE_THREAD_NUM = "eventMesh.server.clientmanage.threads.num";
+    @ConfigFiled(field = "async.accumulation.threshold")
+    private int eventMeshServerAsyncAccumulationThreshold = 1000;
 
-        public static final String KEYS_EVENTMESH_ADMIN_THREAD_NUM = "eventMesh.server.admin.threads.num";
+    @ConfigFiled(field = "retry.blockQ.size")
+    private int eventMeshServerRetryBlockQSize = 10000;
 
-        public static final String KEY_EVENTMESH_RETRY_THREAD_NUM = "eventMesh.server.retry.threads.num";
+    @ConfigFiled(field = "batchmsg.blockQ.size")
+    private int eventMeshServerBatchBlockQSize = 1000;
 
-        public static final String KEYS_EVENTMESH_PULL_REGISTRY_INTERVAL = "eventMesh.server.pull.registry.interval";
+    @ConfigFiled(field = "sendmsg.blockQ.size")
+    private int eventMeshServerSendMsgBlockQSize = 1000;
 
-        public static final String KEY_EVENTMESH_RETRY_BLOCKQ_SIZE = "eventMesh.server.retry.blockQ.size";
+    @ConfigFiled(field = "")
+    private int eventMeshServerRemoteMsgBlockQSize = 1000;
 
-        public static final String KEY_EVENTMESH_BATCHMSG_BLOCKQ_SIZE = "eventMesh.server.batchmsg.blockQ.size";
+    @ConfigFiled(field = "pushmsg.blockQ.size")
+    private int eventMeshServerPushMsgBlockQSize = 1000;
 
-        public static final String KEY_EVENTMESH_SENDMSG_BLOCKQ_SIZE = "eventMesh.server.sendmsg.blockQ.size";
+    @ConfigFiled(field = "clientM.blockQ.size")
+    private int eventMeshServerClientManageBlockQSize = 1000;
 
-        public static final String KEY_EVENTMESH_PUSHMSG_BLOCKQ_SIZE = "eventMesh.server.pushmsg.blockQ.size";
+    @ConfigFiled(field = "busy.check.interval")
+    private int eventMeshServerBusyCheckInterval = 1000;
 
-        public static final String KEY_EVENTMESH_CLIENTM_BLOCKQ_SIZE = "eventMesh.server.clientM.blockQ.size";
+    @ConfigFiled(field = "consumer.enabled")
+    private boolean eventMeshServerConsumerEnabled = false;
 
-        public static final String KEY_EVENTMESH_CONSUMER_ENABLED = "eventMesh.server.consumer.enabled";
+    @ConfigFiled(field = "useTls.enabled")
+    private boolean eventMeshServerUseTls = false;
 
-        public static final String KEY_EVENTMESH_HTTPS_ENABLED = "eventMesh.server.useTls.enabled";
+    @ConfigFiled(field = "ssl.protocol")
+    private String eventMeshServerSSLProtocol = "TLSv1.1";
 
-        public static final String KEY_EVENTMESH_HTTPS_SSL_PROTOCOL = "eventMesh.server.ssl.protocol";
+    @ConfigFiled(field = "ssl.cer")
+    private String eventMeshServerSSLCer = "sChat2.jks";
 
-        public static final String KEY_EVENTMESH_HTTPS_SSL_CER = "eventMesh.server.ssl.cer";
+    @ConfigFiled(field = "ssl.pass")
+    private String eventMeshServerSSLPass = "sNetty";
 
-        public static final String KEY_EVENTMESH_HTTPS_SSL_PASS = "eventMesh.server.ssl.pass";
+    @ConfigFiled(field = "http.msgReqnumPerSecond")
+    private int eventMeshHttpMsgReqNumPerSecond = 15000;
 
-        public static final String KEY_EVENTMESH_SERVER_MSG_REQ_NUM_PER_SECOND = "eventMesh.server.http.msgReqnumPerSecond";
+    @ConfigFiled(field = "batchmsg.reqNumPerSecond")
+    private int eventMeshBatchMsgRequestNumPerSecond = 20000;
 
-        public static final String KEY_EVENTMESH_SERVER_EVENTSIZE = "eventMesh.server.maxEventSize";
+    @ConfigFiled(field = "maxEventSize")
+    private int eventMeshEventSize = 1000;
 
-        public static final String KEY_EVENTMESH_SERVER_EVENT_BATCHSIZE = "eventMesh.server.maxEventBatchSize";
+    @ConfigFiled(field = "maxEventBatchSize")
+    private int eventMeshEventBatchSize = 10;
 
-        public static final String KEY_EVENTMESH_SERVER_IPV4_BLACK_LIST = "eventMesh.server.blacklist.ipv4";
+    @ConfigFiled(field = "blacklist.ipv4")
+    private List<IPAddress> eventMeshIpv4BlackList = Collections.emptyList();
 
-        public static final String KEY_EVENTMESH_SERVER_IPV6_BLACK_LIST = "eventMesh.server.blacklist.ipv6";
-    }
+    @ConfigFiled(field = "blacklist.ipv6")
+    private List<IPAddress> eventMeshIpv6BlackList = Collections.emptyList();
 }
\ No newline at end of file
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
index 82c5f872d..d89d043e1 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java
@@ -18,247 +18,108 @@
 package org.apache.eventmesh.runtime.configuration;
 
 import org.apache.eventmesh.common.config.CommonConfiguration;
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@Config(prefix = "eventMesh.server")
 public class EventMeshTCPConfiguration extends CommonConfiguration {
+
+    @ConfigFiled(field = "tcp.port")
     public int eventMeshTcpServerPort = 10000;
 
+    @ConfigFiled(field = "tcp.allIdleSeconds")
     public int eventMeshTcpIdleAllSeconds = 60;
 
+    @ConfigFiled(field = "tcp.writerIdleSeconds")
     public int eventMeshTcpIdleWriteSeconds = 60;
 
+    @ConfigFiled(field = "tcp.readerIdleSeconds")
     public int eventMeshTcpIdleReadSeconds = 60;
 
+    @ConfigFiled(field = "tcp.msgReqnumPerSecond")
     public Integer eventMeshTcpMsgReqnumPerSecond = 15000;
 
     /**
      * TCP Server allows max client num
      */
+    @ConfigFiled(field = "tcp.clientMaxNum")
     public int eventMeshTcpClientMaxNum = 10000;
 
     //======================================= New add config =================================
 
+    @ConfigFiled(field = "global.scheduler")
     public int eventMeshTcpGlobalScheduler = 5;
 
+    @ConfigFiled(field = "tcp.taskHandleExecutorPoolSize")
     public int eventMeshTcpTaskHandleExecutorPoolSize = Runtime.getRuntime().availableProcessors();
 
+    @ConfigFiled(field = "tcp.msgDownStreamExecutorPoolSize")
     public int eventMeshTcpMsgDownStreamExecutorPoolSize = Math.max(Runtime.getRuntime().availableProcessors(), 8);
 
+    @ConfigFiled(field = "session.expiredInMills")
     public int eventMeshTcpSessionExpiredInMills = 60000;
 
+    @ConfigFiled(field = "session.upstreamBufferSize")
     public int eventMeshTcpSessionUpstreamBufferSize = 100;
 
+    @ConfigFiled(field = "retry.async.pushRetryTimes")
     public int eventMeshTcpMsgAsyncRetryTimes = 3;
 
+    @ConfigFiled(field = "retry.sync.pushRetryTimes")
     public int eventMeshTcpMsgSyncRetryTimes = 1;
 
+    @ConfigFiled(field = "retry.sync.pushRetryDelayInMills")
     public int eventMeshTcpMsgRetrySyncDelayInMills = 500;
 
+    @ConfigFiled(field = "retry.async.pushRetryDelayInMills")
     public int eventMeshTcpMsgRetryAsyncDelayInMills = 500;
 
+    @ConfigFiled(field = "retry.pushRetryQueueSize")
     public int eventMeshTcpMsgRetryQueueSize = 10000;
 
+    @ConfigFiled(field = "tcp.RebalanceIntervalInMills")
     public Integer eventMeshTcpRebalanceIntervalInMills = 30 * 1000;
 
+    @ConfigFiled(field = "admin.http.port")
     public int eventMeshServerAdminPort = 10106;
 
-
+    @ConfigFiled(field = "tcp.sendBack.enabled")
     public boolean eventMeshTcpSendBackEnabled = Boolean.TRUE;
 
+    @ConfigFiled(field = "")
     public int eventMeshTcpSendBackMaxTimes = 3;
 
+    @ConfigFiled(field = "tcp.pushFailIsolateTimeInMills")
     public int eventMeshTcpPushFailIsolateTimeInMills = 30 * 1000;
 
+    @ConfigFiled(field = "gracefulShutdown.sleepIntervalInMills")
     public int gracefulShutdownSleepIntervalInMills = 1000;
 
+    @ConfigFiled(field = "rebalanceRedirect.sleepIntervalInM")
     public int sleepIntervalInRebalanceRedirectMills = 200;
 
+    @ConfigFiled(field = "maxEventSize")
     public int eventMeshEventSize = 1000;
 
+    @ConfigFiled(field = "maxEventBatchSize")
     public int eventMeshEventBatchSize = 10;
 
-    private TrafficShapingConfig gtc = new TrafficShapingConfig(0, 10_000, 1_000, 2000);
-    private TrafficShapingConfig ctc = new TrafficShapingConfig(0, 2_000, 1_000, 10_000);
-
-    public EventMeshTCPConfiguration(ConfigurationWrapper configurationWrapper) {
-        super(configurationWrapper);
-    }
-
-    @Override
-    public void init() {
-        super.init();
-        eventMeshTcpServerPort = configurationWrapper.getIntProp(ConfKeys.KEYS_EVENTMESH_SERVER_TCP_PORT, eventMeshTcpServerPort);
-
-        eventMeshTcpIdleReadSeconds = configurationWrapper.getIntProp(ConfKeys.KEYS_EVENTMESH_SERVER_READER_IDLE_SECONDS,
-                eventMeshTcpIdleReadSeconds);
-
-        eventMeshTcpIdleWriteSeconds = configurationWrapper.getIntProp(ConfKeys.KEYS_EVENTMESH_SERVER_WRITER_IDLE_SECONDS,
-                eventMeshTcpIdleWriteSeconds);
-
-        eventMeshTcpIdleAllSeconds = configurationWrapper.getIntProp(ConfKeys.KEYS_EVENTMESH_SERVER_ALL_IDLE_SECONDS,
-                eventMeshTcpIdleAllSeconds);
-
-        eventMeshTcpMsgReqnumPerSecond = configurationWrapper.getIntProp(ConfKeys.KEYS_EVENTMESH_SERVER_MSG_REQ_NUM_PER_SECONDS,
-                eventMeshTcpMsgReqnumPerSecond);
-
-        eventMeshTcpClientMaxNum = configurationWrapper.getIntProp(ConfKeys.KEYS_EVENTMESH_SERVER_CLIENT_MAX_NUM,
-                eventMeshTcpClientMaxNum);
-
-        eventMeshTcpGlobalScheduler = configurationWrapper.getIntProp(ConfKeys.KEYS_EVENTMESH_SERVER_GLOBAL_SCHEDULER,
-                eventMeshTcpGlobalScheduler);
-
-        eventMeshTcpTaskHandleExecutorPoolSize = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_TCP_TASK_HANDLE_POOL_SIZE, eventMeshTcpTaskHandleExecutorPoolSize);
-
-        eventMeshTcpMsgDownStreamExecutorPoolSize = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_TCP_MSG_DOWNSTREAM_POOL_SIZE, eventMeshTcpMsgDownStreamExecutorPoolSize);
-
-        eventMeshTcpSessionExpiredInMills = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_SESSION_EXPIRED_TIME, eventMeshTcpSessionExpiredInMills);
-
-        eventMeshTcpSessionUpstreamBufferSize = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_SESSION_UPSTREAM_BUFFER_SIZE, eventMeshTcpSessionUpstreamBufferSize);
-
-        //========================================eventMesh retry config=============================================//
-        eventMeshTcpMsgAsyncRetryTimes = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_RETRY_ASYNC_PUSH_RETRY_TIMES, eventMeshTcpMsgAsyncRetryTimes);
-
-        eventMeshTcpMsgSyncRetryTimes = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_RETRY_SYNC_PUSH_RETRY_TIMES, eventMeshTcpMsgSyncRetryTimes);
-
-        eventMeshTcpMsgRetryAsyncDelayInMills = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_RETRY_ASYNC_PUSH_RETRY_DELAY, eventMeshTcpMsgRetryAsyncDelayInMills);
-
-        eventMeshTcpMsgRetrySyncDelayInMills = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_RETRY_SYNC_PUSH_RETRY_DELAY, eventMeshTcpMsgRetrySyncDelayInMills);
-
-        eventMeshTcpMsgRetryQueueSize = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_RETRY_PUSH_RETRY_QUEUE_SIZE, eventMeshTcpMsgRetryQueueSize);
-
-        eventMeshTcpRebalanceIntervalInMills = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_TCP_REBALANCE_INTERVAL, eventMeshTcpRebalanceIntervalInMills);
-
-        eventMeshServerAdminPort = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_ADMIN_HTTP_PORT, eventMeshServerAdminPort);
-
-        eventMeshTcpSendBackEnabled = configurationWrapper.getBoolProp(
-                ConfKeys.KEYS_EVENTMESH_TCP_SEND_BACK_ENABLED, eventMeshTcpSendBackEnabled);
-
-        eventMeshTcpPushFailIsolateTimeInMills = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_PUSH_FAIL_ISOLATE_TIME, eventMeshTcpPushFailIsolateTimeInMills);
-
-        gracefulShutdownSleepIntervalInMills = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_GRACEFUL_SHUTDOWN_SLEEP_TIME, gracefulShutdownSleepIntervalInMills);
-
-        sleepIntervalInRebalanceRedirectMills = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_REBALANCE_REDIRECT_SLEEP_TIME, sleepIntervalInRebalanceRedirectMills);
-
-        eventMeshEventSize = configurationWrapper.getIntProp(ConfKeys.KEYS_EVENTMESH_SERVER_EVENTSIZE, eventMeshEventSize);
-
-        eventMeshEventBatchSize = configurationWrapper.getIntProp(
-                ConfKeys.KEYS_EVENTMESH_SERVER_EVENT_BATCHSIZE, eventMeshEventBatchSize);
-    }
-
-    public TrafficShapingConfig getGtc() {
-        return gtc;
-    }
-
-    public TrafficShapingConfig getCtc() {
-        return ctc;
-    }
-
-    static class ConfKeys {
-
-        public static final String KEYS_EVENTMESH_SERVER_TCP_PORT = "eventMesh.server.tcp.port";
-        public static final String KEYS_EVENTMESH_SERVER_READER_IDLE_SECONDS = "eventMesh.server.tcp.readerIdleSeconds";
-        public static final String KEYS_EVENTMESH_SERVER_WRITER_IDLE_SECONDS = "eventMesh.server.tcp.writerIdleSeconds";
-        public static final String KEYS_EVENTMESH_SERVER_ALL_IDLE_SECONDS = "eventMesh.server.tcp.allIdleSeconds";
-        public static final String KEYS_EVENTMESH_SERVER_CLIENT_MAX_NUM = "eventMesh.server.tcp.clientMaxNum";
-        public static final String KEYS_EVENTMESH_SERVER_MSG_REQ_NUM_PER_SECONDS = "eventMesh.server.tcp.msgReqnumPerSecond";
-        public static final String KEYS_EVENTMESH_SERVER_TCP_REBALANCE_INTERVAL = "eventMesh.server.tcp.RebalanceIntervalInMills";
-        public static final String KEYS_EVENTMESH_SERVER_GLOBAL_SCHEDULER = "eventMesh.server.global.scheduler";
-        public static final String KEYS_EVENTMESH_SERVER_TCP_TASK_HANDLE_POOL_SIZE = "eventMesh.server.tcp.taskHandleExecutorPoolSize";
-        public static final String KEYS_EVENTMESH_SERVER_TCP_MSG_DOWNSTREAM_POOL_SIZE = "eventMesh.server.tcp.msgDownStreamExecutorPoolSize";
-        public static final String KEYS_EVENTMESH_SERVER_SESSION_EXPIRED_TIME = "eventMesh.server.session.expiredInMills";
-        public static final String KEYS_EVENTMESH_SERVER_SESSION_UPSTREAM_BUFFER_SIZE = "eventMesh.server.session.upstreamBufferSize";
-        public static final String KEYS_EVENTMESH_SERVER_SESSION_DOWNSTREAM_UNACK_SIZE = "eventMesh.server.session.downstreamUnackSize";
-        public static final String KEYS_EVENTMESH_SERVER_RETRY_ASYNC_PUSH_RETRY_TIMES = "eventMesh.server.retry.async.pushRetryTimes";
-        public static final String KEYS_EVENTMESH_SERVER_RETRY_SYNC_PUSH_RETRY_TIMES = "eventMesh.server.retry.sync.pushRetryTimes";
-        public static final String KEYS_EVENTMESH_SERVER_RETRY_ASYNC_PUSH_RETRY_DELAY = "eventMesh.server.retry.async.pushRetryDelayInMills";
-        public static final String KEYS_EVENTMESH_SERVER_RETRY_SYNC_PUSH_RETRY_DELAY = "eventMesh.server.retry.sync.pushRetryDelayInMills";
-        public static final String KEYS_EVENTMESH_SERVER_RETRY_PUSH_RETRY_QUEUE_SIZE = "eventMesh.server.retry.pushRetryQueueSize";
-        public static final String KEYS_EVENTMESH_SERVER_ADMIN_HTTP_PORT = "eventMesh.server.admin.http.port";
-        public static final String KEYS_EVENTMESH_TCP_SEND_BACK_ENABLED = "eventMesh.server.tcp.sendBack.enabled";
-        public static final String KEYS_EVENTMESH_SERVER_PUSH_FAIL_ISOLATE_TIME = "eventMesh.server.tcp.pushFailIsolateTimeInMills";
-        public static final String KEYS_EVENTMESH_SERVER_GRACEFUL_SHUTDOWN_SLEEP_TIME = "eventMesh.server.gracefulShutdown.sleepIntervalInMills";
-        public static final String KEYS_EVENTMESH_SERVER_REBALANCE_REDIRECT_SLEEP_TIME = "eventMesh.server.rebalanceRedirect.sleepIntervalInM";
-        public static final String KEYS_EVENTMESH_SERVER_EVENTSIZE = "eventMesh.server.maxEventSize";
-        public static final String KEYS_EVENTMESH_SERVER_EVENT_BATCHSIZE = "eventMesh.server.maxEventBatchSize";
-    }
+    private final TrafficShapingConfig gtc = new TrafficShapingConfig(0, 10_000, 1_000, 2000);
+    private final TrafficShapingConfig ctc = new TrafficShapingConfig(0, 2_000, 1_000, 10_000);
 
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
     public static class TrafficShapingConfig {
         long writeLimit = 0;
         long readLimit = 1000;
         long checkInterval = 1000;
         long maxTime = 5000;
-
-        public TrafficShapingConfig(long writeLimit, long readLimit, long checkInterval, long maxTime) {
-            this.writeLimit = writeLimit;
-            this.readLimit = readLimit;
-            this.checkInterval = checkInterval;
-            this.maxTime = maxTime;
-        }
-
-        public TrafficShapingConfig() {
-
-        }
-
-        public long getWriteLimit() {
-            return writeLimit;
-        }
-
-        public void setWriteLimit(long writeLimit) {
-            this.writeLimit = writeLimit;
-        }
-
-        public long getReadLimit() {
-            return readLimit;
-        }
-
-        public void setReadLimit(long readLimit) {
-            this.readLimit = readLimit;
-        }
-
-        public long getCheckInterval() {
-            return checkInterval;
-        }
-
-        public void setCheckInterval(long checkInterval) {
-            this.checkInterval = checkInterval;
-        }
-
-        public long getMaxTime() {
-            return maxTime;
-        }
-
-        public void setMaxTime(long maxTime) {
-            this.maxTime = maxTime;
-        }
-
-        @Override
-        public String toString() {
-            return "TrafficShapingConfig{"
-                    +
-                    "writeLimit=" + writeLimit
-                    +
-                    ", readLimit=" + readLimit
-                    +
-                    ", checkInterval=" + checkInterval
-                    +
-                    ", maxTime=" + maxTime
-                    +
-                    '}';
-        }
     }
-
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/consumer/ConsumerManager.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/consumer/ConsumerManager.java
index d77715822..b5eb7a2b5 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/consumer/ConsumerManager.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/consumer/ConsumerManager.java
@@ -208,7 +208,7 @@ public class ConsumerManager {
     }
 
     private void startClientCheck() {
-        final int clientTimeout = eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshSessionExpiredInMills;
+        final int clientTimeout = eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshSessionExpiredInMills();
         if (clientTimeout > 0) {
             scheduledExecutorService.scheduleAtFixedRate(() -> {
                 if (LOGGER.isDebugEnabled()) {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/consumer/EventMeshConsumer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/consumer/EventMeshConsumer.java
index 69ca65465..dc08f86f3 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/consumer/EventMeshConsumer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/consumer/EventMeshConsumer.java
@@ -145,7 +145,6 @@ public class EventMeshConsumer {
         keyValue.put(EVENT_MESH_IDC, eventMeshGrpcConfiguration.getEventMeshIDC());
         keyValue.put(INSTANCE_NAME, EventMeshUtil.buildMeshClientID(consumerGroup,
                 eventMeshGrpcConfiguration.getEventMeshCluster()));
-
         persistentMqConsumer.init(keyValue);
         persistentMqConsumer.registerEventListener(createEventListener(SubscriptionMode.CLUSTERING));
 
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/push/WebhookPushRequest.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/push/WebhookPushRequest.java
index 1341eb27c..458bb0eca 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/push/WebhookPushRequest.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/push/WebhookPushRequest.java
@@ -108,7 +108,7 @@ public class WebhookPushRequest extends AbstractPushRequest {
             builder.addHeader(ProtocolKey.VERSION, ProtocolVersion.V1.getVersion());
             builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHCLUSTER,
                     eventMeshGrpcConfiguration.getEventMeshCluster());
-            builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshGrpcConfiguration.eventMeshIp);
+            builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHIP, eventMeshGrpcConfiguration.getEventMeshIp());
             builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHENV, eventMeshGrpcConfiguration.getEventMeshEnv());
             builder.addHeader(ProtocolKey.EventMeshInstanceKey.EVENTMESHIDC, eventMeshGrpcConfiguration.getEventMeshIDC());
 
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/retry/GrpcRetryer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/retry/GrpcRetryer.java
index f65bfc63d..0022e24ff 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/retry/GrpcRetryer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/retry/GrpcRetryer.java
@@ -49,7 +49,7 @@ public class GrpcRetryer {
     private Thread dispatcher;
 
     public void pushRetry(DelayRetryable delayRetryable) {
-        if (failed.size() >= grpcConfiguration.eventMeshServerRetryBlockQueueSize) {
+        if (failed.size() >= grpcConfiguration.getEventMeshServerRetryBlockQueueSize()) {
             retryLogger.error("[RETRY-QUEUE] is full!");
             return;
         }
@@ -57,22 +57,21 @@ public class GrpcRetryer {
     }
 
     public void init() {
-        pool = new ThreadPoolExecutor(grpcConfiguration.eventMeshServerRetryThreadNum,
-            grpcConfiguration.eventMeshServerRetryThreadNum,
-            60000,
-            TimeUnit.MILLISECONDS,
-            new ArrayBlockingQueue<>(grpcConfiguration.eventMeshServerRetryBlockQueueSize),
-            new ThreadFactory() {
-                private AtomicInteger count = new AtomicInteger();
-
-                @Override
-                public Thread newThread(Runnable r) {
-                    Thread thread = new Thread(r, "grpc-retry-" + count.incrementAndGet());
-                    thread.setPriority(Thread.NORM_PRIORITY);
-                    thread.setDaemon(true);
-                    return thread;
-                }
-            }, new ThreadPoolExecutor.AbortPolicy());
+        pool = new ThreadPoolExecutor(
+                grpcConfiguration.getEventMeshServerRetryThreadNum(),
+                grpcConfiguration.getEventMeshServerRetryThreadNum(), 60000, TimeUnit.MILLISECONDS,
+                new ArrayBlockingQueue<>(grpcConfiguration.getEventMeshServerRetryBlockQueueSize()),
+                new ThreadFactory() {
+                    private AtomicInteger count = new AtomicInteger();
+
+                    @Override
+                    public Thread newThread(Runnable r) {
+                        Thread thread = new Thread(r, "grpc-retry-" + count.incrementAndGet());
+                        thread.setPriority(Thread.NORM_PRIORITY);
+                        thread.setDaemon(true);
+                        return thread;
+                    }
+                }, new ThreadPoolExecutor.AbortPolicy());
 
         dispatcher = new Thread(() -> {
             try {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/ConsumerService.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/ConsumerService.java
index ec77420b0..b3108a7c6 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/ConsumerService.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/ConsumerService.java
@@ -55,7 +55,7 @@ public class ConsumerService extends ConsumerServiceGrpc.ConsumerServiceImplBase
     public void subscribe(Subscription request, StreamObserver<Response> responseObserver) {
         log.info("cmd={}|{}|client2eventMesh|from={}|to={}",
             "subscribe", EventMeshConstants.PROTOCOL_GRPC,
-            request.getHeader().getIp(), eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshIp);
+            request.getHeader().getIp(), eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshIp());
         eventMeshGrpcServer.getMetricsMonitor().recordReceiveMsgFromClient();
 
         EventEmitter<Response> emitter = new EventEmitter<>(responseObserver);
@@ -80,14 +80,14 @@ public class ConsumerService extends ConsumerServiceGrpc.ConsumerServiceImplBase
                 if (!subscription.getSubscriptionItemsList().isEmpty()) {
                     log.info("cmd={}|{}|client2eventMesh|from={}|to={}",
                         "subscribeStream", EventMeshConstants.PROTOCOL_GRPC,
-                        subscription.getHeader().getIp(), eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshIp);
+                        subscription.getHeader().getIp(), eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshIp());
                     eventMeshGrpcServer.getMetricsMonitor().recordReceiveMsgFromClient();
 
                     handleSubscriptionStream(subscription, emitter);
                 } else {
                     log.info("cmd={}|{}|client2eventMesh|from={}|to={}",
                         "reply-to-server", EventMeshConstants.PROTOCOL_GRPC,
-                        subscription.getHeader().getIp(), eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshIp);
+                        subscription.getHeader().getIp(), eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshIp());
 
                     handleSubscribeReply(subscription, emitter);
                 }
@@ -148,7 +148,7 @@ public class ConsumerService extends ConsumerServiceGrpc.ConsumerServiceImplBase
     public void unsubscribe(Subscription request, StreamObserver<Response> responseObserver) {
         log.info("cmd={}|{}|client2eventMesh|from={}|to={}",
             "unsubscribe", EventMeshConstants.PROTOCOL_GRPC,
-            request.getHeader().getIp(), eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshIp);
+            request.getHeader().getIp(), eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshIp());
         eventMeshGrpcServer.getMetricsMonitor().recordReceiveMsgFromClient();
 
         EventEmitter<Response> emitter = new EventEmitter<>(responseObserver);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/HeartbeatService.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/HeartbeatService.java
index 962cf401b..c302d01d2 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/HeartbeatService.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/HeartbeatService.java
@@ -49,7 +49,7 @@ public class HeartbeatService extends HeartbeatServiceGrpc.HeartbeatServiceImplB
     public void heartbeat(Heartbeat request, StreamObserver<Response> responseObserver) {
         LOGGER.info("cmd={}|{}|client2eventMesh|from={}|to={}",
                 "heartbeat", EventMeshConstants.PROTOCOL_GRPC, request.getHeader().getIp(),
-                eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshIp);
+                eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshIp());
 
         EventEmitter<Response> emitter = new EventEmitter<>(responseObserver);
         threadPoolExecutor.submit(() -> {
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/ProducerService.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/ProducerService.java
index 0254bdb8f..c7759a743 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/ProducerService.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/grpc/service/ProducerService.java
@@ -54,7 +54,7 @@ public class ProducerService extends PublisherServiceGrpc.PublisherServiceImplBa
     public void publish(SimpleMessage request, StreamObserver<Response> responseObserver) {
         cmdLogger.info("cmd={}|{}|client2eventMesh|from={}|to={}", "AsyncPublish",
             EventMeshConstants.PROTOCOL_GRPC, request.getHeader().getIp(),
-            eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshIp);
+            eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshIp());
         eventMeshGrpcServer.getMetricsMonitor().recordReceiveMsgFromClient();
         
         EventEmitter<Response> emitter = new EventEmitter<>(responseObserver);
@@ -73,7 +73,7 @@ public class ProducerService extends PublisherServiceGrpc.PublisherServiceImplBa
     public void requestReply(SimpleMessage request, StreamObserver<SimpleMessage> responseObserver) {
         cmdLogger.info("cmd={}|{}|client2eventMesh|from={}|to={}", "RequestReply",
             EventMeshConstants.PROTOCOL_GRPC, request.getHeader().getIp(),
-            eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshIp);
+            eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshIp());
         eventMeshGrpcServer.getMetricsMonitor().recordReceiveMsgFromClient();
 
         EventEmitter<SimpleMessage> emitter = new EventEmitter<>(responseObserver);
@@ -92,7 +92,7 @@ public class ProducerService extends PublisherServiceGrpc.PublisherServiceImplBa
     public void batchPublish(BatchMessage request, StreamObserver<Response> responseObserver) {
         cmdLogger.info("cmd={}|{}|client2eventMesh|from={}|to={}", "BatchPublish",
             EventMeshConstants.PROTOCOL_GRPC, request.getHeader().getIp(),
-            eventMeshGrpcServer.getEventMeshGrpcConfiguration().eventMeshIp);
+            eventMeshGrpcServer.getEventMeshGrpcConfiguration().getEventMeshIp());
         eventMeshGrpcServer.getMetricsMonitor().recordReceiveMsgFromClient(request.getMessageItemCount());
 
         EventEmitter<Response> emitter = new EventEmitter<>(responseObserver);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java
index 418395bbb..45a5a1c76 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java
@@ -112,14 +112,14 @@ public class BatchSendMessageProcessor implements HttpRequestProcessor {
         String producerGroup = "";
         int eventSize = eventList.size();
 
-        if (eventSize > eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventBatchSize) {
+        if (eventSize > eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventBatchSize()) {
             batchMessageLogger.error("Event batch size exceeds the limit: {}",
-                eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventBatchSize);
+                eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventBatchSize());
 
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                 sendMessageBatchResponseHeader,
                 SendMessageBatchResponseBody.buildBody(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_ERR.getRetCode(),
-                    "Event batch size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventBatchSize));
+                    "Event batch size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventBatchSize()));
             asyncContext.onComplete(responseEventMeshCommand);
             return;
         }
@@ -140,14 +140,14 @@ public class BatchSendMessageProcessor implements HttpRequestProcessor {
             }
 
             String content = event.getData() == null ? "" : new String(event.getData().toBytes(), StandardCharsets.UTF_8);
-            if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize) {
+            if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()) {
                 batchMessageLogger.error("Event size exceeds the limit: {}",
-                    eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize);
+                    eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize());
 
                 responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
-                    sendMessageBatchResponseHeader,
-                    SendMessageBatchResponseBody.buildBody(EventMeshRetCode.EVENTMESH_PROTOCOL_HEADER_ERR.getRetCode(),
-                        "Event size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize));
+                        sendMessageBatchResponseHeader,
+                        SendMessageBatchResponseBody.buildBody(EventMeshRetCode.EVENTMESH_PROTOCOL_HEADER_ERR.getRetCode(),
+                                "Event size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()));
                 asyncContext.onComplete(responseEventMeshCommand);
                 return;
             }
@@ -284,7 +284,7 @@ public class BatchSendMessageProcessor implements HttpRequestProcessor {
         long delta = eventSize;
         eventMeshHTTPServer.getMetrics().getSummaryMetrics().recordSendBatchMsg(delta);
 
-        if (eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshServerBatchMsgBatchEnabled) {
+        if (eventMeshHTTPServer.getEventMeshHttpConfiguration().isEventMeshServerBatchMsgBatchEnabled()) {
             for (List<CloudEvent> eventlist : topicBatchMessageMappings.values()) {
                 // TODO: Implementation in API. Consider whether to put it in the plug-in.
                 CloudEvent event = null;
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java
index 46514b9eb..cdcb9ebce 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java
@@ -159,14 +159,14 @@ public class BatchSendMessageV2Processor implements HttpRequestProcessor {
         }
 
         String content = new String(event.getData().toBytes(), StandardCharsets.UTF_8);
-        if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize) {
+        if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()) {
             batchMessageLogger.error("Event size exceeds the limit: {}",
-                eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize);
+                eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize());
 
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                 sendMessageBatchV2ResponseHeader,
                 SendMessageBatchV2ResponseBody.buildBody(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_ERR.getRetCode(),
-                    "Event size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize));
+                    "Event size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()));
             asyncContext.onComplete(responseEventMeshCommand);
             return;
         }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/LocalSubscribeEventProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/LocalSubscribeEventProcessor.java
index eb854072e..88db9db21 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/LocalSubscribeEventProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/LocalSubscribeEventProcessor.java
@@ -52,7 +52,7 @@ import lombok.extern.slf4j.Slf4j;
 @EventMeshTrace
 @Slf4j
 public class LocalSubscribeEventProcessor extends AbstractEventProcessor {
-    
+
     public LocalSubscribeEventProcessor(final EventMeshHTTPServer eventMeshHTTPServer) {
         super(eventMeshHTTPServer);
     }
@@ -135,12 +135,12 @@ public class LocalSubscribeEventProcessor extends AbstractEventProcessor {
 
         // validate URL
         try {
-            if (!IPUtils.isValidDomainOrIp(url, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIpv4BlackList,
-                    eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIpv6BlackList)) {
+            if (!IPUtils.isValidDomainOrIp(url, eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshIpv4BlackList(),
+                    eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshIpv6BlackList())) {
                 if (log.isErrorEnabled()) {
                     log.error("subscriber url {} is not valid", url);
                 }
-                
+
                 handlerSpecific.sendErrorResponse(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_ERR, responseHeaderMap,
                         responseBodyMap, null);
                 return;
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/RemoteSubscribeEventProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/RemoteSubscribeEventProcessor.java
index 503ac87dd..a3019a32e 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/RemoteSubscribeEventProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/RemoteSubscribeEventProcessor.java
@@ -150,8 +150,8 @@ public class RemoteSubscribeEventProcessor extends AbstractEventProcessor {
 
         // validate URL
         try {
-            if (!IPUtils.isValidDomainOrIp(url, eventMeshHttpConfiguration.eventMeshIpv4BlackList,
-                eventMeshHttpConfiguration.eventMeshIpv6BlackList)) {
+            if (!IPUtils.isValidDomainOrIp(url, eventMeshHttpConfiguration.getEventMeshIpv4BlackList(),
+                eventMeshHttpConfiguration.getEventMeshIpv6BlackList())) {
                 httpLogger.error("subscriber url {} is not valid", url);
                 handlerSpecific.sendErrorResponse(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_ERR, responseHeaderMap,
                     responseBodyMap, null);
@@ -179,7 +179,7 @@ public class RemoteSubscribeEventProcessor extends AbstractEventProcessor {
         try {
             // local subscription url
             String localUrl = "http://" + localAddress + ":"
-                + eventMeshHttpConfiguration.httpServerPort
+                + eventMeshHttpConfiguration.getHttpServerPort()
                 + RequestURI.PUBLISH_BRIDGE.getRequestURI();
             Map<String, Object> remoteBodyMap = new HashMap<>();
             remoteBodyMap.put(EventMeshConstants.URL, localUrl);
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/RemoteUnSubscribeEventProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/RemoteUnSubscribeEventProcessor.java
index c6b5b2ad4..b5edf8ab9 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/RemoteUnSubscribeEventProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/RemoteUnSubscribeEventProcessor.java
@@ -93,7 +93,7 @@ public class RemoteUnSubscribeEventProcessor extends AbstractEventProcessor {
         Map<String, Object> sysHeaderMap = requestWrapper.getSysHeaderMap();
 
         Map<String, Object> responseBodyMap = new HashMap<>();
-        
+
 
         //validate header
         if (validateSysHeader(sysHeaderMap)) {
@@ -130,11 +130,11 @@ public class RemoteUnSubscribeEventProcessor extends AbstractEventProcessor {
             String sysId = eventMeshHttpConfiguration.getSysID();
             String meshGroup = String.join("-", env, idc, cluster, sysId);
 
-  
+
 
             // local unSubscription url
             String unsubscribeUrl = "http://" + localAddress + ":"
-                + eventMeshHttpConfiguration.httpServerPort
+                + eventMeshHttpConfiguration.getHttpServerPort()
                 + RequestURI.PUBLISH_BRIDGE.getRequestURI();
 
             Map<String, Object> remoteBodyMap = new HashMap<>();
@@ -197,6 +197,6 @@ public class RemoteUnSubscribeEventProcessor extends AbstractEventProcessor {
         return new String[] {RequestURI.UNSUBSCRIBE_REMOTE.getRequestURI()};
     }
 
-    
+
 
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java
index 118cc65b6..f74e70789 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java
@@ -154,14 +154,14 @@ public class ReplyMessageProcessor implements HttpRequestProcessor {
         }
 
         String content = event.getData() == null ? "" : new String(event.getData().toBytes(), StandardCharsets.UTF_8);
-        if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize) {
+        if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()) {
             httpLogger.error("Event size exceeds the limit: {}",
-                eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize);
+                eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize());
 
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                 replyMessageResponseHeader,
                 ReplyMessageResponseBody.buildBody(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_ERR.getRetCode(),
-                    "Event size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize));
+                    "Event size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()));
             asyncContext.onComplete(responseEventMeshCommand);
             return;
         }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncEventProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncEventProcessor.java
index d20253163..9dcd973a5 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncEventProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncEventProcessor.java
@@ -198,10 +198,10 @@ public class SendAsyncEventProcessor implements AsyncHttpProcessor {
         }
 
         final String content = new String(event.getData().toBytes(), StandardCharsets.UTF_8);
-        if (Objects.requireNonNull(content).length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize) {
+        if (Objects.requireNonNull(content).length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()) {
             if (log.isErrorEnabled()) {
                 log.error("Event size exceeds the limit: {}",
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize());
             }
             handlerSpecific.sendErrorResponse(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_SIZE_ERR, responseHeaderMap,
                     responseBodyMap, EventMeshUtil.getCloudEventExtensionMap(SpecVersion.V1.toString(), event));
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java
index 86d12dd86..fc73c4baa 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java
@@ -228,14 +228,14 @@ public class SendAsyncMessageProcessor implements HttpRequestProcessor {
         }
 
         String content = event.getData() == null ? "" : new String(event.getData().toBytes(), StandardCharsets.UTF_8);
-        if (content.length() > eventMeshHttpConfiguration.eventMeshEventSize) {
+        if (content.length() > eventMeshHttpConfiguration.getEventMeshEventSize()) {
             httpLogger.error("Event size exceeds the limit: {}",
-                eventMeshHttpConfiguration.eventMeshEventSize);
+                eventMeshHttpConfiguration.getEventMeshEventSize());
 
             responseEventMeshCommand = request.createHttpCommandResponse(
                 sendMessageResponseHeader,
                 SendMessageResponseBody.buildBody(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_SIZE_ERR.getRetCode(),
-                    "Event size exceeds the limit: " + eventMeshHttpConfiguration.eventMeshEventSize));
+                    "Event size exceeds the limit: " + eventMeshHttpConfiguration.getEventMeshEventSize()));
             asyncContext.onComplete(responseEventMeshCommand);
 
             Span excepSpan = TraceUtils.prepareServerSpan(EventMeshUtil.getCloudEventExtensionMap(protocolVersin, event),
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncRemoteEventProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncRemoteEventProcessor.java
index 7425bd9e4..0e270f364 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncRemoteEventProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendAsyncRemoteEventProcessor.java
@@ -243,10 +243,10 @@ public class SendAsyncRemoteEventProcessor implements AsyncHttpProcessor {
         }
 
         final String content = event.getData() == null ? "" : new String(event.getData().toBytes(), StandardCharsets.UTF_8);
-        if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize) {
+        if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()) {
             if (log.isErrorEnabled()) {
                 log.error("Event size exceeds the limit: {}",
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize());
             }
             handlerSpecific.sendErrorResponse(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_SIZE_ERR, responseHeaderMap,
                     responseBodyMap, EventMeshUtil.getCloudEventExtensionMap(SpecVersion.V1.toString(), event));
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java
index 6b5deb4c7..92b116f62 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java
@@ -193,16 +193,16 @@ public class SendSyncMessageProcessor implements HttpRequestProcessor {
         }
 
         final String content = new String(Objects.requireNonNull(event.getData()).toBytes(), StandardCharsets.UTF_8);
-        if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize) {
+        if (content.length() > eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()) {
             if (log.isErrorEnabled()) {
                 log.error("Event size exceeds the limit: {}",
-                        eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize);
+                        eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize());
             }
 
             responseEventMeshCommand = asyncContext.getRequest().createHttpCommandResponse(
                     sendMessageResponseHeader,
                     SendMessageResponseBody.buildBody(EventMeshRetCode.EVENTMESH_PROTOCOL_BODY_ERR.getRetCode(),
-                            "Event size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshEventSize));
+                            "Event size exceeds the limit: " + eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshEventSize()));
             asyncContext.onComplete(responseEventMeshCommand);
             return;
         }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java
index 3f6c24387..97303a928 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java
@@ -145,8 +145,8 @@ public class SubscribeProcessor implements HttpRequestProcessor {
 
         // validate URL
         try {
-            if (!IPUtils.isValidDomainOrIp(url, eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIpv4BlackList,
-                    eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshIpv6BlackList)) {
+            if (!IPUtils.isValidDomainOrIp(url, eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshIpv4BlackList(),
+                    eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshIpv6BlackList())) {
                 LOGGER.error("subscriber url {} is not valid", url);
                 responseEventMeshCommand = request.createHttpCommandResponse(
                         subscribeResponseHeader,
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/inf/AbstractEventProcessor.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/inf/AbstractEventProcessor.java
index 5828b5248..3ff387985 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/inf/AbstractEventProcessor.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/inf/AbstractEventProcessor.java
@@ -206,7 +206,7 @@ public abstract class AbstractEventProcessor implements AsyncHttpProcessor {
         return requestBodyMap.get(EventMeshConstants.URL) == null
             || requestBodyMap.get(EventMeshConstants.MANAGE_TOPIC) == null
             || requestBodyMap.get(EventMeshConstants.CONSUMER_GROUP) == null;
-        
+
     }
 
     /**
@@ -274,5 +274,5 @@ public abstract class AbstractEventProcessor implements AsyncHttpProcessor {
 
         return client.execute(httpPost, responseHandler);
     }
-    
+
 }
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/retry/HttpRetryer.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/retry/HttpRetryer.java
index 6448db3fe..b7faae46a 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/retry/HttpRetryer.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/retry/HttpRetryer.java
@@ -48,7 +48,7 @@ public class HttpRetryer {
     private Thread dispatcher;
 
     public void pushRetry(DelayRetryable delayRetryable) {
-        if (failed.size() >= eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshServerRetryBlockQSize) {
+        if (failed.size() >= eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshServerRetryBlockQSize()) {
             retryLogger.error("[RETRY-QUEUE] is full!");
             return;
         }
@@ -56,11 +56,11 @@ public class HttpRetryer {
     }
 
     public void init() {
-        pool = new ThreadPoolExecutor(eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshServerRetryThreadNum,
-                eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshServerRetryThreadNum,
+        pool = new ThreadPoolExecutor(eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshServerRetryThreadNum(),
+                eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshServerRetryThreadNum(),
                 60000,
                 TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(
-                    eventMeshHTTPServer.getEventMeshHttpConfiguration().eventMeshServerRetryBlockQSize),
+                    eventMeshHTTPServer.getEventMeshHttpConfiguration().getEventMeshServerRetryBlockQSize()),
                 new ThreadFactory() {
                     private AtomicInteger count = new AtomicInteger();
 
diff --git a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java
index 4e91a3d2d..894759f71 100644
--- a/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java
+++ b/eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java
@@ -71,7 +71,7 @@ import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
 public class ClientGroupWrapper {
-    
+
     private final String sysId;
 
     private String group;
@@ -130,7 +130,6 @@ public class ClientGroupWrapper {
                 eventMeshTCPServer.getEventMeshTCPConfiguration().getEventMeshConnectorPluginType());
         this.mqProducerWrapper = new MQProducerWrapper(
                 eventMeshTCPServer.getEventMeshTCPConfiguration().getEventMeshConnectorPluginType());
-
     }
 
     public ConcurrentHashMap<String, Set<Session>> getTopic2sessionInGroupMapping() {
diff --git a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/controller/ClientManageControllerTest.java b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/controller/ClientManageControllerTest.java
index 092369abb..4984fa9c0 100644
--- a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/controller/ClientManageControllerTest.java
+++ b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/controller/ClientManageControllerTest.java
@@ -21,11 +21,11 @@ package org.apache.eventmesh.runtime.admin.controller;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import org.apache.eventmesh.admin.rocketmq.controller.AdminController;
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.metrics.api.model.HttpSummaryMetrics;
 import org.apache.eventmesh.metrics.api.model.TcpSummaryMetrics;
 import org.apache.eventmesh.runtime.boot.EventMeshGrpcServer;
@@ -50,19 +50,20 @@ import com.sun.net.httpserver.HttpServer;
 public class ClientManageControllerTest {
 
     @Test
-    public void testStart() {
-        EventMeshTCPServer eventMeshTCPServer = mock(EventMeshTCPServer.class);
-        EventMeshHTTPServer eventMeshHTTPServer = mock(EventMeshHTTPServer.class);
-        EventMeshGrpcServer eventMeshGrpcServer = mock(EventMeshGrpcServer.class);
-        Registry registry = mock(Registry.class);
+    public void testStart() throws Exception {
         AdminController adminController = mock(AdminController.class);
-        EventMeshTCPConfiguration tcpConfiguration = mock(EventMeshTCPConfiguration.class);
-        doNothing().when(tcpConfiguration).init();
+
+        ConfigService configService = ConfigService.getInstance();
+        configService.setRootConfig("classPath://configuration.properties");
+        EventMeshTCPConfiguration tcpConfiguration = configService.buildConfigInstance(EventMeshTCPConfiguration.class);
+
+        EventMeshTCPServer eventMeshTCPServer = mock(EventMeshTCPServer.class);
         when(eventMeshTCPServer.getEventMeshTCPConfiguration()).thenReturn(tcpConfiguration);
 
         HttpSummaryMetrics httpSummaryMetrics = mock(HttpSummaryMetrics.class);
         HTTPMetricsServer metrics = mock(HTTPMetricsServer.class);
 
+        EventMeshHTTPServer eventMeshHTTPServer = mock(EventMeshHTTPServer.class);
         when(eventMeshHTTPServer.getMetrics()).thenReturn(metrics);
         when(eventMeshHTTPServer.getMetrics().getSummaryMetrics()).thenReturn(httpSummaryMetrics);
 
@@ -76,11 +77,13 @@ public class ClientManageControllerTest {
         WebHookConfigOperation webHookConfigOperation = mock(WebHookConfigOperation.class);
         when(adminWebHookConfigOperationManage.getWebHookConfigOperation()).thenReturn(webHookConfigOperation);
 
+        EventMeshGrpcServer eventMeshGrpcServer = mock(EventMeshGrpcServer.class);
+        Registry registry = mock(Registry.class);
         ClientManageController controller = new ClientManageController(eventMeshTCPServer,
             eventMeshHTTPServer, eventMeshGrpcServer, registry);
         controller.setAdminWebHookConfigOperationManage(adminWebHookConfigOperationManage);
 
-        when(eventMeshTCPServer.getEventMeshTCPConfiguration().getEventMeshConnectorPluginType()).thenReturn("standalone");
+        eventMeshTCPServer.getEventMeshTCPConfiguration().setEventMeshConnectorPluginType("standalone");
 
         try (MockedStatic<HttpServer> dummyStatic = Mockito.mockStatic(HttpServer.class)) {
             HttpServer server = mock(HttpServer.class);
diff --git a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/handler/QueryRecommendEventMeshHandlerTest.java b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/handler/QueryRecommendEventMeshHandlerTest.java
index 1a7c3a273..0e6b5e5a8 100644
--- a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/handler/QueryRecommendEventMeshHandlerTest.java
+++ b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/handler/QueryRecommendEventMeshHandlerTest.java
@@ -21,13 +21,13 @@ package org.apache.eventmesh.runtime.admin.handler;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockConstruction;
 import static org.mockito.Mockito.mockStatic;
 import static org.mockito.Mockito.when;
 
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.runtime.admin.controller.HttpHandlerManager;
 import org.apache.eventmesh.runtime.boot.EventMeshTCPServer;
 import org.apache.eventmesh.runtime.configuration.EventMeshTCPConfiguration;
@@ -54,8 +54,7 @@ public class QueryRecommendEventMeshHandlerTest {
     public void testHandle() throws Exception {
         // mock eventMeshTCPServer
         EventMeshTCPServer eventMeshTCPServer = mock(EventMeshTCPServer.class);
-        EventMeshTCPConfiguration tcpConfiguration = mock(EventMeshTCPConfiguration.class);
-        doNothing().when(tcpConfiguration).init();
+        EventMeshTCPConfiguration tcpConfiguration = new EventMeshTCPConfiguration();
         when(eventMeshTCPServer.getEventMeshTCPConfiguration()).thenReturn(tcpConfiguration);
 
         URI uri = mock(URI.class);
@@ -70,7 +69,6 @@ public class QueryRecommendEventMeshHandlerTest {
 
         // case 1: normal case
         tcpConfiguration.setEventMeshServerRegistryEnable(true);
-        outputStream.write("result".getBytes(StandardCharsets.UTF_8));
         when(httpExchange.getResponseBody()).thenReturn(outputStream);
         try (MockedConstruction<EventMeshRecommendImpl> ignored = mockConstruction(EventMeshRecommendImpl.class,
             (mock, context) -> when(mock.calculateRecommendEventMesh(anyString(), anyString())).thenReturn(returnValue))) {
@@ -81,7 +79,6 @@ public class QueryRecommendEventMeshHandlerTest {
 
         // case 2: params illegal
         outputStream = new ByteArrayOutputStream();
-        outputStream.write("params illegal!".getBytes(StandardCharsets.UTF_8));
         when(httpExchange.getResponseBody()).thenReturn(outputStream);
         try (MockedStatic<StringUtils> dummyStatic = mockStatic(StringUtils.class)) {
             dummyStatic.when(() -> StringUtils.isBlank(any())).thenReturn(true);
diff --git a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/boot/EventMeshServerTest.java b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/boot/EventMeshServerTest.java
new file mode 100644
index 000000000..84aedc1fd
--- /dev/null
+++ b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/boot/EventMeshServerTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.eventmesh.runtime.boot;
+
+import org.apache.eventmesh.common.config.CommonConfiguration;
+import org.apache.eventmesh.common.config.ConfigService;
+import org.apache.eventmesh.runtime.configuration.EventMeshTCPConfiguration;
+import org.apache.eventmesh.runtime.constants.EventMeshConstants;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EventMeshServerTest {
+
+    /**
+     * True Environment variables need to be set during startup
+     */
+    @Test
+    public void testGetConfigWhenStartup() throws Exception {
+
+        testGetConfigWhenStartup(Boolean.FALSE);
+    }
+
+    private void testGetConfigWhenStartup(Boolean hasEnv) throws Exception {
+        String eventMeshConfFile = "configuration.properties";
+
+        if (hasEnv) {
+            ConfigService.getInstance()
+                    .setConfigPath(EventMeshConstants.EVENTMESH_CONF_HOME + File.separator)
+                    .setRootConfig(eventMeshConfFile);
+        } else {
+            eventMeshConfFile = "classPath://" + eventMeshConfFile;
+            ConfigService.getInstance().setRootConfig(eventMeshConfFile);
+        }
+
+        ConfigService configService = ConfigService.getInstance();
+        EventMeshTCPConfiguration eventMeshTCPConfiguration = configService.buildConfigInstance(EventMeshTCPConfiguration.class);
+
+        assertCommonConfig(eventMeshTCPConfiguration);
+        assertTCPConfig(eventMeshTCPConfiguration);
+    }
+
+    private void assertTCPConfig(EventMeshTCPConfiguration config) {
+        Assert.assertEquals(config.eventMeshTcpServerPort, 816);
+        Assert.assertEquals(config.eventMeshTcpIdleAllSeconds, 1816);
+        Assert.assertEquals(config.eventMeshTcpIdleWriteSeconds, 2816);
+        Assert.assertEquals(config.eventMeshTcpIdleReadSeconds, 3816);
+        Assert.assertEquals(config.eventMeshTcpMsgReqnumPerSecond, Integer.valueOf(4816));
+        Assert.assertEquals(config.eventMeshTcpClientMaxNum, 5816);
+        Assert.assertEquals(config.eventMeshTcpGlobalScheduler, 6816);
+        Assert.assertEquals(config.eventMeshTcpTaskHandleExecutorPoolSize, 7816);
+        Assert.assertEquals(config.eventMeshTcpMsgDownStreamExecutorPoolSize, 8816);
+        Assert.assertEquals(config.eventMeshTcpSessionExpiredInMills, 1816);
+        Assert.assertEquals(config.eventMeshTcpSessionUpstreamBufferSize, 11816);
+        Assert.assertEquals(config.eventMeshTcpMsgAsyncRetryTimes, 12816);
+        Assert.assertEquals(config.eventMeshTcpMsgSyncRetryTimes, 13816);
+        Assert.assertEquals(config.eventMeshTcpMsgRetrySyncDelayInMills, 14816);
+        Assert.assertEquals(config.eventMeshTcpMsgRetryAsyncDelayInMills, 15816);
+        Assert.assertEquals(config.eventMeshTcpMsgRetryQueueSize, 16816);
+        Assert.assertEquals(config.eventMeshTcpRebalanceIntervalInMills, Integer.valueOf(17816));
+        Assert.assertEquals(config.eventMeshServerAdminPort, 18816);
+        Assert.assertEquals(config.eventMeshTcpSendBackEnabled, Boolean.TRUE);
+        Assert.assertEquals(config.eventMeshTcpSendBackMaxTimes, 3);
+        Assert.assertEquals(config.eventMeshTcpPushFailIsolateTimeInMills, 21816);
+        Assert.assertEquals(config.gracefulShutdownSleepIntervalInMills, 22816);
+        Assert.assertEquals(config.sleepIntervalInRebalanceRedirectMills, 23816);
+        Assert.assertEquals(config.eventMeshEventSize, 22816);
+        Assert.assertEquals(config.eventMeshEventBatchSize, 23816);
+    }
+
+    private void assertCommonConfig(CommonConfiguration config) {
+        Assert.assertEquals("env-succeed!!!", config.getEventMeshEnv());
+        Assert.assertEquals("idc-succeed!!!", config.getEventMeshIDC());
+        Assert.assertEquals("cluster-succeed!!!", config.getEventMeshCluster());
+        Assert.assertEquals("name-succeed!!!", config.getEventMeshName());
+        Assert.assertEquals("816", config.getSysID());
+        Assert.assertEquals("connector-succeed!!!", config.getEventMeshConnectorPluginType());
+        Assert.assertEquals("security-succeed!!!", config.getEventMeshSecurityPluginType());
+        Assert.assertEquals("registry-succeed!!!", config.getEventMeshRegistryPluginType());
+        Assert.assertEquals("trace-succeed!!!", config.getEventMeshTracePluginType());
+        Assert.assertEquals("hostIp-succeed!!!", config.getEventMeshServerIp());
+
+        List<String> list = new ArrayList<>();
+        list.add("metrics-succeed1!!!");
+        list.add("metrics-succeed2!!!");
+        list.add("metrics-succeed3!!!");
+        Assert.assertEquals(list, config.getEventMeshMetricsPluginType());
+
+        Assert.assertTrue(config.isEventMeshServerSecurityEnable());
+        Assert.assertTrue(config.isEventMeshServerRegistryEnable());
+        Assert.assertTrue(config.isEventMeshServerTraceEnable());
+
+        Assert.assertEquals("eventmesh.idc-succeed!!!", config.getEventMeshWebhookOrigin());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/client/common/Server.java b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/client/common/Server.java
index 3cc089931..8c69fd522 100644
--- a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/client/common/Server.java
+++ b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/client/common/Server.java
@@ -17,9 +17,7 @@
 
 package org.apache.eventmesh.runtime.client.common;
 
-import org.apache.eventmesh.common.config.ConfigurationWrapper;
 import org.apache.eventmesh.runtime.boot.EventMeshServer;
-import org.apache.eventmesh.runtime.constants.EventMeshConstants;
 
 public class Server {
 
@@ -33,10 +31,8 @@ public class Server {
     }
 
     public void startAccessServer() throws Exception {
-        ConfigurationWrapper configurationWrapper =
-                new ConfigurationWrapper(EventMeshConstants.EVENTMESH_CONF_HOME,
-                        EventMeshConstants.EVENTMESH_CONF_FILE, false);
-        new EventMeshServer(configurationWrapper).start();
+        eventMeshServer = new EventMeshServer();
+        eventMeshServer.start();
     }
 
     public void shutdownAccessServer() throws Exception {
diff --git a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshGrpcConfigurationTest.java b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshGrpcConfigurationTest.java
new file mode 100644
index 000000000..5f107ab3b
--- /dev/null
+++ b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshGrpcConfigurationTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.eventmesh.runtime.configuration;
+
+import org.apache.eventmesh.common.config.CommonConfiguration;
+import org.apache.eventmesh.common.config.ConfigService;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EventMeshGrpcConfigurationTest {
+
+    @Test
+    public void testGetConfigForEventMeshGrpcConfiguration() throws Exception {
+
+        ConfigService configService = ConfigService.getInstance();
+        configService.setRootConfig("classPath://configuration.properties");
+
+        EventMeshGrpcConfiguration config = configService.buildConfigInstance(EventMeshGrpcConfiguration.class);
+
+        assertCommonConfig(config);
+        assertGrpcConfig(config);
+    }
+
+    private void assertGrpcConfig(EventMeshGrpcConfiguration config) {
+        Assert.assertEquals(config.getGrpcServerPort(), 816);
+        Assert.assertEquals(config.getEventMeshSessionExpiredInMills(), 1816);
+        Assert.assertEquals(config.isEventMeshServerBatchMsgBatchEnabled(), Boolean.FALSE);
+        Assert.assertEquals(config.getEventMeshServerBatchMsgThreadNum(), 2816);
+        Assert.assertEquals(config.getEventMeshServerSendMsgThreadNum(), 3816);
+        Assert.assertEquals(config.getEventMeshServerPushMsgThreadNum(), 4816);
+        Assert.assertEquals(config.getEventMeshServerReplyMsgThreadNum(), 5816);
+        Assert.assertEquals(config.getEventMeshServerSubscribeMsgThreadNum(), 6816);
+        Assert.assertEquals(config.getEventMeshServerRegistryThreadNum(), 7816);
+        Assert.assertEquals(config.getEventMeshServerAdminThreadNum(), 8816);
+        Assert.assertEquals(config.getEventMeshServerRetryThreadNum(), 9816);
+        Assert.assertEquals(config.getEventMeshServerPullRegistryInterval(), 11816);
+        Assert.assertEquals(config.getEventMeshServerAsyncAccumulationThreshold(), 12816);
+        Assert.assertEquals(config.getEventMeshServerRetryBlockQueueSize(), 13816);
+        Assert.assertEquals(config.getEventMeshServerBatchBlockQueueSize(), 14816);
+        Assert.assertEquals(config.getEventMeshServerSendMsgBlockQueueSize(), 15816);
+        Assert.assertEquals(config.getEventMeshServerPushMsgBlockQueueSize(), 16816);
+        Assert.assertEquals(config.getEventMeshServerSubscribeMsgBlockQueueSize(), 17816);
+        Assert.assertEquals(config.getEventMeshServerBusyCheckInterval(), 18816);
+        Assert.assertEquals(config.isEventMeshServerConsumerEnabled(), Boolean.TRUE);
+        Assert.assertEquals(config.isEventMeshServerUseTls(), Boolean.TRUE);
+        Assert.assertEquals(config.getEventMeshBatchMsgRequestNumPerSecond(), 21816);
+        Assert.assertEquals(config.getEventMeshMsgReqNumPerSecond(), 19816);
+    }
+
+    private void assertCommonConfig(CommonConfiguration config) {
+        Assert.assertEquals("env-succeed!!!", config.getEventMeshEnv());
+        Assert.assertEquals("idc-succeed!!!", config.getEventMeshIDC());
+        Assert.assertEquals("cluster-succeed!!!", config.getEventMeshCluster());
+        Assert.assertEquals("name-succeed!!!", config.getEventMeshName());
+        Assert.assertEquals("816", config.getSysID());
+        Assert.assertEquals("connector-succeed!!!", config.getEventMeshConnectorPluginType());
+        Assert.assertEquals("security-succeed!!!", config.getEventMeshSecurityPluginType());
+        Assert.assertEquals("registry-succeed!!!", config.getEventMeshRegistryPluginType());
+        Assert.assertEquals("trace-succeed!!!", config.getEventMeshTracePluginType());
+        Assert.assertEquals("hostIp-succeed!!!", config.getEventMeshServerIp());
+
+        List<String> list = new ArrayList<>();
+        list.add("metrics-succeed1!!!");
+        list.add("metrics-succeed2!!!");
+        list.add("metrics-succeed3!!!");
+        Assert.assertEquals(list, config.getEventMeshMetricsPluginType());
+
+        Assert.assertTrue(config.isEventMeshServerSecurityEnable());
+        Assert.assertTrue(config.isEventMeshServerRegistryEnable());
+        Assert.assertTrue(config.isEventMeshServerTraceEnable());
+
+        Assert.assertEquals("eventmesh.idc-succeed!!!", config.getEventMeshWebhookOrigin());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshHTTPConfigurationTest.java b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshHTTPConfigurationTest.java
new file mode 100644
index 000000000..72c0b5e14
--- /dev/null
+++ b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshHTTPConfigurationTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.eventmesh.runtime.configuration;
+
+import org.apache.eventmesh.common.config.CommonConfiguration;
+import org.apache.eventmesh.common.config.ConfigService;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import inet.ipaddr.AddressStringException;
+import inet.ipaddr.IPAddress;
+import inet.ipaddr.IPAddressString;
+
+public class EventMeshHTTPConfigurationTest {
+
+    @Test
+    public void testGetEventMeshHTTPConfiguration() throws Exception {
+
+        ConfigService configService = ConfigService.getInstance();
+        configService.setRootConfig("classPath://configuration.properties");
+
+        EventMeshHTTPConfiguration config = configService.buildConfigInstance(EventMeshHTTPConfiguration.class);
+
+        assertCommonConfig(config);
+        assertHTTPConfig(config);
+    }
+
+    private void assertHTTPConfig(EventMeshHTTPConfiguration config) throws AddressStringException {
+        Assert.assertEquals(config.getHttpServerPort(), 1816);
+        Assert.assertEquals(config.isEventMeshServerBatchMsgBatchEnabled(), Boolean.FALSE);
+        Assert.assertEquals(config.getEventMeshServerBatchMsgThreadNum(), 2816);
+        Assert.assertEquals(config.getEventMeshServerSendMsgThreadNum(), 3816);
+        Assert.assertEquals(config.getEventMeshServerPushMsgThreadNum(), 4816);
+        Assert.assertEquals(config.getEventMeshServerReplyMsgThreadNum(), 5816);
+        Assert.assertEquals(config.getEventMeshServerClientManageThreadNum(), 6816);
+        Assert.assertEquals(config.getEventMeshServerRegistryThreadNum(), 7816);
+        Assert.assertEquals(config.getEventMeshServerAdminThreadNum(), 8816);
+
+        Assert.assertEquals(config.getEventMeshServerRetryThreadNum(), 9816);
+        Assert.assertEquals(config.getEventMeshServerPullRegistryInterval(), 11816);
+        Assert.assertEquals(config.getEventMeshServerAsyncAccumulationThreshold(), 12816);
+        Assert.assertEquals(config.getEventMeshServerRetryBlockQSize(), 13816);
+        Assert.assertEquals(config.getEventMeshServerBatchBlockQSize(), 14816);
+        Assert.assertEquals(config.getEventMeshServerSendMsgBlockQSize(), 15816);
+        Assert.assertEquals(config.getEventMeshServerPushMsgBlockQSize(), 16816);
+        Assert.assertEquals(config.getEventMeshServerClientManageBlockQSize(), 17816);
+        Assert.assertEquals(config.getEventMeshServerBusyCheckInterval(), 18816);
+        Assert.assertEquals(config.isEventMeshServerConsumerEnabled(), Boolean.TRUE);
+        Assert.assertEquals(config.isEventMeshServerUseTls(), Boolean.TRUE);
+        Assert.assertEquals(config.getEventMeshHttpMsgReqNumPerSecond(), 19816);
+        Assert.assertEquals(config.getEventMeshBatchMsgRequestNumPerSecond(), 21816);
+        Assert.assertEquals(config.getEventMeshEventSize(), 22816);
+        Assert.assertEquals(config.getEventMeshEventBatchSize(), 23816);
+
+        List<IPAddress> list4 = new ArrayList<>();
+        list4.add(new IPAddressString("127.0.0.1").toAddress());
+        list4.add(new IPAddressString("127.0.0.2").toAddress());
+        Assert.assertEquals(config.getEventMeshIpv4BlackList(), list4);
+        List<IPAddress> list6 = new ArrayList<>();
+        list6.add(new IPAddressString("0:0:0:0:0:0:7f00:01").toAddress());
+        list6.add(new IPAddressString("0:0:0:0:0:0:7f00:02").toAddress());
+        Assert.assertEquals(config.getEventMeshIpv6BlackList(), list6);
+    }
+
+    private void assertCommonConfig(CommonConfiguration config) {
+        Assert.assertEquals("env-succeed!!!", config.getEventMeshEnv());
+        Assert.assertEquals("idc-succeed!!!", config.getEventMeshIDC());
+        Assert.assertEquals("cluster-succeed!!!", config.getEventMeshCluster());
+        Assert.assertEquals("name-succeed!!!", config.getEventMeshName());
+        Assert.assertEquals("816", config.getSysID());
+        Assert.assertEquals("connector-succeed!!!", config.getEventMeshConnectorPluginType());
+        Assert.assertEquals("security-succeed!!!", config.getEventMeshSecurityPluginType());
+        Assert.assertEquals("registry-succeed!!!", config.getEventMeshRegistryPluginType());
+        Assert.assertEquals("trace-succeed!!!", config.getEventMeshTracePluginType());
+        Assert.assertEquals("hostIp-succeed!!!", config.getEventMeshServerIp());
+
+        List<String> list = new ArrayList<>();
+        list.add("metrics-succeed1!!!");
+        list.add("metrics-succeed2!!!");
+        list.add("metrics-succeed3!!!");
+        Assert.assertEquals(list, config.getEventMeshMetricsPluginType());
+
+        Assert.assertTrue(config.isEventMeshServerSecurityEnable());
+        Assert.assertTrue(config.isEventMeshServerRegistryEnable());
+        Assert.assertTrue(config.isEventMeshServerTraceEnable());
+
+        Assert.assertEquals("eventmesh.idc-succeed!!!", config.getEventMeshWebhookOrigin());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfigurationTest.java b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfigurationTest.java
new file mode 100644
index 000000000..a26617842
--- /dev/null
+++ b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfigurationTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.eventmesh.runtime.configuration;
+
+import org.apache.eventmesh.common.config.CommonConfiguration;
+import org.apache.eventmesh.common.config.ConfigService;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EventMeshTCPConfigurationTest {
+
+    @Test
+    public void testGetEventMeshTCPConfiguration() throws Exception {
+
+        ConfigService configService = ConfigService.getInstance();
+        configService.setRootConfig("classPath://configuration.properties");
+
+        EventMeshTCPConfiguration config = configService.buildConfigInstance(EventMeshTCPConfiguration.class);
+
+        assertCommonConfig(config);
+        assertTCPConfig(config);
+    }
+
+    private void assertTCPConfig(EventMeshTCPConfiguration config) {
+        Assert.assertEquals(config.eventMeshTcpServerPort, 816);
+        Assert.assertEquals(config.eventMeshTcpIdleAllSeconds, 1816);
+        Assert.assertEquals(config.eventMeshTcpIdleWriteSeconds, 2816);
+        Assert.assertEquals(config.eventMeshTcpIdleReadSeconds, 3816);
+        Assert.assertEquals(config.eventMeshTcpMsgReqnumPerSecond, Integer.valueOf(4816));
+        Assert.assertEquals(config.eventMeshTcpClientMaxNum, 5816);
+        Assert.assertEquals(config.eventMeshTcpGlobalScheduler, 6816);
+        Assert.assertEquals(config.eventMeshTcpTaskHandleExecutorPoolSize, 7816);
+        Assert.assertEquals(config.eventMeshTcpMsgDownStreamExecutorPoolSize, 8816);
+        Assert.assertEquals(config.eventMeshTcpSessionExpiredInMills, 1816);
+        Assert.assertEquals(config.eventMeshTcpSessionUpstreamBufferSize, 11816);
+        Assert.assertEquals(config.eventMeshTcpMsgAsyncRetryTimes, 12816);
+        Assert.assertEquals(config.eventMeshTcpMsgSyncRetryTimes, 13816);
+        Assert.assertEquals(config.eventMeshTcpMsgRetrySyncDelayInMills, 14816);
+        Assert.assertEquals(config.eventMeshTcpMsgRetryAsyncDelayInMills, 15816);
+        Assert.assertEquals(config.eventMeshTcpMsgRetryQueueSize, 16816);
+        Assert.assertEquals(config.eventMeshTcpRebalanceIntervalInMills, Integer.valueOf(17816));
+        Assert.assertEquals(config.eventMeshServerAdminPort, 18816);
+        Assert.assertEquals(config.eventMeshTcpSendBackEnabled, Boolean.TRUE);
+        Assert.assertEquals(config.eventMeshTcpSendBackMaxTimes, 3);
+        Assert.assertEquals(config.eventMeshTcpPushFailIsolateTimeInMills, 21816);
+        Assert.assertEquals(config.gracefulShutdownSleepIntervalInMills, 22816);
+        Assert.assertEquals(config.sleepIntervalInRebalanceRedirectMills, 23816);
+        Assert.assertEquals(config.eventMeshEventSize, 22816);
+        Assert.assertEquals(config.eventMeshEventBatchSize, 23816);
+    }
+
+    private void assertCommonConfig(CommonConfiguration config) {
+        Assert.assertEquals("env-succeed!!!", config.getEventMeshEnv());
+        Assert.assertEquals("idc-succeed!!!", config.getEventMeshIDC());
+        Assert.assertEquals("cluster-succeed!!!", config.getEventMeshCluster());
+        Assert.assertEquals("name-succeed!!!", config.getEventMeshName());
+        Assert.assertEquals("816", config.getSysID());
+        Assert.assertEquals("connector-succeed!!!", config.getEventMeshConnectorPluginType());
+        Assert.assertEquals("security-succeed!!!", config.getEventMeshSecurityPluginType());
+        Assert.assertEquals("registry-succeed!!!", config.getEventMeshRegistryPluginType());
+        Assert.assertEquals("trace-succeed!!!", config.getEventMeshTracePluginType());
+        Assert.assertEquals("hostIp-succeed!!!", config.getEventMeshServerIp());
+
+        List<String> list = new ArrayList<>();
+        list.add("metrics-succeed1!!!");
+        list.add("metrics-succeed2!!!");
+        list.add("metrics-succeed3!!!");
+        Assert.assertEquals(list, config.getEventMeshMetricsPluginType());
+
+        Assert.assertTrue(config.isEventMeshServerSecurityEnable());
+        Assert.assertTrue(config.isEventMeshServerRegistryEnable());
+        Assert.assertTrue(config.isEventMeshServerTraceEnable());
+
+        Assert.assertEquals("eventmesh.idc-succeed!!!", config.getEventMeshWebhookOrigin());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/util/HttpTinyClientTest.java b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/util/HttpTinyClientTest.java
index 09e66657d..bc09994d1 100644
--- a/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/util/HttpTinyClientTest.java
+++ b/eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/util/HttpTinyClientTest.java
@@ -31,6 +31,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.MockedStatic;
 import org.mockito.Mockito;
diff --git a/eventmesh-runtime/src/test/resources/configuration.properties b/eventmesh-runtime/src/test/resources/configuration.properties
new file mode 100644
index 000000000..190fd2fc5
--- /dev/null
+++ b/eventmesh-runtime/src/test/resources/configuration.properties
@@ -0,0 +1,106 @@
+#
+# 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.
+#
+
+# CommonConfiguration config
+eventMesh.server.env=env-succeed!!!
+eventMesh.server.idc=idc-succeed!!!
+eventMesh.sysid=816
+eventMesh.server.cluster=cluster-succeed!!!
+eventMesh.server.name=name-succeed!!!
+eventMesh.server.hostIp=hostIp-succeed!!!
+eventMesh.connector.plugin.type=connector-succeed!!!
+eventMesh.security.plugin.type=security-succeed!!!
+eventMesh.registry.plugin.type=registry-succeed!!!
+eventMesh.trace.plugin=trace-succeed!!!
+eventMesh.server.registry.registerIntervalInMills=816
+eventMesh.server.registry.fetchRegistryAddrIntervalInMills=1816
+eventMesh.metrics.plugin=metrics-succeed1!!!,metrics-succeed2!!!,metrics-succeed3!!!
+eventMesh.registry.plugin.server-addr=server-addr-succeed1!!!
+
+eventMesh.server.security.enabled=true
+eventMesh.server.registry.enabled=true
+eventMesh.server.trace.enabled=true
+
+eventMesh.server.provide.protocols=TCP,HTTP,GRPC
+eventMesh.registry.plugin.username=username-succeed!!!
+eventMesh.registry.plugin.password=password-succeed!!!
+
+# EventMeshHTTPConfiguration config
+eventMesh.server.http.port=1816
+eventMesh.server.batchmsg.batch.enabled=false
+eventMesh.server.batchmsg.threads.num=2816
+eventMesh.server.sendmsg.threads.num=3816
+eventMesh.server.pushmsg.threads.num=4816
+eventMesh.server.replymsg.threads.num=5816
+eventMesh.server.clientmanage.threads.num=6816
+eventMesh.server.registry.threads.num=7816
+eventMesh.server.admin.threads.num=8816
+eventMesh.server.retry.threads.num=9816
+eventMesh.server.pull.registry.interval=11816
+eventMesh.server.async.accumulation.threshold=12816
+eventMesh.server.retry.blockQ.size=13816
+eventMesh.server.batchmsg.blockQ.size=14816
+eventMesh.server.sendmsg.blockQ.size=15816
+eventMesh.server.pushmsg.blockQ.size=16816
+eventMesh.server.clientM.blockQ.size=17816
+eventMesh.server.busy.check.interval=18816
+eventMesh.server.consumer.enabled=true
+eventMesh.server.useTls.enabled=true
+eventMesh.server.http.msgReqnumPerSecond=19816
+eventMesh.server.batchmsg.reqNumPerSecond=21816
+eventMesh.server.maxEventSize=22816
+eventMesh.server.maxEventBatchSize=23816
+eventMesh.server.blacklist.ipv4=127.0.0.1,127.0.0.2
+eventMesh.server.blacklist.ipv6=0:0:0:0:0:0:7f00:01,0:0:0:0:0:0:7f00:02
+
+# EventMeshGrpcConfiguration config
+eventMesh.server.grpc.port=816
+eventMesh.server.session.expiredInMills=1816
+
+
+# EventMeshTCPConfiguration config
+eventMesh.server.tcp.port=816
+eventMesh.server.tcp.allIdleSeconds=1816
+eventMesh.server.tcp.writerIdleSeconds=2816
+eventMesh.server.tcp.readerIdleSeconds=3816
+eventMesh.server.tcp.msgReqnumPerSecond=4816
+eventMesh.server.tcp.clientMaxNum=5816
+eventMesh.server.tcp.enabled=true
+eventMesh.server.global.scheduler=6816
+eventMesh.server.tcp.taskHandleExecutorPoolSize=7816
+eventMesh.server.tcp.msgDownStreamExecutorPoolSize=8816
+eventMesh.server.session.upstreamBufferSize=11816
+eventMesh.server.retry.async.pushRetryTimes=12816
+eventMesh.server.retry.sync.pushRetryTimes=13816
+eventMesh.server.retry.sync.pushRetryDelayInMills=14816
+eventMesh.server.retry.async.pushRetryDelayInMills=15816
+eventMesh.server.retry.pushRetryQueueSize=16816
+eventMesh.server.tcp.RebalanceIntervalInMills=17816
+eventMesh.server.admin.http.port=18816
+eventMesh.server.tcp.sendBack.enabled=true
+eventMesh.server.tcp.pushFailIsolateTimeInMills=21816
+eventMesh.server.gracefulShutdown.sleepIntervalInMills=22816
+eventMesh.server.rebalanceRedirect.sleepIntervalInM=23816
+
+
+
+
+
+
+
+
+
diff --git a/eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/tcp/impl/eventmeshmessage/EventMeshMessageTCPSubClient.java b/eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/tcp/impl/eventmeshmessage/EventMeshMessageTCPSubClient.java
index f0257050f..93e4b92ae 100644
--- a/eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/tcp/impl/eventmeshmessage/EventMeshMessageTCPSubClient.java
+++ b/eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/tcp/impl/eventmeshmessage/EventMeshMessageTCPSubClient.java
@@ -88,7 +88,7 @@ class EventMeshMessageTCPSubClient extends TcpClient implements EventMeshTCPSubC
 
     @Override
     public void subscribe(String topic, SubscriptionMode subscriptionMode, SubscriptionType subscriptionType)
-            throws EventMeshException {
+        throws EventMeshException {
         try {
             subscriptionItems.add(new SubscriptionItem(topic, subscriptionMode, subscriptionType));
             Package request = MessageUtils.subscribe(topic, subscriptionMode, subscriptionType);
@@ -146,7 +146,7 @@ class EventMeshMessageTCPSubClient extends TcpClient implements EventMeshTCPSubC
         public void callback(EventMeshMessage eventMeshMessage, ChannelHandlerContext ctx) {
             if (callback != null) {
                 callback.handle(eventMeshMessage).ifPresent(
-                        responseMessage -> ctx.writeAndFlush(MessageUtils.buildPackage(responseMessage, Command.RESPONSE_TO_SERVER))
+                    responseMessage -> ctx.writeAndFlush(MessageUtils.buildPackage(responseMessage, Command.RESPONSE_TO_SERVER))
                 );
             }
         }
diff --git a/eventmesh-security-plugin/eventmesh-security-api/src/main/java/org/apache/eventmesh/api/common/ConfigurationWrapper.java b/eventmesh-security-plugin/eventmesh-security-api/src/main/java/org/apache/eventmesh/api/common/ConfigurationWrapper.java
deleted file mode 100644
index 8f07b0551..000000000
--- a/eventmesh-security-plugin/eventmesh-security-api/src/main/java/org/apache/eventmesh/api/common/ConfigurationWrapper.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.eventmesh.api.common;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Properties;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ConfigurationWrapper {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationWrapper.class);
-
-    private static final String EVENTMESH_CONFIG_HOME = System.getProperty("confPath", System.getenv("confPath"));
-
-    public static Properties getConfig(String configFile) throws IOException {
-        String configFilePath;
-
-        // get from classpath
-        URL resource = Thread.currentThread().getContextClassLoader().getResource(configFile);
-        if (resource != null && new File(resource.getPath()).exists()) {
-            configFilePath = resource.getPath();
-        } else {
-            // get from config home
-            configFilePath = EVENTMESH_CONFIG_HOME + File.separator + configFile;
-        }
-
-        if (LOGGER.isInfoEnabled()) {
-            LOGGER.info("loading auth config: {}", configFilePath);
-        }
-
-        Properties properties = new Properties();
-        try (BufferedReader br = new BufferedReader(new FileReader(configFilePath))) {
-            properties.load(br);
-        }
-
-        return properties;
-    }
-}
diff --git a/eventmesh-security-plugin/eventmesh-security-api/src/test/java/org/apache/eventmesh/api/common/ConfigurationWrapperTest.java b/eventmesh-security-plugin/eventmesh-security-api/src/test/java/org/apache/eventmesh/api/common/ConfigurationWrapperTest.java
deleted file mode 100644
index d517c912f..000000000
--- a/eventmesh-security-plugin/eventmesh-security-api/src/test/java/org/apache/eventmesh/api/common/ConfigurationWrapperTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.eventmesh.api.common;
-
-import java.net.URL;
-import java.util.Properties;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ConfigurationWrapperTest {
-
-    @Test
-    public void testGetDefaultConfig() {
-        try {
-            URL resource = Thread.currentThread().getContextClassLoader().getResource("testpath");
-            String directoryPath = resource.getPath();
-            System.setProperty("confPath", directoryPath);
-            Properties p = ConfigurationWrapper.getConfig("test1.properties");
-            String v = (String) p.get("a");
-            Assert.assertEquals(v, "2");
-        } catch (Exception e) {
-            Assert.fail(e.getMessage());
-        }
-
-    }
-
-    @Test
-    public void testGetSpecifiedConfig() {
-        try {
-            Properties p = ConfigurationWrapper.getConfig("test.properties");
-            String v = (String) p.get("a");
-            Assert.assertEquals(v, "1");
-        } catch (Exception e) {
-            Assert.fail(e.getMessage());
-        }
-    }
-}
diff --git a/eventmesh-security-plugin/eventmesh-security-api/src/test/resources/testpath/test1.properties b/eventmesh-security-plugin/eventmesh-security-api/src/test/resources/testpath/test1.properties
deleted file mode 100644
index 9dc12ee52..000000000
--- a/eventmesh-security-plugin/eventmesh-security-api/src/test/resources/testpath/test1.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# 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.
-#
-a=2
\ No newline at end of file
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/build.gradle b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/build.gradle
index 044b2e6b4..9a35c3b1b 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/build.gradle
+++ b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/build.gradle
@@ -18,6 +18,9 @@
 dependencies {
     implementation project(":eventmesh-security-plugin:eventmesh-security-api")
     implementation "org.apache.commons:commons-lang3"
+    implementation project(":eventmesh-common")
+    compileOnly 'org.projectlombok:lombok:1.18.22'
+    annotationProcessor 'org.projectlombok:lombok:1.18.22'
 
     testImplementation project(":eventmesh-security-plugin:eventmesh-security-api")
     testImplementation "org.apache.commons:commons-lang3"
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/main/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigs.java b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/main/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigs.java
index acc737989..d9441c3a9 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/main/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigs.java
+++ b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/main/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigs.java
@@ -17,45 +17,18 @@
 
 package org.apache.eventmesh.auth.http.basic.config;
 
-import org.apache.eventmesh.api.common.ConfigurationWrapper;
-import org.apache.eventmesh.api.exception.AuthException;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
-import java.io.IOException;
-import java.util.Properties;
+import lombok.Data;
 
+@Data
+@Config(prefix = "auth", path = "classPath://auth-http-basic.properties")
 public class AuthConfigs {
 
-    private static final String AUTH_CONFIG_FILE_NAME = "auth-http-basic.properties";
-
-    private static final String AUTH_CONFIG_KEY_USERNAME = "auth.username";
-
-    private static final String AUTH_CONFIG_KEY_PASSWORD = "auth.password";
-
+    @ConfigFiled(field = "username")
     private String username;
 
-    private String password;
-
-    private static AuthConfigs instance;
-
-    public static synchronized AuthConfigs getConfigs() throws AuthException {
-        try {
-            if (instance == null) {
-                Properties props = ConfigurationWrapper.getConfig(AUTH_CONFIG_FILE_NAME);
-                instance = new AuthConfigs();
-                instance.username = props.getProperty(AUTH_CONFIG_KEY_USERNAME);
-                instance.password = props.getProperty(AUTH_CONFIG_KEY_PASSWORD);
-            }
-            return instance;
-        } catch (IOException e) {
-            throw new AuthException("getConfigs error", e);
-        }
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
+    @ConfigFiled(field = "password")
+    public String password;
 }
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/main/java/org/apache/eventmesh/auth/http/basic/impl/AuthHttpBasicService.java b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/main/java/org/apache/eventmesh/auth/http/basic/impl/AuthHttpBasicService.java
index 42dad2c5c..71075fd4c 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/main/java/org/apache/eventmesh/auth/http/basic/impl/AuthHttpBasicService.java
+++ b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/main/java/org/apache/eventmesh/auth/http/basic/impl/AuthHttpBasicService.java
@@ -20,6 +20,7 @@ package org.apache.eventmesh.auth.http.basic.impl;
 import org.apache.eventmesh.api.auth.AuthService;
 import org.apache.eventmesh.api.exception.AuthException;
 import org.apache.eventmesh.auth.http.basic.config.AuthConfigs;
+import org.apache.eventmesh.common.config.Config;
 
 import org.apache.commons.lang3.Validate;
 
@@ -28,13 +29,17 @@ import java.util.Base64;
 import java.util.HashMap;
 import java.util.Map;
 
+@Config(field = "authConfigs")
 public class AuthHttpBasicService implements AuthService {
 
+    /**
+     * Unified configuration class corresponding to auth-http-basic.properties
+     */
     private AuthConfigs authConfigs;
 
     @Override
     public void init() throws AuthException {
-        authConfigs = AuthConfigs.getConfigs();
+
     }
 
     @Override
@@ -49,16 +54,17 @@ public class AuthHttpBasicService implements AuthService {
 
     @Override
     public Map<String, String> getAuthParams() throws AuthException {
-        if (authConfigs == null) {
-            init();
-        }
-
-        Validate.notNull(authConfigs);
-        String token = Base64.getEncoder().encodeToString((authConfigs.getUsername() + authConfigs.getPassword())
-                .getBytes(StandardCharsets.UTF_8));
+        String password = authConfigs.getPassword();
+        String username = authConfigs.getUsername();
+        String token = Base64.getEncoder()
+                .encodeToString((username + password).getBytes(StandardCharsets.UTF_8));
 
         Map<String, String> authParams = new HashMap<>(2);
         authParams.put("Authorization", "Basic " + token);
         return authParams;
     }
+
+    public AuthConfigs getClientConfiguration() {
+        return this.authConfigs;
+    }
 }
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
index 275530328..7bfee7425 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
+++ b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/config/AuthConfigsTest.java
@@ -17,17 +17,26 @@
 
 package org.apache.eventmesh.auth.http.basic.config;
 
+import org.apache.eventmesh.api.auth.AuthService;
+import org.apache.eventmesh.auth.http.basic.impl.AuthHttpBasicService;
+import org.apache.eventmesh.spi.EventMeshExtensionFactory;
+
 import org.junit.Assert;
 import org.junit.Test;
 
 public class AuthConfigsTest {
 
     @Test
-    public void testGetConfigs() {
-        AuthConfigs configs = AuthConfigs.getConfigs();
-        String password = configs.getPassword();
-        String username = configs.getUsername();
-        Assert.assertEquals(password, "password");
-        Assert.assertEquals(username, "usera");
+    public void getConfigWhenAuthHttpBasicServiceInit() {
+        AuthHttpBasicService authService = (AuthHttpBasicService) EventMeshExtensionFactory.getExtension(
+                AuthService.class, "auth-http-basic");
+
+        AuthConfigs config = authService.getClientConfiguration();
+        assertConfig(config);
+    }
+
+    private void assertConfig(AuthConfigs config) {
+        Assert.assertEquals(config.getUsername(), "username-success!!!");
+        Assert.assertEquals(config.getPassword(), "password-success!!!");
     }
-}
+}
\ No newline at end of file
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/impl/AuthHttpBasicServiceTest.java b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/impl/AuthHttpBasicServiceTest.java
index 0216252d1..f3b389089 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/impl/AuthHttpBasicServiceTest.java
+++ b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/java/org/apache/eventmesh/auth/http/basic/impl/AuthHttpBasicServiceTest.java
@@ -18,6 +18,9 @@
 package org.apache.eventmesh.auth.http.basic.impl;
 
 
+import org.apache.eventmesh.api.auth.AuthService;
+import org.apache.eventmesh.spi.EventMeshExtensionFactory;
+
 import java.util.Map;
 
 import org.junit.Assert;
@@ -30,7 +33,8 @@ public class AuthHttpBasicServiceTest {
 
     @BeforeClass
     public static void beforeClass() {
-        service = new AuthHttpBasicService();
+        service = (AuthHttpBasicService) EventMeshExtensionFactory.getExtension(
+                AuthService.class, "auth-http-basic");
     }
 
     @Test
diff --git a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/resources/auth-http-basic.properties b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/resources/auth-http-basic.properties
index 367e5a446..0e46ee68c 100644
--- a/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/resources/auth-http-basic.properties
+++ b/eventmesh-security-plugin/eventmesh-security-auth-http-basic/src/test/resources/auth-http-basic.properties
@@ -14,5 +14,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-auth.username = usera
-auth.password = password
\ No newline at end of file
+auth.username = username-success!!!
+auth.password = password-success!!!
\ No newline at end of file
diff --git a/eventmesh-spi/src/main/java/org/apache/eventmesh/spi/EventMeshExtensionFactory.java b/eventmesh-spi/src/main/java/org/apache/eventmesh/spi/EventMeshExtensionFactory.java
index 54d239619..6de216b40 100644
--- a/eventmesh-spi/src/main/java/org/apache/eventmesh/spi/EventMeshExtensionFactory.java
+++ b/eventmesh-spi/src/main/java/org/apache/eventmesh/spi/EventMeshExtensionFactory.java
@@ -17,12 +17,14 @@
 
 package org.apache.eventmesh.spi;
 
+import org.apache.eventmesh.common.config.ConfigService;
 import org.apache.eventmesh.spi.loader.ExtensionClassLoader;
 import org.apache.eventmesh.spi.loader.JarExtensionClassLoader;
 import org.apache.eventmesh.spi.loader.MetaInfExtensionClassLoader;
 
 import org.apache.commons.lang3.StringUtils;
 
+import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
@@ -85,12 +87,18 @@ public class EventMeshExtensionFactory {
                 if (extensionInstanceClass == null) {
                     return null;
                 }
-                T extensionInstance =  extensionInstanceClass.getDeclaredConstructor().newInstance();
+                T extensionInstance = extensionInstanceClass.getDeclaredConstructor().newInstance();
+                ConfigService.getInstance().populateConfigForObject(extensionInstance);
+
                 logger.info("initialize extension instance success, extensionType: {}, extensionInstanceName: {}",
-                    extensionType, extensionInstanceName);
+                        extensionType, extensionInstanceName);
                 return extensionInstance;
             } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
                 throw new ExtensionException("Extension initialize error", e);
+            } catch (NoSuchFieldException | IOException e) {
+                logger.error("initialize extension instance config failed, extensionType: {}, extensionInstanceName: {}",
+                        extensionType, extensionInstanceName, e);
+                throw new ExtensionException("Extension initialize error", e);
             }
         });
     }
@@ -102,11 +110,17 @@ public class EventMeshExtensionFactory {
                 return null;
             }
             T extensionInstance = extensionInstanceClass.getDeclaredConstructor().newInstance();
+            ConfigService.getInstance().populateConfigForObject(extensionInstance);
+
             logger.info("initialize extension instance success, extensionType: {}, extensionName: {}",
-                extensionType, extensionInstanceName);
+                    extensionType, extensionInstanceName);
             return extensionInstance;
         } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
             throw new ExtensionException("Extension initialize error", e);
+        } catch (NoSuchFieldException | IOException e) {
+            logger.error("initialize extension instance config failed, extensionType: {}, extensionInstanceName: {}",
+                    extensionType, extensionInstanceName, e);
+            throw new ExtensionException("Extension initialize error", e);
         }
     }
 
diff --git a/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/common/EventMeshTraceConstants.java b/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/common/EventMeshTraceConstants.java
index d1e2db093..41c1f3419 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/common/EventMeshTraceConstants.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/common/EventMeshTraceConstants.java
@@ -29,9 +29,4 @@ public class EventMeshTraceConstants {
     public static final String TRACE_DOWNSTREAM_EVENTMESH_CLIENT_SPAN = "downstream-eventmesh-client-span";
 
     public static final String TRACE_EVENTMESH_SDK_SERVER_SPAN = "eventmesh-sdk-server-span";
-
-    public static final String TRACE_EVENTMESH_MAX_EXPORT_SIZE = "eventmesh.trace.max.export.size";
-    public static final String TRACE_EVENTMESH_MAX_QUEUE_SIZE = "eventmesh.trace.max.queue.size";
-    public static final String TRACE_EVENTMESH_EXPORT_TIMEOUT = "eventmesh.trace.export.timeout";
-    public static final String TRACE_EVENTMESH_EXPORT_INTERVAL = "eventmesh.trace.export.interval";
 }
diff --git a/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/config/ExporterConfiguration.java b/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/config/ExporterConfiguration.java
index ef07c2619..b59eed443 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/config/ExporterConfiguration.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/config/ExporterConfiguration.java
@@ -17,101 +17,27 @@
 
 package org.apache.eventmesh.trace.api.config;
 
-import org.apache.eventmesh.common.utils.PropertiesUtils;
-import org.apache.eventmesh.trace.api.common.EventMeshTraceConstants;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Properties;
-
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
+import lombok.Data;
 
 /**
  * to load the properties form exporter.properties
  */
-@Slf4j
-@UtilityClass
+@Data
+@Config(prefix = "eventmesh.trace", path = "classPath://exporter.properties")
 public class ExporterConfiguration {
 
-    private static final String CONFIG_FILE = "exporter.properties";
-    private static final Properties properties = new Properties();
-
+    @ConfigFiled(field = "max.export.size")
     private int eventMeshTraceMaxExportSize = 512;
-    private int eventMeshTraceMaxQueueSize = 2048;
-    private int eventMeshTraceExportTimeout = 30;
-    private int eventMeshTraceExportInterval = 5;
-
-    static {
-        loadProperties();
-        initializeConfig();
-    }
-
-    public static int getEventMeshTraceMaxExportSize() {
-        return eventMeshTraceMaxExportSize;
-    }
 
-    public static int getEventMeshTraceMaxQueueSize() {
-        return eventMeshTraceMaxQueueSize;
-    }
-
-    public static int getEventMeshTraceExportTimeout() {
-        return eventMeshTraceExportTimeout;
-    }
-
-    public static int getEventMeshTraceExportInterval() {
-        return eventMeshTraceExportInterval;
-    }
-
-    private void initializeConfig() {
-        String eventMeshTraceMaxExportSizeStr = properties.getProperty(EventMeshTraceConstants.TRACE_EVENTMESH_MAX_EXPORT_SIZE);
-        if (StringUtils.isNotEmpty(eventMeshTraceMaxExportSizeStr)) {
-            eventMeshTraceMaxExportSize =
-                Integer.parseInt(StringUtils.deleteWhitespace(eventMeshTraceMaxExportSizeStr));
-        }
-
-        String eventMeshTraceMaxQueueSizeStr = properties.getProperty(EventMeshTraceConstants.TRACE_EVENTMESH_MAX_QUEUE_SIZE);
-        if (StringUtils.isNotEmpty(eventMeshTraceMaxQueueSizeStr)) {
-            eventMeshTraceMaxQueueSize = Integer.parseInt(StringUtils.deleteWhitespace(eventMeshTraceMaxQueueSizeStr));
-        }
-
-        String eventMeshTraceExportTimeoutStr = properties.getProperty(EventMeshTraceConstants.TRACE_EVENTMESH_EXPORT_TIMEOUT);
-        if (StringUtils.isNotEmpty(eventMeshTraceExportTimeoutStr)) {
-            eventMeshTraceExportTimeout =
-                Integer.parseInt(StringUtils.deleteWhitespace(eventMeshTraceExportTimeoutStr));
-        }
+    @ConfigFiled(field = "max.queue.size")
+    private int eventMeshTraceMaxQueueSize = 2048;
 
-        String eventMeshTraceExportIntervalStr = properties.getProperty(EventMeshTraceConstants.TRACE_EVENTMESH_EXPORT_INTERVAL);
-        if (StringUtils.isNotEmpty(eventMeshTraceExportIntervalStr)) {
-            eventMeshTraceExportInterval =
-                Integer.parseInt(StringUtils.deleteWhitespace(eventMeshTraceExportIntervalStr));
-        }
-    }
+    @ConfigFiled(field = "export.timeout")
+    private int eventMeshTraceExportTimeout = 30;
 
-    private void loadProperties() {
-        URL resource = ExporterConfiguration.class.getClassLoader().getResource(CONFIG_FILE);
-        if (resource != null) {
-            try (InputStream inputStream = resource.openStream()) {
-                if (inputStream.available() > 0) {
-                    properties.load(new BufferedReader(new InputStreamReader(inputStream)));
-                }
-            } catch (IOException e) {
-                throw new RuntimeException("Load exporter.properties file from classpath error");
-            }
-        }
-        // get from config home
-        try {
-            String configPath = System.getProperty("confPath", System.getenv("confPath")) + File.separator + CONFIG_FILE;
-            PropertiesUtils.loadPropertiesWhenFileExist(properties, configPath);
-        } catch (IOException e) {
-            throw new IllegalArgumentException("Cannot load exporter.properties file from conf");
-        }
-    }
+    @ConfigFiled(field = "export.interval")
+    private int eventMeshTraceExportInterval = 5;
 }
diff --git a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java b/eventmesh-trace-plugin/eventmesh-trace-api/src/test/java/org/apache/eventmesh/trace/api/config/ExporterConfigurationTest.java
similarity index 56%
copy from eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
copy to eventmesh-trace-plugin/eventmesh-trace-api/src/test/java/org/apache/eventmesh/trace/api/config/ExporterConfigurationTest.java
index e5edc1261..a0900cf05 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-knative/src/test/java/org/apache/eventmesh/connector/knative/consumer/KnativeConsumerImplTest.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-api/src/test/java/org/apache/eventmesh/trace/api/config/ExporterConfigurationTest.java
@@ -15,31 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.connector.knative.consumer;
+package org.apache.eventmesh.trace.api.config;
 
-import java.util.Properties;
+import org.apache.eventmesh.common.config.ConfigService;
 
 import org.junit.Assert;
 import org.junit.Test;
 
-public class KnativeConsumerImplTest {
+public class ExporterConfigurationTest {
 
     @Test
-    public void testSubscribe() throws Exception {
-        Properties properties = new Properties();
-        final String topic = "messages";
-        properties.put("topic", topic);
-
-        // Create a Knative consumer:
-        KnativeConsumerImpl knativeConsumer = new KnativeConsumerImpl();
-
-        try {
-            knativeConsumer.init(properties);
-
-            // Subscribe:
-            knativeConsumer.subscribe(properties.getProperty("topic"));
-        } catch (Exception e) {
-            Assert.fail(e.getMessage());
-        }
+    public void testGetExporterConfiguration() {
+        ConfigService configService = ConfigService.getInstance();
+        ExporterConfiguration config = configService.buildConfigInstance(ExporterConfiguration.class);
+
+        Assert.assertEquals(816, config.getEventMeshTraceMaxExportSize());
+        Assert.assertEquals(1816, config.getEventMeshTraceMaxQueueSize());
+        Assert.assertEquals(2816, config.getEventMeshTraceExportTimeout());
+        Assert.assertEquals(3816, config.getEventMeshTraceExportInterval());
     }
-}
+}
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties b/eventmesh-trace-plugin/eventmesh-trace-api/src/test/resources/exporter.properties
similarity index 67%
copy from eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties
copy to eventmesh-trace-plugin/eventmesh-trace-api/src/test/resources/exporter.properties
index 9151c027e..a951d4891 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-redis/src/test/resources/redis-client.properties
+++ b/eventmesh-trace-plugin/eventmesh-trace-api/src/test/resources/exporter.properties
@@ -15,4 +15,11 @@
 # limitations under the License.
 #
 
-eventMesh.server.redis.serverAddress=redis://127.0.0.1:6379
\ No newline at end of file
+#set the maximum batch size to use
+eventmesh.trace.max.export.size=816
+#set the queue size. This must be >= the export batch size
+eventmesh.trace.max.queue.size=1816
+#set the max amount of time an export can run before getting(TimeUnit=SECONDS)
+eventmesh.trace.export.timeout=2816
+#set time between two different exports(TimeUnit=SECONDS)
+eventmesh.trace.export.interval=3816
\ No newline at end of file
diff --git a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/JaegerTraceService.java b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/JaegerTraceService.java
index 78bb74758..bd0ad8c52 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/JaegerTraceService.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/JaegerTraceService.java
@@ -19,6 +19,7 @@ package org.apache.eventmesh.trace.jaeger;
 
 import static io.opentelemetry.api.common.AttributeKey.stringKey;
 
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.trace.api.EventMeshTraceService;
 import org.apache.eventmesh.trace.api.config.ExporterConfiguration;
 import org.apache.eventmesh.trace.api.exception.TraceException;
@@ -49,6 +50,8 @@ import io.opentelemetry.sdk.trace.SdkTracerProvider;
 import io.opentelemetry.sdk.trace.SpanProcessor;
 import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
 
+@Config(field = "jaegerConfiguration")
+@Config(field = "exporterConfiguration")
 public class JaegerTraceService implements EventMeshTraceService {
 
     private String eventMeshJaegerIp;
@@ -73,16 +76,26 @@ public class JaegerTraceService implements EventMeshTraceService {
 
     private TextMapPropagator textMapPropagator;
 
+    /**
+     * Unified configuration class corresponding to jaeger.properties
+     */
+    private JaegerConfiguration jaegerConfiguration;
+
+    /**
+     * Unified configuration class corresponding to exporter.properties
+     */
+    private ExporterConfiguration exporterConfiguration;
+
     @Override
     public void init() throws TraceException {
         // jaeger's config
-        eventMeshJaegerIp = JaegerConfiguration.getEventMeshJaegerIp();
-        eventMeshJaegerPort = JaegerConfiguration.getEventMeshJaegerPort();
+        eventMeshJaegerIp = jaegerConfiguration.getEventMeshJaegerIp();
+        eventMeshJaegerPort = jaegerConfiguration.getEventMeshJaegerPort();
         // exporter's config
-        eventMeshTraceExportInterval = ExporterConfiguration.getEventMeshTraceExportInterval();
-        eventMeshTraceExportTimeout = ExporterConfiguration.getEventMeshTraceExportTimeout();
-        eventMeshTraceMaxExportSize = ExporterConfiguration.getEventMeshTraceMaxExportSize();
-        eventMeshTraceMaxQueueSize = ExporterConfiguration.getEventMeshTraceMaxQueueSize();
+        eventMeshTraceExportInterval = exporterConfiguration.getEventMeshTraceExportInterval();
+        eventMeshTraceExportTimeout = exporterConfiguration.getEventMeshTraceExportTimeout();
+        eventMeshTraceMaxExportSize = exporterConfiguration.getEventMeshTraceMaxExportSize();
+        eventMeshTraceMaxQueueSize = exporterConfiguration.getEventMeshTraceMaxQueueSize();
 
         String httpEndpoint = String.format("http://%s:%s", eventMeshJaegerIp, eventMeshJaegerPort);
         JaegerGrpcSpanExporter jaegerExporter = JaegerGrpcSpanExporter.builder()
@@ -165,4 +178,12 @@ public class JaegerTraceService implements EventMeshTraceService {
     public void shutdown() throws TraceException {
         sdkTracerProvider.close();
     }
+
+    public JaegerConfiguration getClientConfiguration() {
+        return this.jaegerConfiguration;
+    }
+
+    public ExporterConfiguration getExporterConfiguration() {
+        return this.exporterConfiguration;
+    }
 }
\ No newline at end of file
diff --git a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/common/JaegerConstants.java b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/common/JaegerConstants.java
index 775cd8993..622b63774 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/common/JaegerConstants.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/common/JaegerConstants.java
@@ -20,8 +20,4 @@ package org.apache.eventmesh.trace.jaeger.common;
 public class JaegerConstants {
 
     public static final String SERVICE_NAME = "eventmesh_trace";
-
-    public static final String KEY_JAEGER_IP = "eventmesh.trace.jaeger.ip";
-
-    public static final String KEY_JAEGER_PORT = "eventmesh.trace.jaeger.port";
 }
\ No newline at end of file
diff --git a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfiguration.java b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfiguration.java
index f08feac86..1e60ca665 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfiguration.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfiguration.java
@@ -17,81 +17,18 @@
 
 package org.apache.eventmesh.trace.jaeger.config;
 
-import org.apache.eventmesh.common.Constants;
-import org.apache.eventmesh.common.utils.PropertiesUtils;
-import org.apache.eventmesh.trace.jaeger.common.JaegerConstants;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 
-import org.apache.commons.lang3.StringUtils;
+import lombok.Data;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.util.Properties;
-
-import com.google.common.base.Preconditions;
-
-import lombok.experimental.UtilityClass;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@UtilityClass
+@Data
+@Config(prefix = "eventmesh.trace.jaeger", path = "classPath://jaeger.properties")
 public class JaegerConfiguration {
 
-    private static final String CONFIG_FILE = "jaeger.properties";
-
-    private static final Properties PROPERTIES = new Properties();
-
+    @ConfigFiled(field = "ip", notEmpty = true)
     private String eventMeshJaegerIp = "localhost";
 
+    @ConfigFiled(field = "port", notEmpty = true)
     private int eventMeshJaegerPort = 14250;
-
-    static {
-        loadProperties();
-        initializeConfig();
-    }
-
-    private void loadProperties() {
-        URL resource = JaegerConfiguration.class.getClassLoader().getResource(CONFIG_FILE);
-        if (resource != null) {
-            try (InputStream inputStream = resource.openStream();
-                 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
-                if (inputStream.available() > 0) {
-                    PROPERTIES.load(reader);
-                }
-            } catch (IOException e) {
-                throw new RuntimeException("Load jaeger.properties file from classpath error", e);
-            }
-        }
-        // get from config home
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + CONFIG_FILE;
-            PropertiesUtils.loadPropertiesWhenFileExist(PROPERTIES, configPath);
-        } catch (IOException e) {
-            throw new IllegalArgumentException("Cannot load jaeger.properties file from conf", e);
-        }
-    }
-
-    private void initializeConfig() {
-        String jaegerIp = PROPERTIES.getProperty(JaegerConstants.KEY_JAEGER_IP);
-        Preconditions.checkState(StringUtils.isNotEmpty(jaegerIp),
-            String.format("%s error", JaegerConstants.KEY_JAEGER_IP));
-        eventMeshJaegerIp = StringUtils.deleteWhitespace(jaegerIp);
-
-        String jaegerPort = PROPERTIES.getProperty(JaegerConstants.KEY_JAEGER_PORT);
-        if (StringUtils.isNotEmpty(jaegerPort)) {
-            eventMeshJaegerPort = Integer.parseInt(StringUtils.deleteWhitespace(jaegerPort));
-        }
-    }
-
-    public static String getEventMeshJaegerIp() {
-        return eventMeshJaegerIp;
-    }
-
-    public static int getEventMeshJaegerPort() {
-        return eventMeshJaegerPort;
-    }
 }
\ No newline at end of file
diff --git a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/JaegerTraceServiceTest.java b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/JaegerTraceServiceTest.java
index 19e1702bc..b3b4756c4 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/JaegerTraceServiceTest.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/JaegerTraceServiceTest.java
@@ -19,6 +19,8 @@ package org.apache.eventmesh.trace.jaeger;
 
 import static org.junit.Assert.assertThrows;
 
+import org.apache.eventmesh.trace.api.TracePluginFactory;
+
 import java.lang.reflect.Field;
 
 import org.junit.Assert;
@@ -31,7 +33,8 @@ public class JaegerTraceServiceTest {
 
     @Test
     public void testInit() {
-        JaegerTraceService jaegerTraceService = new JaegerTraceService();
+        JaegerTraceService jaegerTraceService =
+                (JaegerTraceService) TracePluginFactory.getEventMeshTraceService("jaeger");
         jaegerTraceService.init();
 
         Assert.assertNotNull(jaegerTraceService.sdkTracerProvider);
@@ -47,7 +50,8 @@ public class JaegerTraceServiceTest {
     @Test
     public void testShutdown() throws NoSuchFieldException, IllegalAccessException {
         SdkTracerProvider mockSdkTracerProvider = Mockito.mock(SdkTracerProvider.class);
-        JaegerTraceService jaegerTraceService = new JaegerTraceService();
+        JaegerTraceService jaegerTraceService =
+                (JaegerTraceService) TracePluginFactory.getEventMeshTraceService("jaeger");
         jaegerTraceService.init();
         Field sdkTracerProviderField = JaegerTraceService.class.getDeclaredField("sdkTracerProvider");
         sdkTracerProviderField.setAccessible(true);
diff --git a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfigurationTest.java b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfigurationTest.java
index 7f1245fe0..03e62c89c 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfigurationTest.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfigurationTest.java
@@ -17,6 +17,10 @@
 
 package org.apache.eventmesh.trace.jaeger.config;
 
+import org.apache.eventmesh.trace.api.TracePluginFactory;
+import org.apache.eventmesh.trace.api.config.ExporterConfiguration;
+import org.apache.eventmesh.trace.jaeger.JaegerTraceService;
+
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -24,7 +28,24 @@ public class JaegerConfigurationTest {
 
     @Test
     public void testGetConfiguration() {
-        Assert.assertEquals("localhost", JaegerConfiguration.getEventMeshJaegerIp());
-        Assert.assertEquals(14250, JaegerConfiguration.getEventMeshJaegerPort());
+        JaegerTraceService jaegerTrace =
+                (JaegerTraceService) TracePluginFactory.getEventMeshTraceService("jaeger");
+
+        JaegerConfiguration config = jaegerTrace.getClientConfiguration();
+        assertClientConfig(config);
+        ExporterConfiguration exporterConfig = jaegerTrace.getExporterConfiguration();
+        assertBaseConfig(exporterConfig);
+    }
+
+    private void assertClientConfig(JaegerConfiguration config) {
+        Assert.assertEquals("localhost", config.getEventMeshJaegerIp());
+        Assert.assertEquals(14250, config.getEventMeshJaegerPort());
+    }
+
+    private void assertBaseConfig(ExporterConfiguration config) {
+        Assert.assertEquals(816, config.getEventMeshTraceMaxExportSize());
+        Assert.assertEquals(1816, config.getEventMeshTraceMaxQueueSize());
+        Assert.assertEquals(2816, config.getEventMeshTraceExportTimeout());
+        Assert.assertEquals(3816, config.getEventMeshTraceExportInterval());
     }
 }
\ No newline at end of file
diff --git a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/resources/exporter.properties
similarity index 84%
copy from eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties
copy to eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/resources/exporter.properties
index 1261f30e2..14f6980df 100644
--- a/eventmesh-connector-plugin/eventmesh-connector-rocketmq/src/test/resources/rocketmq-client.properties
+++ b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/resources/exporter.properties
@@ -14,5 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-#######################rocketmq-client##################
-eventMesh.server.rocketmq.namesrvAddr=127.0.0.1:9876;127.0.0.1:9876
+eventmesh.trace.max.export.size=816
+eventmesh.trace.max.queue.size=1816
+eventmesh.trace.export.timeout=2816
+eventmesh.trace.export.interval=3816
\ No newline at end of file
diff --git a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/build.gradle b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/build.gradle
index 63e892e55..3b7409252 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/build.gradle
+++ b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/build.gradle
@@ -22,6 +22,9 @@ dependencies {
     implementation project(":eventmesh-common")
     implementation 'org.slf4j:slf4j-api'
 
+    compileOnly 'org.projectlombok:lombok:1.18.22'
+    annotationProcessor 'org.projectlombok:lombok:1.18.22'
+
     implementation 'io.opentelemetry:opentelemetry-api'
     implementation 'io.opentelemetry:opentelemetry-semconv'
     implementation 'io.opentelemetry:opentelemetry-sdk'
diff --git a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceService.java b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceService.java
index f0e0217dc..bde649033 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceService.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceService.java
@@ -17,6 +17,7 @@
 
 package org.apache.eventmesh.trace.pinpoint;
 
+import org.apache.eventmesh.common.config.Config;
 import org.apache.eventmesh.trace.api.EventMeshTraceService;
 import org.apache.eventmesh.trace.api.config.ExporterConfiguration;
 import org.apache.eventmesh.trace.api.exception.TraceException;
@@ -48,6 +49,8 @@ import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
 /**
  * https://github.com/pinpoint-apm/pinpoint
  */
+@Config(field = "pinpointConfiguration")
+@Config(field = "exporterConfiguration")
 public class PinpointTraceService implements EventMeshTraceService {
 
     private SdkTracerProvider sdkTracerProvider;
@@ -58,20 +61,29 @@ public class PinpointTraceService implements EventMeshTraceService {
 
     protected Thread shutdownHook;
 
+    /**
+     * Unified configuration class corresponding to pinpoint.properties
+     */
+    private PinpointConfiguration pinpointConfiguration;
+
+    /**
+     * Unified configuration class corresponding to exporter.properties
+     */
+    private ExporterConfiguration exporterConfiguration;
 
     @Override
     public void init() throws TraceException {
-        long eventMeshTraceExportInterval = ExporterConfiguration.getEventMeshTraceExportInterval();
-        long eventMeshTraceExportTimeout = ExporterConfiguration.getEventMeshTraceExportTimeout();
-        int eventMeshTraceMaxExportSize = ExporterConfiguration.getEventMeshTraceMaxExportSize();
-        int eventMeshTraceMaxQueueSize = ExporterConfiguration.getEventMeshTraceMaxQueueSize();
+        long eventMeshTraceExportInterval = exporterConfiguration.getEventMeshTraceExportInterval();
+        long eventMeshTraceExportTimeout = exporterConfiguration.getEventMeshTraceExportTimeout();
+        int eventMeshTraceMaxExportSize = exporterConfiguration.getEventMeshTraceMaxExportSize();
+        int eventMeshTraceMaxQueueSize = exporterConfiguration.getEventMeshTraceMaxQueueSize();
 
         SpanProcessor spanProcessor = BatchSpanProcessor.builder(
                 new PinpointSpanExporter(
-                    PinpointConfiguration.getAgentId(),
-                    PinpointConfiguration.getAgentName(),
-                    PinpointConfiguration.getApplicationName(),
-                    PinpointConfiguration.getGrpcTransportConfig()))
+                    pinpointConfiguration.getAgentId(),
+                    pinpointConfiguration.getAgentName(),
+                    pinpointConfiguration.getApplicationName(),
+                    pinpointConfiguration.getGrpcTransportConfig()))
             .setScheduleDelay(eventMeshTraceExportInterval, TimeUnit.SECONDS)
             .setExporterTimeout(eventMeshTraceExportTimeout, TimeUnit.SECONDS)
             .setMaxExportBatchSize(eventMeshTraceMaxExportSize)
@@ -148,4 +160,12 @@ public class PinpointTraceService implements EventMeshTraceService {
     public void shutdown() throws TraceException {
         sdkTracerProvider.close();
     }
+
+    public PinpointConfiguration getClientConfiguration() {
+        return this.pinpointConfiguration;
+    }
+
+    public ExporterConfiguration getExporterConfiguration() {
+        return this.exporterConfiguration;
+    }
 }
diff --git a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/common/PinpointConstants.java b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/common/PinpointConstants.java
index 8ccf5affc..9ebf68fd7 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/common/PinpointConstants.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/common/PinpointConstants.java
@@ -17,22 +17,10 @@
 
 package org.apache.eventmesh.trace.pinpoint.common;
 
-import org.apache.eventmesh.common.Constants;
-
 public class PinpointConstants {
 
     public static final String SERVICE_NAME = "eventmesh_trace";
 
-    public static final String PROPERTY_KEY_PREFIX = "eventmesh.trace.pinpoint";
-
-    public static final String AGENT_ID_KEY = PROPERTY_KEY_PREFIX + Constants.DOT + "agentId";
-
-    public static final String AGENT_NAME_KEY = PROPERTY_KEY_PREFIX + Constants.DOT + "agentName";
-
-    public static final String APPLICATION_NAME = "applicationName";
-
-    public static final String APPLICATION_NAME_KEY = PROPERTY_KEY_PREFIX + Constants.DOT + APPLICATION_NAME;
-
     public static final String REQ_IP = "req0ip";
 
     public static final String UNKNOWN_REQ_IP = "unknown";
diff --git a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/config/PinpointConfiguration.java b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/config/PinpointConfiguration.java
index 14d2254b9..31596eb3b 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/config/PinpointConfiguration.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/config/PinpointConfiguration.java
@@ -17,17 +17,10 @@
 
 package org.apache.eventmesh.trace.pinpoint.config;
 
-import static org.apache.eventmesh.trace.pinpoint.common.PinpointConstants.AGENT_ID_KEY;
-import static org.apache.eventmesh.trace.pinpoint.common.PinpointConstants.AGENT_NAME_KEY;
-import static org.apache.eventmesh.trace.pinpoint.common.PinpointConstants.APPLICATION_NAME;
-import static org.apache.eventmesh.trace.pinpoint.common.PinpointConstants.APPLICATION_NAME_KEY;
-import static org.apache.eventmesh.trace.pinpoint.common.PinpointConstants.PROPERTY_KEY_PREFIX;
-
-import static java.util.Objects.requireNonNull;
-
 import org.apache.eventmesh.common.Constants;
+import org.apache.eventmesh.common.config.Config;
+import org.apache.eventmesh.common.config.ConfigFiled;
 import org.apache.eventmesh.common.exception.JsonException;
-import org.apache.eventmesh.common.utils.PropertiesUtils;
 import org.apache.eventmesh.common.utils.RandomStringUtils;
 
 import org.apache.commons.lang3.StringUtils;
@@ -46,56 +39,34 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.navercorp.pinpoint.profiler.context.grpc.config.GrpcTransportConfig;
 
-public final class PinpointConfiguration {
-
-    private static final String CONFIG_FILE = "pinpoint.properties";
-
-    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
-            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
-
-    private static final Properties properties = new Properties();
-
-    private static String agentId;
-    private static String agentName;
-    private static String applicationName;
-    private static GrpcTransportConfig grpcTransportConfig;
+import lombok.Data;
 
-    static {
-        loadProperties();
-        initializeConfig();
-    }
+@Data
+@Config(prefix = "eventmesh.trace.pinpoint", path = "classPath://pinpoint.properties")
+public final class PinpointConfiguration {
 
-    public static String getAgentId() {
-        return agentId;
-    }
+    @ConfigFiled(field = "agentId", reload = true)
+    private String agentId;
 
-    public static String getAgentName() {
-        return agentName;
-    }
+    @ConfigFiled(field = "agentName", reload = true)
+    private String agentName;
 
-    public static String getApplicationName() {
-        return applicationName;
-    }
+    @ConfigFiled(field = "applicationName", findEnv = true, notNull = true)
+    private String applicationName;
 
-    public static GrpcTransportConfig getGrpcTransportConfig() {
-        return grpcTransportConfig;
-    }
+    @ConfigFiled(field = "", reload = true)
+    private Properties grpcTransportProperties;
 
-    private static void initializeConfig() {
-        applicationName = properties.getProperty(APPLICATION_NAME_KEY);
-        if (StringUtils.isBlank(applicationName)) {
-            applicationName = Optional.ofNullable(System.getProperty(APPLICATION_NAME))
-                    .orElseGet(() -> System.getenv(APPLICATION_NAME));
-        }
+    private GrpcTransportConfig grpcTransportConfig;
 
-        requireNonNull(applicationName, String.format("%s can not be null", APPLICATION_NAME_KEY));
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
+            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
 
-        agentName = properties.getProperty(AGENT_NAME_KEY);
+    public void reload() {
         if (StringUtils.isBlank(agentName)) {
             agentName = applicationName;
         }
 
-        agentId = properties.getProperty(AGENT_ID_KEY);
         if (StringUtils.isBlank(agentId)) {
             // refer to: com.navercorp.pinpoint.common.util.IdValidateUtils#validateId
             agentId = StringUtils.substring(agentName, 0, 15)
@@ -103,32 +74,8 @@ public final class PinpointConfiguration {
                     + RandomStringUtils.generateNum(8);
         }
 
-        Properties temporary = PropertiesUtils.getPropertiesByPrefix(properties, PROPERTY_KEY_PREFIX);
-
         // Map to Pinpoint property configuration.
-        grpcTransportConfig = convertValue(temporary, GrpcTransportConfig.class);
-    }
-
-    private static void loadProperties() {
-        URL resource = PinpointConfiguration.class.getClassLoader().getResource(CONFIG_FILE);
-        if (resource != null) {
-            try (InputStream inputStream = resource.openStream();
-                 BufferedReader reader = new BufferedReader(
-                         new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
-                if (inputStream.available() > 0) {
-                    properties.load(reader);
-                }
-            } catch (IOException e) {
-                throw new RuntimeException(String.format("Load %s file from classpath error", CONFIG_FILE));
-            }
-        }
-        // get from config home
-        try {
-            String configPath = Constants.EVENTMESH_CONF_HOME + File.separator + CONFIG_FILE;
-            PropertiesUtils.loadPropertiesWhenFileExist(properties, configPath, StandardCharsets.UTF_8);
-        } catch (IOException e) {
-            throw new IllegalArgumentException(String.format("Can not load %s file from conf", CONFIG_FILE));
-        }
+        grpcTransportConfig = convertValue(grpcTransportProperties, GrpcTransportConfig.class);
     }
 
     public static <T> T convertValue(Object fromValue, Class<T> toValueType) {
diff --git a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/test/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceServiceTest.java b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/test/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceServiceTest.java
index c14ee5986..b49d7ca58 100644
--- a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/test/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceServiceTest.java
+++ b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/test/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceServiceTest.java
... 1064 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@eventmesh.apache.org
For additional commands, e-mail: commits-help@eventmesh.apache.org