手写RPC框架(一)

手写RPC框架

img

罗曼-罗兰说过的,这个世上只有一种真正的英雄主义,那就是认清生活的真相,并且仍然热爱它。

RPC架构

在这里插入图片描述

技术选型

网络传输

(为了调用远程方法,就是需要发送网络请求来传递目标类和方法信息以及方法的参数到服务提供方)

  • bio
  • nio
  • netty

序列化

(编写网络应用程序的时候,因为数据在网络中传输的都是二进制字节码数据,在发送数据时需要编码,在接收数据时需要解码)

把对象转换成字节数组很容易,但是如果没有相应规则就不能将其转换回对象,所以以下就是含有相应规则的协议方法

如何选择序列化:协议是否支持跨平、序列化的速度、序列化生成的体积。

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的依赖 CuratorNetflix公司开源的一个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中实现数据压缩所有方式
不同的工具有不同的压缩率 同时不一定会变小,如果是对小体积文件进行压缩的话,一些压缩的相关信息加进去反而变大,一般如果是有大的对象传输可以开启压缩机制

Java不同压缩算法的性能比较_

  • bzip
  • deflater
  • gzip
  • lz4
  • zip
  • 自己根据所学的霍夫曼编码实现的diyZip

其他机制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值