前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GRPC-JAVA

GRPC-JAVA

作者头像
房上的猫
发布2020-03-08 10:05:55
1.1K0
发布2020-03-08 10:05:55
举报
文章被收录于专栏:个人随笔

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

参考资料:

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

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

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

依赖包

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档