RCP流程

22222222222222222

1.服务调用方(Client)将远程方法的信息(如类名.方法方法名.方法传入的参数)封装为统一的请求体:

2.序列化请求对象,转化为二进制串,方便传输;

3.通过 Client Stub 发送消息到指定的服务提供方;

4.Server Stub 接收来自 Client 的消息;

5.反序列化二进制串,转化为对象,方便使用;

6.根据请求体,执行本地方法;

7.封装方法执行结果为统一的响应体;

8.序列化响应体对象,转化为二进制串;

9.通过 Server Stub 将消息发送给对应的 Client;

10.Client Stub 接受消息;

11.反序列化二进制串,转化为对象;

12.得到方法执行的结果

简单演示例子

参考资料:

https://blog.csdn.net/whzhaochao/article/details/52421867

例子项目test1.zip

  1. 创建src/main/proto source文件夹,存放proto文件

  2. 选中项目,右键–>run as–>Maven generate-sources

生成java代码

123

  1. 加入source

生成的代码在target/generated-sources/protobuf文件夹下,有grpc-java和java两个目录,把这两个目录加入到source路径

44444

  1. 运行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

RPC实现是把调用的 springbean,方法,和参数做成二进制,通过grpc传递(protobuf会再次序列化),实际是二次序列化,对性能有损耗,但是方便通用……

可以根据maven打包不同,实现拆分(RPC)和合并(单体war)的不同效果,不影响业务逻辑.

还需要isito和分布式事务……

项目例子:

456

限制:

  1. 接口和实现的包和类的命名强制规范,底层强制

  2. 一个接口只能有一个实现

  3. 接口上加上一个注解,可以代码辅助生成

Maven分模块

https://www.cnblogs.com/h--d/p/6001366.html

下载例子项目: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