项目情况:

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--day62--删除出版社

    删除成出版社关键代码:

  2. IntStack(存放int型值,带迭代器) 附模板化实现 p406

    1 该栈只用于存在int型数据 #include "../require.h" #include <iostream> using namespace std; cla ...

  3. MySQL高级配置

    参考文章:http://www.jb51.net/article/47419.htm https://blog.csdn.net/waneto2008/article/details/52502208 ...

  4. Django入门3--Models

  5. Django入门1--Django是什么?Django里文件的作用?

    Django项目目录介绍: wsgi.py文件介绍: urls.py文件介绍: __init__.py文件介绍:

  6. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(4)之业务仓储工厂

    在创建业务层之前,我们先来熟悉一下业务仓储工厂Bobo.Repository.dll程序集,后续的业务操作,我们都将通过这个程序集中的方法传递数据库操作,其介于数据库操作与业务层之间,详情可前往< ...

  7. html根据下拉框选中的值修改背景颜色

    错误的写法 <!doctype html><html><head><meta charset="utf-8"><title&g ...

  8. 【53.57%】【codeforces 610C】Harmony Analysis

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  9. Java面向对象程序设计第8章3-5

    Java面向对象程序设计第8章3-5 3.String类型有什么特点? 一旦赋值,便不能更改其指向的字符对象 如果更改,则会指向一个新的字符对象 不能为null 4.String什么时候进行值比较,什 ...

  10. saltstack的配置配置

    一.为不同的环境设置不同的文件目录 1.1 修改配置文件 /etc/salt/master [root@node1 salt]# vim /etc/salt/master file_roots: ba ...