From ad3f7ff0aba8b48a6458d2e2ee2b8cae9ba79d47 Mon Sep 17 00:00:00 2001 From: mike_xwm Date: Sat, 26 Jun 2021 16:55:30 +0800 Subject: [PATCH] update 1.2.0-release branch code (#399) * 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 * update 1.2.0-release branch code Co-authored-by: Eason Chen Co-authored-by: Steve Yurong Su 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 Co-authored-by: Lan Liang Co-authored-by: nanoxiong Co-authored-by: keranbingaa <397294722@qq.com> --- .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 - CONTRIBUTING.md | 8 +- CONTRIBUTING.zh-CN.md | 8 +- README.md | 30 +- README.zh-CN.md | 35 +- build.gradle | 124 ++- docker/centos7-jdk8/Dockerfile | 19 + docker/eventmesh-rocketmq/Dockerfile | 19 + docs/.vuepress/config.js | 19 + docs/README.md | 15 +- docs/_config.yml | 21 +- docs/cn/README.md | 17 +- docs/cn/features/0-introduction.md | 56 -- docs/cn/features/1-request-response-call.md | 34 - docs/cn/features/10-flow-control.md | 0 docs/cn/features/2-dark-launch.md | 26 - docs/cn/features/3-circuit-break-mechanism.md | 28 - docs/cn/features/4-invoke-service-nearby.md | 34 - docs/cn/features/5-multi-active.md | 21 - docs/cn/features/6-dynamic-adjust-queue.md | 38 - docs/cn/features/7-isolation-mechanism.md | 26 - docs/cn/features/8-fault-tolerant.md | 51 -- docs/cn/features/9-publish-type.md | 33 - docs/cn/features/https.zh-CN.md | 1 - .../eventmesh-runtime-quickstart.zh-CN.md | 16 +- .../eventmesh-sdk-java-quickstart.zh-CN.md | 6 +- docs/cn/instructions/quickstart.zh-CN.md | 6 +- docs/en/README.md | 15 +- docs/en/features/architecture.md | 0 .../eventmesh-cloudevents-sdk-binding.md | 55 ++ docs/en/features/request-response-call.md | 0 .../eventmesh-runtime-quickstart.md | 17 +- .../eventmesh-sdk-java-quickstart.md | 6 +- .../eventmesh-store-quickstart.md | 2 +- docs/eventmesh.md | 2 +- 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/gradle.properties | 2 +- .../apache/eventmesh/common/Constants.java | 6 - .../org/apache/eventmesh/common/IPUtil.java | 2 +- .../eventmesh/common/command/HttpCommand.java | 15 +- .../common/config/CommonConfiguration.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 ++ .../body/client/HeartbeatRequestBody.java | 13 + .../http/body/client/RegRequestBody.java | 9 +- .../body/client/SubscribeRequestBody.java | 26 +- .../body/client/UnSubscribeRequestBody.java | 17 +- .../body/message/ReplyMessageRequestBody.java | 15 +- .../message/SendMessageBatchRequestBody.java | 14 + .../SendMessageBatchV2RequestBody.java | 14 + .../body/message/SendMessageRequestBody.java | 15 +- .../protocol/http/common/ProtocolKey.java | 4 - .../header/client/HeartbeatRequestHeader.java | 30 +- .../client/HeartbeatResponseHeader.java | 30 +- .../http/header/client/RegRequestHeader.java | 26 - .../http/header/client/RegResponseHeader.java | 31 +- .../header/client/SubscribeRequestHeader.java | 26 - .../client/SubscribeResponseHeader.java | 30 +- .../header/client/UnRegRequestHeader.java | 28 - .../header/client/UnRegResponseHeader.java | 29 +- .../client/UnSubscribeRequestHeader.java | 26 - .../client/UnSubscribeResponseHeader.java | 29 +- .../message/PushMessageRequestHeader.java | 26 - .../message/PushMessageResponseHeader.java | 32 +- .../message/ReplyMessageRequestHeader.java | 28 - .../message/ReplyMessageResponseHeader.java | 32 +- .../SendMessageBatchRequestHeader.java | 28 - .../SendMessageBatchResponseHeader.java | 32 +- .../SendMessageBatchV2RequestHeader.java | 28 - .../SendMessageBatchV2ResponseHeader.java | 32 +- .../message/SendMessageRequestHeader.java | 28 - .../message/SendMessageResponseHeader.java | 32 +- .../common/protocol/tcp/Subscription.java | 12 +- .../common/protocol/tcp/UserAgent.java | 30 +- .../RandomLoadBalanceSelectorTest.java | 63 ++ ...ightRoundRobinLoadBalanceSelectorTest.java | 64 ++ eventmesh-connector-api/gradle.properties | 2 +- .../apache/eventmesh/api/EventMeshAction.java | 8 +- .../api/EventMeshAsyncConsumeContext.java | 40 + .../api/consumer/MeshMQPushConsumer.java | 7 - .../api/producer/MeshMQProducer.java | 9 +- .../gradle.properties | 2 +- .../connector/rocketmq/common/Constants.java | 5 +- .../rocketmq/common/EventMeshConstants.java | 5 - .../rocketmq/consumer/PushConsumerImpl.java | 57 +- .../consumer/RocketMQConsumerImpl.java | 10 +- .../producer/RocketMQProducerImpl.java | 17 +- .../consumer/PushConsumerImplTest.java | 4 +- ...ache.io.openmessaging.MessagingAccessPoint | 19 + ....apache.io.openmessaging.producer.Producer | 19 + eventmesh-runtime/conf/eventmesh.properties | 4 +- eventmesh-runtime/scripts/client_manage.sh | 22 +- eventmesh-runtime/scripts/session.sh | 5 +- .../controller/ClientManageController.java | 747 +----------------- .../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 | 16 +- .../runtime/boot/EventMeshHTTPServer.java | 4 +- .../runtime/boot/EventMeshServer.java | 1 - .../runtime/boot/EventMeshTCPServer.java | 23 +- .../EventMeshTCPConfiguration.java | 26 +- .../runtime/constants/DeFiBusConstant.java | 72 -- .../runtime/constants/EventMeshConstants.java | 7 - .../consumergroup/ConsumerGroupTopicConf.java | 18 +- .../core/plugin/MQConsumerWrapper.java | 12 - .../http/consumer/ConsumerGroupManager.java | 18 +- .../http/consumer/ConsumerManager.java | 27 +- .../http/consumer/EventMeshConsumer.java | 41 +- .../http/consumer/HandleMsgContext.java | 23 +- .../processor/BatchSendMessageProcessor.java | 15 +- .../BatchSendMessageV2Processor.java | 10 +- .../http/processor/HeartBeatProcessor.java | 10 +- .../http/processor/ReplyMessageProcessor.java | 8 +- .../processor/SendAsyncMessageProcessor.java | 8 +- .../processor/SendSyncMessageProcessor.java | 10 +- .../http/processor/SubscribeProcessor.java | 68 +- .../http/processor/UnSubscribeProcessor.java | 85 +- .../protocol/http/processor/inf/Client.java | 4 - .../http/producer/EventMeshProducer.java | 3 +- .../http/push/AsyncHTTPPushRequest.java | 5 +- .../tcp/client/group/ClientGroupWrapper.java | 220 +++--- .../group/ClientSessionGroupMapping.java | 161 ++-- .../FreePriorityDispatchStrategy.java | 13 +- .../protocol/tcp/client/session/Session.java | 76 +- .../tcp/client/session/SessionContext.java | 5 +- .../client/session/push/ClientAckContext.java | 5 +- .../session/push/DownStreamMsgContext.java | 19 +- .../tcp/client/session/push/PushContext.java | 27 +- .../client/session/push/SessionPusher.java | 89 +-- .../push/retry/EventMeshTcpRetryer.java | 29 +- .../protocol/tcp/client/task/HelloTask.java | 10 + .../tcp/client/task/MessageAckTask.java | 11 +- .../tcp/client/task/MessageTransferTask.java | 4 - .../tcp/client/task/SubscribeTask.java | 21 +- .../tcp/client/task/UnSubscribeTask.java | 8 +- .../metrics/tcp/EventMeshTcpMonitor.java | 11 +- .../eventmesh/runtime/util/EventMeshUtil.java | 106 +-- .../runtime/util/MessageClientIDSetter.java | 223 ------ .../eventmesh/runtime/util/NetUtils.java | 72 ++ .../src/test/java/client/EventMeshClient.java | 10 +- .../src/test/java/client/SubClient.java | 10 +- .../java/client/common/ClientConstants.java | 6 +- .../test/java/client/common/MessageUtils.java | 40 +- .../java/client/common/UserAgentUtils.java | 3 - .../java/client/impl/EventMeshClientImpl.java | 17 +- .../test/java/client/impl/SubClientImpl.java | 37 +- .../src/test/java/demo/AsyncSubClient.java | 4 +- .../test/java/demo/BroadCastSubClient.java | 4 +- .../src/test/java/demo/CCSubClient.java | 4 +- .../src/test/java/demo/CClientDemo.java | 16 +- .../src/test/java/demo/SyncPubClient.java | 2 +- .../src/test/java/demo/SyncSubClient.java | 4 +- .../RedirectClientByIpPortHandlerTest.java | 59 ++ eventmesh-sdk-java/gradle.properties | 2 +- .../client/http/AbstractLiteClient.java | 66 +- .../eventmesh/client/http/RemotingServer.java | 3 +- .../client/http/conf/LiteClientConfig.java | 92 ++- .../client/http/consumer/LiteConsumer.java | 82 +- .../consumer/context/LiteConsumeContext.java | 28 +- .../client/http/producer/LiteProducer.java | 55 +- .../http/util/HttpLoadBalanceUtils.java | 83 ++ .../eventmesh/client/tcp/EventMeshClient.java | 4 +- .../eventmesh/client/tcp/SimpleSubClient.java | 4 +- .../client/tcp/common/MessageUtils.java | 28 +- .../tcp/impl/DefaultEventMeshClient.java | 6 +- .../client/tcp/impl/SimpleSubClientImpl.java | 22 +- .../http/demo/AsyncPublishInstance.java | 4 +- .../http/demo/AsyncSyncRequestInstance.java | 4 +- .../client/http/demo/SyncRequestInstance.java | 2 +- .../http/util/HttpLoadBalanceUtilsTest.java | 47 ++ .../tcp/common/EventMeshTestCaseTopicSet.java | 6 +- .../client/tcp/common/EventMeshTestUtils.java | 6 +- .../client/tcp/demo/AsyncSubscribe.java | 4 +- .../tcp/demo/AsyncSubscribeBroadcast.java | 4 +- .../client/tcp/demo/SyncResponse.java | 4 +- eventmesh-starter/gradle.properties | 2 +- eventmesh-test/gradle.properties | 2 +- .../http/demo/AsyncPublishInstance.java | 9 +- .../http/demo/AsyncSyncRequestInstance.java | 4 +- .../http/demo/SyncRequestInstance.java | 2 +- .../demo/sub/controller/SubController.java | 7 + .../http/demo/sub/service/SubService.java | 82 +- .../tcp/common/EventMeshTestCaseTopicSet.java | 6 +- .../tcp/common/EventMeshTestUtils.java | 9 +- .../eventmesh/tcp/demo/AsyncSubscribe.java | 4 +- .../tcp/demo/AsyncSubscribeBroadcast.java | 4 +- .../eventmesh/tcp/demo/SyncResponse.java | 5 +- gradle.properties | 2 +- gradlew | 26 +- gradlew.bat | 25 +- install.sh | 18 + 213 files changed, 3539 insertions(+), 3412 deletions(-) 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 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/logo1.png create mode 100644 docs/images/logo2.png 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 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 rename eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/core/consumergroup/event/ConsumerGroupInstanceChangeEvent.java => eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAction.java (87%) create mode 100644 eventmesh-connector-api/src/main/java/org/apache/eventmesh/api/EventMeshAsyncConsumeContext.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 delete mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/constants/DeFiBusConstant.java delete mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/util/MessageClientIDSetter.java create mode 100644 eventmesh-runtime/src/main/java/org/apache/eventmesh/runtime/util/NetUtils.java create mode 100644 eventmesh-runtime/src/test/java/org/apache/eventmesh/runtime/admin/handler/RedirectClientByIpPortHandlerTest.java create mode 100644 eventmesh-sdk-java/src/main/java/org/apache/eventmesh/client/http/util/HttpLoadBalanceUtils.java create mode 100644 eventmesh-sdk-java/src/test/java/org/apache/eventmesh/client/http/util/HttpLoadBalanceUtilsTest.java 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 b29e0806f6..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 a6b1867585..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -dist: trusty - -language: java -jdk: - - oraclejdk8 - -script: - - travis_retry ./gradlew clean build - -#after_success: -# - ./gradlew clean - -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/CONTRIBUTING.md b/CONTRIBUTING.md index bfa29b93e5..68c870c4b2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,7 +32,7 @@ Here are the workflow for contributors: 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) +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. @@ -41,11 +41,11 @@ 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 +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 diff --git a/CONTRIBUTING.zh-CN.md b/CONTRIBUTING.zh-CN.md index 03bec9c925..742ccbdc32 100644 --- a/CONTRIBUTING.zh-CN.md +++ b/CONTRIBUTING.zh-CN.md @@ -29,7 +29,7 @@ 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后,将为拉取请求分配一个或多个审阅者。 审阅者将审阅代码。 @@ -38,10 +38,10 @@ ### 打开问题/ PR 我们将使用Issues和Pull Requests作为跟踪器 -[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) -[Pull Requests](https://github.com/WeBankFinTech/EventMesh/pulls) +[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包含较大的更改,例如组件重构或新组件,请写详细文档 有关其设计和使用的信息。 diff --git a/README.md b/README.md index d6429cc1d6..43cfc861ab 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ -[![Build Status](https://www.travis-ci.org/apache/incubator-eventmesh.svg?branch=develop)](https://www.travis-ci.org/github/apache/incubator-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(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. @@ -22,17 +26,6 @@ EventMesh(incubating) is a dynamic cloud-native eventing infrastruture used to d ![architecture2](docs/images/eventmesh-panels.png) -The EventMesh(incubating) allows events from one application to be dynamically routed to any other application. -General functions of the eventmesh: - -* Event driven; -* Event governance; -* Event routing; -* Flow control; -* Load balance; -* Pluggable; -* Cloud native; -* Gateway **Support connecting event store:** @@ -41,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 | @@ -54,7 +48,7 @@ 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.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| diff --git a/README.zh-CN.md b/README.zh-CN.md index 76c450e78b..8dadfaa24a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,10 +1,15 @@ -[![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生态:** @@ -18,15 +23,6 @@ EventMesh是一个动态的云原生事件驱动架构基础设施,用于分 ![architecture2](docs/images/eventmesh-panels.png) -Event Mesh允许将来自一个应用程序的事件动态路由到任何其他应用程序. -Event Mesh的一般功能: -* 事件驱动; -* 事件治理; -* 动态路由; -* 云原生; -* 流控; -* 负载均衡 - **支持连接的事件存储:** * [RocketMQ](https://github.com/apache/rocketmq):RocketMQ是一个分布式消息流平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可伸缩性。 @@ -35,7 +31,8 @@ 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作为事件存储,实现事件的发布与订阅 **通信协议:** @@ -47,7 +44,7 @@ eventmesh的通信协议更加简洁方便,详细内容,阅读更多[这里] | 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.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| @@ -76,7 +73,15 @@ eventmesh的通信协议更加简洁方便,详细内容,阅读更多[这里] ## 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/build.gradle b/build.gradle index e285ba43e8..12a2b005e9 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,6 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } - } dependencies { @@ -41,7 +40,6 @@ allprojects { apply plugin: "eclipse" apply plugin: "idea" apply plugin: "project-reports" - apply plugin: "maven" apply plugin: "maven-publish" apply plugin: "com.github.spotbugs" apply plugin: "project-reports" @@ -50,6 +48,7 @@ allprojects { apply plugin: "java-library" apply plugin: 'signing' +// print(project) // if (project.findProperty("jdk") == "1.7") { // sourceCompatibility = 1.7 // targetCompatibility = 1.7 @@ -59,12 +58,10 @@ allprojects { // targetCompatibility = 1.8 // version = version + "-jdk8" // } - [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' compileJava.options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - clean.doFirst { delete 'build' delete 'dist' @@ -74,7 +71,6 @@ allprojects { if ((project.findProperty("snapshot") instanceof String) && (Boolean.valueOf(project.property("snapshot")))) { version = version + "-SNAPSHOT" } - } task tar(type: Tar) { @@ -97,7 +93,6 @@ task zip(type: Zip) { } } - subprojects { List fastjson = [ @@ -135,6 +130,13 @@ subprojects { "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", @@ -152,13 +154,12 @@ subprojects { ] dependencies { - implementation apache_commons, guava, log, fastjson, jackson, common, httpclient, netty - testImplementation apache_commons, guava, log, fastjson, jackson, common, junit, assertj, mock, httpclient, netty + 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'] @@ -176,17 +177,13 @@ subprojects { jacoco { toolVersion = "0.8.6" - reportsDir = file("$buildDir/reports/jacoco") } 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") + html.enabled false } } @@ -204,7 +201,7 @@ subprojects { // html.enabled true // } // } - +// // sourceSets { // main { // java { @@ -227,11 +224,8 @@ subprojects { // } // // } -// -// // } - spotbugs { //toolVersion = '4.2.3' ignoreFailures = true @@ -295,10 +289,10 @@ subprojects { jar { manifest { attributes("Specification-Version": project.version, - "Specification-Vendor": "Apache", + "Specification-Vendor": "WeBank, Inc.", "Specification-Title": project.name, "Implementation-Version": project.version, - "Implementation-Vendor": "Apache", + "Implementation-Vendor": "WeBank, Inc.", "Implementation-Title": project.name, "Build-Jdk": project.findProperty("jdk") ) @@ -325,7 +319,7 @@ subprojects { } copy { into '../dist/lib' - from project.configurations.runtime + from project.configurations.runtimeClasspath exclude '**/*.properties*' exclude '**/*testng*.jar' exclude '**/*powermock*.jar' @@ -383,12 +377,6 @@ subprojects { } } - signing { - sign packageJavadoc, packageSources, jar - } - - - repositories { maven { url "https://maven.aliyun.com/repository/public" } mavenCentral() @@ -401,56 +389,62 @@ subprojects { resolutionStrategy.cacheDynamicVersionsFor 0, TimeUnit.SECONDS } - - uploadArchives { - repositories { - mavenDeployer { - beforeDeployment { - MavenDeployment deployment -> signing.signPom(deployment) - } - // 指定上传的路径 - def releaseRepo = 'https://repository.apache.org/content/repositories/releases/' - def snapshotsRepo = 'https://repository.apache.org/content/repositories/snapshots/' - repository(url: releaseRepo) { - authentication(userName: apacheUserName, password: apachePassWord) - } - - snapshotRepository(url: snapshotsRepo) { - authentication(userName: apacheUserName, password: apachePassWord) - } - - - pom.project { - name 'Apache EventMesh' - packaging 'jar' - // optionally artifactId can be defined here - description 'Apache EventMesh' - url 'https://github.com/apache/incubator-eventmesh' - - 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' + 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' + 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/' + 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 1f6bad1330..870c593b08 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -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. + */ + module.exports = { title: 'EventMesh', description: 'EventMesh', diff --git a/docs/README.md b/docs/README.md index 9e8b030a18..5909122319 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,9 @@ -[![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) @@ -63,13 +66,13 @@ Key components: 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). + instruction ['eventmesh-runtime quickstart'](en/instructions/eventmesh-runtime-quickstart.md). 3. Run eventmesh-sdk-java demo, see - instruction ['eventmesh-sdk-java quickstart'](instructions/eventmesh-sdk-java-quickstart.md). + 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 +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) 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 8b19f4de3b..3aae2a3726 100644 --- a/docs/cn/README.md +++ b/docs/cn/README.md @@ -1,6 +1,9 @@ -[![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? @@ -56,15 +59,15 @@ Event Mesh允许将来自一个应用程序的事件动态路由到任何其他 ## 快速开始 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)了解详细指南 +永远欢迎参与共建, 请参阅[贡献](../../CONTRIBUTING.zh-CN.md)了解详细指南 您可以从问题开始. -[GitHub Issues](https://github.com/WeBankFinTech/EventMesh/issues) +[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) ## License diff --git a/docs/cn/features/0-introduction.md b/docs/cn/features/0-introduction.md deleted file mode 100644 index 7df673178a..0000000000 --- a/docs/cn/features/0-introduction.md +++ /dev/null @@ -1,56 +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定位服务使用。 - -* **EventMesh**:服务代理(EventMesh)提供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 10166d74ef..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 148838614e..0000000000 --- a/docs/cn/features/2-dark-launch.md +++ /dev/null @@ -1,26 +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 3ae2f7a635..0000000000 --- a/docs/cn/features/3-circuit-break-mechanism.md +++ /dev/null @@ -1,28 +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 4a24248fd6..0000000000 --- a/docs/cn/features/4-invoke-service-nearby.md +++ /dev/null @@ -1,34 +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 9e19d6d7cc..0000000000 --- a/docs/cn/features/5-multi-active.md +++ /dev/null @@ -1,21 +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 287fa7fc54..0000000000 --- a/docs/cn/features/6-dynamic-adjust-queue.md +++ /dev/null @@ -1,38 +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 3c86bc9aaf..0000000000 --- a/docs/cn/features/7-isolation-mechanism.md +++ /dev/null @@ -1,26 +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 6814e12c34..0000000000 --- a/docs/cn/features/8-fault-tolerant.md +++ /dev/null @@ -1,51 +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 18ddd6bfe2..0000000000 --- a/docs/cn/features/9-publish-type.md +++ /dev/null @@ -1,33 +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 044e89bf53..fa1244f949 100644 --- a/docs/cn/features/https.zh-CN.md +++ b/docs/cn/features/https.zh-CN.md @@ -9,7 +9,6 @@ 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 中配置 diff --git a/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md b/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md index b6bc593603..adc9703796 100644 --- a/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md +++ b/docs/cn/instructions/eventmesh-runtime-quickstart.zh-CN.md @@ -7,7 +7,7 @@ ``` 建议使用64位操作系统,建议使用Linux / Unix; 64位JDK 1.8+; -Gradle至少为5.6, 推荐 5.6.* +Gradle至少为7.0, 推荐 7.0.* ``` ### 1.2 下载源码 @@ -19,7 +19,7 @@ Gradle至少为5.6, 推荐 5.6.* ```$ xslt unzip EventMesh-master.zip -cd / *您的部署路径* /EventMesh-master/eventmesh-runtime +cd / *您的部署路径* /EventMesh-master gradle clean dist tar -x test ``` @@ -68,11 +68,12 @@ sh start.sh **2.3.2 配置VM启动参数** ```java --Dlog4j.configurationFile=..\eventmesh-runtime\conf\log4j2.xml --Deventmesh.log.home=..\eventmesh-runtime\logs --Deventmesh.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文件** @@ -190,8 +191,7 @@ docker run -d -p 10911:10911 -p 10909:10909 -v `pwd`/data/broker/logs:/root/logs Windows -- -Windows系统下运行示例可以参考[这里](https://github.com/apache/incubator-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 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 43df03320f..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,7 +16,7 @@ TCP 和 Http 示例都在**eventmesh-test**模块下

异步消息

-- 创建主题FT0-e-80010000-01-1,可以通过rocketmq-console或者rocketmq tools 命令 +- 创建主题TEST-TOPIC-TCP-ASYNC,可以通过rocketmq-console或者rocketmq tools 命令 - 启动消费者,订阅上一步骤已经创建的Topic @@ -32,7 +32,7 @@ TCP 和 Http 示例都在**eventmesh-test**模块下

广播消息

-- 创建主题FT0-e-80030000-01-3,可以通过rocketmq-console或者rocketmq tools 命令 +- 创建主题TEST-TOPIC-TCP-BROADCAST,可以通过rocketmq-console或者rocketmq tools 命令 - 启动消费端,订阅上一步骤已经创建的Topic @@ -56,7 +56,7 @@ TCP 和 Http 示例都在**eventmesh-test**模块下 > 生产者将事件发送给下游即可,无需等待响应 -- 创建主题FT0-e-80010001-01-1,可以通过rocketmq-console或者rocketmq tools 命令 +- 创建主题TEST-TOPIC-HTTP-ASYNC,可以通过rocketmq-console或者rocketmq tools 命令 - 启动消费端,订阅Topic 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 254cd2a195..1b8d3c1178 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -1,9 +1,12 @@ -[![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? @@ -72,10 +75,10 @@ Key components: ## Contributing -Contributions are always welcomed! Please see [CONTRIBUTING](CONTRIBUTING.md) for detailed guidelines +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) +[GitHub Issues](https://github.com/apache/incubator-eventmesh/issues) ## License 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/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-quickstart.md b/docs/en/instructions/eventmesh-runtime-quickstart.md index 3b1e1090ca..0536e5b6ee 100644 --- a/docs/en/instructions/eventmesh-runtime-quickstart.md +++ b/docs/en/instructions/eventmesh-runtime-quickstart.md @@ -7,7 +7,7 @@ ``` 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 @@ -19,8 +19,8 @@ You will get **EventMesh-master.zip** ```$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 @@ -63,17 +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 +> 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 --Deventmesh.log.home=..\eventmesh-runtime\logs --Deventmesh.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** diff --git a/docs/en/instructions/eventmesh-sdk-java-quickstart.md b/docs/en/instructions/eventmesh-sdk-java-quickstart.md index a754502aa8..53eb673709 100644 --- a/docs/en/instructions/eventmesh-sdk-java-quickstart.md +++ b/docs/en/instructions/eventmesh-sdk-java-quickstart.md @@ -17,7 +17,7 @@ the `resources` directory #### 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. @@ -33,7 +33,7 @@ Run the main method of org.apache.eventmesh.tcp.demo.AsyncPublish #### 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. @@ -57,7 +57,7 @@ Run the main method of org.apache.eventmesh.tcp.demo.AsyncPublishBroadcast > producer send the event to consumer and don't need waiting response msg from consumer -- create topic FT0-e-80010001-01-1 on rocketmq-console +- create topic TEST-TOPIC-HTTP-ASYNC on rocketmq-console - start consumer, subscribe topic diff --git a/docs/en/instructions/eventmesh-store-quickstart.md b/docs/en/instructions/eventmesh-store-quickstart.md index b5fd94fbf3..74158e85fc 100644 --- a/docs/en/instructions/eventmesh-store-quickstart.md +++ b/docs/en/instructions/eventmesh-store-quickstart.md @@ -16,7 +16,7 @@ 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 +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. ``` diff --git a/docs/eventmesh.md b/docs/eventmesh.md index 9460476259..432c09360d 100644 --- a/docs/eventmesh.md +++ b/docs/eventmesh.md @@ -30,7 +30,7 @@ EventMesh允许将来自一个应用程序的事件动态路由到任何其他 ## 开源地址 * 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-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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