松耦合系统通常是基于消息的系统,此时客户端和远程服务并不知道对方是如何实现的。客户端和服务之间的通讯由消息的架构支配。只要消息符合协商的架构,则客户端或服务的实现就可以根据需要进行更改,而不必担心会破坏对方

松耦合通讯机制提供了紧耦合机制所没有的许多优点,并且它们有助于降低客户端和远程服务之间的依赖性。但是,紧耦合性通常可以提供性能好处,便于在客户端和服务之间进行更为紧密的集成。
最近,人们越来越热衷于比较应用程序交互的
松耦合方法和紧耦合方法。
造成这个趋势的主要技术原因是:使用UDDI(Universal Description, Discovery and Integration,通用描述、发现和集成)等标准,Web服务可以动态地发现和绑定到其他服务。
而主要业务原因是:企业越来越需要灵活地处理业务流程的更改以及与合作伙伴的交互方式。松耦合系统的优点在于更新一个模块不会引起其它模块的改变。
传统上,业务流程是在企业范围,甚至在企业的不同业务单元内开发。这些活动在详细的实时信息的帮助下进行管理。跨多个业务单元或跨企业的流程必须更加灵活,以应对各种各样的需求。在这种情况下,可能出现更多的不确定性:参与者及其角色不断变化,所需的交互类型也不断变化。

如下机制要在上一个的广播的案例中添加一个新的服务,如果按照之间的配置的话则需要,更改订单的服务的源码,这就违反的开闭原则,如果我们使用消息中间件,我们只需要添加服务即可,让服务区订阅的消息中间件即可。

松耦合架构灵活部署 松耦合系统的缺点_客户端

松耦合架构灵活部署 松耦合系统的缺点_松耦合架构灵活部署_02

只需要修改服务端即可
全局配置文件

spring.rabbitmq.host=192.168.177.140
spring.rabbitmq.port=5672
spring.rabbitmq.username=oldlu
spring.rabbitmq.password=123456
spring.application.name=08-rabbitmq-fanout-cunsumer

#配置交换器的名字
spring.rabbitmq.exchange.name=order-topic

#设置短信队列名称
spring.rabbitmq.queue.sms=order-sms

#设置push队列名称
spring.rabbitmq.queue.push=order-push

#添加红包系统
spring.rabbitmq.queue.red=order-red

添加服务

@Component
@RabbitListener(
        bindings = @QueueBinding(
                value = @Queue(value = "${spring.rabbitmq.queue.red}"),
                exchange = @Exchange(value = "${spring.rabbitmq.exchange.name}",type = ExchangeTypes.FANOUT)
        )
)
public class RedQueue
{
    @RabbitHandler
    public void red(String msg){
        System.out.println("red...");
    }
}

测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ApplicationTests
{

    @Autowired
    private Sender sender;

    @Test
    public void contextLoads()
    {
        this.sender.send("消息传输");
    }
}

松耦合架构灵活部署 松耦合系统的缺点_spring_03