javaguide-rpc框架项目学习笔记-未完待续(代码片段)

rotk2015 rotk2015     2022-12-06     185

关键词:

本笔记为JavaGuide哥RPC项目的学习笔记,感谢Guide哥的无私奉献!

  1. RPC,Remote Procedure Call,远程过程(方法)调用,本地上某个服务的方法要调用远程主机上某个服务的方法。

  2. RPC的原理。简单讲主要涉及三个问题:如何告知远程主机需调用的目标方法是哪个?(在两边同时维护一个<函数名,ID>映射表)将本地的参数传输给远程主机时,要将其转变为适合传输的字节流(序列化,反序列化)。使用什么协议传输?(TCP、UDP,HTTP

  3. 首先,根据作者的教程以及POM文件查看项目依赖关系。

  4. 由于对mave不熟悉,即使理清了依赖关系,对应打了jar包,编译时也报了错。后来发现是因为没有将包install到本地仓库,导致不可见。(关键词:maven生命周期

  5. SocketRpcClient/Server,serviceDiscovery/Registry,核心类:ExtensionLoader(),扩展加载器(写法上参照了dubbo,而dubbo的写法,个人感觉似乎与JDK的ClassLoader有点像)。维护加载器缓存(类级),以及扩展实例缓存(类级、对象级),扩展类型缓存(对象级)。

    通过对应加载器,获取扩展实例时,先从“本地的”对象级缓存中找。若未命中,获取扩展类型,以之为Key从“全局的”类级实例缓存中找,命中则更新本地缓存。若仍未命中,则反射创建扩展实例并更新类级、对象级实例缓存。

    获取扩展类型是通过“本地的”对象级扩展类型缓存获取,若未命中则解析本地配置文件,加载类型并更新缓存。

  6. dubbo网站应用演进dubbo架构及特点

  7. 单例模式,DCL,指令重排,volatile(内部类、枚举)。

  8. ConcurrentMap,get取值后判空用putIfAbsent而非put是为了DCL?

  9. ExtensionLoader()的实现里用到了Holder类,该类将对象包裹,并提供一个volatile限定的引用(我看了下,ExtensionLoader不可变,成员均final修饰,故无法volatile限定,意思是可以加一层间接实现 final+volatile 共存?)。

  10. volatile的一揽子破事

  11. 行吧,进度有点慢,考虑到该项目迭代至今扩展了很多功能,如果一直纠结于细节,对于RPC的主旨部分很难快速了解。故在调研一番后,打算从该带佬发布的第一个正式版开始看,提纲挈领。

  12. client使用动态代理的原因:

    1. 相同的模式:对于每种方法,进行RPC时我们都要做同样的事情:将相关信息打包序列化发送给服务端,接受服务端回信反序列化相关结果。故我们需要实现一个类做这些事情,但目前还不一定要用代理的方式。
    2. 未知的方法:我们希望像调用本地方法那样调用远程方法,因此要求那个类必须提供对应的方法。我们可以通过继承同一接口的方式实现方法的统一(这也是JDK动态代理的要求,只能代理实现接口实现类),但这个接口信息,要等到运行时才能确定,故我们必须用动态代理的方式。
  13. lombok @Builder 建造者模式。实现方法,设置内部类作为中间对象传参,另:通过返回this可以实现method的链式调用。

  14. RPC时要传送方法的名称参数类型,以便通过反射匹配获取对应方法对象-Method。获取Method后,调用invoke即可实现方法调用(若方法有参数,此时传入,此外,这说明在客户端还需传送方法的实参)。

  15. Java序列化通过ObjectOutputStream、ObjectInputStream的writeObject、readObject。序列化对象类需要继承Serializable标记接口。此外,为了避免序列化后,类发生改动产生的版本不一致问题,编译器为Serializable实现类自动添加serialVersionUID属性,当反序列化时,若检测到serialVersionUI与本地类的一致,则报错。serialVersionUID可手动添加,当进行兼容性升级时,不要改动serialVersionUID;反之则修改。

  16. ver1.1改动:

    1. 为RpcRequest增加serialVersionUID;
    2. 服务端:增加异常消息枚举类、调用回执RpcResponse类
    3. 客户端:RpcClient增加对RpcResponse的相应分析。
  17. IDEA可以用git方便的查看每个文件的每个历史改动…不用自己在网页上慢慢点了…orz…太强了…

  18. ver1.2改动:

    1. 服务端:将服务注册功能抽离成接口ServiceRegistry,以及实现类DefaultServiceRegistry(synchronized方法同步,服务多接口重复注册对象)。导致线程类不再直接获取服务对象,而是通过注册中心间接获取
  19. ver2.0改动:

    1. 客户端:RpcClient类抽出RpcClient接口,与RpcClientProxy解耦,原实现类改名为SocketRpcClient。
    2. 服务端:RpcRequestHandler与ServiceRegistry的初始化,从RpcServer推迟到线程类SocketRpcRequestHandlerRunnable,懒加载,线程池职责更明确单一。
    3. 增加对netty与kryo的支持
  20. Netty:基于NIO的客户端-服务器框架,可以简化网络通信编程。

  21. interface Constant<T extends Constant<T>> extends Comparable<T>这个通配符在这里有意义吗?。。。

  22. ThreadLocal(kryo并发不安全)。

参考资料:

  1. Idea操作Maven超级详细使用 基础篇
  2. Idea操作Maven超级详细使用 高级篇
  3. MAVEN01_概述+核心概念+IDEA中如何使用(创建项目)
  4. MAVEN02_依赖范围+依赖冲突+解决冲突+继承聚合

数组黑科技(偏性能方面)未完待更新...

数组去重最优解:Array.prototype.unique=function()vartmp=newMap();returnthis.filter(item=>return!tmp.has(item)&&tmp.set(item,1);)   查看详情

centos6最小化安装所需的常用软件(未完待更新)

CentOS6最小化安装,缺少常用的软件,软件列表如下:yuminstalllrzszwgettelnetlsof openssh-clients-ylrzsz-->rzsz命令wget-->wget命令telnet -->telnet命令lsof -->lsof命令openssh-clientsscp命令,两端的服务器都需要安装这个包 查看详情

cad二次开发学习笔记-未完待续...

CAD二次开发学习笔记-未完待续...总结一张关系图合并两个选择集,并改变所有对象的颜色///<summary>///合并两次选择的选择集,并将所有选择对象改变颜色///</summary>[CommandMethod("MergeSelectionSet")]publicv 查看详情

gdi+学习笔记--未完待续

生成Graphics的两种方法:l 通过事件参数Eventargs生成;l 通过控件的CreateGraphics方法生成;绘制的两种方法:l 控件的paint事件;l 重写Control类的OnPaint方法;Graphics是否需要Dispose释放资源?(也可以使用using释放资 查看详情

less学习笔记(未完待续)

...法,而且连新增的特性也是使用CSS语法。这样的设计使得学习Less很轻松,而且你可以在任何时候回退到CSS(摘自官网)1.变量  Less通过@来定义变量;Less中的变量为完全的常量,所以只能被定义一次  @base:#f938ab;  &nbs... 查看详情

学习笔记之03做百度搜索页面,未完

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><metahttp-equiv=" 查看详情

[后缀数组]学习笔记未完

研究了好长时间....(诶好像莫比乌斯反演时也说过这句话)参考资料:1.http://wenku.baidu.com/link?url=Beh6Asxvtm7M2QY5kiPyKKaP87xvBrNBKW9LXOeGKm-WM4GoUM3opnHZ8z-DahF7TRaLZZ4cpUe6jfFF064XUEmAiIDF7t90CpgNfSC3_Pq2.http://www.cnblogs.com/ 查看详情

android学习《android开发视频教程》第二季笔记(未完待续)

视频地址:http://study.163.com/course/courseMain.htm?courseId=207001 课时22 Activity生命周期(一)1、如何在一个应用中添加新的activity第一步:添加一个activity子类(新建class,继承Activity,添加onCreate方法)右键sourse里面的override/imple... 查看详情

jeesite学习笔记项目框架

JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源JavaEE快速开发平台。在github上,对jeesite平台有详细的介绍,这里稍作整理,给出项目的内置功能、开发工具、设计思想、技术选型以及平台... 查看详情

字符串匹配算法的使用(未完待整理)

参考技术A字符串的匹配在Java中都知道使用indexOf函数来实现,那么其匹配算法是怎么样的呢?单模式和多模式的区别就是一次遍历主串能否将多个模式的字符串都查找出来。英文全称为BruteForce,暴力匹配算法,匹配字符串的方... 查看详情

abb800xa学习笔记52:项目框架结构3

...记我在新浪博客记录过,地址是ABB800XA学习笔记52:项目框架结构3_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里我再记录一遍,以免丢失5.2.6创建一个控制项目在你创建一个控制网络后,创建一个控制项目。控制项目从项目资源... 查看详情

w3school之javascript学习笔记-未完待续

...(简称JS),主要用来向HTML页面添加交互行为。  学习网址:http://www.w3school.com.cn/js/js_intro.asp   写入HTML输出document.write("html元素")对事件作出反应&l 查看详情

abb800xa学习笔记49:项目框架结构1

...笔记我在新浪博客记录过,地址是ABB800XA学习笔记4:项目框架结构1_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里也记录一遍,以免丢失开始第五章的学习。5.基本信息5.1目标完成此章节学习,你将能够:在800XA系统会创建新的项... 查看详情

abb800xa学习笔记51:项目框架结构2

...记我在新浪博客记录过,地址是ABB800XA学习笔记51:项目框架结构2_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里我也记录一遍,以免丢失5.2.4 集成和连接controlbuilderM在方面框架(也称为方面集成平台)作为方面系统运行。集... 查看详情

abb800xa学习笔记50:项目框架结构2

...记我在新浪博客记录过,地址是ABB800XA学习笔记50:项目框架结构2_来自金沙江的小鱼_新浪博客(sina.com.cn)在这里也记录一遍,以免丢失继续学习5.2自动化解决方案自动化解决方案是集管理、维护、控制的自动化系统。在800XA系统... 查看详情

spring学习笔记

spring课堂笔记框架:一个java应用程序的半成品项目,该项目中对java的软件开发进行了一部分的封装和定义标准,我们使用时 只需要学习框架,则会学会使用该框架开发新项目,再开发中使用框架可以提高开发效率,有利于团队... 查看详情

nodejs学习笔记二:解析express框架项目文件

   上一章介绍了如何去创建一个express框架的工程项目,这章介绍一下express框架下的文件和用法解析,上一张我们创建的工程项目结构图如下:  models是不属于原工程项目结构,为了实现数据模型后添加的,而n... 查看详情

爬虫学习笔记(二十四)——pyspider框架(代码片段)

文章目录一、框架介绍1.1、简介1.2、安装(windows)1.3、Phantomjs无界面浏览器二、框架入门2.1、启动pyspider2.2、创建一个项目2.3、脚本2.4、运行项目三、小案例:豆瓣250信息四、架构4.1、概述4.2、组件4.3、关于任务4.4、关于项目4.... 查看详情