近一年来一直在用公司内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();
}
}

GRPC-JAVA的更多相关文章

  1. gRPC Java的代码架构

    RPC(远程过程调用) 的架构最常见的是"动态代理"方式,事先定义好接口,用一个代理假装实现了这个接口(真正的实现放在服务端),供客户端调用,代理内部将该方法调用封装成一个网络请求 ...

  2. gRPC java 客户端,服务器端通讯使用json格式

    使用 protobuf 作为通讯内容序列化的简单例子请看:http://www.cnblogs.com/ghj1976/p/5458176.html . 本文是使用 json 做为内容序列化的简单例子 ...

  3. gRPC(Java) keepAlive机制研究

    基于java gRPC 1.24.2 分析 结论 gRPC keepAlive是grpc框架在应用层面连接保活的一种措施.即当grpc连接上没有业务数据时,是否发送pingpong,以保持连接活跃性, ...

  4. 用Java开发gRPC服务的例子分析

    本文的代码例子来自:https://github.com/grpc/grpc-java  定义服务 这一步与其他语言完全一样,需要定义gRPC的服务.方法.request和response的类型. 完 ...

  5. 开始食用grpc(之一)

    开始食用grpc(之一) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9501353.html ```   记一次和一锅们压马路,路过一咖啡厅(某巴克),随口 ...

  6. gRPC官方文档(概览)

    文章来自gRPC 官方文档中文版 概览 开始 欢迎进入 gRPC 的开发文档,gRPC 一开始由 google 开发,是一款语言中立.平台中立.开源的远程过程调用(RPC)系统. 本文档通过快速概述和 ...

  7. gRPC入坑记

    概要 由于gRPC主要是谷歌开发的,由于一些已知的原因,gRPC跑demo还是不那么顺利的.单独写这一篇,主要是gRPC安装过程中的坑太多了,记录下来让大家少走弯路. 主要的坑: 如果使用PHP.Py ...

  8. gRPC Learning Notes

    简介 更多内容参考:https://www.grpc.io/docs/guides/ gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计.目前提供 C.Java 和 G ...

  9. RPC详解

    RPC(Remote Procedure Call),即远程过程调用,是一个分布式系统间通信的必备技术,本文体系性地介绍了 RPC 包含的核心概念和技术,希望读者读完文章,一提到 RPC,脑中不是零碎 ...

  10. 理解REST和RPC

    REST 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 网站开发,完全可以采用软件开发的模式.但是传统上,软件和网络是两个不同的领域,很少有交集:软件开发主要针对单机环境,网络则主要研究 ...

随机推荐

  1. 国产东方通消息队列TongLINKQ8.1服务端安装步骤

    一.服务端安装 groupadd tlq # 新建组 useradd -m -g tlq tlq # 新建tlq用户并指定组tlq cd /home/tlq/ # 切换到安装目录并上传安装包 tar ...

  2. switch、case语句的问题

    switch.case语句: 点击查看代码 int state = 1; switch(state) { case 1: { //状态1执行的程序 } case 2: { //状态2执行的程序 } d ...

  3. 开源IDS/IPS Suricata的部署与使用

    目录 前言 在Linux上部署Suricata Suricata的基本配置 配置文件 Suricata的规则 Suricata的使用 Suricata检测SQL注入 前言 Suricata 是一个高性 ...

  4. .NET Core 线程池(ThreadPool)底层原理浅谈

    简介 上文提到,创建线程在操作系统层面有4大无法避免的开销.因此复用线程明显是一个更优的策略,切降低了使用线程的门槛,提高程序员的下限. .NET Core线程池日新月异,不同版本实现都有差别,在.N ...

  5. hashcode和equals为何要同时重写

    浅谈为何要重写 hashcode()与equals() 首先,这两个方法都来自于Object对象,根据API文档查看下原意.(1)public boolean equals(Objectobj),对于 ...

  6. PHP中的特殊用法

    开发中查阅别人代码的时候, 总能发现新大陆, 各种骚操作与奇技淫巧, 有些还是值得借鉴的,自然要学习一番啦 1.fastcgi_finish_request 此函数冲刷(flush)所有响应的数据给客 ...

  7. API 接口开发调试工具之ApiPost

    安装 ApiPost ApiPost 支持 Windows.Mac.Linux 平台,你可以通过这个链接下载软件安装包: https://www.apipost.cn/download.html?fr ...

  8. Mybatis【16】-- Mybatis多对一关联查询

    注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-12-many2one,需要自取,需要配置mave ...

  9. Vue实现记住账号密码功能

    实现思路: 用户登录时若勾选"记住我"功能选项,则将登录名和密码(加密后)存入本地缓存,下次登录页面加载时自动获取保存好的账号和密码(需解密),回显到登录输入框中. 说到存入本地缓 ...

  10. 切换浏览器tab刷新实现

    标签: js 缘起 最近在做一个活动需求,需求交互有跨项目,跳转到另一个项目里完成指定任务,再回来领取相应任务奖励,产品十分反感要求用户主动刷新浏览器才更新活动页的任务信息. 解决方案 方案1:如果项 ...