项目情况:

springboot: 2.2.2

grpc-spring-boot-starter: 2.6.1.RELEASE

项目目录:

mypro:

  - person  - grpc服务端

  - lib - 公共库

  - device - grpc客户端

项目建立可参考:项目建立部分可参考我另一篇随笔的项目建立部分:

https://www.cnblogs.com/SamNicole1809/p/12200875.html

步骤一:引入依赖

我是都在lib模块引入的:

        <dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-spring-boot-starter</artifactId>
<version>2.6.1.RELEASE</version>
</dependency> <dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>2.6.1.RELEASE</version>
</dependency> <dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
<version>2.6.1.RELEASE</version>
</dependency> <dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.26.0</version>
</dependency> <dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.26.0</version>
</dependency>
    <properties>
<java.version>1.8</java.version>
<os.plugin.version>1.6.2</os.plugin.version>
<grpc.version>1.26.0</grpc.version>
<protoc.version>3.11.0</protoc.version>
<protobuf.plugin.version>0.6.1</protobuf.plugin.version>
<skipTests>true</skipTests>
</properties>
    <build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>${os.plugin.version}</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>${protobuf.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
<protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<clearOutputDirectory>false</clearOutputDirectory>
<!-- for more https://www.xolstice.org/protobuf-maven-plugin/compile-mojo.html -->
</configuration>
<executions>
<execution>
<!-- run mvn compile -->
<phase>compile</phase>
<goals>
<!-- produce OuterClass -->
<goal>compile</goal>
<!-- produce Grpc class -->
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

person模块引入:

        <dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>2.6.1.RELEASE</version>
</dependency>

person的application.yml

grpc:
server:
port: 9898

device模块引入:

        <dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
<version>2.6.1.RELEASE</version>
</dependency>

device的application.yml

grpc:
client:
person:
address: 'static://127.0.0.1:9898'
enableKeepAlive: true
keepAliveWithoutCalls: true
negotiationType: plaintext

步骤二:生成proto文件

在lib的main目录下新建文件夹proto,再在文件夹中新建文件mypro.proto,文件名可随意。

mypro.proto文件内容:

syntax = "proto3";

option java_package = "com.sam.lib";
option java_multiple_files = true;
option java_outer_classname = "MyproRpcProto"; service MyproRpcService {
rpc getUser (GrpcStringRequest) returns (GrpcStringResponse) {}
} message GrpcStringRequest {
string str = 1;
} message GrpcStringResponse {
string str = 1;
}

安装完相关依赖后,maven中lib的Plugins目录下找到protobug,依次执行compile和compile-custom

执行时需要下载,下载速度比较慢,第二次就很快了,下载完执行如果出错,多半是proto文件内容的问题。

执行成功后会出现如下文件:

utils是我自己建的,主要是下面那些。

步骤三:给person和device增加lib扫描,使其能够引用lib中的所有文件,lib和自己都要加,person同理。

@SpringBootApplication
@ComponentScan({"com.sam.lib.*", "com.sam.device.*"})
public class DeviceApplication {
public static void main(String[] args) {
SpringApplication.run(DeviceApplication.class, args);
}
}

步骤四:服务端代码

import com.sam.lib.GrpcStringRequest;
import com.sam.lib.GrpcStringResponse;
import com.sam.lib.MyproRpcServiceGrpc;
import io.grpc.netty.shaded.io.netty.util.internal.StringUtil;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService; import java.util.UUID; @GrpcService
public class PersonGrpcService extends MyproRpcServiceGrpc.MyproRpcServiceImplBase {
@Override
public void getUser(GrpcStringRequest request, StreamObserver<GrpcStringResponse> responseObserver) {
String name = request.getStr(); // 接收请求的内容
// 定义返回的内容
GrpcStringResponse response = GrpcStringResponse.newBuilder().setStr("").build();
// 如果请求正确,返回name和uuid,不正确返回空字符串
if (!StringUtil.isNullOrEmpty(name)) {
String result = name + "--" + UUID.randomUUID().toString();
response = GrpcStringResponse.newBuilder().setStr(result).build();
}
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}

步骤五:客户端代码

import com.sam.lib.GrpcStringRequest;
import com.sam.lib.GrpcStringResponse;
import com.sam.lib.MyproRpcServiceGrpc;
import io.grpc.Channel;
import net.devh.boot.grpc.client.inject.GrpcClient;
import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; @Service
public class DeviceGrpcService {
@GrpcClient("person") // grpc服务的名称
private Channel channel; private MyproRpcServiceGrpc.MyproRpcServiceBlockingStub stub; @PostConstruct
public void init() {
stub = MyproRpcServiceGrpc.newBlockingStub(channel);
} public String getUser(String name) {
GrpcStringResponse response = stub.getUser(GrpcStringRequest.newBuilder().setStr(name).build());
return response.getStr();
} }

步骤六:controller测试

    @GetMapping("/grpc")
public String setGrpc() {
String result = deviceGrpcService.getUser("device");
if ("".equals(result)) {
return "Result is blank";
}
return result;
}

至此,grpc调用成功。

springboot2 + grpc的更多相关文章

  1. springboot2 + grpc + k8s + istio

    项目情况说明: ubuntu - 16.04 springboot - 2.2.2.RELEASE mysql - 5.7 mongodb - 4.0.14 redis - 3.0.6 grpc -  ...

  2. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  3. gRPC源码分析2-Server的建立

    gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...

  4. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  5. 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

    Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开 ...

  6. gRPC .NET Core跨平台学习

    前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...

  7. gRPC C#学习

    前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段. 今天我们就来学习gRPC C# .而且目前也已经支持.NET Core 可以实现完美跨平台. 传统的.NET 可以通过Mono ...

  8. .net core 用grpc实现微服务

    GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...

  9. rpc框架之gRPC 学习 - hello world

    grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...

随机推荐

  1. Python--day27--内置函数isinstance和issubclass方法

  2. InetlliJ IDEA的快捷键及各种配置

    在IDEA中新建Maven工程,之后再新建一个Maven模块,此时在模块中的src/main/java中右键新建Java文件时,发现只能新建普通文件,不能新建Java类了,怎么回事,和eclipse的 ...

  3. linux清理函数

    每个非试验性的模块也要求有一个清理函数, 它注销接口, 在模块被去除之前返回所有资 源给系统. 这个函数定义为: static void   exit cleanup_function(void) { ...

  4. windows服务器运维日常--防火墙打开后ping不通

    1. 打开防火墙,有利于安全 2. 添加80端口,支持互联网访问:添加3389端口,以支持远程桌面连接 3. 发现开了防火墙之后,ping不通网址www.mjywxy.xin 4. 查找资料和测试发现 ...

  5. Linux 内核设备驱动

    设备模型跟踪所有对系统已知的驱动. 这个跟踪的主要原因是使驱动核心能匹配驱动和新 设备. 一旦驱动在系统中是已知的对象, 但是, 许多其他的事情变得有可能. 设备驱动可 输出和任何特定设备无关的信息和 ...

  6. Vscode 开发插件

    vs常用公共插件 Auto Close Tag 自动闭合标签 Auto Rename Tag 自动重命名标签 AutoFileName 自动联想文件名 Autoprefixer 自动兼容前缀 Auto ...

  7. MindV编入微软云计算中小企业解决方案

    鹰翔MindV思维导图软件基于云计算,曾作为windows azure云计算的一个样例介绍,收入中小企业解决方案中.http://www.microsoft.com/hk/smb/cloud/azur ...

  8. RobotFramework+Appium 升级Appium v1.10.0后,执行click element时报错:InvalidSelectorException: Message: Locator Strategy 'css selector' is not supported for this session,解决办法

    报错信息如下: debug] [35m[XCUITest][39m Connection to WDA timed out[debug] [35m[XCUITest][39m Connection t ...

  9. 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用

    背景介绍 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数 ...

  10. DRF 08

    目录 三大认证 流程 认证组件 权限组件 频率组件 自定义token的签发 三大认证 流程 由于DRF中, 所有的视图类都要直接和间接继承APIView类, 也只有APIView类中才有dispatc ...