grpc

The Redefine Team Lv5

grpc

grpc 主要玩耍对象就是Google Protobuf

proto 文件也很简单,主要就是定义message, enum, service 这些

和远古时期的WSDL 一样,需要生成stub 代码,而stub 代码一直不舒服,感觉很乱

但proto 生成的stub 代码貌似比印象中的WSDL stub 代码更眉清目秀一些?

在java 中用io.grpc 的几个依赖就可以很快的创建一个GrpcService

项目依赖,和code generator 按照https://github.com/grpc/grpc-java 的README就可以了

stub

生成的Grpc ,在调用时,有blocking, future, stub 几种, 可玩耍比较有意思的是stub , 通过传入一个StreamObServer 对象

然后在onNext 中读取服务端生产的stream 对象, 而服务端可以一直调用onNext 创建对象给调用方

如果没有Flux 这类工具可用,那么可以通过Executors的方式按照时间周期创建对象

http/2

spring framework 5 兼容servlet 4, 这是支持http/2, 但是需要给容器添加配置

看文档说webflux on netty 不支持http/2, 所以不能通过Flux.interval(Duration.ofMillis(200)) 的方式不断的创建stream response

但这是存疑的,看起来spring 官网的文档和github 上的文档写的并不一样

而grpc 默认就是http/2 的, 通过stub 代码,blocking 的方式可以是request/response 的,而stub 的方式可以不断的读取stream response

Rsocket && Grpc

在Rsocket 里面说, Grpc 是好的,但是它没有背压, 所以Rsocket 给添加了背压

Rsocket Rpc 基本是基于Grpc 进行的实现,主要的区别首先是在:

grpc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.6.1:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.19.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>

rsocket rpc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.6.1:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.rsocket.rpc:rsocket-rpc-protobuf:${rsocket-rpc.version}:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>

二者首先在编译参数上的区别

另外的区别再于,生成的stub 代码,有非常大的区别, grpc 的stub 是Observer

而rsocket rpc 基本生成的是Flux/Mono

在对待stream 上的区别也是StreamObserver, Publisher的对应,当然这只是在api 上各自选择的不同

二者在启动rpc 服务和调用rpc服务上也有非常大的不同,这就不写了

– cmonkey 2019年3月29日16:57:48

  • 标题: grpc
  • 作者: The Redefine Team
  • 创建于 : 2019-03-29 16:30:41
  • 更新于 : 2023-05-23 18:52:03
  • 链接: https://redefine.ohevan.com/2019/03/29/grpc/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论