From 3d6a766a0cdfc85d16d78851453baed85bb25813 Mon Sep 17 00:00:00 2001 From: wqliang Date: Mon, 28 Jun 2021 17:58:33 +0800 Subject: [PATCH] merge develop into 1.3.0 branch (#401) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * upgrade gradle to 6.8.3 * [ISSUE #265]rename wemq and access to eventmesh * [ISSUE #265]rename proxy field to eventmesh * merge conflict * remove warn * [ISSUE #265] Specification of code structure and file naming * remove eventmesh-registry module * enabled http/tcp monitor logs * Update README.md * Changed com.webank to org.apache Changed 'eventmesh-connector-api' code package name to apache. * issue #277:refactor eventmesh-common package with org.apache * issue #277:rename package with org.apache * Refactor 'eventmesh-connector-rocketmq' package name to org.apache * Update README.zh-CN.md * [ISSUE #282]Refactor 'eventmesh-starter' package name to org.apache * Update codeStyle.xml * Refactor 'eventmesh-test' package name to org.apache #283 * Refactor 'eventmesh-test' package name to org.apache #283 * Refactor 'eventmesh-test' package name to org.apache #283 * Refactor 'eventmesh-test' package name to org.apache #283 * Refactor 'eventmesh-test' package name to org.apache #283 * refactor runtime module package com.webank to org.apache * refactor(eventmesh-sdk-java):rename to org.apache(#281) * [ISSUE #281]refactor(eventmesh-sdk-java):rename to org.apache * add licenses of apache for runtime module * add NOTICE * bugfix for event-mesh-test module * change package name to org.apache * format README.md * change package name to org.apache * fix ISSUE #296:add licenses in each source file under the eventmesh-sdk-java * [ISSUE #294]add licenses in file under eventmesh-connector-rocketmq module * [ISSUE #293]Lack of licenses in each source file under the eventmesh-connector-api module * [ISSUE #298]Lack of licenses in each source file under the eventmesh-test module * [ISSUE #297]Lack of licenses in each source file under the eventmesh-starter module * Create .asf.yaml * Update .asf.yaml * Update .asf.yaml (#316) * Update README.md * Update .asf.yaml * bugfix build.gradle tar task (#318) Co-authored-by: jonyang(杨军) * [ISSUE #322] Rename package name "com.webank.eventmesh" to "org.apache.eventmesh" (#319) * rename org.apache.runtime to com.webank.runtime * rename com.webank.eventmesh to org.apache.eventmesh * fix(docs): change the travis location * Create DISCLAIMER-WIP * Delete CNAME * Delete _config.yml * Delete package.json * Add files via upload * Add files via upload * Delete eventmesh-multi-runtime.jpg * Update README.md * Update eventmesh-runtime-quickstart.md * Update README.zh-CN.md * Update eventmesh-runtime-quickstart.zh-CN.md * [ISSUE #325]Update gradle configuration for publishing package to maven repository (#326) * [ISSUE #325]Update gradle configuration for publishing package to maven repository * update build.gradle * update build.gradle and gradle.properties * upgrade gradle to 7.0 and fix test bug. (#327) * bugfix build.gradle tar task * merge * upgrade to gradle 7.0 * bugfix gradle task spotbugs * bugfix eventmesh-connector-rocketmq testImplementation * upgrade to gradle7.0 * refactor runtime module test and spotbugs error * bugfix sign task Co-authored-by: jonyang(杨军) Co-authored-by: jonyangx * remove unused files Signed-off-by: qqeasonchen * update build.gradle and gradle.properties for publish to maven repository (#330) * [ISSUE #325]Update gradle configuration for publishing package to maven repository * update build.gradle * update build.gradle and gradle.properties * update build.gradle and gradle.properties for publish to maven repository * Update README.md * Update README.zh-CN.md * update quickstart md files for gradle version (#332) * [ISSUE #325]Update gradle configuration for publishing package to maven repository * update build.gradle * update build.gradle and gradle.properties * update build.gradle and gradle.properties for publish to maven repository * * update gradle version for instructions * fix: dist task exception * remove dead docs Signed-off-by: qqeasonchen * [ISSUE #329]Missing Log4j dependency (#336) * [ISSUE #325]Update gradle configuration for publishing package to maven repository * update build.gradle * update build.gradle and gradle.properties * update build.gradle and gradle.properties for publish to maven repository * * update gradle version for instructions * fix: dist task exception * [ISSUE #329]Missing Log4j dependency * [ISSUE #331] Fix dead links in docs (#334) fixed #331 * Doc modification #328 (#335) change vm params * Update README.md * [Issue #337] Fix Http Test Subscriber startup issue by moving the Thread.sleep into the child thread (#338) * [Issue #337] Fix HttpSubscriber startup issue * [Issue #337] test commit * [Issue #337] revert test commit Co-authored-by: j00441484 * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook (#343) * [Issue #337] Fix HttpSubscriber startup issue * [Issue #337] test commit * [Issue #337] revert test commit * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Address code review comment for Subscriber Demo App Co-authored-by: j00441484 * [ISSUE #348] Setup automated workflows for greetings (#347) * Setup automated workflows for greetings * Remove '@apache/eventmesh-committers' * Add LGTM Badges ISSUE#353 (#354) LGTM is a variant analysis platform that automatically checks code for real CVEs and vulnerabilities. Learn more at https://lgtm.com/help/lgtm/about-lgtm . Here are some alerts in our project reported by LGTM: https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/?mode=list I'd like to add LGTM badges in the README.md, it makes easier for people who want to get alerts and then contribute to EventMesh. * [ISSUE #355] Setup Github workflows for CodeQL scans (#356) * Setup CodeQL scans * disable autorun * add a step for setting up JDK * add codeql * fix step Build * fix strategy * add events: schedule & workflow_dispatch * [Issue #344] Fixing racing condition issue in SubscribeProcessor and UnSubscribeProcessor (#345) * [Issue #337] Fix HttpSubscriber startup issue * [Issue #337] test commit * [Issue #337] revert test commit * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #344] Fixing racing condition issue in SubscribeProcessor and UnSubscribeProcessor * [Issue #344] Fix import statements * [Issue #337] Address code review comment for Subscriber Demo App * [Issue #344] Enhance client registration logic in SubscribeProcessor and UnsubscriberProcessor * [Issue #344] Minor code clean up in SubscribeProcessor and UnsubscriberProcessor * [Issue #344] Fix NullPointerException in ConsumerManager occurs during subscribe/unsunscribe iteration testing * [Issue #344] Fix bugs in subscribe/unsunscribe code path * [Issue #344] use client.pid instead of client.ip for client comparasion in UnSubscribeProcessor Co-authored-by: j00441484 * update eventmesh-runtime.png (#358) * update eventmesh-runtime.png * [Issue #333] Support multiple load balance strategy in sdk (#342) * Support multiple load balance strategy in sdk #333 * Fix ut * add log * update eventmesh-panels.png (#362) * [ISSUE #325]Update gradle configuration for publishing package to maven repository * update build.gradle * update build.gradle and gradle.properties * update build.gradle and gradle.properties for publish to maven repository * * update gradle version for instructions * fix: dist task exception * [ISSUE #329]Missing Log4j dependency * update eventmesh-runtime.png * update eventmesh-panels.png * update eventmesh-panels.png (#363) * [ISSUE #325]Update gradle configuration for publishing package to maven repository * update build.gradle * update build.gradle and gradle.properties * update build.gradle and gradle.properties for publish to maven repository * * update gradle version for instructions * fix: dist task exception * [ISSUE #329]Missing Log4j dependency * update eventmesh-runtime.png * update eventmesh-panels.png * Migrate CI to Github Actions and enable coverage report (#365) * add: requirements for lightweight EventMesh SDK with CloudEvents (#370) This commit only includes a brief introduction and requirements. Design details can be followed up in a later commit. Signed-off-by: Yuzhou Mao * Add files via upload * Update README.md * [Issue #368] Fix Racing condition and memory leak issue in EventMesh SDK LiteConsumer and LiteProducer (#369) * [Issue #337] Fix HttpSubscriber startup issue * [Issue #337] test commit * [Issue #337] revert test commit * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Address code review comment for Subscriber Demo App * [Issue #368] Fix Racing condition and memory leak issue in EventMesh SDK LiteConsumer and LiteProducer * [Issue #368] fix build issue * [Issue #368] use try with resource statement for HttpClient * [Issue #368] fix TLS1.1 and use TLS1.2 in HttpClient Co-authored-by: j00441484 * [ISSUE #350]optimize flow control in downstreaming msg (#352) * modify:optimize flow control in downstreaming msg * modify:optimize stategy of selecting session in downstream msg * modify:optimize msg downstream,msg store in session * modify:fix bug:not a @Sharable handler * [ISSUE #380] Remove gitee-mirror.yml from Github workflows (#381) * Update README.md * [ISSUE #310] add github action for check license (#313) * add github action for check license * fix syntax and name ci for Check license * fix github action branch typo * [ISSUE #310] Enable Github Actions for license check and fix license headers (#377) * add github action for check license * fix syntax and name ci for Check license * fix github action branch typo * enable github actions for license check * add necessary headers * update badges Co-authored-by: Lan Liang * [Issue #382] Fix java.lang.NumberFormatException when parsing Long (#383) * [Issue #337] Fix HttpSubscriber startup issue * [Issue #337] test commit * [Issue #337] revert test commit * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Address code review comment for Subscriber Demo App * [Issue #368] Fix Racing condition and memory leak issue in EventMesh SDK LiteConsumer and LiteProducer * [Issue #368] fix build issue * [Issue #368] use try with resource statement for HttpClient * [Issue #368] fix TLS1.1 and use TLS1.2 in HttpClient * [Issue #382] Fix java.lang.NumberFormatException when parsing Long * [Issue #382] Fix java.lang.NumberFormatException when parsing Integer Co-authored-by: j00441484 * [ISSUE #378] downstream broadcast msg asynchronously (#379) * modify:optimize flow control in downstreaming msg * modify:optimize stategy of selecting session in downstream msg * modify:optimize msg downstream,msg store in session * modify:fix bug:not a @Sharable handler * modify:downstream broadcast msg asynchronously closed #378 * [ISSUE #359] Split handler from controller (#359) (#360) * [ISSUE #359] Split handler from controller (#359) * add license header * add ut * [ISSUE #384] RedirectClientByIpPortHandlerTest.java doesn't have the Apache license header (#385) close #384 * Update README.md * Update README.zh-CN.md * Update README.zh-CN.md * Update README.zh-CN.md * [Issue #386] fixing ConsumerGroup Queue Consumer Offset not synced up issue (#387) * [Issue #337] Fix HttpSubscriber startup issue * [Issue #337] test commit * [Issue #337] revert test commit * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Enhance Http Demo Subscriber by using ExecutorService, CountDownLatch and PreDestroy hook * [Issue #337] Address code review comment for Subscriber Demo App * [Issue #386] fixing ConsumerGroup Queuen Consumer Offset not synced up issue * [Issue #386] adding license header to new file * [Issue #386] Fix license header missing issue Co-authored-by: j00441484 * [ISSUE #366 ] remove custom-format topic concept (#388) * remove custom-format topic concept * remove custom-format topic concept * remove custom-format topic concept * remove custom-format topic concept * remove custom-format topic concept * remove custom-format topic concept * remove custom-format topic concept * [ISSUE #366] remove custom concept [dcn&®ion] (#390) * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} close #366 * [ISSUE #391] Optimize interface design in eventmesh-connector-api (#392) * modify:optimize flow control in downstreaming msg * modify:optimize stategy of selecting session in downstream msg * modify:optimize msg downstream,msg store in session * modify:fix bug:not a @Sharable handler * modify:downstream broadcast msg asynchronously * modify:remove unneccessary interface in eventmesh-connector-api * modify:fix conflict * modify:add license in EventMeshAction close #391 * miss group name set for userAgent (#395) * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * remove custom concept{dcn} * bugfix : miss group set * bugfix : miss group set * [ISSUE #393]:perf topic name in test file (#394) close #393 * support unsubscribe topics while delconsumer in http mode (#396) * [ISSUE #325]Update gradle configuration for publishing package to maven repository * update build.gradle * update build.gradle and gradle.properties * update build.gradle and gradle.properties for publish to maven repository * * update gradle version for instructions * fix: dist task exception * [ISSUE #329]Missing Log4j dependency * update eventmesh-runtime.png * support unsubscribe topics while delconsumer in http mode * [ISSUE #397]Remove subscription session failed error (#398) * [ISSUE #325]Update gradle configuration for publishing package to maven repository * update build.gradle * update build.gradle and gradle.properties * update build.gradle and gradle.properties for publish to maven repository * * update gradle version for instructions * fix: dist task exception * [ISSUE #329]Missing Log4j dependency * update eventmesh-runtime.png * support unsubscribe topics while delconsumer in http mode * [ISSUE #397]Remove subscription session failed error * [ISSUE #397]Remove subscription session failed error close #397 Co-authored-by: jonyang(杨军) Co-authored-by: MajorHe1 Co-authored-by: mike_xwm Co-authored-by: Eason Chen Co-authored-by: Heng Du Co-authored-by: Udesh Liyanaarachchi <> Co-authored-by: keranbingaa <397294722@qq.com> Co-authored-by: sunxi Co-authored-by: sanchen Co-authored-by: surilli(李慧敏) Co-authored-by: Lan Liang Co-authored-by: zhangxiaopengmm Co-authored-by: nanoxiong Co-authored-by: chenyi19851209 <409696597@qq.com> Co-authored-by: yangjun Co-authored-by: Steve Yurong Su Co-authored-by: von gosling Co-authored-by: jonyangx Co-authored-by: ruanwenjun <861923274@qq.com> Co-authored-by: jinrongluo Co-authored-by: j00441484 Co-authored-by: Yuzhou Mao Co-authored-by: lrhkobe <34571087+lrhkobe@users.noreply.github.com> Co-authored-by: Steve Yurong Su Co-authored-by: Lan --- .asf.yaml | 45 + .coveralls.yml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 1 + .github/workflows/ci.yml | 84 + .github/workflows/gitee-mirror.yml | 60 - .github/workflows/greetings.yml | 72 + .licenserc.yaml | 41 + .travis.yml | 15 - CNAME | 1 - CONTRIBUTING.md | 42 +- CONTRIBUTING.zh-CN.md | 41 +- DISCLAIMER-WIP | 19 + NOTICE | 5 + README.md | 64 +- README.zh-CN.md | 81 +- _config.yml | 1 - build.gradle | 336 +- docker/centos7-jdk8/Dockerfile | 19 + docker/eventmesh-rocketmq/Dockerfile | 19 + docs/.vuepress/config.js | 159 +- docs/README.md | 42 +- docs/_config.yml | 21 +- docs/cn/README.md | 30 +- docs/cn/features/0-introduction.md | 49 - docs/cn/features/1-request-response-call.md | 34 - docs/cn/features/10-flow-control.md | 0 docs/cn/features/2-dark-launch.md | 24 - docs/cn/features/3-circuit-break-mechanism.md | 25 - docs/cn/features/4-invoke-service-nearby.md | 29 - docs/cn/features/5-multi-active.md | 18 - docs/cn/features/6-dynamic-adjust-queue.md | 35 - docs/cn/features/7-isolation-mechanism.md | 23 - docs/cn/features/8-fault-tolerant.md | 50 - docs/cn/features/9-publish-type.md | 35 - docs/cn/features/https.zh-CN.md | 7 +- .../eventmesh-runtime-protocol.zh-CN.md | 44 +- .../eventmesh-runtime-quickstart.zh-CN.md | 59 +- .../eventmesh-sdk-java-quickstart.zh-CN.md | 21 +- .../eventmesh-store-quickstart.zh-CN.md | 23 +- docs/cn/instructions/quickstart.zh-CN.md | 6 +- docs/en/README.md | 51 +- docs/en/features/architecture.md | 0 .../eventmesh-cloudevents-sdk-binding.md | 55 + docs/en/features/https.md | 6 +- docs/en/features/request-response-call.md | 0 .../eventmesh-runtime-protocol.md | 50 +- .../eventmesh-runtime-quickstart.md | 68 +- .../eventmesh-sdk-java-quickstart.md | 45 +- .../eventmesh-store-quickstart.md | 19 +- docs/en/instructions/quickstart.md | 4 + docs/eventmesh.md | 10 +- docs/images/eventmesh-multi-runtime.png | Bin 0 -> 77806 bytes docs/images/eventmesh-panels.png | Bin 951690 -> 920415 bytes docs/images/eventmesh-runtime.png | Bin 1562864 -> 1726098 bytes docs/images/logo1.png | Bin 0 -> 28980 bytes docs/images/logo2.png | Bin 0 -> 48761 bytes eventmesh-common/build.gradle | 77 +- eventmesh-common/gradle.properties | 4 +- .../protocol/http/common/ProxyRetCode.java | 67 - .../client/HeartbeatResponseHeader.java | 139 - .../http/header/client/RegResponseHeader.java | 147 - .../client/SubscribeResponseHeader.java | 139 - .../header/client/UnRegResponseHeader.java | 140 - .../client/UnSubscribeResponseHeader.java | 138 - .../message/ReplyMessageResponseHeader.java | 146 - .../SendMessageBatchResponseHeader.java | 146 - .../SendMessageBatchV2ResponseHeader.java | 145 - .../message/SendMessageResponseHeader.java | 146 - .../apache}/eventmesh/common/Constants.java | 10 +- .../eventmesh/common/EventMeshException.java} | 16 +- .../apache}/eventmesh/common/IPUtil.java | 11 +- .../apache}/eventmesh/common/LiteMessage.java | 6 +- .../eventmesh/common/ThreadPoolFactory.java | 8 +- .../apache}/eventmesh/common/ThreadUtil.java | 7 +- .../eventmesh/common/command/HttpCommand.java | 23 +- .../common/config/CommonConfiguration.java | 96 +- .../common/config/ConfigurationWraper.java | 14 +- .../loadbalance/LoadBalanceSelector.java | 44 + .../common/loadbalance/LoadBalanceType.java | 50 + .../RandomLoadBalanceSelector.java | 56 + .../eventmesh/common/loadbalance/Weight.java | 70 + .../WeightRoundRobinLoadBalanceSelector.java | 72 + .../common/protocol/SubcriptionType.java | 43 + .../common/protocol/SubscriptionItem.java | 71 + .../common/protocol/SubscriptionMode.java | 45 + .../protocol/http/body/BaseRequestBody.java | 2 +- .../protocol/http/body/BaseResponseBody.java | 6 +- .../common/protocol/http/body/Body.java | 25 +- .../body/client/HeartbeatRequestBody.java | 26 +- .../body/client/HeartbeatResponseBody.java | 12 +- .../http/body/client/RegRequestBody.java | 22 +- .../http/body/client/RegResponseBody.java | 12 +- .../body/client/SubscribeRequestBody.java | 39 +- .../body/client/SubscribeResponseBody.java | 12 +- .../http/body/client/UnRegRequestBody.java | 13 +- .../http/body/client/UnRegResponseBody.java | 12 +- .../body/client/UnSubscribeRequestBody.java | 30 +- .../body/client/UnSubscribeResponseBody.java | 12 +- .../body/message/PushMessageRequestBody.java | 15 +- .../body/message/PushMessageResponseBody.java | 12 +- .../body/message/ReplyMessageRequestBody.java | 29 +- .../message/ReplyMessageResponseBody.java | 12 +- .../message/SendMessageBatchRequestBody.java | 29 +- .../message/SendMessageBatchResponseBody.java | 12 +- .../SendMessageBatchV2RequestBody.java | 22 +- .../SendMessageBatchV2ResponseBody.java | 12 +- .../body/message/SendMessageRequestBody.java | 29 +- .../body/message/SendMessageResponseBody.java | 12 +- .../protocol/http/common/ClientRetCode.java | 4 +- .../protocol/http/common/ClientType.java | 6 +- .../http/common/EventMeshRetCode.java | 67 + .../protocol/http/common/ProtocolKey.java | 20 +- .../protocol/http/common/ProtocolVersion.java | 6 +- .../protocol/http/common/RequestCode.java | 2 +- .../http/header/BaseRequestHeader.java | 8 +- .../http/header/BaseResponseHeader.java | 8 +- .../common/protocol/http/header/Header.java | 27 +- .../header/client/HeartbeatRequestHeader.java | 46 +- .../client/HeartbeatResponseHeader.java | 113 + .../http/header/client/RegRequestHeader.java | 42 +- .../http/header/client/RegResponseHeader.java | 118 + .../header/client/SubscribeRequestHeader.java | 42 +- .../client/SubscribeResponseHeader.java | 113 + .../header/client/UnRegRequestHeader.java | 44 +- .../header/client/UnRegResponseHeader.java | 113 + .../client/UnSubscribeRequestHeader.java | 42 +- .../client/UnSubscribeResponseHeader.java | 111 + .../message/PushMessageRequestHeader.java | 104 +- .../message/PushMessageResponseHeader.java | 45 +- .../message/ReplyMessageRequestHeader.java | 44 +- .../message/ReplyMessageResponseHeader.java | 118 + .../SendMessageBatchRequestHeader.java | 44 +- .../SendMessageBatchResponseHeader.java | 118 + .../SendMessageBatchV2RequestHeader.java | 44 +- .../SendMessageBatchV2ResponseHeader.java | 117 + .../message/SendMessageRequestHeader.java | 44 +- .../message/SendMessageResponseHeader.java | 118 + .../common/protocol/tcp/Command.java | 4 +- .../protocol/tcp/EventMeshClientInfo.java} | 6 +- .../protocol/tcp/EventMeshMessage.java} | 10 +- .../eventmesh/common/protocol/tcp/Header.java | 2 +- .../common/protocol/tcp/HeartBeatInfo.java | 2 +- .../common/protocol/tcp/OPStatus.java | 2 +- .../common/protocol/tcp/Package.java | 2 +- .../common/protocol/tcp/RedirectInfo.java | 2 +- .../common/protocol/tcp/RegisterInfo.java | 2 +- .../common/protocol/tcp/Subscription.java | 14 +- .../common/protocol/tcp/UnRegisterInfo.java | 2 +- .../common/protocol/tcp/UserAgent.java | 32 +- .../common/protocol/tcp/codec/Codec.java | 38 +- .../RandomLoadBalanceSelectorTest.java | 63 + ...ightRoundRobinLoadBalanceSelectorTest.java | 64 + eventmesh-connector-api/build.gradle | 48 +- eventmesh-connector-api/gradle.properties | 3 +- .../webank/eventmesh/api/AbstractContext.java | 4 - .../com/webank/eventmesh/api/RRCallback.java | 11 - .../api/consumer/MeshMQPushConsumer.java | 31 - .../apache/eventmesh/api/AbstractContext.java | 4 +- .../apache/eventmesh/api/EventMeshAction.java | 25 + .../api/EventMeshAsyncConsumeContext.java | 40 + .../org/apache/eventmesh/api/RRCallback.java | 28 + .../api/consumer/MeshMQPushConsumer.java | 41 + .../api/producer/MeshMQProducer.java | 16 +- eventmesh-connector-rocketmq/build.gradle | 164 +- .../gradle.properties | 7 +- .../connector/rocketmq/common/Constants.java | 27 - .../rocketmq/MessagingAccessPointImpl.java | 10 +- .../connector/rocketmq/common/Constants.java | 41 + .../rocketmq/common/EventMeshConstants.java} | 47 +- .../rocketmq/config/ClientConfig.java | 6 +- .../rocketmq/config/ClientConfiguration.java | 97 +- .../rocketmq/config/ConfigurationWraper.java | 14 +- .../rocketmq/consumer/PushConsumerImpl.java | 129 +- .../consumer/RocketMQConsumerImpl.java | 69 +- .../rocketmq/domain/ConsumeRequest.java | 5 +- .../rocketmq/domain/NonStandardKeys.java | 3 +- .../rocketmq/domain/RocketMQConstants.java | 3 +- .../EventMeshConsumeConcurrentlyContext.java} | 8 +- .../EventMeshConsumeConcurrentlyStatus.java} | 4 +- ...EventMeshMessageListenerConcurrently.java} | 20 +- .../producer/AbstractOMSProducer.java | 38 +- .../rocketmq/producer/ProducerImpl.java | 128 +- .../producer/RocketMQProducerImpl.java | 54 +- .../rocketmq/promise/DefaultPromise.java | 14 +- .../rocketmq/promise/FutureState.java | 2 +- .../connector/rocketmq/utils/BeanUtils.java | 17 +- .../connector/rocketmq/utils/OMSUtil.java | 20 +- .../ConsumeMessageConcurrentlyService.java | 34 +- ....eventmesh.api.consumer.MeshMQPushConsumer | 1 - ...bank.eventmesh.api.producer.MeshMQProducer | 1 - ....eventmesh.api.consumer.MeshMQPushConsumer | 16 + ...ache.eventmesh.api.producer.MeshMQProducer | 16 + .../consumer/PushConsumerImplTest.java | 62 +- .../rocketmq/producer/ProducerImplTest.java | 153 + .../rocketmq/promise/DefaultPromiseTest.java | 2 +- .../apache}/rocketmq/utils/BeanUtilsTest.java | 17 +- .../rocketmq/producer/ProducerImplTest.java | 106 - .../io.openmessaging.MessagingAccessPoint | 1 - .../io.openmessaging.producer.Producer | 1 - ...ache.io.openmessaging.MessagingAccessPoint | 20 + ....apache.io.openmessaging.producer.Producer | 20 + eventmesh-runtime/bin/start.sh | 61 +- eventmesh-runtime/bin/stop.sh | 35 +- eventmesh-runtime/bin/watchdog.sh | 17 + eventmesh-runtime/build.gradle | 143 +- eventmesh-runtime/conf/eventmesh.properties | 54 + eventmesh-runtime/conf/log4j2.xml | 6 +- eventmesh-runtime/conf/proxy.properties | 67 - .../conf/rocketmq-client.properties | 2 +- eventmesh-runtime/conf/server.env | 17 + eventmesh-runtime/gradle.properties | 4 +- eventmesh-runtime/scripts/before_shutdown.sh | 17 + eventmesh-runtime/scripts/client_manage.sh | 39 +- eventmesh-runtime/scripts/connections.sh | 21 +- eventmesh-runtime/scripts/histo.sh | 19 +- eventmesh-runtime/scripts/histo_suspects.sh | 19 +- eventmesh-runtime/scripts/jstack.sh | 19 +- .../scripts/monitor_connections.sh | 17 + .../scripts/monitor_histo_suspects.sh | 17 + eventmesh-runtime/scripts/monitor_threads.sh | 17 + eventmesh-runtime/scripts/session.sh | 22 +- eventmesh-runtime/scripts/threads.sh | 19 +- .../controller/ClientManageController.java | 775 -- .../eventmesh/runtime/boot/ProxyServer.java | 93 - .../configuration/AccessConfiguration.java | 296 - .../configuration/CommonConfiguration.java | 212 - .../configuration/ConfigurationWraper.java | 78 - .../configuration/ProxyConfiguration.java | 227 - .../runtime/constants/DeFiBusConstant.java | 54 - .../runtime/core/plugin/MQWrapper.java | 28 - .../http/consumer/ConsumerGroupManager.java | 83 - .../BatchSendMessageV2Processor.java | 240 - .../http/processor/SubscribeProcessor.java | 211 - .../http/processor/UnSubscribeProcessor.java | 269 - .../client/session/push/SessionPusher.java | 150 - .../runtime/metrics/tcp/ProxyTcpMonitor.java | 170 - .../runtime/util/MessageClientIDSetter.java | 205 - .../controller/ClientManageController.java | 64 + .../RedirectClientByIpPortHandler.java | 111 + .../handler/RedirectClientByPathHandler.java | 112 + .../RedirectClientBySubSystemHandler.java | 112 + .../admin/handler/RejectAllClientHandler.java | 96 + .../handler/RejectClientByIpPortHandler.java | 107 + .../RejectClientBySubSystemHandler.java | 122 + .../handler/ShowClientBySystemHandler.java | 91 + .../admin/handler/ShowClientHandler.java | 92 + .../ShowListenClientByTopicHandler.java | 92 + .../runtime/boot/AbrstractHTTPServer.java | 126 +- .../runtime/boot/AbstractRemotingServer.java | 11 +- .../runtime/boot/EventMeshHTTPServer.java} | 109 +- .../runtime/boot/EventMeshServer.java | 93 + .../runtime/boot/EventMeshStartup.java} | 42 +- .../runtime/boot/EventMeshTCPServer.java} | 182 +- .../runtime/boot/SSLContextFactory.java | 47 +- .../eventmesh/runtime/common/Pair.java | 2 +- .../runtime/common/ServiceState.java | 2 +- .../EventMeshHTTPConfiguration.java | 230 + .../EventMeshTCPConfiguration.java | 291 + .../constants/EventMeshConstants.java} | 57 +- .../runtime/constants/EventMeshVersion.java} | 4 +- .../core/consumergroup/ConsumerGroupConf.java | 6 +- .../consumergroup/ConsumerGroupTopicConf.java | 31 +- .../core/consumergroup/ProducerGroupConf.java | 2 +- .../event/ConsumerGroupStateEvent.java | 4 +- .../ConsumerGroupTopicConfChangeEvent.java | 4 +- .../core/plugin/MQConsumerWrapper.java | 35 +- .../core/plugin/MQProducerWrapper.java | 23 +- .../runtime/core/plugin/MQWrapper.java | 46 + .../protocol/http/async/AsyncContext.java | 6 +- .../protocol/http/async/CompleteHandler.java | 2 +- .../http/consumer/ConsumerGroupManager.java | 97 + .../http/consumer/ConsumerManager.java | 97 +- .../http/consumer/EventMeshConsumer.java} | 144 +- .../http/consumer/HandleMsgContext.java | 73 +- .../http/processor/AdminMetricsProcessor.java | 17 +- .../processor/AdminShutdownProcessor.java | 43 +- .../processor/BatchSendMessageProcessor.java | 164 +- .../BatchSendMessageV2Processor.java | 237 + .../http/processor/HeartBeatProcessor.java | 142 +- .../http/processor/ReplyMessageProcessor.java | 181 +- .../processor/SendAsyncMessageProcessor.java | 143 +- .../processor/SendSyncMessageProcessor.java | 178 +- .../http/processor/SubscribeProcessor.java | 245 + .../http/processor/UnSubscribeProcessor.java | 274 + .../protocol/http/processor/inf/Client.java | 29 +- .../processor/inf/HttpRequestProcessor.java | 7 +- .../http/producer/EventMeshProducer.java} | 40 +- .../http/producer/ProducerManager.java | 56 +- .../http/producer/SendMessageContext.java | 43 +- .../http/push/AbstractHTTPPushRequest.java | 41 +- .../http/push/AsyncHTTPPushRequest.java | 87 +- .../protocol/http/push/HTTPClientPool.java | 9 +- .../http/push/HTTPMessageHandler.java | 35 +- .../protocol/http/push/MessageHandler.java | 4 +- .../protocol/http/retry/DelayRetryable.java | 2 +- .../core/protocol/http/retry/HttpRetryer.java | 26 +- .../protocol/http/retry/RetryContext.java | 2 +- .../tcp/client/EventMeshTcp2Client.java} | 90 +- .../EventMeshTcpConnectionHandler.java} | 27 +- .../client/EventMeshTcpExceptionHandler.java} | 25 +- .../EventMeshTcpMessageDispatcher.java} | 83 +- .../tcp/client/group/ClientGroupWrapper.java | 495 +- .../group/ClientSessionGroupMapping.java | 273 +- .../dispatch/DownstreamDispatchStrategy.java | 7 +- .../FreePriorityDispatchStrategy.java | 31 +- .../protocol/tcp/client/session/Session.java | 144 +- .../tcp/client/session/SessionContext.java | 15 +- .../tcp/client/session/SessionState.java | 2 +- .../client/session/push/ClientAckContext.java | 32 +- .../session/push/DownStreamMsgContext.java | 58 +- .../tcp/client/session/push/PushContext.java | 35 +- .../client/session/push/SessionPusher.java | 142 + .../push/retry/EventMeshTcpRetryer.java} | 143 +- .../session/send/EventMeshTcpSendResult.java} | 12 +- .../session/send/EventMeshTcpSendStatus.java} | 4 +- .../client/session/send/SessionSender.java | 73 +- .../session/send/UpStreamMsgContext.java | 11 +- .../tcp/client/task/AbstractTask.java | 17 +- .../protocol/tcp/client/task/GoodbyeTask.java | 27 +- .../tcp/client/task/HeartBeatTask.java | 23 +- .../protocol/tcp/client/task/HelloTask.java | 53 +- .../protocol/tcp/client/task/ListenTask.java | 21 +- .../tcp/client/task/MessageAckTask.java | 28 +- .../tcp/client/task/MessageTransferTask.java | 88 +- .../tcp/client/task/SubscribeTask.java | 40 +- .../tcp/client/task/UnSubscribeTask.java | 33 +- .../runtime/domain/BytesMessageImpl.java | 2 +- .../runtime/domain/ConsumeRequest.java | 0 .../runtime/domain/NonStandardKeys.java | 2 +- .../runtime/domain/RocketMQConstants.java | 2 +- .../runtime/domain/SendResultImpl.java | 2 +- .../metrics/MonitorMetricConstants.java | 14 +- .../runtime/metrics/http/GroupMetrics.java | 11 +- .../metrics/http/HTTPMetricsServer.java | 53 +- .../runtime/metrics/http/HealthMetrics.java | 11 +- .../runtime/metrics/http/SummaryMetrics.java | 31 +- .../metrics/http/TcpSummaryMetrics.java | 31 +- .../runtime/metrics/http/TopicMetrics.java | 11 +- .../metrics/tcp/EventMeshTcpMonitor.java | 169 + .../EventMeshConsumeConcurrentlyContext.java} | 6 +- .../EventMeshConsumeConcurrentlyStatus.java} | 4 +- ...EventMeshMessageListenerConcurrently.java} | 16 +- .../util/EventMeshThreadFactoryImpl.java} | 10 +- .../runtime/util/EventMeshUtil.java} | 208 +- .../runtime/util/HttpTinyClient.java | 14 +- .../eventmesh/runtime/util/IOTinyUtils.java | 24 +- .../eventmesh/runtime/util/NetUtils.java | 72 + .../eventmesh/runtime/util/OMSUtil.java | 33 +- .../runtime/util/RemotingHelper.java | 26 +- .../eventmesh/runtime/util/ServerGlobal.java | 2 +- .../apache}/eventmesh/runtime/util/Utils.java | 54 +- .../runtime/util/ValueComparator.java | 2 +- .../ConsumeMessageConcurrentlyService.java | 516 -- ...{ProxyClient.java => EventMeshClient.java} | 16 +- .../src/test/java/client/PubClient.java | 5 +- .../src/test/java/client/SubClient.java | 15 +- .../java/client/common/ClientConstants.java | 6 +- .../test/java/client/common/ClientGlobal.java | 5 +- .../src/test/java/client/common/Codec.java | 31 +- .../test/java/client/common/MessageUtils.java | 56 +- .../java/client/common/RequestContext.java | 6 +- .../src/test/java/client/common/Server.java | 12 +- .../test/java/client/common/TCPClient.java | 25 +- .../java/client/common/UserAgentUtils.java | 23 +- .../test/java/client/hook/ReceiveMsgHook.java | 4 +- ...ientImpl.java => EventMeshClientImpl.java} | 32 +- .../test/java/client/impl/PubClientImpl.java | 26 +- .../test/java/client/impl/SubClientImpl.java | 61 +- .../src/test/java/demo/AsyncPubClient.java | 8 +- .../src/test/java/demo/AsyncSubClient.java | 16 +- .../test/java/demo/BroadCastPubClient.java | 3 +- .../test/java/demo/BroadCastSubClient.java | 18 +- .../src/test/java/demo/CCSubClient.java | 12 +- .../src/test/java/demo/CClientDemo.java | 30 +- .../src/test/java/demo/SyncPubClient.java | 11 +- .../src/test/java/demo/SyncSubClient.java | 12 +- .../RedirectClientByIpPortHandlerTest.java | 59 + .../java/protocol/CmdAsync2ClientTest.java | 68 - .../java/protocol/CmdAsync2ServerTest.java | 59 - .../protocol/CmdBroadCast2ClientTest.java | 69 - .../protocol/CmdBroadCast2ServerTest.java | 60 - .../java/protocol/CmdClientGoodByTest.java | 59 - .../test/java/protocol/CmdHeartbeatTest.java | 68 - .../src/test/java/protocol/CmdListenTest.java | 59 - .../test/java/protocol/CmdRecommendTest.java | 59 - .../src/test/java/protocol/CmdSendRRTest.java | 63 - .../test/java/protocol/CmdSubscribeTest.java | 59 - .../src/test/java/protocol/CmdSysLogTest.java | 63 - .../test/java/protocol/CmdTraceLogTest.java | 64 - .../java/protocol/CmdUnSubscribeTest.java | 60 - .../src/test/java/test/BasicTest.java | 159 - eventmesh-sdk-java/build.gradle | 88 +- eventmesh-sdk-java/gradle.properties | 3 +- .../client/http/consumer/LiteConsumer.java | 308 - .../consumer/context/LiteConsumeContext.java | 126 - .../client/http/AbstractLiteClient.java | 69 +- .../client/http/EventMeshRetObj.java} | 4 +- .../eventmesh/client/http/RemotingServer.java | 95 +- .../client/http/conf/LiteClientConfig.java | 98 +- .../client/http/consumer/HandleResult.java | 2 +- .../client/http/consumer/LiteConsumer.java | 304 + .../consumer/context/LiteConsumeContext.java | 102 + .../listener/LiteMessageListener.java | 9 +- .../eventmesh/client/http/http/HttpUtil.java | 27 +- .../client/http/http/RequestParam.java | 11 +- .../client/http/producer/LiteProducer.java | 173 +- .../client/http/producer/RRCallback.java | 4 +- .../RRCallbackResponseHandlerAdapter.java | 36 +- .../client/http/ssl/MyX509TrustManager.java | 27 +- .../http/util/HttpLoadBalanceUtils.java | 83 + .../client/tcp/EventMeshClient.java} | 14 +- .../eventmesh/client/tcp/SimplePubClient.java | 10 +- .../eventmesh/client/tcp/SimpleSubClient.java | 44 + .../client/tcp/common/AsyncRRCallback.java | 3 +- .../client/tcp/common/EventMeshCommon.java} | 12 +- .../common/EventMeshThreadFactoryImpl.java} | 10 +- .../client/tcp/common/MessageUtils.java | 40 +- .../client/tcp/common/ReceiveMsgHook.java | 4 +- .../client/tcp/common/RequestContext.java | 7 +- .../client/tcp/common/TcpClient.java | 40 +- .../tcp/impl/DefaultEventMeshClient.java} | 30 +- .../client/tcp/impl/SimplePubClientImpl.java | 44 +- .../client/tcp/impl/SimpleSubClientImpl.java | 66 +- .../src/main/resources/log4j2.xml | 2 +- .../http/demo/AsyncPublishInstance.java | 67 - .../tcp/common/AccessTestCaseTopicSet.java | 17 - .../client/tcp/common/AccessTestUtils.java | 130 - .../client/tcp/demo/AsyncPublish.java | 42 - .../tcp/demo/AsyncPublishBroadcast.java | 36 - .../client/tcp/demo/AsyncSubscribe.java | 48 - .../tcp/demo/AsyncSubscribeBroadcast.java | 48 - .../client/tcp/demo/SyncRequest.java | 36 - .../client/tcp/demo/SyncResponse.java | 49 - .../http/demo/AsyncPublishInstance.java | 85 + .../http/demo/AsyncSyncRequestInstance.java | 57 +- .../http/demo/SyncRequestInstance.java | 50 +- .../http/util/HttpLoadBalanceUtilsTest.java | 47 + .../tcp/common/EventMeshTestCaseTopicSet.java | 34 + .../client/tcp/common/EventMeshTestUtils.java | 155 + .../client/tcp/demo/AsyncPublish.java | 59 + .../tcp/demo/AsyncPublishBroadcast.java | 53 + .../client/tcp/demo/AsyncSubscribe.java | 69 + .../tcp/demo/AsyncSubscribeBroadcast.java | 69 + .../client/tcp/demo/SyncRequest.java | 53 + .../client/tcp/demo/SyncResponse.java | 69 + .../src/test/resources/application.properties | 16 + .../src/test/resources/log4j2.xml | 2 +- eventmesh-starter/build.gradle | 32 +- eventmesh-starter/gradle.properties | 4 +- .../com/webank/eventmesh/starter/StartUp.java | 9 - .../org/apache/eventmesh/starter/StartUp.java | 26 + eventmesh-test/bin/http_pub.sh | 37 +- eventmesh-test/bin/http_sub.sh | 37 +- eventmesh-test/bin/tcp_pub.sh | 37 +- eventmesh-test/bin/tcp_pub_broadcast.sh | 35 +- eventmesh-test/bin/tcp_sub.sh | 35 +- eventmesh-test/bin/tcp_sub_broadcast.sh | 39 +- eventmesh-test/build.gradle | 86 +- eventmesh-test/conf/application.properties | 16 + eventmesh-test/conf/log4j2.xml | 2 +- eventmesh-test/conf/server.env | 16 + eventmesh-test/gradle.properties | 3 +- .../http/demo/AsyncPublishInstance.java | 73 - .../demo/sub/SpringBootDemoApplication.java | 15 - .../demo/sub/controller/SubController.java | 26 - .../http/demo/sub/service/SubService.java | 86 - .../tcp/common/AccessTestCaseTopicSet.java | 17 - .../eventmesh/tcp/common/AccessTestUtils.java | 127 - .../eventmesh/tcp/demo/AsyncPublish.java | 49 - .../tcp/demo/AsyncPublishBroadcast.java | 42 - .../eventmesh/tcp/demo/AsyncSubscribe.java | 54 - .../tcp/demo/AsyncSubscribeBroadcast.java | 54 - .../eventmesh/tcp/demo/SyncRequest.java | 36 - .../eventmesh/tcp/demo/SyncResponse.java | 49 - .../http/demo/AsyncPublishInstance.java | 94 + .../http/demo/AsyncSyncRequestInstance.java | 62 +- .../http/demo/SyncRequestInstance.java | 56 +- .../demo/sub/SpringBootDemoApplication.java | 24 +- .../demo/sub/controller/SubController.java | 51 + .../http/demo/sub/service/SubService.java | 130 + .../tcp/common/EventMeshTestCaseTopicSet.java | 30 +- .../tcp/common/EventMeshTestUtils.java | 154 + .../eventmesh/tcp/demo/AsyncPublish.java | 66 + .../tcp/demo/AsyncPublishBroadcast.java | 59 + .../eventmesh/tcp/demo/AsyncSubscribe.java | 74 + .../tcp/demo/AsyncSubscribeBroadcast.java | 74 + .../eventmesh/tcp/demo/SyncRequest.java | 55 + .../eventmesh/tcp/demo/SyncResponse.java | 70 + .../apache}/eventmesh/util/Utils.java | 29 +- gradle.properties | 19 +- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 21 + gradlew | 26 +- gradlew.bat | 25 +- install.sh | 18 + package.json | 19 - settings.gradle | 8 +- style/codeStyle.xml | 2 +- yarn.lock | 7839 ----------------- 499 files changed, 13124 insertions(+), 21494 deletions(-) create mode 100644 .asf.yaml delete mode 100644 .coveralls.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/gitee-mirror.yml create mode 100644 .github/workflows/greetings.yml create mode 100644 .licenserc.yaml delete mode 100644 .travis.yml delete mode 100644 CNAME create mode 100644 DISCLAIMER-WIP create mode 100644 NOTICE delete mode 100644 _config.yml delete mode 100644 docs/cn/features/0-introduction.md delete mode 100644 docs/cn/features/1-request-response-call.md delete mode 100644 docs/cn/features/10-flow-control.md delete mode 100644 docs/cn/features/2-dark-launch.md delete mode 100644 docs/cn/features/3-circuit-break-mechanism.md delete mode 100644 docs/cn/features/4-invoke-service-nearby.md delete mode 100644 docs/cn/features/5-multi-active.md delete mode 100644 docs/cn/features/6-dynamic-adjust-queue.md delete mode 100644 docs/cn/features/7-isolation-mechanism.md delete mode 100644 docs/cn/features/8-fault-tolerant.md delete mode 100644 docs/cn/features/9-publish-type.md delete mode 100644 docs/en/features/architecture.md create mode 100644 docs/en/features/eventmesh-cloudevents-sdk-binding.md delete mode 100644 docs/en/features/request-response-call.md create mode 100644 docs/images/eventmesh-multi-runtime.png create mode 100644 docs/images/logo1.png create mode 100644 docs/images/logo2.png delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/common/ProxyRetCode.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/RegResponseHeader.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java delete mode 100644 eventmesh-common/src/main/java/com/webank/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/Constants.java (89%) rename eventmesh-common/src/main/java/{com/webank/eventmesh/common/ProxyException.java => org/apache/eventmesh/common/EventMeshException.java} (70%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/IPUtil.java (97%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/LiteMessage.java (98%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/ThreadPoolFactory.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/ThreadUtil.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/command/HttpCommand.java (90%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/config/CommonConfiguration.java (62%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/config/ConfigurationWraper.java (93%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/LoadBalanceSelector.java create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/LoadBalanceType.java create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/RandomLoadBalanceSelector.java create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/Weight.java create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/loadbalance/WeightRoundRobinLoadBalanceSelector.java create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubcriptionType.java create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubscriptionItem.java create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/SubscriptionMode.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/BaseRequestBody.java (95%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/BaseResponseBody.java (93%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/Body.java (77%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/HeartbeatRequestBody.java (84%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/HeartbeatResponseBody.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/RegRequestBody.java (86%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/RegResponseBody.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/SubscribeRequestBody.java (69%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/SubscribeResponseBody.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/UnRegRequestBody.java (96%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/UnRegResponseBody.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/UnSubscribeRequestBody.java (77%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/client/UnSubscribeResponseBody.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/PushMessageRequestBody.java (93%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/PushMessageResponseBody.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/ReplyMessageRequestBody.java (83%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/ReplyMessageResponseBody.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/SendMessageBatchRequestBody.java (85%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/SendMessageBatchResponseBody.java (92%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/SendMessageBatchV2RequestBody.java (85%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/SendMessageBatchV2ResponseBody.java (92%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/SendMessageRequestBody.java (85%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/body/message/SendMessageResponseBody.java (92%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/common/ClientRetCode.java (94%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/common/ClientType.java (91%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/common/EventMeshRetCode.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/common/ProtocolKey.java (73%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/common/ProtocolVersion.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/common/RequestCode.java (97%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/BaseRequestHeader.java (93%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/BaseResponseHeader.java (91%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/Header.java (77%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/client/HeartbeatRequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/HeartbeatResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/client/RegRequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/RegResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/client/SubscribeRequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/SubscribeResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/client/UnRegRequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnRegResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/client/UnSubscribeRequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/client/UnSubscribeResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/message/PushMessageRequestHeader.java (50%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/message/PushMessageResponseHeader.java (81%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/message/ReplyMessageRequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/ReplyMessageResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/message/SendMessageBatchRequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/message/SendMessageBatchV2RequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageBatchV2ResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/http/header/message/SendMessageRequestHeader.java (83%) create mode 100644 eventmesh-common/src/main/java/org/apache/eventmesh/common/protocol/http/header/message/SendMessageResponseHeader.java rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/Command.java (97%) rename eventmesh-common/src/main/java/{com/webank/eventmesh/common/protocol/tcp/ProxyClientInfo.java => org/apache/eventmesh/common/protocol/tcp/EventMeshClientInfo.java} (92%) rename eventmesh-common/src/main/java/{com/webank/eventmesh/common/protocol/tcp/AccessMessage.java => org/apache/eventmesh/common/protocol/tcp/EventMeshMessage.java} (88%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/Header.java (97%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/HeartBeatInfo.java (97%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/OPStatus.java (96%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/Package.java (96%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/RedirectInfo.java (96%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/RegisterInfo.java (96%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/Subscription.java (77%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/UnRegisterInfo.java (97%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/UserAgent.java (92%) rename eventmesh-common/src/main/java/{com/webank => org/apache}/eventmesh/common/protocol/tcp/codec/Codec.java (89%) create mode 100644 eventmesh-common/src/test/java/org/apache/eventmesh/common/loadbalance/RandomLoadBalanceSelectorTest.java create mode 100644 eventmesh-common/src/test/java/org/apache/eventmesh/common/loadbalance/WeightRoundRobinLoadBalanceSelectorTest.java delete mode 100644 eventmesh-connector-api/src/main/java/com/webank/eventmesh/api/AbstractContext.java delete mode 100644 eventmesh-connector-api/src/main/java/com/webank/eventmesh/api/RRCallback.java delete mode 100644 eventmesh-connector-api/src/main/java/com/webank/eventmesh/api/consumer/MeshMQPushConsumer.java rename eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java => eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/AbstractContext.java (87%) create mode 100644 eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAction.java create mode 100644 eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAsyncConsumeContext.java create mode 100644 eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/RRCallback.java create mode 100644 eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/consumer/MeshMQPushConsumer.java rename eventmesh-connector-api/src/main/java/{com/webank => org/apache}/eventmesh/api/producer/MeshMQProducer.java (83%) delete mode 100644 eventmesh-connector-rocketmq/src/main/java/com/webank/eventmesh/connector/rocketmq/common/Constants.java rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/MessagingAccessPointImpl.java (93%) create mode 100644 eventmesh-connector-rocketmq/src/main/java/org/apache/eventmesh/connector/rocketmq/common/Constants.java rename eventmesh-connector-rocketmq/src/main/java/{com/webank/eventmesh/connector/rocketmq/common/ProxyConstants.java => org/apache/eventmesh/connector/rocketmq/common/EventMeshConstants.java} (60%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/config/ClientConfig.java (97%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/config/ClientConfiguration.java (53%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/config/ConfigurationWraper.java (93%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/consumer/PushConsumerImpl.java (66%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/consumer/RocketMQConsumerImpl.java (78%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/domain/ConsumeRequest.java (94%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/domain/NonStandardKeys.java (96%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/domain/RocketMQConstants.java (94%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank/eventmesh/connector/rocketmq/patch/ProxyConsumeConcurrentlyContext.java => org/apache/eventmesh/connector/rocketmq/patch/EventMeshConsumeConcurrentlyContext.java} (81%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank/eventmesh/connector/rocketmq/patch/ProxyConsumeConcurrentlyStatus.java => org/apache/eventmesh/connector/rocketmq/patch/EventMeshConsumeConcurrentlyStatus.java} (90%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank/eventmesh/connector/rocketmq/patch/ProxyMessageListenerConcurrently.java => org/apache/eventmesh/connector/rocketmq/patch/EventMeshMessageListenerConcurrently.java} (75%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/producer/AbstractOMSProducer.java (87%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/producer/ProducerImpl.java (53%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/producer/RocketMQProducerImpl.java (80%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/promise/DefaultPromise.java (98%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/promise/FutureState.java (95%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/utils/BeanUtils.java (95%) rename eventmesh-connector-rocketmq/src/main/java/{com/webank => org/apache}/eventmesh/connector/rocketmq/utils/OMSUtil.java (96%) delete mode 100644 eventmesh-connector-rocketmq/src/main/resources/META-INF/services/com.webank.eventmesh.api.consumer.MeshMQPushConsumer delete mode 100644 eventmesh-connector-rocketmq/src/main/resources/META-INF/services/com.webank.eventmesh.api.producer.MeshMQProducer create mode 100644 eventmesh-connector-rocketmq/src/main/resources/META-INF/services/org.apache.eventmesh.api.consumer.MeshMQPushConsumer create mode 100644 eventmesh-connector-rocketmq/src/main/resources/META-INF/services/org.apache.eventmesh.api.producer.MeshMQProducer rename eventmesh-connector-rocketmq/src/test/java/{ => org/apache}/rocketmq/consumer/PushConsumerImplTest.java (62%) create mode 100644 eventmesh-connector-rocketmq/src/test/java/org/apache/rocketmq/producer/ProducerImplTest.java rename eventmesh-connector-rocketmq/src/test/java/{ => org/apache}/rocketmq/promise/DefaultPromiseTest.java (98%) rename eventmesh-connector-rocketmq/src/test/java/{ => org/apache}/rocketmq/utils/BeanUtilsTest.java (92%) delete mode 100644 eventmesh-connector-rocketmq/src/test/java/rocketmq/producer/ProducerImplTest.java delete mode 100644 eventmesh-connector-rocketmq/src/test/resources/META-INF/services/io.openmessaging.MessagingAccessPoint delete mode 100644 eventmesh-connector-rocketmq/src/test/resources/META-INF/services/io.openmessaging.producer.Producer create mode 100644 eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.MessagingAccessPoint create mode 100644 eventmesh-connector-rocketmq/src/test/resources/META-INF/services/org.apache.io.openmessaging.producer.Producer create mode 100644 eventmesh-runtime/conf/eventmesh.properties delete mode 100644 eventmesh-runtime/conf/proxy.properties delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/admin/controller/ClientManageController.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/boot/ProxyServer.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/configuration/AccessConfiguration.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/configuration/CommonConfiguration.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/configuration/ConfigurationWraper.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/configuration/ProxyConfiguration.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/constants/DeFiBusConstant.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/core/plugin/MQWrapper.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/core/protocol/http/consumer/ConsumerGroupManager.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/core/protocol/http/processor/UnSubscribeProcessor.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/core/protocol/tcp/client/session/push/SessionPusher.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/metrics/tcp/ProxyTcpMonitor.java delete mode 100644 eventmesh-runtime/src/main/java/com/webank/eventmesh/runtime/util/MessageClientIDSetter.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/controller/ClientManageController.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByIpPortHandler.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByPathHandler.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientBySubSystemHandler.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectAllClientHandler.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectClientByIpPortHandler.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/RejectClientBySubSystemHandler.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowClientBySystemHandler.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowClientHandler.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/admin/handler/ShowListenClientByTopicHandler.java rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/boot/AbrstractHTTPServer.java (78%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/boot/AbstractRemotingServer.java (97%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/boot/ProxyHTTPServer.java => org/apache/eventmesh/runtime/boot/EventMeshHTTPServer.java} (60%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/boot/EventMeshServer.java rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/boot/ProxyStartup.java => org/apache/eventmesh/runtime/boot/EventMeshStartup.java} (54%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/boot/ProxyTCPServer.java => org/apache/eventmesh/runtime/boot/EventMeshTCPServer.java} (50%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/boot/SSLContextFactory.java (50%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/common/Pair.java (96%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/common/ServiceState.java (95%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshHTTPConfiguration.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/configuration/EventMeshTCPConfiguration.java rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/constants/ProxyConstants.java => org/apache/eventmesh/runtime/constants/EventMeshConstants.java} (58%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/constants/ProxyVersion.java => org/apache/eventmesh/runtime/constants/EventMeshVersion.java} (93%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/consumergroup/ConsumerGroupConf.java (97%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/consumergroup/ConsumerGroupTopicConf.java (80%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/consumergroup/ProducerGroupConf.java (96%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/consumergroup/event/ConsumerGroupStateEvent.java (91%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/consumergroup/event/ConsumerGroupTopicConfChangeEvent.java (92%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/plugin/MQConsumerWrapper.java (81%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/plugin/MQProducerWrapper.java (89%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/plugin/MQWrapper.java rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/async/AsyncContext.java (97%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/async/CompleteHandler.java (93%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/consumer/ConsumerGroupManager.java rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/consumer/ConsumerManager.java (80%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/http/consumer/ProxyConsumer.java => org/apache/eventmesh/runtime/core/protocol/http/consumer/EventMeshConsumer.java} (60%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/consumer/HandleMsgContext.java (71%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/AdminMetricsProcessor.java (73%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/AdminShutdownProcessor.java (52%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageProcessor.java (57%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/BatchSendMessageV2Processor.java rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/HeartBeatProcessor.java (51%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/ReplyMessageProcessor.java (53%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/SendAsyncMessageProcessor.java (55%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/SendSyncMessageProcessor.java (56%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/SubscribeProcessor.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/http/processor/UnSubscribeProcessor.java rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/inf/Client.java (70%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/processor/inf/HttpRequestProcessor.java (85%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/http/producer/ProxyProducer.java => org/apache/eventmesh/runtime/core/protocol/http/producer/EventMeshProducer.java} (74%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/producer/ProducerManager.java (52%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/producer/SendMessageContext.java (75%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/push/AbstractHTTPPushRequest.java (74%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/push/AsyncHTTPPushRequest.java (77%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/push/HTTPClientPool.java (96%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/push/HTTPMessageHandler.java (78%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/push/MessageHandler.java (87%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/retry/DelayRetryable.java (93%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/retry/HttpRetryer.java (82%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/http/retry/RetryContext.java (96%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/tcp/client/ProxyTcp2Client.java => org/apache/eventmesh/runtime/core/protocol/tcp/client/EventMeshTcp2Client.java} (64%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/tcp/client/ProxyTcpConnectionHandler.java => org/apache/eventmesh/runtime/core/protocol/tcp/client/EventMeshTcpConnectionHandler.java} (81%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/tcp/client/ProxyTcpExceptionHandler.java => org/apache/eventmesh/runtime/core/protocol/tcp/client/EventMeshTcpExceptionHandler.java} (62%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/tcp/client/ProxyTcpMessageDispatcher.java => org/apache/eventmesh/runtime/core/protocol/tcp/client/EventMeshTcpMessageDispatcher.java} (55%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/group/ClientGroupWrapper.java (54%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/group/ClientSessionGroupMapping.java (58%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/group/dispatch/DownstreamDispatchStrategy.java (88%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/group/dispatch/FreePriorityDispatchStrategy.java (74%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/session/Session.java (71%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/session/SessionContext.java (79%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/session/SessionState.java (93%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/session/push/ClientAckContext.java (79%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/session/push/DownStreamMsgContext.java (69%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/session/push/PushContext.java (65%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/protocol/tcp/client/session/push/SessionPusher.java rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/tcp/client/session/push/retry/ProxyTcpRetryer.java => org/apache/eventmesh/runtime/core/protocol/tcp/client/session/push/retry/EventMeshTcpRetryer.java} (58%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/tcp/client/session/send/ProxyTcpSendResult.java => org/apache/eventmesh/runtime/core/protocol/tcp/client/session/send/EventMeshTcpSendResult.java} (78%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/core/protocol/tcp/client/session/send/ProxyTcpSendStatus.java => org/apache/eventmesh/runtime/core/protocol/tcp/client/session/send/EventMeshTcpSendStatus.java} (89%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/session/send/SessionSender.java (67%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/session/send/UpStreamMsgContext.java (86%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/AbstractTask.java (72%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/GoodbyeTask.java (70%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/HeartBeatTask.java (75%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/HelloTask.java (63%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/ListenTask.java (76%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/MessageAckTask.java (60%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/MessageTransferTask.java (65%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/SubscribeTask.java (69%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/core/protocol/tcp/client/task/UnSubscribeTask.java (72%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/domain/BytesMessageImpl.java (98%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/domain/ConsumeRequest.java (100%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/domain/NonStandardKeys.java (97%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/domain/RocketMQConstants.java (95%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/domain/SendResultImpl.java (96%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/metrics/MonitorMetricConstants.java (69%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/metrics/http/GroupMetrics.java (75%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/metrics/http/HTTPMetricsServer.java (76%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/metrics/http/HealthMetrics.java (77%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/metrics/http/SummaryMetrics.java (91%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/metrics/http/TcpSummaryMetrics.java (90%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/metrics/http/TopicMetrics.java (75%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/metrics/tcp/EventMeshTcpMonitor.java rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/patch/ProxyConsumeConcurrentlyContext.java => org/apache/eventmesh/runtime/patch/EventMeshConsumeConcurrentlyContext.java} (86%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/patch/ProxyConsumeConcurrentlyStatus.java => org/apache/eventmesh/runtime/patch/EventMeshConsumeConcurrentlyStatus.java} (91%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/patch/ProxyMessageListenerConcurrently.java => org/apache/eventmesh/runtime/patch/EventMeshMessageListenerConcurrently.java} (77%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/util/ProxyThreadFactoryImpl.java => org/apache/eventmesh/runtime/util/EventMeshThreadFactoryImpl.java} (79%) rename eventmesh-runtime/src/main/java/{com/webank/eventmesh/runtime/util/ProxyUtil.java => org/apache/eventmesh/runtime/util/EventMeshUtil.java} (63%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/util/HttpTinyClient.java (92%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/util/IOTinyUtils.java (89%) create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/util/NetUtils.java rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/util/OMSUtil.java (56%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/util/RemotingHelper.java (86%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/util/ServerGlobal.java (96%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/util/Utils.java (75%) rename eventmesh-runtime/src/main/java/{com/webank => org/apache}/eventmesh/runtime/util/ValueComparator.java (96%) delete mode 100644 eventmesh-runtime/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java rename eventmesh-runtime/src/test/java/client/{ProxyClient.java => EventMeshClient.java} (74%) rename eventmesh-runtime/src/test/java/client/impl/{ProxyClientImpl.java => EventMeshClientImpl.java} (79%) create mode 100644 eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByIpPortHandlerTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdAsync2ClientTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdAsync2ServerTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdBroadCast2ClientTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdBroadCast2ServerTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdClientGoodByTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdHeartbeatTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdListenTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdRecommendTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdSendRRTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdSubscribeTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdSysLogTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdTraceLogTest.java delete mode 100644 eventmesh-runtime/src/test/java/protocol/CmdUnSubscribeTest.java delete mode 100644 eventmesh-runtime/src/test/java/test/BasicTest.java delete mode 100644 eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/LiteConsumer.java delete mode 100644 eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/http/consumer/context/LiteConsumeContext.java rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/AbstractLiteClient.java (50%) rename eventmesh-sdk-java/src/main/java/{com/webank/eventmesh/client/http/ProxyRetObj.java => org/apache/eventmesh/client/http/EventMeshRetObj.java} (94%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/RemotingServer.java (85%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/conf/LiteClientConfig.java (66%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/consumer/HandleResult.java (94%) create mode 100644 eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/http/consumer/LiteConsumer.java create mode 100644 eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/http/consumer/context/LiteConsumeContext.java rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/consumer/listener/LiteMessageListener.java (80%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/http/HttpUtil.java (98%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/http/RequestParam.java (98%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/producer/LiteProducer.java (64%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/producer/RRCallback.java (90%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/producer/RRCallbackResponseHandlerAdapter.java (79%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/http/ssl/MyX509TrustManager.java (68%) create mode 100644 eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/http/util/HttpLoadBalanceUtils.java rename eventmesh-sdk-java/src/main/java/{com/webank/eventmesh/client/tcp/WemqAccessClient.java => org/apache/eventmesh/client/tcp/EventMeshClient.java} (74%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/tcp/SimplePubClient.java (82%) create mode 100644 eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/tcp/SimpleSubClient.java rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/tcp/common/AsyncRRCallback.java (89%) rename eventmesh-sdk-java/src/main/java/{com/webank/eventmesh/client/tcp/common/WemqAccessCommon.java => org/apache/eventmesh/client/tcp/common/EventMeshCommon.java} (92%) rename eventmesh-sdk-java/src/main/java/{com/webank/eventmesh/client/tcp/common/WemqAccessThreadFactoryImpl.java => org/apache/eventmesh/client/tcp/common/EventMeshThreadFactoryImpl.java} (79%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/tcp/common/MessageUtils.java (78%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/tcp/common/ReceiveMsgHook.java (90%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/tcp/common/RequestContext.java (96%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/tcp/common/TcpClient.java (82%) rename eventmesh-sdk-java/src/main/java/{com/webank/eventmesh/client/tcp/impl/DefaultWemqAccessClient.java => org/apache/eventmesh/client/tcp/impl/DefaultEventMeshClient.java} (76%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/tcp/impl/SimplePubClientImpl.java (84%) rename eventmesh-sdk-java/src/main/java/{com/webank => org/apache}/eventmesh/client/tcp/impl/SimpleSubClientImpl.java (72%) delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/http/demo/AsyncPublishInstance.java delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/common/AccessTestCaseTopicSet.java delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/common/AccessTestUtils.java delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncPublish.java delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncSubscribe.java delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/SyncRequest.java delete mode 100644 eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client/tcp/demo/SyncResponse.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/http/demo/AsyncPublishInstance.java rename eventmesh-sdk-java/src/test/java/{com/webank => org/apache}/eventmesh/client/http/demo/AsyncSyncRequestInstance.java (52%) rename {eventmesh-test/src/main/java/com/webank/eventmesh => eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client}/http/demo/SyncRequestInstance.java (51%) create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/http/util/HttpLoadBalanceUtilsTest.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/tcp/common/EventMeshTestCaseTopicSet.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/tcp/common/EventMeshTestUtils.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/tcp/demo/AsyncPublish.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/tcp/demo/AsyncPublishBroadcast.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/tcp/demo/AsyncSubscribe.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/tcp/demo/AsyncSubscribeBroadcast.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/tcp/demo/SyncRequest.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/tcp/demo/SyncResponse.java delete mode 100644 eventmesh-starter/src/main/java/com/webank/eventmesh/starter/StartUp.java create mode 100644 eventmesh-starter/src/main/java/org/apache/eventmesh/starter/StartUp.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/http/demo/AsyncPublishInstance.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/http/demo/sub/SpringBootDemoApplication.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/http/demo/sub/controller/SubController.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/http/demo/sub/service/SubService.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/tcp/common/AccessTestCaseTopicSet.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/tcp/common/AccessTestUtils.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/tcp/demo/AsyncPublish.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/tcp/demo/AsyncPublishBroadcast.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/tcp/demo/AsyncSubscribe.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/tcp/demo/AsyncSubscribeBroadcast.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/tcp/demo/SyncRequest.java delete mode 100644 eventmesh-test/src/main/java/com/webank/eventmesh/tcp/demo/SyncResponse.java create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/http/demo/AsyncPublishInstance.java rename eventmesh-test/src/main/java/{com/webank => org/apache}/eventmesh/http/demo/AsyncSyncRequestInstance.java (54%) rename {eventmesh-sdk-java/src/test/java/com/webank/eventmesh/client => eventmesh-test/src/main/java/org/apache/eventmesh}/http/demo/SyncRequestInstance.java (51%) rename eventmesh-runtime/src/test/java/protocol/CmdHelloTest.java => eventmesh-test/src/main/java/org/apache/eventmesh/http/demo/sub/SpringBootDemoApplication.java (58%) create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/http/demo/sub/controller/SubController.java create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/http/demo/sub/service/SubService.java rename eventmesh-sdk-java/src/main/java/com/webank/eventmesh/client/tcp/SimpleSubClient.java => eventmesh-test/src/main/java/org/apache/eventmesh/tcp/common/EventMeshTestCaseTopicSet.java (56%) create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/tcp/common/EventMeshTestUtils.java create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/tcp/demo/AsyncPublish.java create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/tcp/demo/AsyncPublishBroadcast.java create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/tcp/demo/AsyncSubscribe.java create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/tcp/demo/AsyncSubscribeBroadcast.java create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/tcp/demo/SyncRequest.java create mode 100644 eventmesh-test/src/main/java/org/apache/eventmesh/tcp/demo/SyncResponse.java rename eventmesh-test/src/main/java/{com/webank => org/apache}/eventmesh/util/Utils.java (74%) create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100644 package.json delete mode 100644 yarn.lock diff --git a/.asf.yaml b/.asf.yaml new file mode 100644 index 0000000000..24bcbcda98 --- /dev/null +++ b/.asf.yaml @@ -0,0 +1,45 @@ +# +# 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. +# + +github: + description: EventMesh is a dynamic cloud-native eventing infrastruture used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks. + homepage: https://eventmesh.apache.org/ + labels: + - event-mesh + - event-gateway + - event-driven + - event-streaming + - event-sourcing + - event-governance + - event-routing + - cloud-native + - serverless + - serverless-workflow + - esb + - message-bus + - cqrs + enabled_merge_buttons: + squash: true + merge: false + rebase: false + protected_branches: + master: + required_status_checks: + strict: true + required_pull_request_reviews: + dismiss_stale_reviews: true + required_approving_review_count: 2 diff --git a/.coveralls.yml b/.coveralls.yml deleted file mode 100644 index cf27a37024..0000000000 --- a/.coveralls.yml +++ /dev/null @@ -1 +0,0 @@ -service_name: travis-pro diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..381e4d77e6 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1 @@ +#TBD \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..1d0cbfc626 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,84 @@ +# +# 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. +# + +name: "Continuous Integration" + +on: + push: + branches: + - develop + pull_request: + branches: + - develop + workflow_dispatch: + +jobs: + build: + name: Build + + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + language: + - 'java' + java: + - 8 + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + languages: ${{ matrix.language }} + + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.java }} + + - name: Build + run: ./gradlew clean build jacocoTestReport + + - name: Perform CodeQL analysis + uses: github/codeql-action/analyze@v1 + + - name: Upload coverage report to codecov.io + run: bash <(curl -s https://codecov.io/bash) || echo 'Failed to upload coverage report!' + + license-check: + name: License Check + + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Check license header + uses: apache/skywalking-eyes@9bd5feb86b5817aa6072b008f9866a2c3bbc8587 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/gitee-mirror.yml b/.github/workflows/gitee-mirror.yml deleted file mode 100644 index 6582dfd5ac..0000000000 --- a/.github/workflows/gitee-mirror.yml +++ /dev/null @@ -1,60 +0,0 @@ -# 使用 GitHub Action 来解决手动同步到 Gitee 的问题 -# 效果:github repo 代码更新之后,会自动同步至 gitee -# 使用到的 GitHub Action:https://github.com/Yikun/hub-mirror-action - -# This is a basic workflow to help you get started with Actions - -name: Gitee Mirror - -# Controls when the action will run. Triggers the workflow on push or pull request -# events but only for the master branch -on: - push: - branches: - - '*' - -jobs: - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on - runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - - name: Mirror the Github organization repos to Gitee. - uses: Yikun/hub-mirror-action@master - with: - src: github/WeBankFinTech - dst: gitee/webank - # 这里请填写与gitee上公钥匹配的的 ssh private key,参见:https://gitee.com/profile/sshkeys - # 填写地址:https://github.com/WeBankFinTech/fes.js/settings/secrets - dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} - # 这里请填写 gitee的令牌,参见:https://gitee.com/profile/personal_access_tokens - # 填写地址:https://github.com/WeBankFinTech/fes.js/settings/secrets - dst_token: ${{ secrets.GITEE_TOKEN }} - # 项目同步白名单,可以选择填写多个,以英文逗号分割 - static_list: "EventMesh" - # 是否强制同步 - force_update: true - # 账号类型:对 luban-h5 而言是 user,因为是个人项目;如果是企业项目,请填写 org,因为是组织下的项目 - account_type: org - clone_style: ssh - - build-and-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout 🛎️ - uses: actions/checkout@v2 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly. - with: - persist-credentials: false - - - name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built. - run: | - yarn install - yarn run docs:build - - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@3.7.1 - with: - GITHUB_TOKEN: ${{ secrets.EVENTMESH }} - BRANCH: gh-pages - FOLDER: docs/.vuepress/dist # The folder the action should deploy. diff --git a/.github/workflows/greetings.yml b/.github/workflows/greetings.yml new file mode 100644 index 0000000000..8883906d2e --- /dev/null +++ b/.github/workflows/greetings.yml @@ -0,0 +1,72 @@ +# +# 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. +# + +name: Greetings + +on: [pull_request, issues] + +jobs: + greeting: + name: Greeting + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: | + Welcome to the Apache EventMesh (incubating) community!! + We are glad that you are contributing by opening this issue. :D + + Please make sure to include all the relevant context. + We will be here shortly. + + If you are interested in contributing to our project, please let us know! + You can check out our contributing guide on [contributing to EventMesh](https://github.com/apache/incubator-eventmesh/blob/develop/CONTRIBUTING.md). + + Want to get closer to the community? + + WeChat Group: + ![wechat_qr](https://github.com/apache/incubator-eventmesh/blob/develop/docs/images/mesh-helper.png?raw=true) + + Mailing Lists: + | Name | Description |Subscribe |Unsubscribe|Archive + | ---- | ---- |---- | ---- | ---- | + |Users |User support and questions mailing list| [Subscribe](mailto:users-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:users-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?users@eventmesh.apache.org)| + |Development |Development related discussions| [Subscribe](mailto:dev-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:dev-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?dev@eventmesh.apache.org)| + |Commits |All commits to repositories| [Subscribe](mailto:commits-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:commits-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?commits@eventmesh.apache.org)| + + pr-message: | + Welcome to the Apache EventMesh (incubating) community!! + This is your first PR in our project. We're very excited to have you onboard contributing. Your contributions are greatly appreciated! + + Please make sure that the changes are covered by tests. + We will be here shortly. + Let us know if you need any help! + + Want to get closer to the community? + + WeChat Group: + ![wechat_qr](https://github.com/apache/incubator-eventmesh/blob/develop/docs/images/mesh-helper.png?raw=true) + + Mailing Lists: + | Name | Description |Subscribe |Unsubscribe|Archive + | ---- | ---- |---- | ---- | ---- | + |Users |User support and questions mailing list| [Subscribe](mailto:users-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:users-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?users@eventmesh.apache.org)| + |Development |Development related discussions| [Subscribe](mailto:dev-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:dev-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?dev@eventmesh.apache.org)| + |Commits |All commits to repositories| [Subscribe](mailto:commits-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:commits-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?commits@eventmesh.apache.org)| diff --git a/.licenserc.yaml b/.licenserc.yaml new file mode 100644 index 0000000000..5046f8e188 --- /dev/null +++ b/.licenserc.yaml @@ -0,0 +1,41 @@ +# +# 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. +# + +header: + license: + spdx-id: Apache-2.0 + copyright-owner: Apache Software Foundation + + paths-ignore: + - '.github/PULL_REQUEST_TEMPLATE' + - '.gitmodules' + - '**/.gitkeep' + - '**/.gitignore' + - '**/*.md' + - '**/*.json' + - '**/*.ftl' + - '**/*.iml' + - '**/*.ini' + - '**/*.crt' + - '**/*.pem' + - 'LICENSE' + - 'NOTICE' + - 'DISCLAIMER-WIP' + + comment: on-failure diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 4c2ba8ba57..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -dist: trusty - -language: java -jdk: -- oraclejdk8 - -script: -- travis_retry gradle check - -after_success: -- gradle clean test jacocoAllTestReport coveralls - -env: - global: - - secure: "T1QAuaAzcB7K8YjAAVVb4P9+W0JAdOFbyBwRxliyyoSZUShlIqa0eE7ioXHXWBP/d5f3XtROse6lq2qILqcU9sFSncKE2vRJlwJ5p7R23WIsCXdV70A9AVE2gLJcIJiOTMwd/YYYzNDrGLp3CSJNcKo8t7t70V2j/11I9xPTOHnaZ8FHGC3d/7bjfR/+g/3d4EOCvV8Vm6ndEmmailmF8OJ/kcbuRbArKIehjUwNDyQZfwAc9+vvPZlHgnQvR1pJ/KiK6muEIi7RQohDq7lMTmcc2LZSYgy/+aqFrmBcQwXScABFmSwysQ4KMXfrCqqMsBdmvno/NoKVGofHHKdym/oauv/G3lxLx5sgM9A7ZSFBK08x08r7u/6TDsTFmQ9LzVFDNo/OLZhxs3dr9x2C9Pa2A7IP1i1oVbbYkwBJv4z6o3khWpQAAY/IWijlCZ9vkjFfqdIXbvlPqamEaFRAmK5I3MVqL2+eBF+2Or/zwv4rXjo+v5LUKTfmDl77QUshPv6J+hblbBR0cJ/ZTSh9rHgdqhEzPGSt3e0YrEefkKWfinBr8TjIsHgQgmfU8Kz7gf7tvioOuAgKj4WlgEQJs3dPp7J5zxFVNMM6teAMFy8c2MtAdzKrs13Ri1qZWtL6B7JWlH6yhHqhKghyJhRjUFNVZnBkA/z9gzDKZ+tz2m8=" \ No newline at end of file diff --git a/CNAME b/CNAME deleted file mode 100644 index 8feffb14d1..0000000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -www.eventmesher.com diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index de1080bc63..68c870c4b2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Contributing to EventMesh -Welcome to EventMesh! This document is a guideline about how to contribute to EventMesh. -If you find something incorrect or missing, please leave comments / suggestions. +Welcome to EventMesh! This document is a guideline about how to contribute to EventMesh. If you find something incorrect +or missing, please leave comments / suggestions. ## Before you get started @@ -11,11 +11,11 @@ You should have JDK installed in your operating system. ## Contributing -We are always very happy to have contributions, whether for typo fix, bug fix or big new features. -Please do not ever hesitate to ask a question or send a pull request. +We are always very happy to have contributions, whether for typo fix, bug fix or big new features. Please do not ever +hesitate to ask a question or send a pull request. -We strongly value documentation and integration with other projects. -We are very glad to accept improvements for these aspects. +We strongly value documentation and integration with other projects. We are very glad to accept improvements for these +aspects. ### GitHub workflow @@ -31,29 +31,29 @@ Here are the workflow for contributors: 6. Push your commits to your forked repository 7. Create a pull request -Please follow [the pull request template](./.github/PULL_REQUEST_TEMPLATE.md). -Please make sure the PR has a corresponding issue. [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) +Please follow [the pull request template](./.github/PULL_REQUEST_TEMPLATE.md). Please make sure the PR has a +corresponding issue. [GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) -After creating a PR, one or more reviewers will be assigned to the pull request. -The reviewers will review the code. +After creating a PR, one or more reviewers will be assigned to the pull request. The reviewers will review the code. -Before merging a PR, squash any fix review feedback, typo, merged, and rebased sorts of commits. -The final commit message should be clear and concise. +Before merging a PR, squash any fix review feedback, typo, merged, and rebased sorts of commits. The final commit +message should be clear and concise. ### Open an issue / PR -We use [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) and [Pull Requests](https://github.com/WeBankFinTech/EventMesh/pulls) for trackers. +We use [GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) +and [Pull Requests](https://github.com/apache/incubator-eventmesh/pulls) for trackers. -If you find a typo in a document, find a bug in code, or want new features, or want to give suggestions, -you can [open an issue on GitHub](https://github.com/WeBankFinTech/EventMesh/issues/new) to report it. -Please follow the guideline message in the issue template. +If you find a typo in a document, find a bug in code, or want new features, or want to give suggestions, you +can [open an issue on GitHub](https://github.com/apache/incubator-eventmesh/issues/new) to report it. Please follow the +guideline message in the issue template. -If you want to contribute, please follow the [contribution workflow](#github-workflow) and create a new pull request. -If your PR contains large changes, e.g. component refactor or new components, please write detailed documents -about its design and usage. +If you want to contribute, please follow the [contribution workflow](#github-workflow) and create a new pull request. If +your PR contains large changes, e.g. component refactor or new components, please write detailed documents about its +design and usage. -Note that a single pull request should not be too large. If heavy changes are required, it's better to separate the changes -to a few individual PRs. +Note that a single pull request should not be too large. If heavy changes are required, it's better to separate the +changes to a few individual PRs. ### Code review diff --git a/CONTRIBUTING.zh-CN.md b/CONTRIBUTING.zh-CN.md index 8c63718e65..742ccbdc32 100644 --- a/CONTRIBUTING.zh-CN.md +++ b/CONTRIBUTING.zh-CN.md @@ -1,7 +1,6 @@ # 贡献给EventMesh -欢迎使用EventMesh! 本文档是有关如何为EventMesh做出贡献的指南。 -如果发现不正确或缺失的内容,请留下评论/建议。 +欢迎使用EventMesh! 本文档是有关如何为EventMesh做出贡献的指南。 如果发现不正确或缺失的内容,请留下评论/建议。 ## 开始之前 @@ -11,11 +10,9 @@ ## 贡献 -无论是对于拼写错误,BUG修复还是重要的新功能,我们总是很乐意为您做出贡献。 -请不要犹豫,提出问题或发送请求请求。 +无论是对于拼写错误,BUG修复还是重要的新功能,我们总是很乐意为您做出贡献。 请不要犹豫,提出问题或发送请求请求。 -我们非常重视文档以及与其他项目的集成。 -我们很高兴接受这些方面的改进。 +我们非常重视文档以及与其他项目的集成。 我们很高兴接受这些方面的改进。 ### GitHub工作流程 @@ -23,39 +20,33 @@ 这是贡献者的工作流程 : -1. Fork到您个人仓库 -2. 克隆到本地存储库 -3. 创建一个新分支并对其进行处理 -4. 保持分支同步 +1. Fork到您个人仓库 +2. 克隆到本地存储库 +3. 创建一个新分支并对其进行处理 +4. 保持分支同步 5. 提交您的更改(确保您的提交消息简明扼要) 6. 将您的提交推送到分叉的存储库 7. 创建PR合并请求 请遵循[Pull Requests模板](./.github/PULL_REQUEST_TEMPLATE.md). -请确保PR对应有相应的问题. [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) +请确保PR对应有相应的问题. [GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) -创建PR后,将为拉取请求分配一个或多个审阅者。 -审阅者将审阅代码。 +创建PR后,将为拉取请求分配一个或多个审阅者。 审阅者将审阅代码。 -在合并PR之前,请压缩所有修订审阅反馈,拼写错误,合并的内容和基于基础的提交内容。 -最终的提交消息应该清晰简洁。 +在合并PR之前,请压缩所有修订审阅反馈,拼写错误,合并的内容和基于基础的提交内容。 最终的提交消息应该清晰简洁。 ### 打开问题/ PR -我们将使用Issues和Pull Requests作为跟踪器 -[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) -[Pull Requests](https://github.com/WeBankFinTech/EventMesh/pulls) +我们将使用Issues和Pull Requests作为跟踪器 +[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) +[Pull Requests](https://github.com/apache/incubator-eventmesh/pulls) -如果您在文档中发现拼写错误,在代码中发现错误,想要新功能或提出建议, -您可以提出问题[在GitHub上打开问题](https://github.com/WeBankFinTech/EventMesh/issues/new) +如果您在文档中发现拼写错误,在代码中发现错误,想要新功能或提出建议, 您可以提出问题[在GitHub上打开问题](https://github.com/apache/incubator-eventmesh/issues/new) 请按照问题模板中的准则消息进行操作。 -如果您想贡献,请遵循[贡献工作流程](#github-workflow)并创建一个新的拉取请求。 -如果您的PR包含较大的更改,例如组件重构或新组件,请写详细文档 -有关其设计和使用的信息。 +如果您想贡献,请遵循[贡献工作流程](#github-workflow)并创建一个新的拉取请求。 如果您的PR包含较大的更改,例如组件重构或新组件,请写详细文档 有关其设计和使用的信息。 -请注意,单个拉取请求不应太大。如果需要进行重大更改,最好将更改分开 -到一些个人PR。 +请注意,单个拉取请求不应太大。如果需要进行重大更改,最好将更改分开 到一些个人PR。 ### 代码审查 diff --git a/DISCLAIMER-WIP b/DISCLAIMER-WIP new file mode 100644 index 0000000000..e72dd1b9d0 --- /dev/null +++ b/DISCLAIMER-WIP @@ -0,0 +1,19 @@ +Apache EventMesh is an effort undergoing incubation at The Apache Software Foundation (ASF), +sponsored by the Apache Incubator PMC. + +Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, +communications, and decision-making process have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or stability of the code, +it does indicate that the project has yet to be fully endorsed by the ASF. + +Some of the incubating project’s releases may not be fully compliant with ASF policy. +For example, releases may have incomplete or un-reviewed licensing conditions. +What follows is a list of issues the project is currently aware of (this list is likely to be incomplete): + +1- Releases may have incomplete licensing conditions + + +If you are planning to incorporate this work into your product/project, +please be aware that you will need to conduct a thorough licensing review to determine the overall implications of including this work. +For the current status of this project through the Apache Incubator, visit: https://incubator.apache.org/projects/eventmesh.html diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000000..19d0bec195 --- /dev/null +++ b/NOTICE @@ -0,0 +1,5 @@ +Apache EventMesh (incubating) +Copyright 2021 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). diff --git a/README.md b/README.md index ee0d26be5d..43cfc861ab 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,18 @@ -[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh) -[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master) -[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases) +# Apache EventMesh (incubating) +[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml) +[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh) +[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java) +[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/) +[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [点我查看中文版](README.zh-CN.md) +![logo](docs/images/logo2.png) ## What is EventMesh? -EventMesh is a dynamic cloud-native eventing infrastruture used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks. +EventMesh(incubating) is a dynamic cloud-native eventing infrastruture used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks. + +![architecture1](docs/images/eventmesh-multi-runtime.png) **EventMesh Ecosystem:** @@ -20,15 +26,6 @@ EventMesh is a dynamic cloud-native eventing infrastruture used to decouple the ![architecture2](docs/images/eventmesh-panels.png) -The EventMesh allows events from one application to be dynamically routed to any other application. -General functions of the eventmesh: - -* Event driven; -* Event governance; -* Dynamic routing; -* Cloud native; -* Flow control; -* Load balance **Support connecting event store:** @@ -37,12 +34,13 @@ General functions of the eventmesh: **Components:** * **eventmesh-runtime** : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices. -* **eventmesh-sdk-java** : currently supports HTTP and TCP protocols, and will support gRPC in the future. -* **eventmesh-connector-rocketmq** : an implementation based on OpenMessaging Connector Interface, pub event to or sub event from RocketMQ Event Store. +* **eventmesh-sdk-java** : currently supports HTTP and TCP protocols. +* **eventmesh-connector-api** : an api layer based on OpenMessaging api and SPI pluggin, which can be implemented by popular EventStores such as IMDG, Messaging Engine and OSS etc. +* **eventmesh-connector-rocketmq** : an implementation of eventmesh-connector-api, pub event to or sub event from RocketMQ as EventStore. **Protocol:** -The protocol of eventmesh is easier and convenient, you can read more [here](docs/en/instructions/eventmesh-runtime-protocol.md) +The protocol of eventmesh is easier and more convenient, you can read more [here](docs/en/instructions/eventmesh-runtime-protocol.md) ## RoadMap | version | feature | @@ -50,34 +48,31 @@ The protocol of eventmesh is easier and convenient, you can read more [here](doc | v1.0.0 |Support java-sdk , tcp pub/sub, http pub| | v1.1.0 |Support RocketMQ as eventstore| | v1.1.1 |Support https| -| v1.2.0 |Support OpenMessaging API,support Plug-in architecture, support http sub, support cloud native deploy| -| V1.3.0 |Support CloudEvents protocol,support OpenMessaging Connector| +| v1.2.0 |Support EventMesh store layer pluggable by OpenMessaging Pub/Sub API, http sub, docker| +| V1.3.0 |Support CloudEvents, Event Streaming| +| |Support Event function,triggers and bindings| +| |Support Event orchestration, Servelss workflow| | |Support Event transaction| -| |Support Event filter| -| |Support Promethus as metrics| +| |Support Event schema| +| |Support Event governance, dashboard| +| |Support Event security| | |Support multi language SDK(c\go\python\wasm)| -| |Support Event orchestration| -| |Support Event governance| +| |Support Promethus as metrics| | |Support Skywalking as tracing| -| |Support Spiffe as security| -| |Support Event replay| -| |Support openmessaging-storage-dledger as default event store| -| |Support Dashboard| -| |Support schema registry| -| |Support gRPC protocol| -| |Support MQTT protocol| -| |Support routing functions with triggers and bindings| +| |Support streaming event store| +| |Support gRPC protocol| +| |Support MQTT protocol| ## Quick Start -1. Build and deploy event-store(RocketMQ), see [instruction](https://rocketmq.apache.org/docs/quick-start/). +1. Build and deploy event-store(default RocketMQ), see [instruction](https://rocketmq.apache.org/docs/quick-start/). 2. Build and deploy eventmesh-runtime, see instruction ['eventmesh-runtime quickstart'](docs/en/instructions/eventmesh-runtime-quickstart.md). -3. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](docs/en/instructions/eventmesh-sdk-java-quickstart.md). +3. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](docs/en/instructions/eventmesh-sdk-java-quickstart.md). ## Contributing Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines. -You can start with the issues labeled with good first issue. -[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) +You can start with the issues labeled with good first issue. +[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) ## License [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation. @@ -88,6 +83,7 @@ WeChat group: ![wechat_qr](docs/images/mesh-helper.png) Mailing Lists: + | Name | Description |Subscribe |Unsubscribe|Archive | ---- | ---- |---- | ---- | ---- | |Users |User support and questions mailing list| [Subscribe](mailto:users-subscribe@eventmesh.incubator.apache.org) |[Unsubscribe](mailto:users-unsubscribe@eventmesh.incubator.apache.org) |[Mail Archives](https://lists.apache.org/list.html?users@eventmesh.apache.org)| diff --git a/README.zh-CN.md b/README.zh-CN.md index 6604ae83fa..8dadfaa24a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,10 +1,18 @@ -[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh) -[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master) -[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases) +# Apache EventMesh (incubating) +[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml) +[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh) +[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java) +[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/) +[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) +![logo](docs/images/logo2.png) ## 什么是Event Mesh? EventMesh是一个动态的云原生事件驱动架构基础设施,用于分离应用程序和后端中间件层,它支持广泛的用例,包括复杂的混合云、使用了不同技术栈的分布式架构。 + +![architecture1](docs/images/eventmesh-multi-runtime.png) + +**EventMesh生态:** ![architecture1](docs/images/eventmesh-define.png) **EventMesh架构:** @@ -15,15 +23,6 @@ EventMesh是一个动态的云原生事件驱动架构基础设施,用于分 ![architecture2](docs/images/eventmesh-panels.png) -Event Mesh允许将来自一个应用程序的事件动态路由到任何其他应用程序. -Event Mesh的一般功能: -* 事件驱动; -* 事件治理; -* 动态路由; -* 云原生; -* 流控; -* 负载均衡 - **支持连接的事件存储:** * [RocketMQ](https://github.com/apache/rocketmq):RocketMQ是一个分布式消息流平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可伸缩性。 @@ -32,35 +31,33 @@ Event Mesh的一般功能: * **eventmesh-runtime**:一种中间件,用于在事件产生者和使用者之间传输事件,支持云原生应用程序和微服务 * **eventmesh-sdk-java**:当前支持HTTP和TCP协议,未来会支持gRPC等 -* **eventmesh-connector-rocketmq** : 一种基于OpenMessagingConnector 接口的实现,该实现支持将RocketMQ作为事件存储,实现事件的发布与订阅 +* **eventmesh-connector-api**:一个基于OpenMessaging api和SPI插件机制的接口层,可以有很多不同的事件存储的实现,比如IMDG,Messaging Engine和OSS等 +* **eventmesh-connector-rocketmq** : 一种基于eventmesh-connector-api的实现,该实现支持将RocketMQ作为事件存储,实现事件的发布与订阅 **通信协议:** eventmesh的通信协议更加简洁方便,详细内容,阅读更多[这里](docs/cn/instructions/eventmesh-runtime-protocol.zh-CN.md) ## RoadMap -| version | feature | -| ------- | ------------------------------------------------------------ | -| v1.0.0 | Support java-sdk , tcp pub/sub, http pub | -| v1.1.0 | Support RocketMQ as eventstore | -| v1.1.1 | Support https | -| v1.2.0 | Support Plug-in architecture, support http sub, support cloud native deploy | -| V1.3.0 | Support CloudEvents protocol | -| | Support Event transaction | -| | Support Event filter | -| | Support Promethus as metrics | -| | Support multi language SDK(c\go\python\wasm) | -| | Support Event orchestration | -| | Support Event governance | -| | Support Skywalking as tracing | -| | Support Spiffe as security | -| | Support Event replay | -| | Support openmessaging-storage-dledger as default event store | -| | Support Dashboard | -| | Support schema registry | -| | Support gRPC protocol | -| | Support MQTT protocol | -| | Support routing functions with triggers and bindings | +| version | feature | +| ---- | ---- | +| v1.0.0 |Support java-sdk , tcp pub/sub, http pub| +| v1.1.0 |Support RocketMQ as eventstore| +| v1.1.1 |Support https| +| v1.2.0 |Support EventMesh store layer pluggable by OpenMessaging Pub/Sub API, http sub, docker| +| V1.3.0 |Support CloudEvents, Event Streaming| +| |Support Event function,triggers and bindings| +| |Support Event orchestration, Servelss workflow| +| |Support Event transaction| +| |Support Event schema| +| |Support Event governance, dashboard| +| |Support Event security| +| |Support multi language SDK(c\go\python\wasm)| +| |Support Promethus as metrics| +| |Support Skywalking as tracing| +| |Support streaming event store| +| |Support gRPC protocol| +| |Support MQTT protocol| ## 快速开始 1. 构建并部署event-store(RocketMQ), 请参见[说明](https://rocketmq.apache.org/docs/quick-start/) @@ -70,13 +67,21 @@ eventmesh的通信协议更加简洁方便,详细内容,阅读更多[这里] ## 贡献 永远欢迎参与共建, 请参阅[贡献](CONTRIBUTING.zh-CN.md)了解详细指南 -您可以从问题开始. -[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) +您可以从问题开始. +[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) ## License [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation -## 联系人 +## 开发社区 微信群: ![wechat_qr](docs/images/mesh-helper.png) + +Mailing Lists: + +| 列表名称 | 描述 |订阅 |取消订阅|邮件列表存档 +| ---- | ---- |---- | ---- | ---- | +|Users |用户支持与用户问题| [点击订阅](mailto:users-subscribe@eventmesh.incubator.apache.org) |[点击取消订阅](mailto:users-unsubscribe@eventmesh.incubator.apache.org) |[邮件列表存档](https://lists.apache.org/list.html?users@eventmesh.apache.org)| +|Development |开发相关| [点击订阅](mailto:dev-subscribe@eventmesh.incubator.apache.org) |[点击取消订阅](mailto:dev-unsubscribe@eventmesh.incubator.apache.org) |[邮件列表存档](https://lists.apache.org/list.html?dev@eventmesh.apache.org)| +|Commits |所有与仓库相关的commits信息通知| [点击订阅](mailto:commits-subscribe@eventmesh.incubator.apache.org) |[点击取消订阅](mailto:commits-unsubscribe@eventmesh.incubator.apache.org) |[邮件列表存档](https://lists.apache.org/list.html?commits@eventmesh.apache.org)| diff --git a/_config.yml b/_config.yml deleted file mode 100644 index c4192631f2..0000000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman \ No newline at end of file diff --git a/build.gradle b/build.gradle index e61c234703..12a2b005e9 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,8 @@ import java.util.concurrent.TimeUnit +//import com.github.spotbugs.snom.SpotBugsTask + buildscript { repositories { maven { @@ -26,20 +28,39 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } - } dependencies { - //classpath("net.sourceforge.pmd:pmd-java:5.4.1") - //classpath("com.puppycrawl.tools:checkstyle:6.16.1") - classpath("gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.0.7") - classpath('com.github.spotbugs:spotbugs:4.0.0') + classpath "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.1" } } allprojects { apply plugin: 'java' + apply plugin: "eclipse" + apply plugin: "idea" + apply plugin: "project-reports" + apply plugin: "maven-publish" + apply plugin: "com.github.spotbugs" + apply plugin: "project-reports" + apply plugin: "jacoco" + apply plugin: "pmd" + apply plugin: "java-library" + apply plugin: 'signing' + +// print(project) +// if (project.findProperty("jdk") == "1.7") { +// sourceCompatibility = 1.7 +// targetCompatibility = 1.7 +// version = version + "-jdk7" +// } else { +// sourceCompatibility = 1.8 +// targetCompatibility = 1.8 +// version = version + "-jdk8" +// } + [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' + compileJava.options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" clean.doFirst { delete 'build' @@ -47,26 +68,26 @@ allprojects { delete 'out' } - if (project.findProperty("snapshot") instanceof String) { - if (project.property("snapshot").toBoolean()) - version = version + "-SNAPSHOT" + if ((project.findProperty("snapshot") instanceof String) && (Boolean.valueOf(project.property("snapshot")))) { + version = version + "-SNAPSHOT" } } task tar(type: Tar) { extension = 'tar.gz' compression = Compression.GZIP - archiveName = project.name + '_' + project.version + '.' + extension - destinationDir = new File(projectDir, 'build') + archiveFileName = project.name + '_' + project.version + '.' + extension + destinationDirectory = new File(projectDir, 'build') into('/') { from 'dist' } } + task zip(type: Zip) { extension = 'zip' - archiveName = project.name + '.' + project.version + '.' + extension - destinationDir = new File(projectDir, 'build') + archiveFileName = project.name + '.' + project.version + '.' + extension + destinationDirectory = new File(projectDir, 'build') into('/') { from 'dist' } @@ -74,33 +95,95 @@ task zip(type: Zip) { subprojects { + List fastjson = [ + "com.alibaba:fastjson:1.2.71" + ] - apply plugin: "maven" - apply plugin: "eclipse" - apply plugin: "idea" - apply plugin: "project-reports" - apply plugin: "jacoco" -// apply plugin: "checkstyle" - apply plugin: "pmd" - apply plugin: 'com.github.spotbugs' + List jackson = [ + 'com.fasterxml.jackson.core:jackson-databind:2.11.0', + 'com.fasterxml.jackson.core:jackson-core:2.11.0', + 'com.fasterxml.jackson.core:jackson-annotations:2.11.0' + ] - [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' + List apache_commons = [ + "org.apache.commons:commons-lang3:3.6", + "org.apache.commons:commons-collections4:4.1" + ] - compileJava.options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + List httpclient = [ + "org.apache.httpcomponents:httpclient:4.5.2" + ] + + List guava = [ + "com.google.guava:guava:29.0-jre" + ] + + List netty = [ + "io.netty:netty-all:4.1.49.Final" + ] + + List junit = [ + "junit:junit:4.12" + ] + + List log = [ + "org.slf4j:slf4j-api:1.7.30" + ] + + List log4j2 = [ + "org.apache.logging.log4j:log4j-api:2.13.3", + "org.apache.logging.log4j:log4j-core:2.13.3", + "org.apache.logging.log4j:log4j-slf4j-impl:2.13.3", + "org.apache.logging.log4j:log4j-web:2.13.3", + "com.lmax:disruptor:3.4.2" + ] + + List common = [ + "commons-io:commons-io:2.4", + "org.apache.commons:commons-text:1.9" + ] + + List assertj = [ + "org.assertj:assertj-core:2.6.0" + ] + + List mock = [ + "org.mockito:mockito-core:2.23.0", + "org.powermock:powermock-module-junit4:2.0.2", + "org.powermock:powermock-api-mockito2:2.0.2", + ] + + dependencies { + implementation apache_commons, guava, log, log4j2, fastjson, jackson, common, httpclient, netty + testImplementation apache_commons, guava, log, log4j2, fastjson, jackson, common, junit, assertj, mock, httpclient, netty + spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.11.0' + spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.7' + } + + sourceSets { + main { + java.srcDirs = ['src/main/java'] + } + + test { + java.srcDirs = ['src/test/java'] + } + } + + clean.doFirst { + delete 'build' + delete 'dist' + } jacoco { - toolVersion = "0.8.5" - reportsDir = file("$buildDir/reports/jacoco") + toolVersion = "0.8.6" } jacocoTestReport { -// sourceSets sourceSets.main -// executionData files("$buildDir/jacoco/jacocoTest.exec") - reports { - xml.enabled false + xml.enabled true csv.enabled false - html.destination file("${buildDir}/reports/jacoco") + html.enabled false } } @@ -117,100 +200,92 @@ subprojects { // xml.enabled false // html.enabled true // } +// } +// +// sourceSets { +// main { +// java { +// srcDir 'src/main/java' +// } +// +// resources { +// srcDir 'src/main/resources' +// } +// +// } +// +// test { +// java { +// srcDir 'src/test/java' +// } +// +// resources { +// srcDir 'src/test/resources' +// } +// +// } // } spotbugs { - toolVersion = '4.0.2' + //toolVersion = '4.2.3' ignoreFailures = true - effort = "default" - reportLevel = "default" showProgress = true + showStackTraces = true + //reportLevel = 'default' + effort = 'default' + //visitors = [ 'FindSqlInjection', 'SwitchFallthrough' ] + //omitVisitors = [ 'FindNonShortCircuit' ] + reportsDir = file("$buildDir/reports/spotbugs") + //includeFilter = file('spotbugs-include.xml') + //excludeFilter = file('spotbugs-exclude.xml') + //onlyAnalyze = ['org/apache/eventmesh/**'] + projectName = rootProject.name + release = version + extraArgs = ['-nested:false'] + //jvmArgs = [ '-Duser.language=zh' ] + maxHeapSize = '256m' + } -// tasks.withType(com.github.spotbugs.SpotBugsTask) { -// sourceDirs = [sourceSets.main] -// reports { -// xml.enabled = false -// html.enabled = true -// } -// } spotbugsMain { + reports { xml.enabled = false - html.enabled = true + html { + enabled = true + destination = file("$buildDir/reports/spotbugs/main/spotbugs.html") + stylesheet = 'fancy-hist.xsl' + } } } spotbugsTest { reports { xml.enabled = false - html.enabled = true + html { + enabled = true + destination = file("$buildDir/reports/spotbugs/test/spotbugs.html") + stylesheet = 'fancy-hist.xsl' + } } } - tasks.withType(Pmd) { - reports { - xml.enabled = false - html.enabled = true - } - } +// tasks.withType(Pmd) { +// reports { +// xml.enabled = false +// html.enabled = true +// } +// } pmd { consoleOutput = true toolVersion = "6.23.0" - rulePriority = 5 + rulesMinimumPriority = 5 ruleSets = ["category/java/errorprone.xml", "category/java/bestpractices.xml"] ignoreFailures = true } - - - List junit = [ - "junit:junit:4.12" - ] - - List apache_commons = [ - "org.apache.commons:commons-collections4:4.1", - "commons-beanutils:commons-beanutils:1.9.3", - "org.apache.commons:commons-lang3:3.6", - "commons-codec:commons-codec:1.10" - - ] - - List log = [ - "org.slf4j:slf4j-api:1.7.30" - ] - - List guava = [ - "com.google.guava:guava:29.0-jre" - ] - - List fastjson = [ - "com.alibaba:fastjson:1.2.71" - ] - - List common_io = [ - "commons-io:commons-io:2.4" - ] - - List assertj = [ - "org.assertj:assertj-core:2.6.0" - ] - - List mock = [ -// "org.mockito:mockito-core:1.10.19", -"org.mockito:mockito-core:2.23.0", -"org.powermock:powermock-module-junit4:2.0.2", -"org.powermock:powermock-api-mockito2:2.0.2", - ] - - dependencies { - compile apache_commons, guava, log, fastjson, common_io - testCompile apache_commons, guava, log, fastjson, common_io, junit, assertj, mock - runtime apache_commons, guava, log, fastjson, common_io - } - jar { manifest { attributes("Specification-Version": project.version, @@ -244,7 +319,7 @@ subprojects { } copy { into '../dist/lib' - from project.configurations.runtime + from project.configurations.runtimeClasspath exclude '**/*.properties*' exclude '**/*testng*.jar' exclude '**/*powermock*.jar' @@ -274,7 +349,7 @@ subprojects { javadoc { source = sourceSets.main.java - classpath = configurations.compile + //classpath = configurations.implementation destinationDir = reporting.file("javadoc") } @@ -294,15 +369,82 @@ subprojects { archives packageSources } + if (!Boolean.valueOf(signEnabled)) { + tasks.whenTaskAdded {task -> + if(task.name.contains("sign")) { + task.enabled = false + } + } + } + repositories { maven { url "https://maven.aliyun.com/repository/public" } mavenCentral() + mavenLocal() } + configurations.all { resolutionStrategy.cacheChangingModulesFor 0, TimeUnit.SECONDS resolutionStrategy.cacheDynamicVersionsFor 0, TimeUnit.SECONDS } + publishing { + publications { + mavenJava(MavenPublication) { + from components.java + artifact packageSources + artifact packageJavadoc + versionMapping { + usage('java-api') { + fromResolutionOf('runtimeClasspath') + } + usage('java-runtime') { + fromResolutionResult() + } + } + pom { + name = 'EventMesh' + description = 'Apache EventMesh' + url = 'https://github.com/apache/incubator-eventmesh' + licenses { + license { + name = 'The Apache License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' + } + } + developers { + developer { + id = 'Apache EventMesh(incubating)' + name = 'Apache EventMesh(incubating) of ASF' + url = 'https://eventmesh.apache.org/' + } + } + scm { + connection = 'scm:git:git@github.com:apache/incubator-eventmesh.git' + developerConnection = 'scm:git:git@github.com:apache/incubator-eventmesh.git' + url = 'https://github.com/apache/incubator-eventmesh' + } + } + } + } + repositories { + maven { + def releasesRepoUrl = 'https://repository.apache.org/content/repositories/releases/' + def snapshotsRepoUrl = 'https://repository.apache.org/content/repositories/snapshots/' + url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl + credentials { + username apacheUserName + password apachePassWord + } + + } + } + } + + signing { + sign publishing.publications.mavenJava + } + } diff --git a/docker/centos7-jdk8/Dockerfile b/docker/centos7-jdk8/Dockerfile index 546d3247fc..7d968413d5 100644 --- a/docker/centos7-jdk8/Dockerfile +++ b/docker/centos7-jdk8/Dockerfile @@ -1,3 +1,22 @@ +# +# 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. +# + FROM docker.io/centos:7 MAINTAINER mikexue diff --git a/docker/eventmesh-rocketmq/Dockerfile b/docker/eventmesh-rocketmq/Dockerfile index 326cee133d..5b61cc4f5d 100644 --- a/docker/eventmesh-rocketmq/Dockerfile +++ b/docker/eventmesh-rocketmq/Dockerfile @@ -1,3 +1,22 @@ +# +# 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. +# + FROM centos7-jdk8:latest MAINTAINER mikexue mike_xwm@126.com diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 76c3bc6a09..870c593b08 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -1,74 +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. + */ + module.exports = { - title: 'EventMesh', - description: 'EventMesh', - head: [ - ['link', { rel: 'icon', href: '/logo.png' }] - ], - locales: { - '/': { - lang: 'English', - title: 'EventMesh', - description: '' - }, - '/cn/': { - lang: '中文', - title: 'EventMesh', - description: '' - }, - }, - themeConfig: { + title: 'EventMesh', + description: 'EventMesh', + head: [ + ['link', {rel: 'icon', href: '/logo.png'}] + ], locales: { - '/': { - selectText: 'Languages', - label: 'English', - ariaLabel: 'Languages', - nav: [ - { text: 'Community', link: '/en/community/' }, - { - text: 'Blog', - link: '/en/blog/' - }, - { - text: 'Documentation', link: '/en/documentation/' - }, - { text: 'Github', link: 'https://github.com/WeBankFinTech/EventMesh'}, - ], - }, - '/en/': { - selectText: 'Languages', - label: 'English', - ariaLabel: 'Languages', - nav: [ - { text: 'Community', link: '/en/community/' }, - { - text: 'Blog', - link: '/en/blog/' - }, - { - text: 'Documentation', link: '/en/documentation/' - }, - { text: 'Github', link: 'https://github.com/WeBankFinTech/EventMesh'}, - ], - }, - '/cn/': { - // 多语言下拉菜单的标题 - selectText: '选择语言', - // 该语言在下拉菜单中的标签 - label: '简体中文', - nav: [ - { text: '社区', link: '/cn/community/' }, - { - text: '博客', - link: '/cn/blog/' - }, - { - text: '文档', link: '/en/documentation/' - }, - { text: 'Github', link: 'https://github.com/WeBankFinTech/EventMesh'}, - ], - } + '/': { + lang: 'English', + title: 'EventMesh', + description: '' + }, + '/cn/': { + lang: '中文', + title: 'EventMesh', + description: '' + }, }, - - sidebar: true - } + themeConfig: { + locales: { + '/': { + selectText: 'Languages', + label: 'English', + ariaLabel: 'Languages', + nav: [ + {text: 'Community', link: '/en/community/'}, + { + text: 'Blog', + link: '/en/blog/' + }, + { + text: 'Documentation', link: '/en/documentation/' + }, + {text: 'Github', link: 'https://github.com/WeBankFinTech/EventMesh'}, + ], + }, + '/en/': { + selectText: 'Languages', + label: 'English', + ariaLabel: 'Languages', + nav: [ + {text: 'Community', link: '/en/community/'}, + { + text: 'Blog', + link: '/en/blog/' + }, + { + text: 'Documentation', link: '/en/documentation/' + }, + {text: 'Github', link: 'https://github.com/WeBankFinTech/EventMesh'}, + ], + }, + '/cn/': { + // 多语言下拉菜单的标题 + selectText: '选择语言', + // 该语言在下拉菜单中的标签 + label: '简体中文', + nav: [ + {text: '社区', link: '/cn/community/'}, + { + text: '博客', + link: '/cn/blog/' + }, + { + text: '文档', link: '/en/documentation/' + }, + {text: 'Github', link: 'https://github.com/WeBankFinTech/EventMesh'}, + ], + } + }, + + sidebar: true + } } diff --git a/docs/README.md b/docs/README.md index 7dec671ded..5909122319 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,12 +1,18 @@ -[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh) -[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master) -[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases) +# Apache EventMesh (Incubating) +[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml) +[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh) +[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java) +[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/) +[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [点我查看中文版](cn/README.md) ## What is Event Mesh? -EventMesh is a dynamic cloud-native eventing infrastruture used to decouple the application and backend middleware layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using diverse technology stacks. + +EventMesh is a dynamic cloud-native eventing infrastruture used to decouple the application and backend middleware +layer, which supports a wide range of use cases that encompass complex multi-cloud, widely distributed topologies using +diverse technology stacks. ![architecture1](images/eventmesh-define.png) **EventMesh Architecture:** @@ -17,21 +23,27 @@ EventMesh is a dynamic cloud-native eventing infrastruture used to decouple the ![architecture2](images/eventmesh-panels.png) -The event mesh allows events from one application to be dynamically routed to any other application. -General functions of the event mesh: +The event mesh allows events from one application to be dynamically routed to any other application. General functions +of the event mesh: + * Event driven; * Event governance; * Dynamic routing; * Cloud native Dependent components: -* [RocketMQ](https://github.com/apache/rocketmq):RocketMQ is a distributed messaging and streaming platform with low latency, high performance and reliability, trillion-level capacity and flexible scalability. + +* [RocketMQ](https://github.com/apache/rocketmq):RocketMQ is a distributed messaging and streaming platform with low + latency, high performance and reliability, trillion-level capacity and flexible scalability. Key components: -* eventmesh-runtime : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices + +* eventmesh-runtime : an middleware to transmit events between event producers and consumers, support cloud native apps + and microservices * eventmesh-sdk-java : currently supports HTTP and TCP protocols, and will support gRPC in the future ## RoadMap + | version | feature | | ---- | ---- | | v1.0.0 |Support pub/sub, http api, java-sdk| @@ -51,20 +63,26 @@ Key components: | |Support c/go/python/NodeJs/wasm SDK| ## Quick Start + 1. Build and deploy event-store(RocketMQ), see [instruction](https://rocketmq.apache.org/docs/quick-start/). -2. Build and deploy eventmesh-runtime, see instruction ['eventmesh-runtime quickstart'](instructions/eventmesh-runtime-quickstart.md). -3. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.md). +2. Build and deploy eventmesh-runtime, see + instruction ['eventmesh-runtime quickstart'](en/instructions/eventmesh-runtime-quickstart.md). +3. Run eventmesh-sdk-java demo, see + instruction ['eventmesh-sdk-java quickstart'](en/instructions/eventmesh-sdk-java-quickstart.md). ## Contributing -Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines -You can start with the issues labeled with good first issue. +Contributions are always welcomed! Please see [CONTRIBUTING](../CONTRIBUTING.md) for detailed guidelines + +You can start with the issues labeled with good first issue. [GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) ## License + [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation ## Contacts + WeChat group: ![wechat_qr](images/mesh-helper.png) diff --git a/docs/_config.yml b/docs/_config.yml index c4192631f2..3ef20c109c 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1,20 @@ -theme: jekyll-theme-cayman \ No newline at end of file +# +# 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. +# + +theme: jekyll-theme-cayman diff --git a/docs/cn/README.md b/docs/cn/README.md index 276999882c..3aae2a3726 100644 --- a/docs/cn/README.md +++ b/docs/cn/README.md @@ -1,9 +1,13 @@ -[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh) -[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master) -[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases) +# Apache EventMesh (Incubating) +[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml) +[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh) +[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java) +[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/) +[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) ## 什么是Event Mesh? + EventMesh是一个动态的云原生事件驱动架构基础设施,用于分离应用程序和后端中间件层,它支持广泛的用例,包括复杂的混合云、使用了不同技术栈的分布式架构。 ![architecture1](../images/eventmesh-define.png) @@ -16,8 +20,7 @@ EventMesh是一个动态的云原生事件驱动架构基础设施,用于分 ![architecture2](../images/eventmesh-panels.png) -Event Mesh允许将来自一个应用程序的事件动态路由到任何其他应用程序. -Event Mesh的一般功能: +Event Mesh允许将来自一个应用程序的事件动态路由到任何其他应用程序. Event Mesh的一般功能: * 事件驱动; * 事件治理; @@ -25,13 +28,16 @@ Event Mesh的一般功能: * 云原生 依赖部件: + * [RocketMQ](https://github.com/apache/rocketmq):RocketMQ是一个分布式消息流平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可伸缩性。 关键部件: + * eventmesh-runtime:一种中间件,用于在事件产生者和使用者之间传输事件,支持云原生应用程序和微服务 * eventmesh-sdk-java:当前支持HTTP和TCP协议,未来会支持gRPC等 ## RoadMap + | version | feature | | ---- | ---- | | v1.0.0 |Support pub/sub, http api, java-sdk| @@ -51,20 +57,24 @@ Event Mesh的一般功能: | |Support c/go/python/NodeJs/wasm SDK| ## 快速开始 + 1. 构建并部署event-store(RocketMQ), 请参见[说明](https://rocketmq.apache.org/docs/quick-start/) -2. 构建并部署eventmesh-runtime,请参见说明['eventmesh-runtime quickstart']( instructions/eventmesh-runtime-quickstart.md) -3. 运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.md) +2. 构建并部署eventmesh-runtime,请参见说明['eventmesh-runtime quickstart'](instructions/eventmesh-runtime-quickstart.zh-CN.md) +3. 运行eventmesh-sdk-java演示,请参见说明['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.zh-CN.md) ## 贡献 -永远欢迎参与共建, 请参阅[贡献](CONTRIBUTING.md)了解详细指南 -您可以从问题开始. -[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) +永远欢迎参与共建, 请参阅[贡献](../../CONTRIBUTING.zh-CN.md)了解详细指南 + +您可以从问题开始. +[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) ## License + [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation ## 联系人 + 微信群: ![wechat_qr](../images/mesh-helper.png) diff --git a/docs/cn/features/0-introduction.md b/docs/cn/features/0-introduction.md deleted file mode 100644 index 195054feb7..0000000000 --- a/docs/cn/features/0-introduction.md +++ /dev/null @@ -1,49 +0,0 @@ -# DeFiBus -       -**DeFiBus=RPC+MQ,是基于开源消息中间件打造的安全可靠的分布式金融级消息总线。DeFibus不仅提供了RPC同步调用,还提供了MQ的异步事件通知、事件组播和广播等常用服务调用和消息模式,同时增加了应用多中心多活、服务就近、灰度发布等分布式场景下的高可用能力。在对于机器故障的容错能力方面的增强,也让消息总线的服务更加稳定可靠,为业务提供7x24的服务。** - -### 整体架构 -
- -![architecture1](../../../docs/images/features/a-distributing-architecture-in-financial.png) - -
- -![architecture2](../../../docs/images/features/architecture-p1.png) - -DeFiBus主要包括以下几个组件(模块): - -* **Broker**:通过轻量的Topic和Queue机制提供消息存储功能。Broker定期将Topic信息上报到NameServer中,同集群中的Broker实例上报的NameServer必须保持一致,避免路由信息不一致。 - -* **NameServer**:NameServer提供Topic的发现和路由,每一个NameServer接受Broker上报的Topic信息,并维护Topic的路由信息供客户端查询。 - -* **GSL**:全局服务定位(Global Service Location)服务提供服务级别的路由发现。服务可以部署在不同的区域(比如不同的数据中心、逻辑分区等),服务请求方在请求某一个具体服务时,无需关注服务部署的区域,GSL能够根据服务发现规则自动定位到具体的服务,将服务信息返回给客户端。 - -* **SGS**:服务治理系统(Service Government System)负责全局的服务管理,包括服务的申请、服务部署规划、服务下线等服务全生命周期的管理。在DeFiBus中,服务与Topic一一对应,Topic的名称由对应的服务按照一定的规则来命名。Topic的创建、更新和删除由SGS统一管理。SGS在服务的部署区域对应的Broker集群中创建Topic之后,将更新全局服务路由数据,供GSL定位服务使用。 - -* **Proxy**:服务代理(Proxy)提供HTTP接入方式,同时允许按照协议规范开发的C、GO、Python等其他语言客户端的接入。 - -### 服务和Topic的定义 -       -DeFiBus把服务和Topic做了一一对应,每个服务必须对应一个Topic。Topic根据服务的唯一ID和服务的部署区域来命名。每个服务需要有服务的唯一标识,可以用数字ID或者字符串来表示。每个部署区域使用3位长度的字符串(限数字和字母构成)表示。 -Topic按照如下格式来命名: -``` -[区域代码]-[服务唯一ID] -``` - -比如,余额查询服务的服务ID为20190001表示,部署在“A10”这个区域,那么该服务在A10区域的Topic就命名为“A10-20190001”。Topic的命名规则 - - -### 特性列表: -* [RPC调用:即“Request-Reply”模式,支持系统间的同步调用](docs/cn/features/1-request-response-call.md) -* 消息发布/订阅:消息的发布和订阅 -* [灰度发布:服务级别的灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制:应用实例级别的熔断](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近:就近进行服务的请求和响应,减少跨区调用](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活:应用多中心多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列 :自适应应用实例数量,动态调整队列个数](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制:故障和错误隔离](docs/cn/features/8-fault-tolerant.md) -* 服务路由和定位:动态路由及定位(后续开源) -* 服务代理:HTTP及多语言的代理(后续开源) -* 服务治理:服务元数据的管理(后续开源) -* 平滑升级:平滑升级、平滑扩容(后续开源) \ No newline at end of file diff --git a/docs/cn/features/1-request-response-call.md b/docs/cn/features/1-request-response-call.md deleted file mode 100644 index 1feabaf457..0000000000 --- a/docs/cn/features/1-request-response-call.md +++ /dev/null @@ -1,34 +0,0 @@ -## 1. Request-Reply同步调用 - -       -Request-Reply同步调用指的是请求方发出一条消息之后,需要响应方在消费完这条消息后回复一个响应结果。 - -
- -![RR](../../images/features/RR-call-p1.png) - -
- -整个调用过程包含了两个消息的产生和消费过程。 -**1.请求方产生请求消息,服务响应方消费这条请求消息** -       -请求方根据服务提供方的协议将请求内容设置到消息体中,并将消息发送到Broker上。服务响应方订阅相应的Topic,从Broker上获取到请求消息,并消费。 - -**2.服务响应方产生响应消息,请求方接收这条响应消息** -       -服务响应方收到请求消息后,执行相应的处理,并将请求结果设置到响应消息的消息体中,将响应消息发送到Broker上。请求方接收响应消息的方式采用的是Broker推送的形式,而不是由Producer订阅的方式,从而使得响应消息能够精准回到发出请求消息的实例上。 - -       -DeFiBus在每条请求消息中增加REPLY_TO属性来唯一标识每一个请求方实例。在创建响应消息时将REPLY_TO属性透传到响应消息中。Broker收到响应消息后,根据REPLY_TO属性,查找出对应的请求方实例的连接,将响应消息推送给该请求方实例。 - - ---- -#### Links: -* [架构介绍](../../../README.md) -* [Request-Reply调用](docs/cn/features/1-request-response-call.md) -* [灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制](docs/cn/features/8-fault-tolerant.md) \ No newline at end of file diff --git a/docs/cn/features/10-flow-control.md b/docs/cn/features/10-flow-control.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/cn/features/2-dark-launch.md b/docs/cn/features/2-dark-launch.md deleted file mode 100644 index e6e7e20119..0000000000 --- a/docs/cn/features/2-dark-launch.md +++ /dev/null @@ -1,24 +0,0 @@ -## 2.灰度发布 - -       -同一个消费组中的消费者实例通常订阅的Topic是相同的。在有新业务上线时,我们希望仅仅在个别实例上进行灰度,验证通过之后再进行全量。DeFiBus提供了灰度发布的能力,同一个消费组中,允许不同消费者实例订阅不同的Topic,只有订阅了某个具体Topic的实例才能够收到这个Topic的消息,同消费组中没有订阅这个Topic的实例不会收到消息。 - -       -假设一个消费组有3个消费者实例,上线初期只涉及到Topic1和Topic2。当业务扩展,需要增加Topic3的订阅时,可以先灰度其中一个实例,验证Topic3在灰度实例上执行正常之后,逐步再替换其他实例。在这期间,实例1和实例2不会收到Topic3的消息。 - -
- -![avater](../../images/features/dark-launch-p1.png) - -
- ---- -#### Links: -* [架构介绍](../../../README.md) -* [Request-Reply调用](docs/cn/features/1-request-response-call.md) -* [灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制](docs/cn/features/8-fault-tolerant.md) \ No newline at end of file diff --git a/docs/cn/features/3-circuit-break-mechanism.md b/docs/cn/features/3-circuit-break-mechanism.md deleted file mode 100644 index 06eec22ae3..0000000000 --- a/docs/cn/features/3-circuit-break-mechanism.md +++ /dev/null @@ -1,25 +0,0 @@ -## 3.熔断 -       -DeFiBus基于队列来做消费端的负载均衡,对同一个消费组,除广播模式外,每个队列只由一个消费者实例消费。当一个实例处理能力下降或者异常出现消息堆积时,为了避免堆积情况继续加剧,DeFiBus会触发队列的熔断,此时生产者实例在感知到队列熔断之后,会优先把消息发送到其他没有熔断的队列上,暂停往熔断队列上写入新消息。当堆积消除后,熔断被解除,生产者恢复往该队列发送消息。 - -       -DeFiBus对每个Topic定义了深度的属性,表示Topic的队列允许堆积的最大消息条数。消息堆积数表示队列中尚未下发给消费者实例的消息条数,可由队列中最新一条消息的offset与消费者实例已经获取到的消息的offset的差值计算。 -
- -![offset](../../../docs/images/features/circuit-break-p1.png) - -
- -       -当Consumer出现异常或者触发了流控,Consumer拉消息过程受阻,队列的DeliverOffset停止不前,新消息持续写入,MaxOffset不断变大,最终MaxOffset与DeliverOffset将超过Topic的最大深度限制,触发队列熔断。 - ---- -#### Links: -* [架构介绍](../../../README.md) -* [Request-Reply调用](docs/cn/features/1-request-response-call.md) -* [灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制](docs/cn/features/8-fault-tolerant.md) diff --git a/docs/cn/features/4-invoke-service-nearby.md b/docs/cn/features/4-invoke-service-nearby.md deleted file mode 100644 index 209940cbfd..0000000000 --- a/docs/cn/features/4-invoke-service-nearby.md +++ /dev/null @@ -1,29 +0,0 @@ -## 4.服务就近 -       -为了保证高可用,服务的部署通常分布在多个机房、区域。我们希望服务之间能够就近调用,减少跨机房跨区域网络访问的时延问题。对此,DeFiBus在Broker和客户端上都增加了区域的属性来标识实例属于哪个区域。对于Producer,消息会优先发往同区域内的Broker集群上;对于Consumer,则优先监听同区域内的Queue;当一个区域内没有Consumer实例监听时,则由其他区域的Consumer实例跨区域监听。 - -### 就近发送 -       -在创建Producer时,通过设置```DeFiBusClientConfig.setClusterPrefix("your region")```来标识Producer实例所在的区域。Producer在每次发送消息会先选则一个Queue来作为发送的目标队列。当启用就近发送时,Producer优先选择与自己同区域内的Queue,当本区域内没有可用Queue时,则选择其他区域的Queue。 -
- -
- -### 就近监听 -       -就近监听指的是Consumer在做负载均衡分配Queue的时候,每个区域内的Queue只由该区域内的Consumer监听和消费,当且仅当一个区域内没有订阅该Topic的Consumer时,由其他区域订阅了该Topic的Consumer跨区域监听和消费这些Queue。虽然Consumer是在同区域内就近消费,但仍通过心跳维持跨区域的连接,以保证能够随时跨区域接管消费。 - -
- -
- ---- -#### Links: -* [架构介绍](../../../README.md) -* [Request-Reply调用](docs/cn/features/1-request-response-call.md) -* [灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制](docs/cn/features/8-fault-tolerant.md) \ No newline at end of file diff --git a/docs/cn/features/5-multi-active.md b/docs/cn/features/5-multi-active.md deleted file mode 100644 index f24366630b..0000000000 --- a/docs/cn/features/5-multi-active.md +++ /dev/null @@ -1,18 +0,0 @@ -## 5.同城多中心多活 -       -同城多中心多活指的是应用的多活,在DeFiBus集群正常运行的情况下,应用部署在多个数据中心,一个数据中心的应用实例全部挂掉后,DeFiBus能够自动将应用流量切换到另一个数据中心的应用实例上,保证应用能够持续稳定地提供服务而不中断。同城多中心多活得益于DeFiBus的服务就近特性,结合应用部署的规划,使得正常情况下服务调用发生在同一个数据中心,当一个中心的应用出现故障时,能够有其他中心的实例接管服务。 - -
- -
- ---- -#### Links: -* [架构介绍](../../../README.md) -* [Request-Reply调用](docs/cn/features/1-request-response-call.md) -* [灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制](docs/cn/features/8-fault-tolerant.md) \ No newline at end of file diff --git a/docs/cn/features/6-dynamic-adjust-queue.md b/docs/cn/features/6-dynamic-adjust-queue.md deleted file mode 100644 index 9c27b7deb1..0000000000 --- a/docs/cn/features/6-dynamic-adjust-queue.md +++ /dev/null @@ -1,35 +0,0 @@ -## 自动伸缩Queue -       -在同一个消费组内,每个队列只由一个实例消费。当队列数小于消费者实例数时,会有部分消费者实例分不到队列;反之,当队列数大于消费者实例数时,每个消费者需要消费多个队列。队列数不是消费者实例数的整数倍时,则会出现部分实例需要消费比同组内的其他实例更多的队列,出现负载不均衡问题。 - -       -DeFiBus提供了队列数量自动调整的特性。当有Consumer新注册或者去注册时,Broker触发队列的自动伸缩,根据当前在线的消费者实例个数,增加或者减少队列个数,使队列个数与消费者实例数保持一致。 - -       -当队列数需要增加时,首先调整Topic的ReadQueueNum,将可读的队列数扩增;10s之后,再调整Topic的WriteQueueNum,将可写的队列数扩增。这样使得新扩增的队列能够先被消费者感知并监听上,然后才让生产者感知到,往新队列上发送消息,是扩增操作更平滑。 - -
- -
- -       -当队列数需要减少时,首先调整Topic的WriteQueueNum,将可写的队列数缩减;5分钟(默认,可配置)后先检查即将被缩减的队列中是否有消息没有被消费完,如果有,则继续延迟缩减操作,使消费者能够继续消费完队列中的消息;如果没有,则调整ReadQueueNum,将可写的队列数缩减。 - -
- -
- -       -对于多个消费组订阅相同Topic并且是集群消费模式时,在计算扩缩的队列个数时,以最大的消费组的消费者实例数为准,保证拥有最多实例数的消费组内每个消费者实例都能够分到Queue进行消费。 - - ---- -#### Links: -* [架构介绍](../../../README.md) -* [Request-Reply调用](docs/cn/features/1-request-response-call.md) -* [灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制](docs/cn/features/8-fault-tolerant.md) \ No newline at end of file diff --git a/docs/cn/features/7-isolation-mechanism.md b/docs/cn/features/7-isolation-mechanism.md deleted file mode 100644 index 298efc461d..0000000000 --- a/docs/cn/features/7-isolation-mechanism.md +++ /dev/null @@ -1,23 +0,0 @@ -## 隔离机制 -Producer在往Topic发送消息时,会按照MessageQueueSelector定义的选择策略,从Topic的所有MessageQueue中选择一个作为目标队列发送消息。 -当队列发生熔断,或者Broker故障导致队列发送消息异常时,如果没有对这些队列进行特殊处理,下次再轮到发这个队列的时候仍然可能失败。 - -DeFiBus提供异常队列的隔离机制,当往某个队列发送消息失败时,将队列标记为隔离状态,在隔离过期之前将不再往这个队列发送消息,避免再次失败,降低失败概率。 - -异常队列隔离机制分为两步: -**-发现并标记队列为隔离** -在发送回调中更新发送队列的健康状态,如果执行的是onSuccess分支,则标记队列为健康,去除队列的隔离标记;如果执行的是onException分支,则标记队列为隔离状态。 - -**-不选择隔离中的队列发送消息** -在MessageQueueSelector中实现隔离机制的过滤逻辑,每次进行队列的选择时,优先从没有标记为隔离的队列中选择。当所有队列都被标记为隔离时,则从所有队列中选择,保证每次都要选出一个队列。 - ---- -#### Links: -* [架构介绍](../../../README.md) -* [Request-Reply调用](docs/cn/features/1-request-response-call.md) -* [灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制](docs/cn/features/8-fault-tolerant.md) \ No newline at end of file diff --git a/docs/cn/features/8-fault-tolerant.md b/docs/cn/features/8-fault-tolerant.md deleted file mode 100644 index f118c9d311..0000000000 --- a/docs/cn/features/8-fault-tolerant.md +++ /dev/null @@ -1,50 +0,0 @@ -## 8.容错机制 -       -在金融场景下,对可用性和稳定性的要求非常高,中间件对机器故障、网络故障、应用故障以及中间件本身的故障等常见故障场景需要有容错能力,降低故障带来的影响。 - -### 隔离机制 -##### 1. Producer端的隔离 -       -Producer在往Topic发送消息时,会按照MessageQueueSelector定义的选择策略,从Topic的所有MessageQueue中选择一个作为目标队列发送消息。 -当队列发生熔断,或者Broker故障导致队列发送消息异常时,如果没有对这些队列进行特殊处理,下次再轮到发这个队列的时候仍然可能失败。 - -       -DeFiBus提供异常队列的隔离机制,当往某个队列发送消息失败时,将队列标记为隔离状态,在隔离过期之前将不再往这个队列发送消息,避免再次失败,降低失败概率。 - -异常队列隔离机制分为两步: -**-发现并标记队列为隔离** -       -在发送回调中更新发送队列的健康状态,如果执行的是onSuccess分支,则标记队列为健康,去除队列的隔离标记;如果执行的是onException分支,则标记队列为隔离状态。 - -**-不选择隔离中的队列发送消息** -       -在MessageQueueSelector中实现隔离机制的过滤逻辑,每次进行队列的选择时,优先从没有标记为隔离的队列中选择。当所有队列都被标记为隔离时,则从所有队列中选择,保证每次都要选出一个队列。 - - -##### 2. Consumer端的隔离 - -       -Consumer由拉消息线程只负责把拉消息请求以异步发送的形式发送出去。在正常情况下,每次拉消息请求的执行都很快,不会有卡顿。一旦有Broker故障导致PullRequest的执行发生了卡顿,则该Consumer监听的所有Queue都会因为PullRequest执行的延迟而出现消息消费延迟。对于RR同步请求的场景,这种是不能够接受的。 - -       -创建连接采用的是同步建立连接的策略,线程执行创建新连接时必须等待连接创建完成或者连接超时。当有Broker故障连不上时,就算是异步发送,也会因为同步等待连接建立而阻塞。此时就会出现一个Broker的故障导致其他健康Broker的消息消费出现延迟。 - -       -DeFiBus在Consumer拉消息的过程中增加了对拉消息任务的隔离,此处的隔离指的是将疑似有问题的任务隔离到另外的线程中执行,保证拉消息线程能够正常处理其他正常的任务。当发现执行拉消息耗时超过设定的阈值时,将该拉消息任务对应的Broker列入“隔离名单”中,在隔离过期之前,隔离Broker的拉消息请求都转交给另外线程执行,避免阻塞拉消息主线程,从而避免故障的Broker影响健康Broker的消息消费时效。 - -### 连接空闲机制 - -       -当连接的读或者写空闲超过60秒时,将主动断开连接。 - - ---- -#### Links: -* [架构介绍](../../../README.md) -* [Request-Reply调用](docs/cn/features/1-request-response-call.md) -* [灰度发布](docs/cn/features/2-dark-launch.md) -* [熔断机制](docs/cn/features/3-circuit-break-mechanism.md) -* [服务就近](docs/cn/features/4-invoke-service-nearby.md) -* [应用多活](docs/cn/features/5-multi-active.md) -* [动态扩缩队列](docs/cn/features/6-dynamic-adjust-queue.md) -* [容错机制](docs/cn/features/8-fault-tolerant.md) \ No newline at end of file diff --git a/docs/cn/features/9-publish-type.md b/docs/cn/features/9-publish-type.md deleted file mode 100644 index 74c3446d77..0000000000 --- a/docs/cn/features/9-publish-type.md +++ /dev/null @@ -1,35 +0,0 @@ -## 2. 单播、多播、广播 - -       -DeFiBus支持单播、多播、广播消费模式。 - -### 单播 - -
- -![unicast](../../images/features/unicast.png) - -
- -单播模式下,topic只被一个消费组监听;接收消息时,消费组内有且仅有一个实例会收到消息。 - -### 多播 - -
- -![multicast](../../images/features/multicast.png) - -
- -多播模式下,topic被多个消费组监听;接收消息时,每个消费组内有且仅有一个实例会收到消息。 - - -### 广播 - -
- -![broadcast](../../images/features/broadcast.png) - -
- -广播模式下,监听此topic的每个消费组中的每个实例都需要收到消息。 \ No newline at end of file diff --git a/docs/cn/features/https.zh-CN.md b/docs/cn/features/https.zh-CN.md index 5714d18b6f..fa1244f949 100644 --- a/docs/cn/features/https.zh-CN.md +++ b/docs/cn/features/https.zh-CN.md @@ -1,19 +1,18 @@ 1.在eventmesh-runtime 中配置 ``` -proxy.properties(添加如下配置) -proxy.server.useTls.enabled=true //默认值 false +eventMesh.properties(添加如下配置) +eventMesh.server.useTls.enabled=true //默认值 false config env varible -Dssl.server.protocol=TLSv1.1 //默认值 TLSv1.1 -Dssl.server.cer=sChat2.jks //把文件放到启动脚本start.sh 指定的conPath目录下 -Dssl.server.pass=sNetty - ``` - 2.在eventmesh-sdk-java 中配置 + ``` //创建producer LiteClientConfig liteClientConfig = new liteClientConfig(); diff --git a/docs/cn/instructions/eventmesh-runtime-protocol.zh-CN.md b/docs/cn/instructions/eventmesh-runtime-protocol.zh-CN.md index b86eccea2b..a3d152dbdc 100644 --- a/docs/cn/instructions/eventmesh-runtime-protocol.zh-CN.md +++ b/docs/cn/instructions/eventmesh-runtime-protocol.zh-CN.md @@ -7,7 +7,7 @@ **消息组成详解:** ``` -魔术字:4位,当前值为“WEMQ” +魔术字:9位,当前值为“EventMesh” 通信协议版本号:4位,当前值为“0000” @@ -20,8 +20,6 @@ 消息体(body):长度 = length - headerLength - 4 - 4 ``` - - #### 2. 业务逻辑层 + 消息组成 @@ -45,8 +43,6 @@ public class Header { } ``` - - + 详解 消息头(header):类型为Header,Header中有Command字段,用于区分不同的消息类型 @@ -61,8 +57,6 @@ public class Header { | REQUEST_TO_SERVER, REQUEST_TO_CLIENT, RESPONSE_TO_SERVER, RESPONSE_TO_CLIENT, ASYNC_MESSAGE_TO_SERVER, ASYNC_MESSAGE_TO_CLIENT, BROADCAST_MESSAGE_TO_SERVER, BROADCAST_MESSAGE_TO_CLIENT, ASYNC_MESSAGE_TO_CLIENT_ACK, BROADCAST_MESSAGE_TO_CLIENT_ACK, RESPONSE_TO_CLIENT_ACK, REQUEST_TO_CLIENT_ACK | OpenMessage | | REDIRECT_TO_CLIENT | RedirectInfo | - - #### 3. Client 与 Eventmesh-Runtime(Server)交互场景详解 ```java @@ -117,8 +111,6 @@ public enum Command { } ``` - - #### 4. Client发起交互 | 场景 | Client向Server发送消息命令字 | Server回复Client消息的命令字 | 说明 | @@ -134,8 +126,6 @@ public enum Command { | 发送广播事件 | BROADCAST_MESSAGE_TO_SERVER | BROADCAST_MESSAGE_TO_SERVER_ACK | | | 客户端主动断连 | CLIENT_GOODBYE_REQUEST | CLIENT_GOODBYE_RESPONSE | | - - #### 5. Server发起交互 | 场景 | Server向Client发送消息命令字 | Client回复Server消息命令字 | 说明 | @@ -148,26 +138,20 @@ public enum Command { | 服务端进行重定向 | REDIRECT_TO_CLIENT | 无 | | | | | | | - #### 6. 消息类型 + + 发送RR消息 ![rr-msg](../../images/protocol/eventmesh-rr-msg.png) - - + 发送异步单播消息 ![async-msg](../../images/protocol/eventmesh-async-msg.png) - - + 发送广播消息 ![broadcast-msg](../../images/protocol/eventmesh-broadcast-msg.png) - - ## HTTP协议文档 Java类`LiteMessage`的`content`字段表示一个特殊的协议,因此,如果您要使用eventmesh-sdk-java的http-client,则只需设计协议的`content`即可。`LiteMessage`组成如下: @@ -189,18 +173,12 @@ public class LiteMessage { } ``` - - #### 1. 消息发送方式与组成 - - **消息发送方式**:POST方式 **消息组成**:请求头(RequestHeader) + 请求体(RequestBody) - - + 心跳消息 **RequestHeader** @@ -227,8 +205,6 @@ public class LiteMessage { | clientType | 客户端类型 | | heartbeatEntities | 心跳实体,包含topic、url等信息 | - - + 订阅消息: **RequestHeader** @@ -242,8 +218,6 @@ public class LiteMessage { | topic | 客户端订阅的topic | | url | topic对应的url | - - + 取消订阅消息: **RequestHeader** @@ -254,8 +228,6 @@ public class LiteMessage { 与订阅消息一致 - - + 发送异步事件: **RequestHeader** @@ -272,18 +244,14 @@ public class LiteMessage { | bizSeqNo | 客户端请求业务流水号 | | uniqueId | 客户端请求消息唯一标识 | - - #### 2. Client发起交互 | 场景 | Client向Server发送消息请求码 | Server回复Client消息的响应码 | 说明 | | ------------ | ---------------------------- | --------------------------------------- | ---- | -| 心跳 | HEARTBEAT(203) | SUCCESS(0)/PROXY_HEARTBEAT_ERROR(19) | | -| 订阅 | SUBSCRIBE(206) | SUCCESS(0)/PROXY_SUBSCRIBE_ERROR(17) | | -| 取消订阅 | UNSUBSCRIBE(207) | SUCCESS(0)/PROXY_UNSUBSCRIBE_ERROR(18) | | -| 发送异步事件 | MSG_SEND_ASYNC(104) | SUCCESS(0)/PROXY_SEND_ASYNC_MSG_ERR(14) | | - - +| 心跳 | HEARTBEAT(203) | SUCCESS(0)/EVENTMESH_HEARTBEAT_ERROR(19) | | +| 订阅 | SUBSCRIBE(206) | SUCCESS(0)/EVENTMESH_SUBSCRIBE_ERROR(17) | | +| 取消订阅 | UNSUBSCRIBE(207) | SUCCESS(0)/EVENTMESH_UNSUBSCRIBE_ERROR(18) | | +| 发送异步事件 | MSG_SEND_ASYNC(104) | SUCCESS(0)/EVENTMESH_SEND_ASYNC_MSG_ERR(14) | | #### 3. Server发起交互 diff --git a/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md index bb87452509..adc9703796 100644 --- a/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md +++ b/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md @@ -1,46 +1,44 @@

Eventmesh-runtime快速入门说明

- -## 1 远程部署 +## 1 远程部署 ### 1.1 依赖 ``` 建议使用64位操作系统,建议使用Linux / Unix; 64位JDK 1.8+; -Gradle至少为5.6, 推荐 5.6.* +Gradle至少为7.0, 推荐 7.0.* ``` -### 1.2 下载源码 +### 1.2 下载源码 -[https://github.com/WeBankFinTech/EventMesh](https://github.com/WeBankFinTech/EventMesh) +[https://github.com/apache/incubator-eventmesh](https://github.com/apache/incubator-eventmesh) 您将获得**EventMesh-master.zip** ### 1.3 构建源码 ```$ xslt unzip EventMesh-master.zip -cd / *您的部署路径* /EventMesh-master/eventmesh-runtime +cd / *您的部署路径* /EventMesh-master gradle clean dist tar -x test ``` + 您将在目录/ *您的部署路径* /EventMesh-master/eventmesh-runtime/dist中获得**eventmesh-runtime_1.0.0.tar.gz** ### 1.4 部署 - 部署eventmesh-runtime - ```$ xslt upload eventmesh-runtime_1.0.0.tar.gz tar -zxvf eventmesh-runtime_1.0.0.tar.gz cd bin -配置 proxy.properties +配置 eventMesh.properties cd ../bin sh start.sh ``` -如果看到"ProxyTCPServer[port=10000] started....",则说明设置成功。 - +如果看到"EventMeshTCPServer[port=10000] started....",则说明设置成功。 ## 2 本地构建运行 @@ -48,7 +46,7 @@ sh start.sh 同上述步骤 1.1 -### 2.2 下载源码 +### 2.2 下载源码 同上述步骤 1.2 @@ -57,6 +55,7 @@ sh start.sh **2.3.1 项目结构说明:** ![project-structure](../../images/project-structure.png) + - eventmesh-common : eventmesh公共类与方法模块 - eventmesh-connector-api : eventmesh插件接口定义模块 - eventmesh-connector-rocketmq : eventmesh rocketmq插件模块 @@ -69,11 +68,12 @@ sh start.sh **2.3.2 配置VM启动参数** ```java --Dlog4j.configurationFile=..\eventmesh-runtime\conf\log4j2.xml --Dproxy.log.home=..\eventmesh-runtime\logs --Dproxy.home=..\eventmesh-runtime --DconfPath=..\eventmesh-runtime\conf +-Dlog4j.configurationFile=eventmesh-runtime/conf/log4j2.xml +-Deventmesh.log.home=eventmesh-runtime/logs +-Deventmesh.home=eventmesh-runtime +-DconfPath=eventmesh-runtime/conf ``` +> 注:如果操作系统为Windows, 可能需要将文件分隔符换成\ **2.3.3 配置build.gradle文件** @@ -92,11 +92,9 @@ dependencies { **2.3.4 启动运行** ``` -运行com.webank.eventmesh.starter.StartUp的主要方法 +运行org.apache.eventmesh.starter.StartUp的主要方法 ``` - - ## 3 Docker 运行 ### 3.1 拉取镜像 @@ -107,37 +105,38 @@ dependencies { ### 3.2 配置 -> **预先准备** : 你可能需要从github上下载源代码,并参考这两个文件(proxy.properties 和 rocketmq-client.properties)的内容来做下面的操作 +> **预先准备** : 你可能需要从github上下载源代码,并参考这两个文件(eventMesh.properties 和 rocketmq-client.properties)的内容来做下面的操作 **3.2.1 需要配置的文件** 在运行容器之前,你需要配置如下文件: -**proxy.properties** +**eventMesh.properties** | 配置项 | 默认值 | 备注 | | ---------------------- | ------ | ----------------------- | -| proxy.server.http.port | 10105 | EventMesh http 服务端口 | -| proxy.server.tcp.port | 10000 | EventMesh tcp 服务端口 | +| eventMesh.server.http.port | 10105 | EventMesh http 服务端口 | +| eventMesh.server.tcp.port | 10000 | EventMesh tcp 服务端口 | **rocketmq-client.properties** | 配置项 | 默认值 | 备注 | | --------------------------------- | ----------------------------- | --------------------- | -| proxy.server.rocketmq.namesrvAddr | 127.0.0.1:9876;127.0.0.1:9876 | RocketMQ namesrv 地址 | +| eventMesh.server.rocketmq.namesrvAddr | 127.0.0.1:9876;127.0.0.1:9876 | RocketMQ namesrv 地址 | -拉取了EventMesh镜像到你的宿主机后,你可以执行下面的命令来完成**proxy.properties**和**rocketmq-client.properties** 文件的配置 +拉取了EventMesh镜像到你的宿主机后,你可以执行下面的命令来完成**eventMesh.properties**和**rocketmq-client.properties** 文件的配置 **3.2.2 创建文件** ```shell mkdir -p /data/eventmesh/rocketmq/conf cd /data/eventmesh/rocketmq/conf -vi proxy.properties +vi eventMesh.properties vi rocketmq-client.properties ``` -这两个文件内容可以参考 [proxy.properties](https://github.com/WeBankFinTech/EventMesh/blob/develop/eventmesh-runtime/conf/proxy.properties) 和 [rocketmq-client.properties](https://github.com/WeBankFinTech/EventMesh/blob/develop/eventmesh-runtime/conf/rocketmq-client.properties) +这两个文件内容可以参考 [eventMesh.properties](https://github.com/apache/incubator-eventmesh/blob/develop/eventmesh-runtime/conf/eventMesh.properties) +和 [rocketmq-client.properties](https://github.com/apache/incubator-eventmesh/blob/develop/eventmesh-runtime/conf/rocketmq-client.properties) ### 3.3 运行 @@ -146,7 +145,7 @@ vi rocketmq-client.properties 执行下面的命令来运行容器 ```shell -docker run -d -p 10000:10000 -p 10105:10105 -v /data/eventmesh/rocketmq/conf/proxy.properties:/data/app/eventmesh/conf/proxy.properties -v /data/eventmesh/rocketmq/conf/rocketmq-client.properties:/data/app/eventmesh/conf/rocketmq-client.properties docker.io/eventmesh/eventmesh-rocketmq:v1.2.0 +docker run -d -p 10000:10000 -p 10105:10105 -v /data/eventmesh/rocketmq/conf/eventMesh.properties:/data/app/eventmesh/conf/eventMesh.properties -v /data/eventmesh/rocketmq/conf/rocketmq-client.properties:/data/app/eventmesh/conf/rocketmq-client.properties docker.io/eventmesh/eventmesh-rocketmq:v1.2.0 ``` > -p : 将容器内端口与宿主机端口绑定,容器的端口应与配置文件中的端口一致 @@ -192,7 +191,7 @@ docker run -d -p 10911:10911 -p 10909:10909 -v `pwd`/data/broker/logs:/root/logs Windows -- Windows系统下运行示例可以参考[这里](https://github.com/WeBankFinTech/EventMesh/blob/develop/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md) +- Windows系统下运行示例可以参考[这里](https://github.com/apache/incubator-eventmesh/blob/develop/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md) Linux @@ -207,7 +206,7 @@ Linux gradle clean testdist testtar -x test` ``` - 可以在 `/eventmesh-test/build` 目录下获得 **eventmesh-test_1.2.0-SNAPSHOT.tar.gz** + 可以在 `/eventmesh-test/build` 目录下获得 **eventmesh-test_1.2.0-SNAPSHOT.tar.gz** - **修改配置文件** @@ -223,7 +222,7 @@ Linux - **运行** - TCP Sub + TCP Sub ```shell cd bin diff --git a/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md index d890f50097..aa5768ac15 100644 --- a/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md +++ b/docs/cn/instructions/eventmesh-sdk-java-quickstart.zh-CN.md @@ -16,40 +16,39 @@ TCP 和 Http 示例都在**eventmesh-test**模块下

异步消息

-- 创建主题FT0-e-80010000-01-1,可以通过rocketmq-console或者rocketmq tools 命令 +- 创建主题TEST-TOPIC-TCP-ASYNC,可以通过rocketmq-console或者rocketmq tools 命令 - 启动消费者,订阅上一步骤已经创建的Topic ``` -运行com.webank.eventmesh.tcp.demo.AsyncSubscribe的主要方法 +运行org.apache.eventmesh.tcp.demo.AsyncSubscribe的主要方法 ``` - 启动发送端,发送消息 - ``` -运行com.webank.eventmesh.tcp.demo.AsyncPublish的主要方法 +运行org.apache.eventmesh.tcp.demo.AsyncPublish的主要方法 ```

广播消息

-- 创建主题FT0-e-80030000-01-3,可以通过rocketmq-console或者rocketmq tools 命令 +- 创建主题TEST-TOPIC-TCP-BROADCAST,可以通过rocketmq-console或者rocketmq tools 命令 - 启动消费端,订阅上一步骤已经创建的Topic ``` -运行com.webank.eventmesh.tcp.demo.AsyncSubscribeBroadcast的主要方法 +运行org.apache.eventmesh.tcp.demo.AsyncSubscribeBroadcast的主要方法 ``` - 启动发送端,发送广播消息 ``` -运行com.webank.eventmesh.tcp.demo.AsyncPublishBroadcast的主要方法 +运行org.apache.eventmesh.tcp.demo.AsyncPublishBroadcast的主要方法 ``` ### 2. HTTP演示 ->对于http,eventmesh-sdk-java对对于异步事件实现了发送与订阅 +> 对于http,eventmesh-sdk-java对对于异步事件实现了发送与订阅 > >在演示中,Java类`LiteMessage`的`content`字段表示一个特殊的协议,因此,如果您要使用eventmesh-sdk-java的http-client,则只需设计协议的内容并在同一时间提供消费者的应用程序。 @@ -57,18 +56,20 @@ TCP 和 Http 示例都在**eventmesh-test**模块下 > 生产者将事件发送给下游即可,无需等待响应 +- 创建主题TEST-TOPIC-HTTP-ASYNC,可以通过rocketmq-console或者rocketmq tools 命令 + - 启动消费端,订阅Topic 异步事件消费端为spring boot demo,运行demo即可启动服务并完成Topic订阅 ``` -运行com.webank.eventmesh.http.demo.sub.SpringBootDemoApplication的主要方法 +运行org.apache.eventmesh.http.demo.sub.SpringBootDemoApplication的主要方法 ``` - 启动发送端,发送消息 ``` -运行com.webank.eventmesh.http.demo.AsyncPublishInstance的主要方法 +运行org.apache.eventmesh.http.demo.AsyncPublishInstance的主要方法 ``` diff --git a/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md index b7bbb9e961..a9ca24c273 100644 --- a/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md +++ b/docs/cn/instructions/eventmesh-store-quickstart.zh-CN.md @@ -1,6 +1,7 @@ -#Eventmesh-store快速入门说明 +# Eventmesh-store快速入门说明 + +### 依赖 -###依赖 ``` 建议使用64位操作系统,建议使用Linux / Unix; 64位JDK 1.8+; @@ -8,30 +9,38 @@ Gradle至少为5.6, 推荐 5.6.* 4g +可用磁盘用于eventmesh-store服务器 ``` -###下载源码 +### 下载源码 + 下载源代码[https://github.com/WeBankFinTech/DeFiBus](https://github.com/WeBankFinTech/DeFiBus) 您将获得**DefiBus-master.zip** -###构建源码 +### 构建源码 + eventmesh-store在下面的部分采用DeFiBus为例,因为默认情况下,eventmesh依赖于defibus作为存储层,其他工具如Rocketmq等也即将推出。 + ``` unzip DefiBus-master.zip cd / *您的部署路径* / DefiBus-master gradle clean dist tar -x test ``` + 您将在目录/*您的部署路径*/DefiBus-master/build中获得**DeFiBus_1.0.0.tar.gz** -###部署 +### 部署 + - 部署DeFiBusNamesrv + ``` 上传DeFiBus_1.0.0.tar.gz tar -zxvf DeFiBus_1.0.0.tar.gz cd bin sh runnamesrv.sh ``` + 如果在../logs/namesrv.log中看到"Thre Name Server boot success”,则说明已成功设置DeFiBus Namesrv。 -部署DeFiBusBroker + ``` 上传DeFiBus_1.0.0.tar.gz tar -zxvf DeFiBus_1.0.0.tar.gz @@ -40,5 +49,5 @@ cd conf cd ../bin sh runbroker.sh ``` -如果看到"The broker \[YOUR-BROKER-NAME, IP:PORT\] boot success."在../logs/broker.log中, -您可以成功设置eventmesh-store。 \ No newline at end of file + +如果看到"The broker \[YOUR-BROKER-NAME, IP:PORT\] boot success."在../logs/broker.log中, 您可以成功设置eventmesh-store。 \ No newline at end of file diff --git a/docs/cn/instructions/quickstart.zh-CN.md b/docs/cn/instructions/quickstart.zh-CN.md index d5f384075e..e14bf122bf 100644 --- a/docs/cn/instructions/quickstart.zh-CN.md +++ b/docs/cn/instructions/quickstart.zh-CN.md @@ -10,15 +10,15 @@ Gradle至少为5.6, 推荐 5.6.* ### 部署eventmesh-store -阅读更多[这里](eventmesh-store-quickstart.md) +阅读更多[这里](eventmesh-store-quickstart.zh-CN.md) ### 部署eventmesh-runtime -阅读更多[这里](eventmesh-runtime-quickstart.md) +阅读更多[这里](eventmesh-runtime-quickstart.zh-CN.md) ### 运行eventmesh sdk演示 -阅读更多[这里](eventmesh-sdk-java-quickstart.md) +阅读更多[这里](eventmesh-sdk-java-quickstart.zh-CN.md) ### 通信协议 diff --git a/docs/en/README.md b/docs/en/README.md index e89c4f303c..1b8d3c1178 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -1,16 +1,22 @@ -[![Build Status](https://www.travis-ci.org/WeBankFinTech/DeFiBus.svg?branch=master)](https://www.travis-ci.org/WeBankFinTech/EventMesh) -[![Coverage Status](https://coveralls.io/repos/github/WeBankFinTech/DeFiBus/badge.svg?branch=master)](https://coveralls.io/github/WeBankFinTech/EventMesh?branch=master) -[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/WeBankFinTech/EventMesh/releases) +# Apache EventMesh (Incubating) +[![CI status](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml/badge.svg)](https://github.com/apache/incubator-eventmesh/actions/workflows/ci.yml) +[![CodeCov](https://codecov.io/gh/apache/incubator-eventmesh/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/incubator-eventmesh) +[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/context:java) +[![Total alerts](https://img.shields.io/lgtm/alerts/g/apache/incubator-eventmesh.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/apache/incubator-eventmesh/alerts/) +[![GitHub release](https://img.shields.io/badge/release-download-orange.svg)](https://github.com/apache/incubator-eventmesh/releases) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) -[点我查看中文版](/cn/README.md) +[点我查看中文版](../cn/README.md) ## What is Event Mesh? -This figure shows the positioning of the event mesh relative to other similar technologies (such as service mesh) in the application framework. + +This figure shows the positioning of the event mesh relative to other similar technologies (such as service mesh) in the +application framework. ![architecture1](../images/eventmesh-define.png) -Event Mesh is a dynamic plug-in cloud-native basic service layer used to decouple the application and middleware layer. It provides flexible, reliable and fast event distribution, and can be managed. +Event Mesh is a dynamic plug-in cloud-native basic service layer used to decouple the application and middleware layer. +It provides flexible, reliable and fast event distribution, and can be managed. ![architecture1](../images/eventmesh-runtime.png) @@ -18,8 +24,8 @@ Cloud Native Event Mesh: ![architecture2](../images/eventmesh-panels.png) -The event mesh allows events from one application to be dynamically routed to any other application. -General functions of the event mesh: +The event mesh allows events from one application to be dynamically routed to any other application. General functions +of the event mesh: * Event driven; * Event governance; @@ -27,14 +33,19 @@ General functions of the event mesh: * Cloud native Dependent components: -* DeFiBus : a distributed messaging platform with low latency, high performance and reliability, flexible scalability. [DeFiBus](https://github.com/WeBankFinTech/DeFiBus) + +* DeFiBus : a distributed messaging platform with low latency, high performance and reliability, flexible + scalability. [DeFiBus](https://github.com/WeBankFinTech/DeFiBus) * RocketMQ Key components: -* eventmesh-runtime : an middleware to transmit events between event producers and consumers, support cloud native apps and microservices + +* eventmesh-runtime : an middleware to transmit events between event producers and consumers, support cloud native apps + and microservices * eventmesh-sdk-java : currently supports HTTP and TCP protocols, and will support gRPC in the future ## RoadMap + | version | feature | | ---- | ---- | | v1.0.0 |Support DeFiBus as eventstore, support pub/sub, http api, java-sdk| @@ -54,21 +65,27 @@ Key components: | |Support c/go/python/nodejs SDK| ## Quick Start -1. Build and deploy event-store([DeFiBus](https://github.com/WeBankFinTech/DeFiBus)), - see instruction ['event-store quickstart'](instructions/eventmesh-store-quickstart.md). -2. Build and deploy eventmesh-runtime, see instruction ['eventmesh-runtime quickstart'](instructions/eventmesh-runtime-quickstart.md). -3. Run eventmesh-sdk-java demo, see instruction ['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.md). + +1. Build and deploy event-store([DeFiBus](https://github.com/WeBankFinTech/DeFiBus)), see + instruction ['event-store quickstart'](instructions/eventmesh-store-quickstart.md). +2. Build and deploy eventmesh-runtime, see + instruction ['eventmesh-runtime quickstart'](instructions/eventmesh-runtime-quickstart.md). +3. Run eventmesh-sdk-java demo, see + instruction ['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.md). ## Contributing -Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines -You can start with the issues labeled with good first issue. -[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) +Contributions are always welcomed! Please see [CONTRIBUTING](../../CONTRIBUTING.md) for detailed guidelines + +You can start with the issues labeled with good first issue. +[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) ## License + [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html) Copyright (C) Apache Software Foundation ## Contacts + WeChat group: ![wechat_qr](../images/mesh-helper.png) diff --git a/docs/en/features/architecture.md b/docs/en/features/architecture.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/en/features/eventmesh-cloudevents-sdk-binding.md b/docs/en/features/eventmesh-cloudevents-sdk-binding.md new file mode 100644 index 0000000000..3c1224f413 --- /dev/null +++ b/docs/en/features/eventmesh-cloudevents-sdk-binding.md @@ -0,0 +1,55 @@ +# Lightweight EventMesh SDK (CloudEvents) + +## Introduction + +[EventMesh(incubating)](https://github.com/apache/incubator-eventmesh) is a dynamic +cloud-native eventing infrastructure. + +[CloudEvents](https://github.com/cloudevents/spec) is a specification for describing +event data in common formats to provide interoperability across services, platforms and systems. + +As of May 2021, EventMesh contains the following +major components: `eventmesh-runtime`, `eventmesh-sdk-java` and `eventmesh-connector-rocketmq`. +For a customer to use EventMesh, `eventmesh-runtime` can be deployed as microservices to transmit +customer's events between event producers and consumers. Customer's applications can then interact +with `eventmesh-runtime` using `eventmesh-sdk-java` to publish/subscribe for events on given topics. + +CloudEvents support has been a highly desired feature by EventMesh users. There are many reasons +for users to prefer using a SDK with CloudEvents support: +- CloudEvents is a more widely accepted and supported way to describe events. `eventmesh-sdk-java` + currently uses the `LiteMessage` structure to describe events, which is less standardized. +- CloudEvents's Java SDK has a wider range of distribution methods. For example, EventMesh users + currently need to use the SDK tarball or build from source for every EventMesh release. With + CloudEvents support, it's easier for users to take a dependency on EventMesh's SDK using CloudEvents's + public distributions (e.g. through a Maven configuration). +- CloudEvents's SDK supports multiple languages. Although EventMesh currently only supports a Java SDK, + in future if more languages need to be supported, the extensions can be easier with experience on + binding Java SDK with CloudEvents. + +## Requirements + +### Functional Requirements + +| Requirement ID | Requirement Description | Comments | +| -------------- | ----------------------- | -------- | +| F-1 | EventMesh users should be able to depend on a public SDK to publish/subscribe events in CloudEvents format | Functionality | +| F-2 | EventMesh users should continue to have access to existing EventMesh client features (e.g. load balancing) with an SDK that supports CloudEvent | Feature Parity | +| F-3 | EventMesh developers should be able to sync `eventmesh-sdk-java` and an SDK with CloudEvents support without much effort/pain | Maintainability | + +### Performance Requirements + +| Requirement ID | Requirement Description | Comments | +| -------------- | ----------------------- | -------- | +| P-1 | Client side latency for SDK with CloudEvents support should be similar to current SDK | | + +## Design Details + +Binding with the CloudEvents Java SDK (similar to what Kafka already did, see Reference for more details) +should be an easy way to achieve the requirements. + +Design details TBD. + +## Appendix + +### References +- https://cloudevents.github.io/sdk-java/kafka diff --git a/docs/en/features/https.md b/docs/en/features/https.md index 93a2dff7b1..247853960f 100644 --- a/docs/en/features/https.md +++ b/docs/en/features/https.md @@ -1,8 +1,8 @@ 1.config in eventmesh-runtime ``` -proxy.properties(add config as follows) -proxy.server.useTls.enabled=true //default value is false +eventMesh.properties(add config as follows) +eventMesh.server.useTls.enabled=true //default value is false config env varible @@ -12,8 +12,8 @@ config env varible ``` +2.config in eventmesh-sdk-java -2.config in eventmesh-sdk-java ``` // create producer LiteClientConfig liteClientConfig = new liteClientConfig(); diff --git a/docs/en/features/request-response-call.md b/docs/en/features/request-response-call.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/en/instructions/eventmesh-runtime-protocol.md b/docs/en/instructions/eventmesh-runtime-protocol.md index 57add5b213..a884a49193 100644 --- a/docs/en/instructions/eventmesh-runtime-protocol.md +++ b/docs/en/instructions/eventmesh-runtime-protocol.md @@ -7,7 +7,7 @@ **Protocol Specification** ``` -Magic Code: 4 bit, defaultValue:WEMQ +Magic Code: 9 bit, defaultValue:EventMesh Protocol Version: 4 bit, defaultValue:0000 @@ -20,8 +20,6 @@ Message Header: the specific header content of message Message Body: the specific body content of message ``` - - #### 2. Message Object in business logic layer * Message Composition @@ -45,13 +43,11 @@ public class Header { } ``` - - * Specificatiion -Message Header(header): The field of Command in Header, used to distinguishing different message types. +Message Header(header): The field of Command in Header, used to distinguishing different message types. -Message Body(body): The message body is defined as different objects according to the message type. +Message Body(body): The message body is defined as different objects according to the message type. | Command | type of Body | | ------------------------------------------------------------ | ------------ | @@ -61,8 +57,6 @@ Message Body(body): The message body is defined as different objects according t | REQUEST_TO_SERVER, REQUEST_TO_CLIENT, RESPONSE_TO_SERVER, RESPONSE_TO_CLIENT, ASYNC_MESSAGE_TO_SERVER, ASYNC_MESSAGE_TO_CLIENT, BROADCAST_MESSAGE_TO_SERVER, BROADCAST_MESSAGE_TO_CLIENT, ASYNC_MESSAGE_TO_CLIENT_ACK, BROADCAST_MESSAGE_TO_CLIENT_ACK, RESPONSE_TO_CLIENT_ACK, REQUEST_TO_CLIENT_ACK | OpenMessage | | REDIRECT_TO_CLIENT | RedirectInfo | - - #### 3. The Interactive Command between Client and Server(Eventmesh-Runtime) ```java @@ -117,8 +111,6 @@ public enum Command { } ``` - - #### 4. Client initiates interaction | Scene | Client Send | Server Reply | Remark | @@ -134,8 +126,6 @@ public enum Command { | Send broadcast msg | BROADCAST_MESSAGE_TO_SERVER | BROADCAST_MESSAGE_TO_SERVER_ACK | | | Client start disconnect | CLIENT_GOODBYE_REQUEST | CLIENT_GOODBYE_RESPONSE | | - - #### 5. Server initiates interaction | Scene | Server Send | Client Reply | Remark | @@ -147,30 +137,25 @@ public enum Command { | Server start disconnect | SERVER_GOODBYE_REQUEST | -- | | | Server send redirect | REDIRECT_TO_CLIENT | -- | | - #### 6. Message classification + Send sync msg ![rr-msg](../../images/protocol/eventmesh-rr-msg.png) - - + Send async msg ![async-msg](../../images/protocol/eventmesh-async-msg.png) - - + Send broadcast msg ![broadcast-msg](../../images/protocol/eventmesh-broadcast-msg.png) - - ## HTTP Protocol Document In Eventmesh-Runtime -The class of `LiteMessage.java` is message definition in http protocal of EventMesh-Runtime.If you want to send msg by using http protocol,you can use client in eventmesh-sdk-java, and you just need care the specific protocol in the field of content. +The class of `LiteMessage.java` is message definition in http protocal of EventMesh-Runtime.If you want to send msg by +using http protocol,you can use client in eventmesh-sdk-java, and you just need care the specific protocol in the field +of content. ```java public class LiteMessage { @@ -189,17 +174,12 @@ public class LiteMessage { } ``` - - #### 1. Message Send and Message Composition - **Request Method**: POST **Message Composition**: RequestHeader + RequestBody - - + Heartbeat Msg **RequestHeader** @@ -226,8 +206,6 @@ public class LiteMessage { | clientType | Producer:clientType is ClientType.PUB,Consumer:clientType is ClientType.SUB | | heartbeatEntities | Heartbeat content,contains topic,url... | - - + Subscribe Msg **RequestHeader** @@ -241,8 +219,6 @@ same with RequestHeader of heartbeat msg | topic | topic of client want to subscribe | | url | url of client, server push msg to the url when receiving msg from other components | - - + Unsubscribe Msg **RequestHeader** @@ -253,8 +229,6 @@ same with RequestHeader of Heartbeat Msg same with RequestBody of Subscribe Msg - - + Send async msg **RequestHeader** @@ -271,18 +245,14 @@ same with RequestHeader of Heartbeat Msg | bizSeqNo | biz sequence number of msg | | uniqueId | unique mark of msg | - - #### 2. Client initiates interaction | Scene | Client Send | Server Reply | Remark | | ------------ | ---------------------------- | --------------------------------------- | ---- | -| Heartbeat | HEARTBEAT(203) | SUCCESS(0)/PROXY_HEARTBEAT_ERROR(19) | | -| Subscribe | SUBSCRIBE(206) | SUCCESS(0)/PROXY_SUBSCRIBE_ERROR(17) | | -| Unsubscribe | UNSUBSCRIBE(207) | SUCCESS(0)/PROXY_UNSUBSCRIBE_ERROR(18) | | -| Send async msg | MSG_SEND_ASYNC(104) | SUCCESS(0)/PROXY_SEND_ASYNC_MSG_ERR(14) | | - - +| Heartbeat | HEARTBEAT(203) | SUCCESS(0)/EVENTMESH_HEARTBEAT_ERROR(19) | | +| Subscribe | SUBSCRIBE(206) | SUCCESS(0)/EVENTMESH_SUBSCRIBE_ERROR(17) | | +| Unsubscribe | UNSUBSCRIBE(207) | SUCCESS(0)/EVENTMESH_UNSUBSCRIBE_ERROR(18) | | +| Send async msg | MSG_SEND_ASYNC(104) | SUCCESS(0)/EVENTMESH_SEND_ASYNC_MSG_ERR(14) | | #### 3. Server initiates interaction diff --git a/docs/en/instructions/eventmesh-runtime-quickstart.md b/docs/en/instructions/eventmesh-runtime-quickstart.md index a41dbea64a..0536e5b6ee 100644 --- a/docs/en/instructions/eventmesh-runtime-quickstart.md +++ b/docs/en/instructions/eventmesh-runtime-quickstart.md @@ -7,40 +7,38 @@ ``` 64bit OS, Linux/Unix is recommended; 64bit JDK 1.8+; -Gradle at least 5.6, eg 5.6.* +Gradle at least 7.0, eg 7.0.* ``` ### 1.2 download sources -download source code from [https://github.com/WeBankFinTech/EventMesh](https://github.com/WeBankFinTech/EventMesh) +download source code from [https://github.com/apache/incubator-eventmesh](https://github.com/apache/incubator-eventmesh) You will get **EventMesh-master.zip** ### 1.3 build sources ```$xslt unzip EventMesh-master.zip -cd /*YOUR DEPLOY PATH*/EventMesh-master/eventmesh-runtime -gradle clean tar -x test +cd /*YOUR DEPLOY PATH*/EventMesh-master +gradle clean dist tar -x test ``` You will get **EventMesh_1.2.0.tar.gz** in directory /* YOUR DEPLOY PATH */EventMesh-master/build ### 1.4 Deployment -- deploy eventmesh-runtime +- deploy eventmesh-runtime ```shell upload Eventmesh_1.2.0.tar.gz tar -zxvf Eventmesh_1.2.0.tar.gz cd conf -config your proxy.properties +config your eventMesh.properties cd ../bin sh start.sh ``` -If you see "ProxyTCPServer[port=10000] started....", you setup runtime successfully. - - +If you see "EventMeshTCPServer[port=10000] started....", you setup runtime successfully. ## 2 Run Locally @@ -65,16 +63,18 @@ Same with 1.2 - eventmesh-sdk-java : eventmesh java client sdk - eventmesh-starter : eventmesh project local start entry -ps:The loading of connector plugin follows the Java SPI mechanism, it's necessary to configure the mapping file of related interface and implementation class under /main/resources/meta-inf/services in the corresponding module +> ps: The loading of connector plugin follows the Java SPI mechanism, it's necessary to configure the mapping file of +related interface and implementation class under /main/resources/meta-inf/services in the corresponding module **2.3.2 Configure VM Options** ```java --Dlog4j.configurationFile=..\eventmesh-runtime\conf\log4j2.xml --Dproxy.log.home=..\eventmesh-runtime\logs --Dproxy.home=..\eventmesh-runtime --DconfPath=..\eventmesh-runtime\conf +-Dlog4j.configurationFile=eventmesh-runtime/conf/log4j2.xml +-Deventmesh.log.home=eventmesh-runtime/logs +-Deventmesh.home=eventmesh-runtime +-DconfPath=eventmesh-runtime/conf ``` +> ps: If you use Windows, you may need to replace the file separator to \ **2.3.3 Configure build.gradle file** @@ -92,11 +92,9 @@ dependencies { **2.3.4 Run** -running `com.webank.eventmesh.starter.StartUp` main method - - +running `org.apache.eventmesh.starter.StartUp` main method -## 3 Run with Docker +## 3 Run with Docker ### 3.1 Pull @@ -106,37 +104,40 @@ execute `docker pull eventmesh/eventmesh-rocketmq:v1.2.0` , you will get EventMe ### 3.2 Config -> **prerequisite** : may be you need download the source code from git first and use the contents of these files(proxy.properties and rocketmq-client.properties) as a reference for the following actions. +> **prerequisite** : may be you need download the source code from git first and use the contents of these files(eventMesh.properties and rocketmq-client.properties) as a reference for the following actions. **3.2.1 Files to configure** Before run the container you should configure some files. -**proxy.properties** +**eventMesh.properties** | Configuration Key | Default Value | Remarks | | ---------------------- | ------------- | -------------------------- | -| proxy.server.http.port | 10105 | EventMesh http server port | -| proxy.server.tcp.port | 10000 | EventMesh tcp server port | +| eventMesh.server.http.port | 10105 | EventMesh http server port | +| eventMesh.server.tcp.port | 10000 | EventMesh tcp server port | **rocketmq-client.properties** | Configuration Key | Default Value | Remarks | | --------------------------------- | ----------------------------- | -------------------------------- | -| proxy.server.rocketmq.namesrvAddr | 127.0.0.1:9876;127.0.0.1:9876 | RocketMQ namesrv default address | +| eventMesh.server.rocketmq.namesrvAddr | 127.0.0.1:9876;127.0.0.1:9876 | RocketMQ namesrv default address | -After pull the EventMesh image to your host machine, you can execute command below to configure **proxy.properties** and **rocketmq-client.properties** +After pull the EventMesh image to your host machine, you can execute command below to configure **eventMesh.properties** +and **rocketmq-client.properties** **3.2.2 Create Files** ```shell mkdir -p /data/eventmesh/rocketmq/conf cd /data/eventmesh/rocketmq/conf -vi proxy.properties +vi eventMesh.properties vi rocketmq-client.properties ``` -The contents of these files can reference from [proxy.properties](https://github.com/WeBankFinTech/EventMesh/blob/develop/eventmesh-runtime/conf/proxy.properties) and [rocketmq-client.properties](https://github.com/WeBankFinTech/EventMesh/blob/develop/eventmesh-runtime/conf/rocketmq-client.properties) +The contents of these files can reference +from [eventMesh.properties](https://github.com/WeBankFinTech/EventMesh/blob/develop/eventmesh-runtime/conf/eventMesh.properties) +and [rocketmq-client.properties](https://github.com/WeBankFinTech/EventMesh/blob/develop/eventmesh-runtime/conf/rocketmq-client.properties) ### 3.3 Run @@ -145,7 +146,7 @@ The contents of these files can reference from [proxy.properties](https://github execute command below to run container ``` -docker run -d -p 10000:10000 -p 10105:10105 -v /data/eventmesh/rocketmq/conf/proxy.properties:/data/app/eventmesh/conf/proxy.properties -v /data/eventmesh/rocketmq/conf/rocketmq-client.properties:/data/app/eventmesh/conf/rocketmq-client.properties docker.io/eventmesh/eventmesh-rocketmq:v1.2.0 +docker run -d -p 10000:10000 -p 10105:10105 -v /data/eventmesh/rocketmq/conf/eventMesh.properties:/data/app/eventmesh/conf/eventMesh.properties -v /data/eventmesh/rocketmq/conf/rocketmq-client.properties:/data/app/eventmesh/conf/rocketmq-client.properties docker.io/eventmesh/eventmesh-rocketmq:v1.2.0 ``` > -p : binding the container port with host machine port @@ -170,7 +171,8 @@ execute `docker exec -it [container id] /bin/bash` you will go into the containe **Prerequisite** :RocketMQ Namesrv & Broker -you can build the rocketmq image following [here](https://github.com/apache/rocketmq-docker) or get the rocketmq image from docker hub. +you can build the rocketmq image following [here](https://github.com/apache/rocketmq-docker) or get the rocketmq image +from docker hub. ``` docker pull rocketmqinc/rocketmq-namesrv:4.5.0-alpine @@ -183,13 +185,15 @@ docker run -d -p 9876:9876 -v `pwd` /data/namesrv/logs:/root/logs -v `pwd`/data/ docker run -d -p 10911:10911 -p 10909:10909 -v `pwd`/data/broker/logs:/root/logs -v `pwd`/data/broker/store:/root/store --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" rocketmqinc/rocketmq-broker:4.5.0-alpine sh mqbroker -c ../conf/broker.conf ``` -When we get this point, **rocketmq-broker ip** is the **pod ip**, if you want to change the ip, you can mount the **broker.conf** file in container and modify **brokerIP1** configuration in this file to your custom values. +When we get this point, **rocketmq-broker ip** is the **pod ip**, if you want to change the ip, you can mount the ** +broker.conf** file in container and modify **brokerIP1** configuration in this file to your custom values. **3.4.1 Run Demo** Windows -- For demos running under the Windows , you can refer [here](https://github.com/WeBankFinTech/EventMesh/blob/develop/docs/en/instructions/eventmesh-sdk-java-quickstart.md) +- For demos running under the Windows , you can + refer [here](https://github.com/WeBankFinTech/EventMesh/blob/develop/docs/en/instructions/eventmesh-sdk-java-quickstart.md) Linux @@ -204,7 +208,7 @@ Linux gradle clean testdist testtar -x test` ``` - you will get **eventmesh-test_1.2.0-SNAPSHOT.tar.gz** under the /eventmesh-test/build + you will get **eventmesh-test_1.2.0-SNAPSHOT.tar.gz** under the /eventmesh-test/build - **Modify configuration files** @@ -217,7 +221,7 @@ Linux - **Run demo** - TCP Sub + TCP Sub ```shell cd bin diff --git a/docs/en/instructions/eventmesh-sdk-java-quickstart.md b/docs/en/instructions/eventmesh-sdk-java-quickstart.md index 8616b49136..53eb673709 100644 --- a/docs/en/instructions/eventmesh-sdk-java-quickstart.md +++ b/docs/en/instructions/eventmesh-sdk-java-quickstart.md @@ -1,55 +1,55 @@ ## How to run eventmesh-sdk-java demo -> Eventmesh-sdk-java , as the client, communicated with eventmesh-runtime, used to complete the sending and receiving of message. +> Eventmesh-sdk-java , as the client, communicated with eventmesh-runtime, used to complete the sending and receiving of message. > -> Eventmesh-sdk-java supports async msg and broadcast msg. Async msg means the producer just sends msg and does not care reply msg.Broadcast msg means the producer send msg once and all the consumer subscribed the broadcast topic will receive the msg. +> Eventmesh-sdk-java supports async msg and broadcast msg. Async msg means the producer just sends msg and does not care reply msg.Broadcast msg means the producer send msg once and all the consumer subscribed the broadcast topic will receive the msg. > -> Eventmesh-sdk-java supports the protocol of HTTP and TCP. +> Eventmesh-sdk-java supports the protocol of HTTP and TCP. TCP demos and Http demos are both under the **eventmesh-test** module. -**prerequisite**:after download the source code you should copy `/conf/application.properties` and `/conf/log4j2.xml` to the `resources` directory +**prerequisite**:after download the source code you should copy `/conf/application.properties` and `/conf/log4j2.xml` to +the `resources` directory ![image-test-structure](../../images/eventmesh-test-structure.png) -### 1. TCP DEMO +### 1. TCP DEMO -#### Async msg +#### Async msg -- create topic FT0-e-80010000-01-1 on rocketmq-console +- create topic TEST-TOPIC-TCP-ASYNC on rocketmq-console -- start consumer ,subscribe topic in previous step. +- start consumer ,subscribe topic in previous step. ``` -Run the main method of com.webank.eventmesh.tcp.demo.AsyncSubscribe +Run the main method of org.apache.eventmesh.tcp.demo.AsyncSubscribe ``` -- start producer, send message - +- start producer, send message ``` -Run the main method of com.webank.eventmesh.tcp.demo.AsyncPublish +Run the main method of org.apache.eventmesh.tcp.demo.AsyncPublish ``` -#### Broadcast msg +#### Broadcast msg -- create topic FT0-e-80030000-01-3 on rocketmq-console +- create topic TEST-TOPIC-TCP-BROADCAST on rocketmq-console -- start consumer ,subscribe topic in previous step. +- start consumer ,subscribe topic in previous step. ``` -Run the main method of com.webank.eventmesh.tcp.demo.AsyncSubscribeBroadcast +Run the main method of org.apache.eventmesh.tcp.demo.AsyncSubscribeBroadcast ``` * start producer, send broadcast message ``` -Run the main method of com.webank.eventmesh.tcp.demo.AsyncPublishBroadcast +Run the main method of org.apache.eventmesh.tcp.demo.AsyncPublishBroadcast ``` ### 2. HTTP DEMO -> As to http, eventmesh-sdk-java implements the pub and sub for async event . +> As to http, eventmesh-sdk-java implements the pub and sub for async event . > > In the demo ,the field of `content` of the java class `LiteMessage` represents a special protocal, so if you want to use http-client of eventmesh-sdk-java, you just need to design the content of protocal and supply the consumer appliacation at the same time. @@ -57,17 +57,20 @@ Run the main method of com.webank.eventmesh.tcp.demo.AsyncPublishBroadcast > producer send the event to consumer and don't need waiting response msg from consumer +- create topic TEST-TOPIC-HTTP-ASYNC on rocketmq-console + - start consumer, subscribe topic - Async consumer demo is a spring boot application demo, you can easily run this demo to start service and subscribe the topic. + Async consumer demo is a spring boot application demo, you can easily run this demo to start service and subscribe the + topic. ``` -Run the main method of com.webank.eventmesh.http.demo.sub.SpringBootDemoApplication +Run the main method of org.apache.eventmesh.http.demo.sub.SpringBootDemoApplication ``` - start producer, produce msg ``` -Run the main method of com.webank.eventmesh.http.demo.AsyncPublishInstance +Run the main method of org.apache.eventmesh.http.demo.AsyncPublishInstance ``` diff --git a/docs/en/instructions/eventmesh-store-quickstart.md b/docs/en/instructions/eventmesh-store-quickstart.md index 8ba16d99aa..74158e85fc 100644 --- a/docs/en/instructions/eventmesh-store-quickstart.md +++ b/docs/en/instructions/eventmesh-store-quickstart.md @@ -1,6 +1,7 @@ # Eventmesh-store Quick start Instruction ### dependencies + ``` 64bit OS, Linux/Unix is recommended; 64bit JDK 1.8+; @@ -9,29 +10,38 @@ Gradle at least 5.6, eg 5.6.* ``` ### download sources + download source code from [https://github.com/WeBankFinTech/DeFiBus](https://github.com/WeBankFinTech/DeFiBus) You will get **DefiBus-master.zip** ### build sources -The eventmesh-store takes DeFiBus for example at the follwing parts, because eventmesh depends on defibus as store layer by default, other implements such as Rocketmq etc. is coming soon. + +The eventmesh-store takes DeFiBus for example at the following parts, because eventmesh depends on defibus as store layer +by default, other implements such as Rocketmq etc. is coming soon. + ``` unzip DefiBus-master.zip cd /*YOUR DEPLOY PATH*/DefiBus-master gradle clean dist tar -x test ``` + You will get **DeFiBus_1.0.0.tar.gz** in directory /* YOUR DEPLOY PATH */DefiBus-master/build ### Deployment -- deploy DeFiBusNamesrv + +- deploy DeFiBusNamesrv + ``` upload DeFiBus_1.0.0.tar.gz tar -zxvf DeFiBus_1.0.0.tar.gz cd bin sh runnamesrv.sh ``` + If you see "Thre Name Server boot success" in ../logs/namesrv.log, you setup DeFiBus Namesrv successfully. - deploy DeFiBusBroker + ``` upload DeFiBus_1.0.0.tar.gz tar -zxvf DeFiBus_1.0.0.tar.gz @@ -40,6 +50,7 @@ config your broker.properties cd ../bin sh runbroker.sh ``` -If you see "The broker \[YOUR-BROKER-NAME, IP:PORT\] boot success." in ../logs/broker.log, -you setup eventmesh-store successfully. + +If you see "The broker \[YOUR-BROKER-NAME, IP:PORT\] boot success." in ../logs/broker.log, you setup eventmesh-store +successfully. diff --git a/docs/en/instructions/quickstart.md b/docs/en/instructions/quickstart.md index cd5de96a29..697dd7c5e4 100644 --- a/docs/en/instructions/quickstart.md +++ b/docs/en/instructions/quickstart.md @@ -1,6 +1,7 @@ # Quick start Instruction ### dependencies + ``` 64bit OS, Linux/Unix is recommended; 64bit JDK 1.8+; @@ -8,10 +9,13 @@ Gradle at least 5.6, eg 5.6.* ``` ### Deploy eventmesh-store + Read more [here](eventmesh-store-quickstart.md) ### Deploy eventmesh-runtime + Read more [here](eventmesh-runtime-quickstart.md) ### Run eventmesh sdk demo + Read more [here](eventmesh-sdk-java-quickstart.md) \ No newline at end of file diff --git a/docs/eventmesh.md b/docs/eventmesh.md index e39cba6546..432c09360d 100644 --- a/docs/eventmesh.md +++ b/docs/eventmesh.md @@ -1,4 +1,5 @@ ## 什么是Event Mesh? + EventMesh是一个动态的云原生事件驱动架构基础设施,用于分离应用程序和后端中间件层,它支持广泛的用例,包括复杂的混合云、使用了不同技术栈的分布式架构。 ![architecture1](images/eventmesh-define.png) @@ -10,8 +11,7 @@ EventMesh是一个动态的云原生事件驱动架构基础设施,用于分 ![architecture2](images/eventmesh-panels.png) -EventMesh允许将来自一个应用程序的事件动态路由到任何其他应用程序. -EventMesh的一般功能: +EventMesh允许将来自一个应用程序的事件动态路由到任何其他应用程序. EventMesh的一般功能: * 事件驱动; * 事件治理; @@ -19,16 +19,18 @@ EventMesh的一般功能: * 云原生; 依赖部件: + * [RocketMQ](https://github.com/apache/rocketmq):RocketMQ是一个分布式消息流平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可伸缩性。 关键部件: + * eventmesh-runtime:一种中间件,用于在事件产生者和使用者之间传输事件,支持云原生应用程序和微服务 * eventmesh-sdk-java:当前支持HTTP和TCP协议,未来会支持gRPC等 - ## 开源地址 + * https://github.com/WeBankFinTech/DeFiBus -* https://github.com/WeBankFinTech/EventMesh +* https://github.com/apache/incubator-eventmesh * https://gitee.com/WeBank/DeFiBus * https://gitee.com/WeBank/EventMesh diff --git a/docs/images/eventmesh-multi-runtime.png b/docs/images/eventmesh-multi-runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b90be7787cd49987440bebab5227f99079d63d GIT binary patch literal 77806 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 literal 0 HcmV?d00001 diff --git a/docs/images/eventmesh-panels.png b/docs/images/eventmesh-panels.png index 7abab9881490bd982f1feb45e3df22f800333bd7..898dbb42ba155629b276d2ae19383c391bd668db 100644 GIT binary patch literal 920415 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�n6bxikHD*|IxQY>K}8Rd)1yZQJemBy;{1tz8I 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

FGUm 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