一、背景

上一篇记录了下SpringCloud使用Eureka作为服务注册中心的简单示例,文末并未提及使用过程中的感受以及总结,在此先做个小结,主要有以下两点:

  • 整体环境配置简单,只需考虑依赖和application.yml中的少许配置
  • Eureka自带服务注册后台,查看服务注册启动情况更方便

对,是的,就这两点。至于SpringCloud之后的ribbon实现负载均衡、feign声明式服务调用、hystrix服务熔断、zuul…emmmm…我们有缘再见!

所以对比着Dubbo和SpirngCloud,今天使用Multicast作为服务发现与注册中心做了如下的示例。

二、Dubbo、Multicast介绍

略。本文只做简单的环境搭建示例。

不过多提一句关于dubbo的,dubbo官网那张架构图,建议没事儿多在纸上画画,理解的同时也要记牢了,面试要问的。如下:

至于Multicast注册中心,dubbo官网并未做详细介绍,也可以了解下。对比着单播、广播可能更好理解组播这种通讯方式。

三、框架版本选择

dubbo官网给出的示例参考,单纯的使用Spirng的ClassPathXmlApplicationContext加载的dubbo.xml配置,然后从IOC容器获取的对象实例进行调用。所以这里只给出该demo中使用的dubbo版本:

  • dubbo - 2.7.0

但是,如果你想使用Springboot,这边建议参考dubbo-spring-boot-starter

三、环境搭建

工程结构:

1. 创建主工程gkd-dubbo-multicast-demo

引入依赖:

<properties><java.version>1.8</java.version><dubbo.version>2.7.0</dubbo.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties><dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-bom</artifactId><version>${dubbo.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-multicast</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-zookeeper</artifactId><version>${dubbo.version}</version></dependency>
</dependencies>

2. 分别创建provider和consumer两个子module

gkd-dubbo-multicast-provider

resource目录下创建spring/dubbo-provider.xml,并添加配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="demo-provider"/><!-- 使用multicast广播注册中心暴露服务地址 --><dubbo:registry address="multicast://224.5.6.7:1234"/><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880"/><!-- 声明需要暴露的服务接口 --><bean id="demoService" class="com.gkd.multicast.service.impl.DemoServiceImpl"/><!-- 和本地bean一样实现服务 --><dubbo:service interface="com.gkd.multicast.service.DemoService" ref="demoService"/></beans>

注意注册中心暴露的服务地址<dubbo:registry address=“multicast://224.5.6.7:1234”/>

编写服务DemoService:

/*** 定义服务接口*/
public interface DemoService {String sayHello(String name);
}

以及DemoService的实现:

/*** 在服务提供方实现接口*/
public class DemoServiceImpl implements DemoService {@Overridepublic String sayHello(String name) {return "Hello " + name;}
}

最后服务启动类:

public class App {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");context.start();System.in.read();}
}

gkd-dubbo-multicast-consumer

引入provider依赖:

<dependencies><dependency><groupId>com.gkd</groupId><artifactId>gkd-dubbo-multicast-provider</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>

同样resource目录下创建spring/dubbo-consumer.xml,并添加配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --><dubbo:application name="demo-consumer"/><!-- 使用multicast广播注册中心暴露发现服务地址 --><!-- unicast=false 并没有配置也可以 --><dubbo:registry address="multicast://224.5.6.7:1234"/><!-- 生成远程服务代理,可以和本地bean一样使用demoService --><dubbo:reference id="demoService" check="false" interface="com.gkd.multicast.service.DemoService"/></beans>

编写启动类并测试调用:

public class App {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml");context.start();DemoService demoService = (DemoService) context.getBean("demoService"); // 获取远程服务代理String hello = demoService.sayHello("world"); // 执行远程方法System.out.println(hello); // 显示调用结果}
}

3. 启动provider服务,再启动consumer服务,调用结果:

Hello world

4. 源码地址:https://github.com/nidagewcc/gkd-spring-learning

示例我写了两种实现方式,区别不大:

  • 一种是本文描述的通过spring的ClassPathXmlApplicationContext加载dubbo配置实现
  • 另一种是基于dubbo-spring-boot-starter实现

四、遇到的问题

  1. dubbo官网提到“当服务者和消费者运行在同一台机器上,消费者同样需要声明unicast=false,否则消费者无法收到消息,导致No provider available for the service异常”,我在本机并没有配置,并没有导致异常,原因未知;
  2. “dubbo 2.5.8 新版本增加了 QOS 模块,提供了新的 telnet 命令支持”。我理解的是:
  • 这个版本之后都需要配置dubbo.properties,并添加属性dubbo.application.qos.port=33333,不然会抛出异常
  • provider和consumer服务设置的QOS端口要不一样;
  • 该在线运维命令默认是开启的,如果要关闭请参考:http://dubbo.apache.org/zh-cn/docs/user/references/qos.html
  1. 在启动consumer服务调用provider的服务是,偶尔会出现异常:message can not send, because channel is closed。我个人是通过修改注册中心暴露的服务地址解决的。

五、总结

dubbo官网的参考也是比较重点和概括的,即使这么简单粗糙的demo中间过程也会踩到很多坑,所以多了解原理,多看源码是有必要的。


前作

  • 散装版学习笔记 - SpringCloud使用Eureka作为服务注册中心示例

以上。

散装版学习笔记 - Dubbo配合Multicast作为服务注册中心示例相关推荐

  1. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

  2. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-02 6. 锁 ​ 人们认为行级锁总会增加开销.实际上,只有当实现本身会增加开销时,行级锁才会增加开销.InnoDB 存储引擎不需要锁升级,因 ...

  3. 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

    基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...

  4. 学习笔记--Dubbo

    Dubbo学习笔记 Dubbo是什么 Dubbo是: 一款分布式服务框架 高性能和透明化的RPC远程服务调用方案 SOA服务治理方案 ZooKeeper服务注册中心 下载 ZooKeeper ,地址 ...

  5. C++Primer第5版学习笔记(三)

    C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容       因为第五章的内容比较少,因此和第四章的笔记内容合并.       第四章是和表达式有关的知识, ...

  6. C++Primer第5版学习笔记(一)

    C++Primer第5版学习笔记(一) 第一.二章的重难点内容        这个笔记本主要记录了我在学习C++Primer(第5版,中文版)的过程中遇到的重难点及其分析.因为第一.二章都比较简单,因 ...

  7. 《Real-Time Rendering》第四版学习笔记——Chapter 9 Physically Based Shading(一)

    一.光的物理特性 光与物体的交互形成了基于物理着色的基础. 在物理层面上,光的模型为电磁横波.每个波都有一个单一的波长λ\lambdaλ.具有单一波长的光叫单色光(monochromatic ligh ...

  8. 《Python编程:从入门到实战》(第2版)学习笔记 第5章 if语句

    [写在前面]为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的<Python编程:从入门到实战> ...

  9. PMBOK(第六版) 学习笔记 ——《第七章 项目成本管理》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

最新文章

  1. 创造信用收入 借贷宝颠覆创新普惠金融
  2. 16 WM配置-策略-激活存储类型搜索(Storage Type Search)
  3. 22 CO配置-控制-产品成本控制-成本对象控制-检查制造订单 (PP) 的评估变式
  4. 十大非著名之父:手机,黑莓,iPod,FORTRAN,远程办公,鼠标,垃圾邮件,DSL,Java,WIFI说,我爸是...-asp.net关注...
  5. java 高级工程师面试
  6. 五大领域总目标指南_每日干货 | 五大领域 学前社会教育1
  7. svn 备份和还原项目
  8. 大数据可视化技术挑战和措施
  9. 我的Oracle 9i学习日志(11)--重做日志文件及练习
  10. opengl 图片处理 卷纸弯曲效果_神笔马良——基于 OpenGL 的涂鸦框架
  11. 从web层运作流程认识Struts2
  12. 软件设计文档国家标准—软件需求说明书(GB856T——88)
  13. 华硕服务器主板型号命名规则,【华硕A85X评测】华硕2012年主板命名规则详解-中关村在线...
  14. python100以内的质数_100以内质数表
  15. 数学建模时序数据分析——趋势性检验和平稳性检验
  16. css绘制一个动态雷达图
  17. 计算机系统维护课程设计报告,计算机系统维护工程(第2版)
  18. python等待执行完毕 再继续执行_如何等待一个函数内部异步执行完毕再执行另外一个函数?...
  19. 城镇职工修改医疗定点机构?如何查询定点医疗机构编码?
  20. 《Photoshop七大核心技术》—第1课Photoshop七大核心技术

热门文章

  1. c语言头文件和源文件为什么分开,C语言中为什么要头文件和源文件分开写
  2. 如何看待自己适不适合做网站
  3. 2021-03-30-CentOS7服务器系统备份与恢复
  4. 从零开始学习Vue(一)
  5. 5步教你快速绘制组织结构图
  6. sqlalchemy 学习笔记(全)
  7. CapsLock+按键总结
  8. 【工具使用】--- wpscan工具的简单使用
  9. 使用Ghost对系统进行备份中出现的NO FAST HIGH是什么意思?
  10. rap2客户端dolores环境搭建