Grpc原理

Python044

Grpc原理,第1张

rpc调用原理框架如图:

-支持多语言的rpc框架,例如Google的grpc,facebook thrift, 百度的brpc

-支持特定语言的rpc框架, 例如新浪微博的Motan

-支持服务治理微服务化特性框架,其底层仍是rpc框架,例如 阿里的Dubbo

目前业内主要使用基于多语言的 RPC 框架来构建微服务,是一种比较好的技术选择,例如netflix ,API服务编排层和后端微服务之间采用微服务rpc进行通信

-支持C java js

-git地址 https://github.com/grpc/grpc-java

-原理图:

gRPC 的线程模型遵循 Netty 的线程分工原则,即:协议层消息的接收和编解码由 Netty 的 I/O(NioEventLoop) 线程负责;后续应用层的处理由应用线程负责,防止由于应用处理耗时而阻塞 Netty 的 I/O 线程

不过正是因为有了分工原则,grpc 之间会做频繁的线程切换,如果在一次grpc调用过程中,做了多次I/O线程到应用线程之间的切换,会导致性能的下降,这也是为什么grpc在一些私有协议支持不太友好的原因

缺点

改进:

优化后BIO线程模型采用了线程池的做法但是后端的应用处理线程仍然采用同步阻塞的模型,阻塞的时间取决对方I/O处理的速度和网络I/O传输的速度

grpc的线程模型主要包含服务端线程模型,客户端线程模型

2.1.1 I/O 通信线程模型

gRPC的做法是服务监听线程和I/O线程分离Reactor多个线程模型 其工作原理如下:

2.1.2 服务调度线程模型

gRPC 客户端线程模型工作原理如下图所示(同步阻塞调用为例)

相比于服务端,客户端的线程模型简单一些,它的工作原理如下:

grpc 线程模型

通过封装将grpc的技术使用难度降低到普通Java程序的开发。

cn.com.yd.commons.grpc提供了4种形式的服务接口定义以适应不同的应用场景。

cn.com.yd.commons.grpc将请求参数和响应参数定义为bytes以统一因业务不同而导致的差异性;使用cglib进行动态代理,在grpc的方法中执行具体的业务处理。

在具体应用中应将此工程使用Maven打包后作为依赖引入目标工程中。

JDK:1.8

GRPC:1.6.1

Protobuf:3.3.0

cglib:3.2.5

IDE:开发工具IDEA

IDEA自带插件支持grpc开发,所以开发工具选择IDEA。在正式开始之前需要先安装Protobuf Support插件。

依次点击Intellij中的“File”-->"Settings"-->"Plugins"-->"Browse repositories",如图

输入Protobuf,如下所示

在main目录下新建一个名为proto的文件夹,请确保文件夹的所处位置以及名称都正确,否则将不能进行编译,而且不报任何错误。

proto文件编写完成后进行编译以生成对应的class文件,编译后的效果大致如图

其中包含了Request、Response与JSONObject之间的转换等,主要是对应用的辅助。

暂不公开。

java的方式对接grpc接口将genopt与java关联。GenOpt是在Java平台开发,能够与任意基于文本输入输出(I/O)的模拟程序相耦合。Genopt进行优化的变量可以是连续的,也可以是离散的。