我们这是 Demo,目的是突出 RPC框架重点功能 - 实现远程调用。所以啥七七八八的都没,并且我用伪代码来展示,其实也就是删除了一些保护性和约束性的代码,因为看起来太多了不太直观,需要一堆 try-catch 啥的,因此我删减了一些,直击重点。
首先我们定义一个接口和一个简单实现。
然后我们再来实现服务提供者暴露服务的功能。
好了,这个 RPC 框架就这样好了,是不是很简单?就是调用者传递了方法名、参数类型和参数值,提供者接收到这样参数之后调用对于的方法返回结果就好了!这就是远程过程调用,我们来看看如何使用:
这个示例,简单明了:
- 生产者:会一直去消费socket中的数据,如果没有的话,就会一直阻塞住,当socket中有数据时,阻塞放开,获取方法名和参数信息,然后执行类中的方法,并将结果写入socket。
- 消费者:其实就是搞了一个代理,当调用service.hello()时,就会触发该代理,这个代理其实就是初始化socket,然后类名和方法写入socket,然后等待服务端返回数据,最后取出数据,然后直接返回。
- 说明:这里只是一个RPC框架,真正的RPC其实还包括数据序列化和反序列化的过程,然后生产者和消费者的交互,可以使HTTP,也可以是其它方式,不一定需要我们直接操作Socket。
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 内置的一个服务发现机制,它使得接口和具体实现完全解耦。我们只声明接口,具体的实现类在配置中选择。
咱们再来看看每一层都是干嘛的:
生产者和消费者的调用过程如下:
2. 消费者调用流程
提炼一下:初始化服务拿到服务信息 -> 构造数据请求 -> 通过负载均衡选取机器节点 -> 处理统计信息 -> 序列化数据 -> 请求发送给下游
3.生产者处理请求
提炼一下:接受请求 -> 反序列化数据 -> 扔入线程池 -> 找到Exporter -> 过滤请求 -> 通过Invoker执行 -> 反序列化结果 -> 返回请求
下面简单讲述一下Dubbo和Spring Cloud的区别,不过在讲述两者区别之前,我们先简单了解一下Spring Cloud。
Spring Cloud 基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
Spring Boot 是 Spring 的一套快速配置脚手架,使用默认大于配置的理念,用于快速开发单个微服务。
核心功能:
流程:
优点:
缺点:
优点:
缺点:
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、数据库、云计算等
由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
需要的小伙伴,可以一键三连, 点击这里获取免费领取方式!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000428/viewspace-2783869/ ,如需转载,请注明出处,否则将追究法律责任。