title: 41.grpc使用手册 CreateTime: 2019-07-11 00:00:41 UpdateTime: 2019-07-11 00:00:41 CategoryName: web --- --- title: "41.grpc使用手册" date: 2019-07-11T00:00:41+08:00 draft: false tags: ["grpc"] categories: ["web"] author: "springrain" --- RCP流程 ------- ![22222222222222222](/public/41/image1.jpeg) 1.服务调用方(Client)将远程方法的信息(如类名.方法方法名.方法传入的参数)封装为统一的请求体: 2.序列化请求对象,转化为二进制串,方便传输; 3.通过 Client Stub 发送消息到指定的服务提供方; 4.Server Stub 接收来自 Client 的消息; 5.反序列化二进制串,转化为对象,方便使用; 6.根据请求体,执行本地方法; 7.封装方法执行结果为统一的响应体; 8.序列化响应体对象,转化为二进制串; 9.通过 Server Stub 将消息发送给对应的 Client; 10.Client Stub 接受消息; 11.反序列化二进制串,转化为对象; 12.得到方法执行的结果 简单演示例子 ------------ 参考资料: [例子项目test1.zip](/public/41/test1.zip) 1. 创建src/main/proto source文件夹,存放proto文件 2. 选中项目,右键-->run as-->Maven generate-sources 生成java代码 ![123](/public/41/image3.png) 3. 加入source 生成的代码在target/generated-sources/protobuf文件夹下,有grpc-java和java两个目录,把这两个目录加入到source路径 ![44444](/public/41/image4.jpeg) 4. 运行server和cliet即可 SpringBoot集成 -------------- https://www.jianshu.com/p/260a1ac847b6 http://www.cnblogs.com/zrtqsk/p/3735273.html 把远程服务器的地址加到接口的@RpcServiceAnnotation注解上,对业务没有影响.在beanfactory初始化的时候,先检查本地是不是有实现的文件,如果没有,就代理这个接口的远程RPC实现,手动注册到beanfactory.这样就会兼顾RPC和本地开发,在开发阶段,本地实际是有实现的,就是单机开发调试的模式,部署的时候,调整成远程RCP调用. 注意:必须在spring 的application初始化之前注入代理bean,我是在beanfactory注入的.接口和实现的命名和路径必须规范,不然本地会找不到,一直调用RPC.因为注解在接口上,所以只能根据类型加载bean,也就是一个接口只能有一个实现. Spring bean的生命周期如下图: ![181453414212066](/public/41/image5.png) RPC实现是把调用的 springbean,方法,和参数做成二进制,通过grpc传递(protobuf会再次序列化),实际是二次序列化,对性能有损耗,但是方便通用...... 可以根据maven打包不同,实现拆分(RPC)和合并(单体war)的不同效果,不影响业务逻辑. 还需要isito和分布式事务...... 项目例子: ![456](/public/41/image7.jpeg) 限制: 1. 接口和实现的包和类的命名强制规范,底层强制 2. 一个接口只能有一个实现 3. 接口上加上一个注解,可以代码辅助生成 Maven分模块 ----------- https://www.cnblogs.com/h--d/p/6001366.html [下载例子项目:tm-parent.zip](/public/41/tm-parent.zip) 基于maven分模块,把项目拆分成模块,主要有service,serviceimpl,web等核心模块.配合grpc-client和grpc-server模块,进行打包组合. 单体项目:web模块依赖serviceimpl模块即可.web模块使用springboot插件打包,serviceimpl使用普通方式打包. RPC分层,是分了P1和P2两个项目,P1通过RPC调用P2. P1项目:web模块依赖service模块,service模块依赖grpc-client模块. P2项目:serviceimpl模块依赖grpc-server模块 web,serviceimpl使用SpringBoot插件打包 service,grpc-client,grpc-server使用普通方式打包. 注意入口类的包路径,要确保代码能被扫描. 打包的时候要注意处理无用的入口类的注解干扰,可以先注释掉. 开发阶段,使用单体开发,确认没有问题,需要把jar打成RCP和单体两种环境,上传到maven仓库. 数据库事务(建议使用Seata) ---------- https://blog.csdn.net/d729332647/article/details/79324767 https://github.com/QNJR-GROUP/EasyTransaction/ https://www.cnblogs.com/skyesx/p/10041923.html https://blog.csdn.net/qq_28341873/article/details/79789054 https://www.jianshu.com/p/28387056eeb4 目前实现了同步事务,通过RPC协议请求数据,把线程挂起等待,入口方法处理完成之后,RPC通知服务端进行事务提交. 不能和Spring切面事务混合使用,因为需要托管Spring事务,比较复杂,暂时未实现. 存在网络抖动风险,最后事务提交的时候,认为只会成功,不能失败,可以记录日志. 需要严格测试才能进入生产环境. [下载项目例子:grpctest.zip](/public/41/grpctest.zip)