grpc 简单实例

pom文件

    <properties>
        <java.version>1.8</java.version>
        <rabbitMQ.version>3.5.1</rabbitMQ.version>
        <spring.version>4.1.7.RELEASE</spring.version>
        <mongodb.version>1.8.0.RELEASE</mongodb.version>
        <mybatis.version>3.4.1</mybatis.version>
        <mybatis.spring.version>1.3.0</mybatis.spring.version>
        <mysql.driver.version>5.1.39</mysql.driver.version>
        <druid.version>1.0.27</druid.version>
        <org.aspectj.version>1.8.9</org.aspectj.version>
        <slf4j.version>1.7.7</slf4j.version>
        <log4j.version>1.2.17</log4j.version>
        <grpc.version>1.13.2</grpc.version>
        <protobuf.version>3.6.0</protobuf.version>
        <os.detected.classifier>windows-x86_64</os.detected.classifier>
    </properties>

    <build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>

            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <excludes>
                    <exclude>conf/*.properties</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <includes>
                    <include>conf/${profiles.active}.properties</include>
                </includes>
            </resource>

        </resources>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.0</version>
            </extension>
        </extensions>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.1</version>
                <configuration>
                    <protoSourceRoot>${basedir}/src/main/proto</protoSourceRoot>
                    <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <!--插件生成类目录,默认在target/xx下,指定避免打包时报类重复错误-->
                    <outputDirectory>${basedir}/src/main/java</outputDirectory>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
                    <!--不清楚目录下文件,直接覆盖-->
                    <clearOutputDirectory>false</clearOutputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  <!--区分开发测试生产环境-->
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>

        </profile>

        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
            </properties>

        </profile>
        <profile>
            <id>release</id>
            <properties>
                <profiles.active>release</profiles.active>
            </properties>

        </profile>

    </profiles>

目录结构如下

Consumer.proto文件

syntax = "proto3";

package com.grpc.proto;

option java_package = "com.grpc.proto";
option java_outer_classname = "ConsumerProto";
option java_multiple_files = true;

service ConsumerService {

    rpc GetMessageSequence(MessageRequest) returns (MessageResponse) {}

}

message MessageRequest {
    string family_id = 1;
    string user_id = 2;
    string device_id = 3;
    int32 device_type = 4;
    int32 type = 5;
    int32 sequence = 6;
    int32 classified_sequence = 7;
}

message MessageResponse {
    int32 sequence = 1;
    int32 classified_sequence = 2;
}
ConsumerService.java 文件
public class ConsumerService {
    final Logger logger = LoggerFactory.getLogger(ConsumerService.class);
    private Server server;

    private void start() throws IOException {
        this.server = ServerBuilder.forPort(8899).addService(new ConsumerServiceGrpcImpl()).build().start();

        logger.info("ConsumerServiceGrpcImpl server started!");

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            logger.info("关闭jvm");
            ConsumerService.this.stop();
        }));
    }

    private void stop() {
        if(null != this.server) {
            this.server.shutdown();
        }
    }

    private void awaitTermination() throws InterruptedException {
        if(null != this.server) {
            this.server.awaitTermination();
        }
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        ConsumerService server = new ConsumerService();

        server.start();
        server.awaitTermination();
    }
}
ConsumerClient.java 文件
@Component
@Scope("prototype")
public class ConsumerClient {
    final Logger logger = LoggerFactory.getLogger(ConsumerClient.class);

    private  ManagedChannel managedChannel;
    private ConsumerServiceGrpc.ConsumerServiceBlockingStub blockingStub;


    @Autowired
    public ConsumerClient(@Value("${serviceip}") String serviceip){
        managedChannel = ManagedChannelBuilder.forAddress(serviceip, 8899).usePlaintext().build();
        blockingStub = ConsumerServiceGrpc.newBlockingStub(managedChannel);
    }

    public void shutdown() throws InterruptedException {
        managedChannel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
    }


    public MessageResponse getMessageSequence(Message msg){
        MessageRequest messageRequest = MessageRequest.newBuilder()
                .setDeviceId(msg.getDeviceId())
                .build();
        logger.info("==={}"+messageRequest.toString());
        return blockingStub.getMessageSequence(messageRequest);
    }


}
ConsumerServiceGrpcImpl.java 文件
public class ConsumerServiceGrpcImpl extends ConsumerServiceGrpc.ConsumerServiceImplBase {

    final Logger logger = LoggerFactory.getLogger(ConsumerServiceGrpcImpl.class);
    //private MongoDBMessageService service = (MongoDBMessageService)SpringContextUtil.getBeanByClass(MongoDBMessageService.class);

    @Override
    public void getMessageSequence(MessageRequest msg, StreamObserver<MessageResponse> responseObserver) {
        logger.info("接受到客户端信息: " + msg.toString());
        //业务代码 service 
        MessageResponse response = MessageResponse.newBuilder().setSequence(1).setClassifiedSequence(2).build();

        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}

这里实现的业务就是消费mq消息,msg -> 处理 ->返回结果 ->写mongo

消费mq  MessageConsumer.java 文件

public class MessageConsumer extends Logging implements MessageListener {

    @Autowired
    private MongoDBMessageService service;

    @Autowired
    ConsumerClient consumerClient;

    @Override
    public void onMessage(Message message) {
        try {
            String line = new String(message.getBody(), "UTF-8");
            com.mongo.entity.Message msg = JSON.parseObject(line, com.mongo.entity.Message.class);
            MessageResponse messageSequence = consumerClient.getMessageSequence(msg);
            msg.setSequence(messageSequence.getSequence());
            msg.setClassifiedSequence(messageSequence.getClassifiedSequence());
            msg.setMessageId(Tools.getUUID());
            logger.info("line======MessageConsumer======== {}", msg);
            service.insert(msg, "message1");
        } catch (Exception e) {
            logger.error("MessageConsumer error.", e);
        }

    }
}

猜你喜欢

转载自blog.csdn.net/mlljava1111/article/details/81101202