• GRPC-JAVA


    近一年来一直在用公司内wiki进行技术调研以及记录,后期有时间将逐步迁移至博客园

    参考资料:

    https://github.com/grpc/grpc-java

    https://www.cnblogs.com/gutousu/p/9951956.html

    可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑- gRPC 帮你解决了不同语言间通信的复杂性以及环境的不同.使用 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新,无注册中心

    依赖包

    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java-util</artifactId>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-all</artifactId>
    </dependency>
    
    

    build

    <build>
       
        <extensions>
            <extension>
                <!-- provides os.detected.classifier (i.e. linux-x86_64, osx-x86_64) property -->
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.1</version>
            </extension>
        </extensions>
    
        <plugins>
           
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
                    </protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
                    </pluginArtifact>
                    <!-- proto文件目录 -->
                    <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
                </configuration>
                <executions>
                    <execution>
                        <id>bean</id>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>
                        </goals>
                        <configuration>
                            <!-- 生成的Java文件目录 -->
                            <outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
                        </configuration>
                    </execution>
    
                    <execution>
                        <id>grpc</id>
                        <goals>
                            <goal>compile-custom</goal>
                            <goal>test-compile-custom</goal>
                        </goals>
                        <configuration>
                            <!-- 生成的grpc-Java文件目录 -->
                            <outputDirectory>${project.build.directory}/generated-sources/protobuf/grpc-java
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    proto-demo

    syntax = "proto2";
    
    package java_test;
    
    service TestService {
        rpc method (Request) returns (Result) {
    
        }
    }
    
    message Request {
        optional string request1 = 1;
        optional string request2 = 2;
    }
    
    message Result {
        optional string result1 = 1;
        optional string result2 = 2;
    }

    编译项目,生成bean文件和通信文件

    server端demo

    package com.baidu.traffic.sc.test;
    
    import io.grpc.ServerBuilder;
    import io.grpc.stub.StreamObserver;
    import java_test.TestGrpc;
    import java_test.TestServiceGrpc;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    
    /**
     * Created by liushouyun on 2019-12-20 12:36.
     */
    
    @Component
    public class JavaGrpcServer extends TestServiceGrpc.TestServiceImplBase implements InitializingBean {
    
    
        @Override
        public void method(TestGrpc.Request request, StreamObserver<TestGrpc.Result> responseObserver) {
            TestGrpc.Result result = TestGrpc.Result.newBuilder().setResult1("结果1").setResult2("结果2不想给你").build();
            responseObserver.onNext(result);
            responseObserver.onCompleted();
            // super.method(request, responseObserver);
        }
    
        @Override
        public void afterPropertiesSet() throws IOException {
            ServerBuilder.forPort(8582)
                    .addService(new JavaGrpcServer())
                    .build().start();
        }
    }

     client端demo

    package com.baidu.traffic.signal.test;
    
    import io.grpc.Channel;
    import io.grpc.ManagedChannelBuilder;
    import io.swagger.annotations.Api;
    import java_test.TestGrpc;
    import java_test.TestServiceGrpc;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * Created by liushouyun on 2019-12-20 12:36.
     */
    
    @Api(tags = "grpc-test")
    @RestController
    @RequestMapping(value = "/test/grpc")
    @Slf4j
    public class JavaGrpcClient {
    
        private Channel channel = channel();
    
        @GetMapping("/run")
        public TestResult run() {
            TestServiceGrpc.TestServiceBlockingStub testServiceBlockingStub = TestServiceGrpc.newBlockingStub(channel);
            TestGrpc.Request request = TestGrpc.Request.newBuilder().setRequest1("ha?").setRequest2("en?").build();
            TestGrpc.Result result = testServiceBlockingStub.method(request);
            return new TestResult(result.getResult1(), result.getResult2());
        }
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        private class TestResult {
            private String result1;
            private String result2;
        }
    
        private Channel channel() {
            return ManagedChannelBuilder
                    .forAddress("127.0.0.1", 8582)
                    .usePlaintext()
                    .build();
        }
    }
  • 相关阅读:
    ylbtech-dbs-m-YinTai(银泰网)
    ylbtech-memorandum(备忘录)-数据库设计
    设计工作-Axure
    RegexHelper
    convert image to base64
    MVC Movie App
    ASP.NET MVC file download sample
    MVC架构、WebForm与MVC对比
    第2章 数字之魅——子数组之和的最大值(二维)
    第2章 数字之魅——求数组的子数组之和的最大值
  • 原文地址:https://www.cnblogs.com/lsy131479/p/12402821.html
Copyright © 2020-2023  润新知