This is an automated email from the ASF dual-hosted git repository. jinrongtong pushed a commit to branch new-official-website in repository https://gitbox.apache.org/repos/asf/rocketmq-site.git
The following commit(s) were added to refs/heads/new-official-website by this push: new 6d478d42fa Add English version for Docker Deployment 5.x (#658) 6d478d42fa is described below commit 6d478d42fa74294b62c124fefd79f017ba520daa Author: CindyXC <72009468+cindy0...@users.noreply.github.com> AuthorDate: Sun Jun 2 20:25:29 2024 +0800 Add English version for Docker Deployment 5.x (#658) Co-authored-by: XCii1 <13015886...@139.com> --- .../02-quickStart/02quickstartwithDocker.md | 245 +++++++++++++++++++++ 1 file changed, 245 insertions(+) diff --git a/i18n/en/docusaurus-plugin-content-docs/version-5.0/02-quickStart/02quickstartwithDocker.md b/i18n/en/docusaurus-plugin-content-docs/version-5.0/02-quickStart/02quickstartwithDocker.md new file mode 100644 index 0000000000..40b7fca624 --- /dev/null +++ b/i18n/en/docusaurus-plugin-content-docs/version-5.0/02-quickStart/02quickstartwithDocker.md @@ -0,0 +1,245 @@ +# Docker Deployment of RocketMQ + +This section introduces how to quickly deploy a single-node, single-replica RocketMQ service using Docker and complete simple message sending and receiving. + +:::tip System Requirements + +1. 64-bit operating system +2. 64-bit JDK 1.8+ + +::: + +## 1.Pull RocketMQ Image +Here, we take the RocketMQ 5.2.0 version image from [dockerhub](https://hub.docker.com/r/apache/rocketmq/tags) as an example to introduce the deployment process. + +```shell +docker pull apache/rocketmq:5.2.0 +``` + +## 2.Create a Shared Network for Containers +RocketMQ involves multiple services and requires multiple containers. Creating a Docker network facilitates communication between containers. + +```shell +docker network create rocketmq +``` + +## 3.Start NameServer + +```shell +# Start NameServer +docker run -d --name rmqnamesrv -p 9876:9876 --network rocketmq apache/rocketmq:5.2.0 sh mqnamesrv + +# Verify if NameServer started successfully +docker logs -f rmqnamesrv +``` +:::info + +Once we see **'The Name Server boot success..'** from namesrv.log, it means the NameServer has been started successfully. + +::: + +## 4.Start Broker and Proxy +After nameserver startup, we proceed to start the Broker and Proxy. + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +<Tabs> +<TabItem value="Linux" label="Linux" default > + +```code +# Configure the broker's IP address +echo "brokerIP1=127.0.0.1" > broker.conf + +# Start the Broker and Proxy +docker run -d \ +--name rmqbroker \ +--network rocketmq \ +-p 10912:10912 -p 10911:10911 -p 10909:10909 \ +-p 8080:8080 -p 8081:8081 \ +-e "NAMESRV_ADDR=rmqnamesrv:9876" \ +-v ./broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf \ +apache/rocketmq:5.2.0 sh mqbroker --enable-proxy \ +-c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf + +# Verify if Broker started successfully +docker exec -it rmqbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log" +``` +</TabItem> +<TabItem value="Windows" label="Windows"> + +```code +# Configure the broker's IP address +echo "brokerIP1=127.0.0.1" > broker.conf + +# Start the Broker and Proxy +docker run -d ^ +--name rmqbroker ^ +--net rocketmq ^ +-p 10912:10912 -p 10911:10911 -p 10909:10909 ^ +-p 8080:8080 -p 8081:8081 \ +-e "NAMESRV_ADDR=rmqnamesrv:9876" ^ +-v %cd%\broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf ^ +apache/rocketmq:5.2.0 sh mqbroker --enable-proxy \ +-c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf + +# Verify if Broker started successfully +docker exec -it rmqbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log" +``` + +</TabItem> + +</Tabs> + + +:::info + +Once we see **'The broker[brokerName,ip:port] boot success..'** from proxy.log, it means the Broker has been started successfully. + +::: + +:::note + +Thus far, a single-Master RocketMQ cluster has been deployed, and we are able to send and receive simple messages. + +::: + +## 5.Send and Receive Messages with SDK + +We can also try to use the client sdk to send and receive messages, you can see more details from <a href='https://github.com/apache/rocketmq-clients'>rocketmq-clients</a>. + +1. Create a java project. + +2. Add sdk dependency to *pom.xml*, remember to replace the `rocketmq-client-java-version` with the <a href='https://search.maven.org/search?q=g:org.apache.rocketmq%20AND%20a:rocketmq-client-java'>latest release</a>. + + ```xml + <dependency> + <groupId>org.apache.rocketmq</groupId> + <artifactId>rocketmq-client-java</artifactId> + <version>${rocketmq-client-java-version}</version> + </dependency> + ``` + +3. Enter the broker container and create a Topic using mqadmin. + + ```shell + $ docker exec -it rmqbroker bash + $ sh mqadmin updatetopic -t TestTopic -c DefaultCluster + ``` + +4. In the created Java project, create and run a program to send a normal message. The sample code is as follows: + + ```java + import org.apache.rocketmq.client.apis.ClientConfiguration; + import org.apache.rocketmq.client.apis.ClientConfigurationBuilder; + import org.apache.rocketmq.client.apis.ClientException; + import org.apache.rocketmq.client.apis.ClientServiceProvider; + import org.apache.rocketmq.client.apis.message.Message; + import org.apache.rocketmq.client.apis.producer.Producer; + import org.apache.rocketmq.client.apis.producer.SendReceipt; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; + + public class ProducerExample { + private static final Logger logger = LoggerFactory.getLogger(ProducerExample.class); + + public static void main(String[] args) throws ClientException { + // Endpoint address, set to the Proxy address and port list, usually xxx:8080;xxx:8081 + String endpoint = "localhost:8081"; + // The target topic name for message sending, which needs to be created in advance. + String topic = "TestTopic"; + ClientServiceProvider provider = ClientServiceProvider.loadService(); + ClientConfigurationBuilder builder = ClientConfiguration.newBuilder().setEndpoints(endpoint); + ClientConfiguration configuration = builder.build(); + // When initializing Producer, communication configuration and pre-bound Topic need to be set. + Producer producer = provider.newProducerBuilder() + .setTopics(topic) + .setClientConfiguration(configuration) + .build(); + // Sending a normal message. + Message message = provider.newMessageBuilder() + .setTopic(topic) + // Set the message index key, which can be used to accurately find a specific message. + .setKeys("messageKey") + // Set the message Tag, used by the consumer to filter messages by specified Tag. + .setTag("messageTag") + // Message body + .setBody("messageBody".getBytes()) + .build(); + try { + // Send the message, paying attention to the sending result and catching exceptions. + SendReceipt sendReceipt = producer.send(message); + logger.info("Send message successfully, messageId={}", sendReceipt.getMessageId()); + } catch (ClientException e) { + logger.error("Failed to send message", e); + } + // producer.close(); + } + } + ``` + +5. In the created Java project, create and run a program to subscribe to normal messages. Apache RocketMQ supports both [SimpleConsumer](https://rocketmq.apache.org/zh/docs/featureBehavior/06consumertype) and [PushConsumer](https://rocketmq.apache.org/zh/docs/featureBehavior/06consumertype) types of consumers. You can choose either method to subscribe to messages. + +```java +import java.io.IOException; +import java.util.Collections; +import org.apache.rocketmq.client.apis.ClientConfiguration; +import org.apache.rocketmq.client.apis.ClientException; +import org.apache.rocketmq.client.apis.ClientServiceProvider; +import org.apache.rocketmq.client.apis.consumer.ConsumeResult; +import org.apache.rocketmq.client.apis.consumer.FilterExpression; +import org.apache.rocketmq.client.apis.consumer.FilterExpressionType; +import org.apache.rocketmq.client.apis.consumer.PushConsumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PushConsumerExample { + private static final Logger logger = LoggerFactory.getLogger(PushConsumerExample.class); + + private PushConsumerExample() { + } + + public static void main(String[] args) throws ClientException, IOException, InterruptedException { + final ClientServiceProvider provider = ClientServiceProvider.loadService(); + // Endpoint address, set to the Proxy address and port list, usually xxx:8080;xxx:8081 + String endpoints = "localhost:8081"; + ClientConfiguration clientConfiguration = ClientConfiguration.newBuilder() + .setEndpoints(endpoints) + .build(); + // Subscription message filtering rule, indicating subscription to all Tag messages. + String tag = "*"; + FilterExpression filterExpression = new FilterExpression(tag, FilterExpressionType.TAG); + // Specify the consumer group the consumer belongs to, Group needs to be created in advance. + String consumerGroup = "YourConsumerGroup"; + // Specify which target Topic to subscribe to, Topic needs to be created in advance. + String topic = "TestTopic"; + // Initialize PushConsumer + PushConsumer pushConsumer = provider.newPushConsumerBuilder() + .setClientConfiguration(clientConfiguration) + // Set the consumer group + .setConsumerGroup(consumerGroup) + // Set pre-bound subscription relationship + .setSubscriptionExpressions(Collections.singletonMap(topic, filterExpression)) + // Set the message listener + .setMessageListener(messageView -> { + // Handle messages and return the consumption result + logger.info("Consume message successfully, messageId={}", messageView.getMessageId()); + return ConsumeResult.SUCCESS; + }) + .build(); + Thread.sleep(Long.MAX_VALUE); + // If PushConsumer is no longer needed, this instance can be closed. + // pushConsumer.close(); + } +} +``` + +## 6. Stop the Containers +After completing the experiment, we can stop the containers as follows. +```shell +# Stop the NameServer container +docker stop rmqnamesrv + +# Stop the Broker container +docker stop rmqbroker +``` \ No newline at end of file