手写RPC框架
罗曼-罗兰说过的,这个世上只有一种真正的英雄主义,那就是认清生活的真相,并且仍然热爱它。
RPC架构
技术选型
网络传输
(为了调用远程方法,就是需要发送网络请求来传递目标类和方法信息以及方法的参数到服务提供方)
- bio
- nio
- netty
序列化
(编写网络应用程序的时候,因为数据在网络中传输的都是二进制字节码数据,在发送数据时需要编码,在接收数据时需要解码)
把对象转换成字节数组很容易,但是如果没有相应规则就不能将其转换回对象,所以以下就是含有相应规则的协议方法
如何选择序列化:协议是否支持跨平、序列化的速度、序列化生成的体积。
- java自带的序列化(之前使用过 这个的话,不支持跨语言平台 同时性能比较差 序列化后的体积比较大)
- json(jackson、fastJson、gson) fastJson、JackJson以及Gson序列化对象与get以及对象属性之间的关系
- Thrift Thrift源于faceBook
由于该序列化框架需要相应编译器生成代码和protoc类似 就不进行测试了
//之后有机会尝试 - kryo 深入理解RPC之序列化篇–Kryo - EsotericSoftware/kryo:Java
- protobuf
- protostuff(基于protobuf的java序列化协议——prorostuff)学习java序列化机制之protoStuff
- hessian[Caucho](http://hessian.caucho.com/)
- FST 高性能序列化框架FST - 成长源于沉淀 较新的一款序列化工具还没有得到很广泛的使用
- Avro 也是和protobuf类似 也是需要额外编写对应的类再编译,为了项目的完整性,暂时不采用,之后有机会尝试
JDK原生、ProtoBuf(Protostuff)、Hessian、Kryo、Json的区别
Hessian、Kryo、Protostuff序列化使用区别_-_hessian和protobuf
代理
(一开始我也不知道代理有什么用,直接把业务逻辑代码写在那边不就行了吗,但是后面听了韩顺平老师的课后发现,动态代理的目的就是让对象能像调用自己方法一样,调用远端的方法,相当于对于服务调用者是一个黑盒的状态)
- 静态代理
- 动态代理JDK (实现有实现接口的类)通过反射
- 动态代理CGLIB (CGLIB可以实现接口,也可以实现类) 通过修改字节码生成子类
注册中心
(服务端启动的时候将服务名+服务地址+服务端口注册 然后客户端进行调用的时候 就通过查到相应服务的地址进行调用–相当于目录)搭建注册中心有两种方案第一种就是根据我的
-
在安装好docker的linux系统上启动docker后可以使用拉取我的镜像一键构造 同时启动zookeeper和nacos
-
指令
# 拉取镜像 docker pull 836585692/zytregistry:1.0
# 启动 docker run -it -d -p 8848:8848 -p 2181:2181 --restart always 836585692/zytregistry:1.0
-
一键启动
docker pull 836585692/zytregistry:1.0&&docker run -it -d -p 8848:8848 -p 2181:2181 --restart always 836585692/zytregistry:1.0
-
以下自己独立构建
-
zookeeper(试试放在linux的docker里玩下)(用zookeeper和curator分别来实现 注册中心) 打一个指令让用户一键启动zk集群
-
目的在一台虚拟机中装多个带zookeeper的centos镜像,这样就不用启动过多的虚拟机了。这是后话,目前来说并不需要集群,先都注册到一个zookeeper上
-
zookeeper的安装
,可以直接在linux下安装,我选择在linux的docker下安装,以下是安装步骤(暂时没有用到集群部署所以不对其配置进行修改)#拉取最新版zookeeper镜像 [root@zytCentos ~]# docker pull zookeeper Using default tag: latest latest: Pulling from library/zookeeper 1fe172e4850f: Pull complete 44d3aa8d0766: Pull complete fda2f211fa11: Pull complete 9154e8aefca7: Pull complete 692fa00e9b62: Pull complete a17c9a9b7c3c: Pull complete bd7073bfcd08: Pull complete 0e2c8094a504: Pull complete Digest: sha256:1e62d091501c7125293c087414fccff4337c08d203b92988f4d88081b4f1f63e Status: Downloaded newer image for zookeeper:latest docker.io/library/zookeeper:latest
-
zookeeper的运行
保持zookeeper的开启状态,由于我之前启动没有加-d所以在执行连接它的命令时总会自动关闭,加了的目的是保证它能保持后台运行,–restart always这个指令的目的就是之后不用每次都再启动了[root@zytCentos ~]# docker run -d -p 2181:2181 --name zytzookeeper --restart always zookeeper
-
尝试用本地idea连接启动的服务端
-
添加依赖 zookeeper原生客户端和一个更加便捷开发的客户端Curator
<!--Zookeeper的依赖 客户端--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.7</version> </dependency> <!--顺带引入的更便捷操作的curator的依赖 Curator是Netflix公司开源的一个Zookeeper客户端 简化了原生的开发--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.3.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.3.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-client</artifactId> <version>4.3.0</version> </dependency>
-
进行测试开发 是否有效
首先前提我为了方便起见设置了域名映射(想偷懒的小伙伴可以尝试)接下来就是尝试去连接了
创建成功
测试成功
进行设置 -
-
-
Nacos
自己去尝试,使用 nacos快速开始采用的都是spring亦或者是springboot,我用的不是这些框架。-
在dockerHub上拉取镜像
[root@zytCentos ~]# docker pull nacos/nacos-server:v2.0.3
-
根据镜像创建容器
[root@zytCentos ~]# docker run --name nacos-quick -e MODE=standalone -p 8848:8848 -d --restart always bdf60dc2ada3
- –name 容器名为nacos-quick
- -e 启动环境模式
- -p 是端口映射
- -d 后台方式运行
- –restart always 自动启动
-
启动成功后界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OlOkd3Iv-1653185480171)(/upload/2022/05/image-c144a18b1f2e41868f5b3242e4b9bd12.png)] -
配置依赖
<!--添加Nacos依赖 使用服务注册 服务发现--> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>1.1.1</version> </dependency>
-
-
HttpClient
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
传输协议
(传输协议的作用 就是我们发送的信息 要按照我们自己的规定构造 相当于密文传输的感觉 让别人不知道在发送什么 )
负载均衡
(防止访问量过大,可以将请求分到其他服务提供方上,减少宕机、崩溃的风险)
- 自己代码实现
- zookeeper本身就能实现软负载均衡吧 可以在zookeeper中记录每台服务器的访问次数,让访问最少的去处理最新的客户端请求
- 随机负载均衡
- 一致性哈希
数据压缩
(减少传输时的数据量)JAVA中实现数据压缩所有方式
不同的工具有不同的压缩率 同时不一定会变小,如果是对小体积文件进行压缩的话,一些压缩的相关信息加进去反而变大,一般如果是有大的对象传输可以开启压缩机制
- bzip
- deflater
- gzip
- lz4
- zip
- 自己根据所学的霍夫曼编码实现的diyZip
其他机制
- 心跳机制
- 解决粘包、拆包问题
- 注解开发等等
- SPI机制 Java SPI 机制及其实现