美文网首页
RocketMQ 生产者

RocketMQ 生产者

作者: isuntong | 来源:发表于2020-02-19 22:44 被阅读0次

    概述

    RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

    由于本教程整个案例基于 Spring Cloud,故我们采用 Spring Cloud Stream 完成一次发布和订阅

    官方教程

    Spring Cloud Stream

    Spring Cloud Stream 是一个用于构建基于消息的微服务应用框架。它基于 Spring Boot 来创建具有生产级别的单机 Spring 应用,并且使用 Spring Integration 与 Broker 进行连接。

    Spring Cloud Stream 提供了消息中间件配置的统一抽象,推出了 publish-subscribeconsumer groupspartition 这些统一的概念。

    Spring Cloud Stream 内部有两个概念:

    • Binder: 跟外部消息中间件集成的组件,用来创建 Binding,各消息中间件都有自己的 Binder 实现。
    • Binding: 包括 Input Binding 和 Output Binding。

    Binding 在消息中间件与应用程序提供的 Provider 和 Consumer 之间提供了一个桥梁,实现了开发者只需使用应用程序的 Provider 或 Consumer 生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。

    解决连接超时问题

    在之前我们采用 Docker 部署了 RocketMQ 服务,此时 RocketMQ Broker 暴露的地址和端口(10909,10911)是基于容器的,会导致我们开发机无法连接,从而引发 org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout 异常

    注意下图中的 IP 地址,这个是容器的 IP,开发机与容器不在一个局域网所以无法连接。

    解决方案是在 broker.conf 配置文件中增加 brokerIP1=宿主机IP 即可

    POM

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>com.suntong</groupId>
            <artifactId>myshop-dependencies</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <relativePath>../myshop-dependencies/pom.xml</relativePath>
        </parent>
    
        <artifactId>myshop-service-rocketmq-provider</artifactId>
        <packaging>jar</packaging>
    
        <name>myshop-service-rocketmq-provider</name>
        <url>http://www.suntong.com</url>
        <inceptionYear>2018-Now</inceptionYear>
    
        <dependencies>
            <!-- Spring Boot Begin -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- Spring Boot End -->
    
            <!-- Spring Cloud Begin -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>
            </dependency>
            <!-- Spring Cloud End -->
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <mainClass>com.suntong.myshop.service.rocketmq.provider.RocketMQProviderApplication</mainClass>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    Application

    package com.suntong.myshop.service.rocketmq.provider;
    
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.stream.annotation.EnableBinding;
    import org.springframework.cloud.stream.messaging.Source;
    import org.springframework.messaging.MessageChannel;
    import org.springframework.messaging.support.MessageBuilder;
    
    @SpringBootApplication
    @EnableBinding({Source.class})
    public class RocketMQProviderApplication implements CommandLineRunner {
    
        @Autowired
        private MessageChannel output;
    
        public static void main(String[] args) {
            SpringApplication.run(RocketMQProviderApplication.class,args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            output.send(MessageBuilder.withPayload("Hello RucketMQ").build());
        }
    }
    
    

    application.yml

    spring:
      application:
        name: rocketmq-provider
      cloud:
        stream:
          bindings:
            output: {destination: test-topic, content-type: application/json}
          rocketmq:
            binder:
              namesrv-addr: 192.168.79.130:9876
    server:
      port: 9093
    
    

    注意在dependencies中,要加上spring Cloud依赖,还有spring boot的版本

    当前 Spring Cloud Alibaba 的 0.2.1.RELEASE 版本基于 Spring Cloud Finchley(F)开发,故在选择 Spring Boot 版本时不要使用 2.1.0 及以上版本(因为 2.1.x 版本必须使用 Spring Cloud Greenwich,俗称 G 版),请使用官方 Demo 中使用的 2.0.6.RELEASE,以免发生意想不到的问题(比如服务无法注册到服务器)

    RocketMq控制台

    来了

    dependencis.pom

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.6.RELEASE</version>
        </parent>
    
        <groupId>com.suntong</groupId>
        <artifactId>myshop-dependencies</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>pom</packaging>
    
        <url>http://www.suntong.com</url>
        <inceptionYear>2018-Now</inceptionYear>
    
        <modules>
            <module>../myshop-commons</module>
            <module>../myshop-commons-mapper</module>
            <module>../myshop-commons-domain</module>
            <module>../myshop-commons-dubbo</module>
            <module>../myshop-databases</module>
            <module>../myshop-static-backend</module>
            <module>../myshop-service-user-api</module>
            <module>../myshop-service-user-provider</module>
            <module>../myshop-service-user-consumer</module>
        </modules>
    
        <properties>
            <!-- Environment Settings -->
            <java.version>1.8</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    
            <!-- Spring Boot Starter Settings
            <boot-actuator.version>2.2.2</boot-actuator.version>-->
            <boot-dubbo.version>2.7.4.1</boot-dubbo.version>
    
    
            <boot-mapper.version>2.0.2</boot-mapper.version>
            <boot-pagehelper.version>1.2.5</boot-pagehelper.version>
            <boot-druid.version>1.1.10</boot-druid.version>
    
            <!-- Spring Cloud Settings-->
            <cloud-hystrix.version>2.2.0.RELEASE</cloud-hystrix.version>
    
            <!-- Commons Settings -->
            <kyro.version>0.42</kyro.version>
            <mysql.version>5.1.47</mysql.version>
            <fastdfs.version>1.27</fastdfs.version>
    
    
            <jpa.version>1.0.0.Final</jpa.version>
            <curator.version>2.12.0</curator.version>
    
            <spring-cloud.version>Finchley.SR2</spring-cloud.version>
            <spring-cloud-alibaba.version>0.2.1.RELEASE</spring-cloud-alibaba.version>
        </properties>
    
        <dependencyManagement>
    
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>${spring-cloud-alibaba.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
    
                <dependency>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-framework</artifactId>
                    <version>${curator.version}</version>
                </dependency>
    
                <dependency>
                    <groupId>org.apache.curator</groupId>
                    <artifactId>curator-recipes</artifactId>
                    <version>${curator.version}</version>
                </dependency>
    
                <dependency>
                    <groupId>org.hibernate.javax.persistence</groupId>
                    <artifactId>hibernate-jpa-2.1-api</artifactId>
                    <version>${jpa.version}</version>
                </dependency>
    
                <!-- Spring Boot Starter Begin-->
                <dependency>
                    <groupId>org.apache.dubbo</groupId>
                    <artifactId>dubbo-spring-boot-starter</artifactId>
                    <version>${boot-dubbo.version}</version>
                </dependency>
    <!--
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-actuator</artifactId>
                    <version>${boot-actuator.version}</version>
                </dependency>
    -->
                <dependency>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper-spring-boot-starter</artifactId>
                    <version>${boot-mapper.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                    <version>${boot-pagehelper.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid-spring-boot-starter</artifactId>
                    <version>${boot-druid.version}</version>
                </dependency>
                <!-- Spring Boot Starter End -->
    
                <!-- Spring Cloud Begin -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
                    <version>${cloud-hystrix.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
                    <version>${cloud-hystrix.version}</version>
                </dependency>
    
                <!-- Spring Cloud End -->
    
                <!-- Commons Begin -->
                <dependency>
                    <groupId>de.javakaffee</groupId>
                    <artifactId>kryo-serializers</artifactId>
                    <version>${kyro.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.csource</groupId>
                    <artifactId>fastdfs-client-java</artifactId>
                    <version>${fastdfs.version}</version>
                </dependency>
                <!-- Commons End -->
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <!-- Compiler 插件, 设定 JDK 版本 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <showWarnings>true</showWarnings>
                    </configuration>
                </plugin>
    
                <!-- 打包 jar 文件时,配置 manifest 文件,加入 lib 包的 jar 依赖 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <configuration>
                        <archive>
                            <addMavenDescriptor>false</addMavenDescriptor>
                        </archive>
                    </configuration>
                    <executions>
                        <execution>
                            <configuration>
                                <archive>
                                    <manifest>
                                        <!-- Add directory entries -->
                                        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                                        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                                        <addClasspath>true</addClasspath>
                                    </manifest>
                                </archive>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    
                <!-- resource -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                </plugin>
    
                <!-- install -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-install-plugin</artifactId>
                </plugin>
    
                <!-- clean -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-clean-plugin</artifactId>
                </plugin>
    
                <!-- ant -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                </plugin>
    
                <!-- dependency -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                </plugin>
            </plugins>
    
            <pluginManagement>
                <plugins>
                    <!-- Java Document Generate -->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <executions>
                            <execution>
                                <phase>prepare-package</phase>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
    
                    <!-- YUI Compressor (CSS/JS压缩) -->
                    <plugin>
                        <groupId>net.alchim31.maven</groupId>
                        <artifactId>yuicompressor-maven-plugin</artifactId>
                        <version>1.5.1</version>
                        <executions>
                            <execution>
                                <phase>prepare-package</phase>
                                <goals>
                                    <goal>compress</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <encoding>UTF-8</encoding>
                            <jswarn>false</jswarn>
                            <nosuffix>true</nosuffix>
                            <linebreakpos>30000</linebreakpos>
                            <force>true</force>
                            <includes>
                                <include>**/*.js</include>
                                <include>**/*.css</include>
                            </includes>
                            <excludes>
                                <exclude>**/*.min.js</exclude>
                                <exclude>**/*.min.css</exclude>
                            </excludes>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
    
            <!-- 资源文件配置 -->
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <excludes>
                        <exclude>**/*.java</exclude>
                    </excludes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                </resource>
            </resources>
        </build>
    
        <distributionManagement>
            <repository>
                <id>nexus-releases</id>
                <name>Nexus Release Repository</name>
                <url>http://192.168.79.130:8081/repository/maven-releases/</url>
            </repository>
            <snapshotRepository>
                <id>nexus-snapshots</id>
                <name>Nexus Snapshot Repository</name>
                <url>http://192.168.79.130:8081/repository/maven-snapshots/</url>
            </snapshotRepository>
        </distributionManagement>
    
        <repositories>
    <!--        <repository>-->
    <!--            <id>nexus</id>-->
    <!--            <name>Nexus Repository</name>-->
    <!--            <url>http://192.168.79.130:8081/repository/maven-public/</url>-->
    <!--            <snapshots>-->
    <!--                <enabled>true</enabled>-->
    <!--            </snapshots>-->
    <!--            <releases>-->
    <!--                <enabled>true</enabled>-->
    <!--            </releases>-->
    <!--        </repository>-->
    
            <repository>
                <id>aliyun-repos</id>
                <name>Aliyun Repository</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
    
            <repository>
                <id>sonatype-repos</id>
                <name>Sonatype Repository</name>
                <url>https://oss.sonatype.org/content/groups/public</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>sonatype-repos-s</id>
                <name>Sonatype Repository</name>
                <url>https://oss.sonatype.org/content/repositories/snapshots</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <pluginRepositories>
    <!--        <pluginRepository>-->
    <!--            <id>nexus</id>-->
    <!--            <name>Nexus Plugin Repository</name>-->
    <!--            <url>http://192.168.79.130:8081/repository/maven-public/</url>-->
    <!--            <snapshots>-->
    <!--                <enabled>true</enabled>-->
    <!--            </snapshots>-->
    <!--            <releases>-->
    <!--                <enabled>true</enabled>-->
    <!--            </releases>-->
    <!--        </pluginRepository>-->
    
            <pluginRepository>
                <id>aliyun-repos</id>
                <name>Aliyun Repository</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    
    </project>
    

    相关文章

      网友评论

          本文标题:RocketMQ 生产者

          本文链接:https://www.haomeiwen.com/subject/sjezfhtx.html