RPC咱们这是 Demo,目的是突出 RPC框架重点功能 - 实现远程调用。因此啥七七八八的都没,而且我用伪代码来展现,其实也就是删除了一些保护性和约束性的代码,由于看起来太多了不太直观,须要一堆 try-catch 啥的,所以我删减了一些,直击重点。面试
首先咱们定义一个接口和一个简单实现。redis
public interface AobingService { String hello(String name); } public class AobingServiceImpl implements AobingService { public String hello(String name) { return "Yo man Hello,I am" + name; } }
而后咱们再来实现服务提供者暴露服务的功能。数据库
public class AobingRpcFramework { public static void export(Object service, int port) throws Exception { ServerSocket server = new ServerSocket(port); while(true) { Socket socket = server.accept(); new Thread(new Runnable() { //反序列化 ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); String methodName = input.read(); //读取方法名 Class<?>[] parameterTypes = (Class<?>[]) input.readObject(); //参数类型 Object[] arguments = (Object[]) input.readObject(); //参数 Method method = service.getClass().getMethod(methodName, parameterTypes); //找到方法 Object result = method.invoke(service, arguments); //调用方法 // 返回结果 ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.writeObject(result); }).start(); } } public static <T> T refer (Class<T> interfaceClass, String host, int port) throws Exception { return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[] {interfaceClass}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable { Socket socket = new Socket(host, port); //指定 provider 的 ip 和端口 ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.write(method.getName()); //传方法名 output.writeObject(method.getParameterTypes()); //传参数类型 output.writeObject(arguments); //传参数值 ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); Object result = input.readObject(); //读取结果 return result; } }); } }
好了,这个 RPC 框架就这样好了,是否是很简单?就是调用者传递了方法名、参数类型和参数值,提供者接收到这样参数以后调用对于的方法返回结果就行了!这就是远程过程调用,咱们来看看如何使用:后端
//服务提供者只须要暴露出接口 AobingService service = new AobingServiceImpl (); AobingRpcFramework.export(service, 2333); //服务调用者只须要设置依赖 AobingService service = AobingRpcFramework.refer(AobingService.class, "127.0.0.1", 2333); service.hello();
这个示例,简单明了:设计模式
- 生产者:会一直去消费socket中的数据,若是没有的话,就会一直阻塞住,当socket中有数据时,阻塞放开,获取方法名和参数信息,而后执行类中的方法,并将结果写入socket。
- 消费者:其实就是搞了一个代理,当调用service.hello()时,就会触发该代理,这个代理其实就是初始化socket,而后类名和方法写入socket,而后等待服务端返回数据,最后取出数据,而后直接返回。
- 说明:这里只是一个RPC框架,真正的RPC其实还包括数据序列化和反序列化的过程,而后生产者和消费者的交互,可使HTTP,也能够是其它方式,不必定须要咱们直接操做Socket。
Dubbo基础
Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。简单的说,Dubbo 就是个服务框架,说白了就是个远程服务调用的分布式框架。缓存
Dubbo 是阿里巴巴 2011年开源的一个基于 Java 的 RPC 框架,中间沉寂了一段时间,不过其余一些企业还在用 Dubbo 并本身作了扩展,好比当当网的 Dubbox,还有网易考拉的 Dubbok。可是在 2017 年阿里巴巴又重启了对 Dubbo 维护。在 2017 年荣获了开源中国 2017 最受欢迎的中国开源软件 Top 3。在 2018 年和 Dubbox 进行了合并,而且进入 Apache 孵化器,在 2019 年毕业正式成为 Apache 顶级项目。网络
目前 Dubbo 社区主力维护的是 2.6.x 和 2.7.x 两大版本,2.6.x 版本主要是 bug 修复和少许功能加强为准,是稳定版本。而 2.7.x 是主要开发版本,更新和新增新的 feature 和优化,而且 2.7.5 版本的发布被 Dubbo 认为是里程碑式的版本发布。它实现了面向接口的代理 RPC 调用,而且能够配合 ZooKeeper 等组件实现服务注册和发现功能,而且拥有负载均衡、容错机制等。多线程
这幅图简单解释一下:架构
一些注意的点:并发
- 首先注册中心和监控中心是可选的,你能够不要监控,也不要注册中心,直接在配置文件里面写而后提供方和消费方直连。
- 就算注册中心和监控中心宕机了也不会影响到已经正常运行的提供者和消费者,由于消费者有本地缓存提供者的信息。
总的而言 Dubbo 分为三层,若是每一层再细分下去,一共有十层:
大的三层分别为 Business(业务层)、RPC 层、Remoting,而且还分为 API 层和 SPI 层。而分 API 层和 SPI 层这是 Dubbo 成功的一点,采用微内核设计+SPI扩展,使得有特殊需求的接入方能够自定义扩展,作定制的二次开发。
SPI(Service Provider Interface),是 JDK 内置的一个服务发现机制,它使得接口和具体实现彻底解耦。咱们只声明接口,具体的实现类在配置中选择。
我们再来看看每一层都是干吗的:
生产者和消费者的调用过程以下:
提炼一下:初始化服务拿到服务信息 -> 构造数据请求 -> 经过负载均衡选取机器节点 -> 处理统计信息 -> 序列化数据 -> 请求发送给下游
提炼一下:接受请求 -> 反序列化数据 -> 扔入线程池 -> 找到Exporter -> 过滤请求 -> 经过Invoker执行 -> 反序列化结果 -> 返回请求
下面简单讲述一下Dubbo和Spring Cloud的区别,不过在讲述二者区别以前,咱们先简单了解一下Spring Cloud。
Spring Cloud简述
Spring Cloud 基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
Spring Boot 是 Spring 的一套快速配置脚手架,使用默认大于配置的理念,用于快速开发单个微服务。
核心功能:
流程:
Dubbo vs Spring Cloud
优势:
缺点:
优势:
缺点:
Dubbo 专一 RPC 和服务治理,Spring Cloud 则是一个微服务架构生态。
使用 Dubbo 构建的微服务架构就像组装电脑,各环节咱们的选择自由度很高,可是最终结果颇有可能由于一条内存质量不行就点不亮了,老是让人不怎么放心,可是若是你是一名高手,那这些都不是问题;而 Spring Cloud 就像品牌机,在 Spring Source 的整合下,作了大量的兼容性测试,保证了机器拥有更高的稳定性,可是若是要在使用非原装组件外的东西,就须要对其基础有足够的了解。
关于 Dubbo 和 Spring Cloud 的相关概念和对比,上面已经叙述的很清楚了,我我的比较倾向于 Spring Cloud,缘由就是真正的微服务框架、提供整套的组件支持、使用简单方便、强大的社区支持等等,另外,由于考虑到 .NET/.NET Core 的兼容处理,RPC 并不能很好的实现跨语言(须要借助跨语言库,好比 gRPC、Thrift,但由于 Dubbo 自己就是“gRPC”,在 Dubbo 之上再包一层 gRPC,有点重复封装了),而 HTTP REST 自己就是支持跨语言实现,因此,Spring Cloud 这一点仍是很是好的(Dubbox 也支持,但性能相比要差一些)。
但凡事无绝对,每件事物有好的地方也有很差的地方,总的来讲,Dubbo 和 Spring Cloud 的主要不一样体如今两个方面:服务调用方式不一样和专一点不一样(生态不一样)。
后记这篇文章,其实主要是对Dubbo有一个总体的认识,而后初步了解Dubbo和Spring Cloud二者的区别,由于网上常常会把它们两拿来比较。
整篇文章都是概念性的东西,可是对于咱们理解Dubbo又很是重要,能够只能做为入门篇,我目前也是先对Java技术栈的技术,先总体初步了解,后续会选择几个方向再深刻学习。
一直想整理出一份完美的面试宝典,可是时间上一直腾不开,这套一千多道面试题宝典,结合今年金三银四各类大厂面试题,以及 GitHub 上 star 数超 30K+ 的文档整理出来的,我上传之后,毫无心外的短短半个小时点赞量就达到了 13k,说实话仍是有点难以想象的。
内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈(485页)
内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等
因为篇幅限制,详解资料太全面,细节内容太多,因此只把部分知识点截图出来粗略的介绍,每一个小节点里面都有更细化的内容!
须要的小伙伴,能够一键三连,点击这里获取免费领取方式!