上一篇我们简单实现了一个自己的RPC框架,主要依托我们上两篇所提到的这个RPC的流程分析
1.客户端处理过程中调用client stub(就像调用本地方法一样),传入参数
2.Client stub将参数编组为消息,然后通过系统调用向服务端发送消息
3.客户端本地操作系统将消息从客户端机器发送到服务端机器
4.服务端操作系统将接收到的数据包传递给client stub
5.server stub解组消息为参数
6.server stub再调用服务端的过程,过程执行结果以反方向的相同步骤响应给客户端
复制代码
stub:分布式计算中的存根是一段代码,它转换在远程过程调用期间Client和server之间传递的参数
我们还通过发现者的引入,对协议支持和网络层的提取进行了一些小的优化,结构如下:
PS:紫色代表客户端代理部分,浅绿色属于服务发现,浅蓝色属于协议部分
各个小块的代码基本已经给出,相信即使是自己需要跑一下的话也无需进行过多的代码填充工作了
从零开始的高并发(一)--- Zookeeper的基础概念
从零开始的高并发(二)--- Zookeeper实现分布式锁
从零开始的高并发(三)--- Zookeeper集群的搭建和leader选举
从零开始的高并发(四)--- Zookeeper的分布式队列
从零开始的高并发(五)--- Zookeeper的配置中心应用
从零开始的高并发(六)--- Zookeeper的Master选举及官网小览
从零开始的高并发(七)--- RPC的介绍,协议及框架
从零开始的高并发(八)--- RPC框架的简单实现
和zookeeper类似,网址只需要记住,首先这个项目叫dubbo,然后它是属于apache下的,然后开源是非营利性组织,也就是org,所以网址就是:
dubbo.apache.org/
可能小伙伴们要是留意这张图片的话,会发现一开始的时候,它的这张图片右上方是带有Incubating这个英文的,有这个英文说明当时的dubbo还是一个孵化项目,而且因为它是中国人开发的,所以对于中文的翻译支持非常全面,所以对于我们来说学起来应该算是最便利的
Apache Dubbo是一款高性能,轻量级的开源java RPC框架,提供了3大核心能力,面向接口的远程方法调用,智能容错和负载均衡,服务自动注册及发现。
这样一对比,好像我们上一篇写出来的小样就弱爆了哈哈哈
Provider:服务提供者,我们的service,实际执行业务逻辑的服务层
Consumer:服务消费者,对service进行调用,不关注service的具体实现的应用层
Register:注册中心,存储Provider,Consumer信息的中介
Monitor:监控中心,dubbo负责收集服务调用信息的监控中心
复制代码
如果事先有了解过应该在官网上应该看过了,init是初始化,async是异步,sync是同步。我们不难发现所有的RPC框架都脱离不了三个基本要素,就是服务消费者和服务提供者,还有把这些角色们组合起来的网络,缺少一个都谈不上是一个完整的RPC了。
第一步就是我们的服务提供者通过初始化动作,把它的服务信息暴露给注册中心,比如端口号,协议,版本,参数,接口,方法或返回值等基本信息,注册中心register就可以视为一个媒人,服务提供者看作相亲对象女方,这些对象要把它们的基本信息给到媒人以便让服务消费者(男方)认识,此时我们男方是在这个中介所下了单的,让中介所帮忙留意他喜欢的女生,符合要求就通知他,所以subscribe订阅,就是男方让媒人帮忙留意合适的女方的动作
可是姑娘的状态信息不是一成不变的,所以男方也需要异步获得女方的动态,而这个动态也是媒人Registry来notify告知的,那这个机制在这里也是不难猜到,是使用zookeeper的watch机制来实现的,invoke就类似于他们交往沟通的过程了
Monitor就类似于国家的315消费者协议,这次的服务是个什么效果,来做个调研
1.服务容器负责启动,加载,运行服务提供者
2.服务提供者在启动时,向注册中心注册自己提供的服务
3.服务消费者在启动时,向注册中心订阅自己所需的服务
4.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
5.服务消费者从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选择另一台调用
6.服务消费者和服务提供者在内存中累计调用次数和调用时间,定时发送一次统计数据到监控中心
dubbo分别具有以下特点,连通性,健壮性,伸缩性和升级性
连通性:刚刚也提到异步操作主要是两个,一个是订阅服务地址的变化,另一个是监控中心的执行是异步的,这说明了一点,在我们程序运行过程中,注册中心或者监控中心挂掉,是不会对我们的程序流程造成影响的,就好比男方已经获取到女方的电话了,这样男方就自然可以和女方取得联系,而无所谓女方突然变胖一两斤或者感冒发烧。而监控中心挂掉只会影响我们的一些采集数据,也不会对程序造成影响
健壮性:这个在之前的zookeeper中已经无数次地被提到了,节点挂掉不影响集群其他节点的工作
升级性:就是一个服务治理方面的想法,达到自动增加服务器去消费突然增长的请求数的一个功能
必须:JDK1.6+,理论上dubbo可以只依赖JDK,不依赖其他第三方库运行,需要配置JDK相关实现策略
缺省:
服务提供端:
1.独立的服务(普通的java程序形式)
2.集成在应用中(在应用中增加远程服务能力)
消费客户端
1.在应用中调用远程服务
2.在服务1提供者中调用远程服务
复制代码
使用相对简单,不过有侵入性,需要实现类中依赖dubbo提供的注解
使用相对麻烦,可以无侵入,方便以后改用其他RPC框架
编程过程十分麻烦,一般仅用于测试,开放API的场景
1.引入dubbo相关依赖
2.配置dubbo框架(也就是 ⑧ 提到的3个方式)
3.服务的开发与配置
4.启动和调用
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
</dependency>
复制代码