微服务异步通信->消息代理

使用消息代理
基于消息传递通常使用消息代理,即服务通信的基础设施。还可以使用无代理的消息传递架构,其中服务之间通信。两种方法(如下图所示)具有不同的利弊,但通常基于消息代理的架构是更好的一种方法。
在这里插入图片描述
无代理消息:

无代理架构中,服务可以直接交互消息。ZeroMQ是一种流行的无代理消息技术。它既是规范,也是一组适用于不同编程语言的库,支持各种传输协议,包括TCP、UNIX风格的套接字和多播。	

无代理架构的好处:

  1. 允许更轻的网络流量和更低的延迟,因为消息直接从发送方到接收方,而不是经过了一层消息代理
  2. 消除了消息代理可能成为性能瓶颈或单点故障的可能性
  3. 降低操作复杂性,不需要设置和维护消息代理

无代理的弊端:

  • 服务需要了解彼此的位置,必须使用服务发现机制
  • 会导致可用性降低,因为在交换消息时,消息的发送方和接收方都必须同时在线
  • 在实现 例如确保消息能够投递成功这些功能更复杂

基于代理的消息:

消息代理是所有消息的中介节点。发送方将消息写入消息代理,消息代理将消息发送给接收方。使用消息代理的一个重要好处是不需要知道接收方的网络位置。另一个好处是消息代理缓冲消息,直到接收方能够出来它们。

流行的开源消息代理包括:

  • Apache ActiveMQ
  • RabbitMQ
  • Apache Kafka

选择消息代理,需要考虑如下因素:

  • 支持的编程语言

     选择消息代理应该尽可能支持多种编程语言
    
  • 支持的消息标准

     消息代理是否支持多种消息标准,比如AMQP和STOMP,还是它仅支持专用的消息标准
    
  • 消息排序

     消息代理是否能够保留消息的排序
    
  • 投递保证

     消息代理提供什么样的消息投递保证
    
  • 持久性

     消息是否支持持久化保存到磁盘上并且能够在代理崩溃后恢复
    
  • 耐久性

     如果接收方重新连接到消息代理,它是否会收到断开连接时发送的消息
    
  • 可扩展性

     消息代理的扩展性如何
    
  • 延迟

     端到端是否有较大的延迟
    
  • 竞争性(并发)接收方

     消息代理是否支持竞争性接收方?
    

基于消息代理的好处

  • 松耦合

     客户端发起请求时只要发送给特定的消息通道即可。客户端不需要获取服务实例的情况,也不需要知道服务的网络位置
    
  • 消息缓存

     消息代理可以在消息被处理之前一直缓存消息
    
  • 灵活的通信

     消息机制支持很多交互方式,如HTTP REST GRPC
    
  • 明确的进程间通信

     基于RPC的机制总数企图让远程服务调用和本地调用看上去没有区别(客户端和服务同时使用远程调用代理)。
    

消息代理的弊端

  • 潜在的性能瓶颈

     消息代理可能存在性能瓶颈。但是许多消息代理都支持集群
    
  • 潜在的单点故障

     消息代理的高可用性至关重要,否则整个系统的可靠性将会受到影响。大多数现代消息代理都是高可用的
    
  • 操作的复杂性

     消息代理是一个必须独立安装、配置和运维的系统组件
    

在这里插入图片描述

### 1. 用户界面层(Presentation Layer) #### 与业务逻辑层的交互 - **uiInteraction 包 -> 业务逻辑层各微服务包** - **箭头类型**:实线箭头 - **标注**:“请求业务处理”。例如,`uiInteraction` 包中的 `QueryTicketUI` 类需要查询车票信息时,会向 `ticketService` 微服务包发送请求,请求其处理车票查询业务。 - **业务逻辑层各微服务-> uiDisplay 包** - **箭头类型**:实线箭头 - **标注**:“返回业务结果”。比如 `ticketService` 微服务包处理完车票查询业务后,将查询结果返回给 `uiDisplay` 包中的 `TicketInfoDisplay` 类进行展示。 - **业务逻辑层各微服务-> uiNotification 包** - **箭头类型**:实线箭头 - **标注**:“触发通知”。当 `orderService` 微服务包处理订单成功后,会触发 `uiNotification` 包中的 `OrderSuccessNotification` 类向用户发送订单成功通知。 ### 2. 业务逻辑层(Business Logic Layer) -微服务形式组织 #### 微服务之间的交互 - **ticketService 微服务包 <-> orderService 微服务包** - **箭头类型**:实线双向箭头 - **标注**:“订单关联车票信息”。在创建订单时,`orderService` 需要从 `ticketService` 获取车票信息;而在某些情况下,如车票库存更新可能会影响订单状态,`ticketService` 也需要与 `orderService` 交互。 - **paymentService 微服务包 <-> orderService 微服务包** - **箭头类型**:实线双向箭头 - **标注**:“支付与订单状态同步”。`orderService` 在创建订单后会请求 `paymentService` 进行支付操作,支付完成后 `paymentService` 会将支付结果反馈给 `order
最新发布
04-13
<think>好的,我需要帮助用户理解用户界面层与业务逻辑层的交互方式,以及微服务之间的交互机制。首先,我要先理清这两个概念的区别和联系。 用户界面层(UI层)主要负责与用户的直接交互,比如接收输入和展示数据。业务逻辑层(Service层)则处理具体的业务规则和数据处理。根据引用中的代码示例,比如引用[4]中的FeignTicketController,可以看到UI层通过REST控制器接收请求,然后调用业务层的TicketService来处理。这符合典型的分层架构,UI层不处理业务逻辑,而是委托给Service层。 接下来是微服务之间的交互机制。用户提到的微服务如ticketService、orderService、paymentService,这些服务之间需要通信。根据引用[2]中的例子,使用Dubbo的@DubboReference注解进行服务调用,类似于OpenFeign的声明式客户端。微服务之间通常通过HTTP/REST或RPC进行通信,比如Dubbo或Spring Cloud Feign。引用[1]提到微服务的优点包括松耦合和技术异构,所以每个服务可以使用不同的技术,只要接口一致。 关于实线箭头的含义,通常在架构图中,实线箭头表示直接的调用或依赖关系。例如UI层调用ticketService,而ticketService可能调用orderService,形成链式调用。需要确认箭头方向,如从UI层指向业务层,或者微服务之间的调用方向。 需要结合用户提供的引用内容,特别是引用[2]和[4]中的代码示例,说明具体的交互方式。比如在引用[4]中,FeignTicketController作为UI层的一部分,通过@Autowired注入TicketService,然后调用其save方法。这里UI层通过依赖注入与业务层交互。而微服务之间如引用[2]中的DubboReference,通过远程调用,并可以配置Mock类进行降级处理,提高可靠性,这也符合引用[1]提到的高可靠性和隔离性。 可能还需要解释服务降级和熔断机制,如引用[2]中的Mock实现,当服务不可用时进行降级处理,避免整体系统崩溃。此外,引用[3]提到SSM和Vue的应用,说明前后端分离的结构,前端通过API与后端微服务交互。 总结下来,用户界面层与业务逻辑层通过控制器调用服务层,而微服务之间通过远程调用(如Dubbo)进行通信,使用注解配置依赖,并实现服务治理机制如降级和熔断。实线箭头在架构图中表示这些调用或依赖关系,方向由调用方指向被调用方。</think>### 用户界面层与业务逻辑层交互设计 #### 1. **分层架构与调用关系** 用户界面层(UI层)负责接收用户请求并展示数据,业务逻辑层(Service层)处理具体业务规则和数据操作。交互方式如下: - **UI层调用Service层**:通过控制器(Controller)接收请求,调用业务逻辑层的接口。 例如引用[4]中的代码: ```java @RestController @RequestMapping("/feign/ticket") public class FeignTicketController { @Autowired private TicketService ticketService; // 依赖注入业务逻辑层接口 @PostMapping("/save") public CommonResp<Object> save(@Valid @RequestBody MemberTicketReq req) throws Exception { ticketService.save(req); // 调用业务逻辑层方法 return new CommonResp<>(); } } ``` 此处通过`@Autowired`注入`TicketService`,实现UI层与业务逻辑层的解耦。 - **数据传递**:UI层通过DTO(Data Transfer Object)或Req对象(如`MemberTicketReq`)向业务层传递参数,业务层返回处理结果或领域对象[^4]。 #### 2. **交互技术实现** - **依赖注入**:使用Spring框架的`@Autowired`或`@Resource`实现层间解耦。 - **RESTful API**:UI层通过HTTP接口对外暴露功能,内部通过服务接口调用业务逻辑[^3]。 --- ### 微服务之间交互机制 #### 1. **通信方式** 微服务间通常采用以下两种交互模式: - **同步调用**:通过HTTP/REST或RPC(如Dubbo)直接调用其他服务的API。 例如引用[2]中的Dubbo远程调用: ```java @DubboReference(mock = "com.linyu.apiservice.mock.TicketServiceMock") private TicketService ticketService; // 声明需要调用的远程服务 ``` 此处`@DubboReference`注解声明了对另一个微服务`TicketService`的依赖,Dubbo会自动生成代理类实现远程调用[^2]。 - **异步消息队列**:通过Kafka、RabbitMQ等中间件实现事件驱动架构,提升系统解耦性和扩展性[^1]。 #### 2. **服务治理机制** - **熔断与降级**:如引用[2]所示,通过`mock`属性配置降级类,当目标服务不可用时,自动触发降级逻辑(如返回默认值或缓存数据),避免级联故障。 - **负载均衡**:Dubbo或Spring Cloud提供负载均衡策略(如轮询、随机),优化服务调用性能[^1]。 --- ### 实线箭头的含义 在架构图中,**实线箭头**通常表示以下关系: 1. **调用方向**:例如`uiInteraction → ticketService`表示用户界面层调用票务服务。 2. **依赖关系**:如`orderService → paymentService`表示订单服务依赖支付服务完成交易。 3. **数据流向**:箭头方向标明请求或数据的传递路径。 --- ### 微服务交互示例 以购票流程为例: 1. **用户界面层**接收选座请求,调用`ticketService`接口。 2. **ticketService**验证座位状态后,调用`orderService`生成订单。 3. **orderService**进一步调用`paymentService`完成支付,最终返回结果至UI层。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值