接触 dubbo 有一段时间,特别想拿 dubbo 和 tomcat 比较一番。

tomcat 是 web 服务器,提供 http 服务,当 tomcat 收到浏览器发送的 http 请求时,根据 url 查询对应的 servlet 处理请求,然后发送 http 响应。

dubbo 是 rpc 框架,提供 dubbo 服务,当 provider 收到 consumer 发送的请求后,解析请求,找到对应的接口服务类(原始接口服务类的外面裹着代理和一系列 filter),处理请求,发送响应。

初看上去,很相同,仔细一想,却也大不同。

相同点:
tomcat 是 http 服务器,基于 tcp 协议,dubbo 框架支持多种协议(dubbo, hessian 等),常用的 dubbo 协议也是基于 tcp 协议。即 dubbo 的 consumer 和 provider 首先要建立 tcp 连接,然后才能发送数据。

不同点:
(1)http 客户端如何发送请求?首先建立 tcp 连接,然后发送 http 请求报文,接着等待 http 响应报文,http 报文都是明文字符串。
dubbo 客户端如何发送请求呢?正常情况下,provider 会暴露服务,consumer 去 refer 服务获得代理,然后通过代理调用服务,这里有很长的一个调用栈,底层也是 consumer 发送 request,等待 provider 的 response,但是这里的 request 和 response 都是序列化的 java 对象。
(2)http 客户端发送请求,必然会收到对应的 http 响应,而 dubbo consumer 发送请求时可以设置为 oneway,即不需要响应,则 dubbo provider 不会发送响应,请求也可以设置为同步或者异步,不管同步还是异步都是有响应的。

最后看看,dubbo provider 如何根据请求定位到具体的服务实现类,调用栈如下图:

  1. Invoker<?> getInvoker(Channel channel, Invocation inv) throws RemotingException{
  2. boolean isCallBackServiceInvoke = false;
  3. boolean isStubServiceInvoke = false;
  4. int port = channel.getLocalAddress().getPort();
  5. String path = inv.getAttachments().get(Constants.PATH_KEY);
  6. //如果是客户端的回调服务.
  7. isStubServiceInvoke = Boolean.TRUE.toString().equals(inv.getAttachments().get(Constants.STUB_EVENT_KEY));
  8. if (isStubServiceInvoke){
  9. port = channel.getRemoteAddress().getPort();
  10. }
  11. //callback
  12. isCallBackServiceInvoke = isClientSide(channel) && !isStubServiceInvoke;
  13. if(isCallBackServiceInvoke){
  14. path = inv.getAttachments().get(Constants.PATH_KEY)+"."+inv.getAttachments().get(Constants.CALLBACK_SERVICE_KEY);
  15. inv.getAttachments().put(IS_CALLBACK_SERVICE_INVOKE, Boolean.TRUE.toString());
  16. }
  17. // serviceKey = "com.zhang.HelloService:20880"
  18. String serviceKey = serviceKey(port, path, inv.getAttachments().get(Constants.VERSION_KEY), inv.getAttachments().get(Constants.GROUP_KEY));
  19.  
  20. DubboExporter<?> exporter = (DubboExporter<?>) exporterMap.get(serviceKey);
  21.  
  22. if (exporter == null)
  23. throw new RemotingException(channel, "Not found exported service: " + serviceKey + " in " + exporterMap.keySet() + ", may be version or group mismatch " + ", channel: consumer: " + channel.getRemoteAddress() + " --> provider: " + channel.getLocalAddress() + ", message:" + inv);
  24.  
  25. return exporter.getInvoker();
  26. }

主要是根据 serviceKey 查找 exporter。

dubbo 框架和 tomcat 的比较的更多相关文章

  1. 基于dubbo框架下的RPC通讯协议性能测试

    一.前言 Dubbo RPC服务框架支持丰富的传输协议.序列化方式等通讯相关的配置和扩展.dubbo执行一次RPC请求的过程大致如下:消费者(Consumer)向注册中心(Registry)执行RPC ...

  2. 基于Dubbo框架构建分布式服务

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  3. [转载] 基于Dubbo框架构建分布式服务

    转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...

  4. Dubbo框架应用之(四)--Dubbo基于Zookeeper实现分布式实例

    上三篇文章主要是解决了概念性的补充和学习,充分结合实战来深入理解 入门实例解析 第一:provider-提供服务和相应的接口 创建DemoService接口 package com.unj.dubbo ...

  5. 【Dubbo篇】--Dubbo框架的使用

    一.前述 Dubbo是一种提供高性能,透明化的RPC框架.是阿里开源的一个框架. 官网地址:http://dubbo.io/ 二.架构 组件解释: Provider: 提供者.发布服务的项目.Regi ...

  6. 将dubbo框架里的服务提供者迁移进k8s里,以docker提供服务时要注意的细节

    在将dubbo框架里的服务提供者迁移进k8s时,有几个注意事项: 1, 要为默认情况下,dubbo会将k8s里的pod ip地址作为注册服务的地址,所以这个地址需要被改写(ip测试过,行得通,而dns ...

  7. SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层 ...

  8. Spring Boot 2 整合 Dubbo 框架 ,实现 RPC 服务远程调用

    一.Dubbo框架简介 1.框架依赖   图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代 ...

  9. 应用Dubbo框架打造仿猫眼项目 理解微服务核心思想

    1:传统应用带来的问题 单一业务开发的迭代问题              扩容困难              部署回滚困难2:微服务概述 微服务是一种将业务系统进一步拆分的架构风格          ...

随机推荐

  1. uint8_t / uint16_t / uint32_t /uint64_t数据类型详解

    uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型? 在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等.咋一看,好像是个新的数据类型 ...

  2. snakemake使用笔记

    snakemake是一个用来编写任务流程的工具,用python编写的,因此其执行的流程脚本也比较通俗易懂,易于理解. 一.从一个简单的例子开始 1.安装snakemake 安装snakemake的方法 ...

  3. 简单Promise回顾

    1:传统的CallBack回调函数let ajax=function(callback){ //dosomething this.setTimeout(()=>{ callback&&a ...

  4. 为 10000+ 业务系统提供数据可视化能力的 AntV 又进化了

    小蚂蚁说: 2018 年 AntV 品牌日以知新.知心为主题,旨在让产品一直「知新」,与用户一直「知心」.AntV 是蚂蚁金服全新一代数据可视化解决方案,致力于提供一套简单方便.专业可靠.无限可能的数 ...

  5. 力扣(LeetCode)69. x 的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  6. 《剑指offer》第五十三题(数组中数值和下标相等的元素)

    // 面试题53(三):数组中数值和下标相等的元素 // 题目:假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程实 // 现一个函数找出数组中任意一个数值等于其下标的元素.例如,在数组{ ...

  7. 学习笔记9—python数据表的合并(join(), merge()和concat())

    merage# pandas提供了一个类似于关系数据库的连接(join)操作的方法<Strong>merage</Strong>,可以根据一个或多个键将不同DataFrame中 ...

  8. POI导出时写一份到ftp服务器,一份下载给客户端

    导语: 昨天接到项目经理这么一个需求,让我在POI导出Excel的时候写一份到我之前搭建的ftp服务器上.所以就有了这篇博客首先我们来分析下之前的业务逻辑:我们创建并构造了一个workbook,然后构 ...

  9. Day3-scrapy爬虫下载图片自定义名称

    学习Scrapy过程中发现用Scrapy下载图片时,总是以他们的URL的SHA1 hash值为文件名,如: 图片URL:http://www.example.com/image.jpg 它的SHA1 ...

  10. 图像识别 | AI在医学上的应用 | 深度学习 | 迁移学习

    参考:登上<Cell>封面的AI医疗影像诊断系统:机器之心专访UCSD张康教授 Identifying Medical Diagnoses and Treatable Diseases b ...