我们把三种交换器讲解完毕了,我们再来看一下,如果使用RabbitMQ,实现松耦合设计,要讲松耦合,我们得先回到就是为什么要使用RabbitMQ,解决什么问题,在这章节当中呢,分别给大家介绍了一下,我们用消息队列对我们系统的一个优点,比如像同步变异步,还有解耦,这个解耦所展示的含义是什么呢,我如果对当前操作的服务增加了,你看我订单服务原来操作短信服务,Email服务,Push服务,那现在我又新建一个微信服务,如果我们没有MQ系统,我们的消息队列接入的话,回到我们传统的模型下,如果我这一块加了一个微信服务,那么也就意味着我现在,我的订单服务必须要代码修改,我原来在订单服务当中,调用短信服务的接口,调用Email服务的接口,调用APP-Push服务的接口,现在我又加了一个微信服务,这块肯定也好去调用微信服务的接口,那这样就不符合我们开闭的原则了,应该还知道吧,对于添加代码是开放的,但是对于修改代码是关闭的,你不能去修改这里的东西,修改肯定会影响我们的健壮性的,对修改的部分做重新测试,所以说呢,我们现在要做的是,通过MQ系统,去实现解耦和松耦合的设计,MQ系统接入以后,我们订单服务的消息,然后通过MQ系统,再将消息发送给不同的服务平台,那么有新的服务介入了,只要让微信服务去订阅MQ里的消息就可以了,那么对于我订单服务来讲,没有任何的代码修改,这就是解耦上的一个设计思路

来说一下解耦的实现,在这里我们还是以上一个案例,在这里我们要说明一下,一定要注意,对于服务与服务之间的解耦,其实跟你用什么交换器没有关系,关键是你要入MQ系统,才能够解耦,明白我的意思吧,不要认为案例是拿fanout交换器去写的,现在我想要来解耦的话,是不是得非用fanout,不是,direct,topic都可以实现解耦,它是都是MQ里面的交换器,所以只要你在服务和服务之间使用MQ系统,或者消息队列,你就可以实现松耦合的设计,我只是做一个代码的实现而已,先看这个图,这个需求,我原来有短信服务,有Push服务,现在我是不是加了一个红包服务,那么也就意味着,现在我要在我的消息队列当中,让红包服务来订阅我MQ当中的消息,那我这里是不是得加一个队列,红包会去订阅这个队列

你看我们这个图是不是只要改Consumer就可以了,还需要动Provider吗,不用的,回到我们的Consumer当中,首先我们的配置文件需要改一下,图中已经画的很清楚了,所以我这里还要给另一个队列起一个名mq.config.queue.red=red我们就叫read得了,我们现在给队列起个名称,然后接下来我们是不是要添加服务,叫RedReceiver,然后在这个服务当中,我们要改的第一个是队列的名称,value="${mq.config.queue.red}",读我们properties文件里的这个配置mq.config.queue.red=red然后回过来,在这里fanout也不要动@RabbitListener(bindings=@QueueBinding(value=@Queue(value="${mq.config.queue.red}",autoDelete="true"),exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT))
)打印这里我们是不是得修改一下,接到消息以后,给用户发送10元红包@RabbitHandler
public void process(String msg){System.out.println("给用户发送10元红包........receiver: "+msg);
}所以在整个编程过程当中,我并没有修改Provider的代码,我只是在Consumer添加了代码了,并没有去修改其他的class,这个是搭建环境,第一个修改配置文件,第二个添加RedReceiver,然后接下来我们来测试一下,我们先把Consumer启动,启动没有问题,我们接下来再去运行Provider,向他发送消息,观察控制台,我们可以看到,给用户发送10元红包的RedReceiver,也运行了,他已经收到这个消息了,也是Hello RabbitMQ,我们只要对添加的新服务,去消息队列订阅我们的消息就可以,所以这是一个典型的松耦合的设计,对于添加代码是开放的,对于修改代码是关闭的,我们主要是添加一个红包服务,来给大家讲解一下,服务与服务之间用RabbitMQ以后,所带来一个松耦合的一个设计,这是非常灵活的
spring.application.name=rabbitmq-fanout-consumerspring.rabbitmq.host=59.110.158.145
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guestmq.config.exchange=order.fanout
mq.config.queue.sms=order.sms
mq.config.queue.push=order.pushmq.config.queue.red=red
package com.learn;import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** 消息接收者* @author Administrator* @RabbitListener bindings:绑定队列* @QueueBinding  value:绑定队列的名称*                exchange:配置交换器*                key:路由键* * @Queue value:配置队列名称*        autoDelete:是否是一个可删除的临时队列* * @Exchange value:为交换器起个名称*           type:指定具体的交换器类型*/
@Component
@RabbitListener(bindings=@QueueBinding(value=@Queue(value="${mq.config.queue.red}",autoDelete="true"),exchange=@Exchange(value="${mq.config.exchange}",type=ExchangeTypes.FANOUT)))
public class RedReceiver {/*** 接收消息的方法。采用消息队列监听机制* @param msg*/@RabbitHandlerpublic void process(String msg){System.out.println("给用户发送10元红包........receiver: "+msg);}
}

使用RabbitMQ实现松耦合设计相关推荐

  1. DIP依赖反转原则——实现松耦合的设计

    在<IoC控制反转设计原则--实现松耦合>我们将控制工作委派给其他类来完成,向松耦合设计又迈进了一步.但是我们类仍然依赖着具体的类,所以我们可以使用DIP(依赖反转原则)来进一步获得松耦合 ...

  2. IoC控制反转设计原则——实现松耦合

    IoC控制反转设计原则--实现松耦合 1.IoC设计原则 1.1.控制程序流 1.2.控制依赖对象的创建 2.从典型的n层体系架构来理解IoC IOC是一种设计原则(虽然,有很多人将它当成是一种设计模 ...

  3. 松耦合式的权限控制设计,自定义权限表达式

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  4. 松耦合和紧耦合的架构设计、性能对比

    在最近的一次大数据技术讨论会上,有一家公司的技术高管谈到松耦合和紧耦合的性能表现的话题.正好Laxcus大数据管理系统的设计,从0.x.1.x到2.x版本,也经历了从紧耦合到松耦合的发展过程.做为亲历 ...

  5. MEF实现设计上的“松耦合”(一)

    1.什么是MEF 先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展, ...

  6. 专访关东升:松耦合分层架构设计

    关东升,国内知名iOS技术作家,iOS技术顾问,高级培训讲师,移动开发专家.拥有16年软件开发经验.8年培训行业经验.精通iOS.Android和 Windows Phone 7及Html5等移动开发 ...

  7. 【设计模式之美 设计原则与思想:设计原则】22 | 理论八:如何用迪米特法则(LOD)实现“高内聚、松耦合”?

    今天,我们讲最后一个设计原则:迪米特法则.尽管它不像 SOLID.KISS.DRY 原则那样,人尽皆知,但它却非常实用.利用这个原则,能够帮我们实现代码的"高内聚.松耦合".今天, ...

  8. C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入

    前言:今天十一长假的第一天,本因出去走走,奈何博主最大的乐趣是假期坐在电脑前看各处堵车,顺便写写博客,有点收获也是好的.关于MEF的知识,之前已经分享过三篇,为什么有今天这篇?是因为昨天分享领域服务的 ...

  9. 松耦合和紧耦合的架构设计及性能对比

    松耦合和紧耦合的架构设计及性能对比 laxcus大数据 2016-07-20 07:26:41 浏览756 评论0 架构 算法 性能优化 摘要: 在最近的一次大数据技术讨论会上,本行业一家公司的技术高 ...

最新文章

  1. 提高IIS网站服务器的效率的八种方法 (转载)
  2. python天天学怎么样-Python天天学_03_基础三
  3. c语言课程设计怎么做,C语言课程设计————写下流程图! 谢谢
  4. uva 10801 Lift Hopping
  5. MySQL数据库备份工具mysqldump的使用(转)
  6. redis+celery+django设置外网可访问
  7. DCT原型 ——傅里叶级数
  8. matalotlib(2)
  9. pythoncad图纸文件管理系统为用户_SafeShare通用CAD图纸文件管理软件6用户免费使用版...
  10. 大数据分析给企业带来哪些挑战
  11. SQL注入工具-----sqlmap
  12. windows NT到底是什么
  13. 合宙Luat | 嘿~合宙刚办了一场「大型网友见面会」
  14. 如何完美实现微信自动发朋友圈自动添加好友等等
  15. python读取grd数据_从等值线图形获取DAT和GRD格式的数据文件_王宜芳
  16. Android仿微信朋友圈4实现评论动态时输入框和软键盘自动定位到内容下面
  17. 七段数码管的使用(使能端分时控制)
  18. node - opn库
  19. 静态文本框透明的实现方法
  20. VS2017 + Win10 下的 OpenCPN 5.0.0 编译过程小结

热门文章

  1. 只要你想学,分分钟钟用H5教会你玩转魔方
  2. BCB中的RTTI机制
  3. Visual C# 2008+SQL Server 2005 数据库与网络开发--13.1.3 简单记事本程序菜单设计
  4. 【Java并发编程】java高并发的解决方案(一)
  5. 任天堂和VR,是要“重新牵手”还是“分道扬镳”?
  6. Python之ORM
  7. 使用移动自适应布局+easy mock实现移动界面的简单实现
  8. MaxCompute实践分析
  9. linux源代码安装程序
  10. 思维+multiset ZOJ Monthly, July 2015 - H Twelves Monkeys