Controlador de mensajes SpringCloud Stream

¿Por qué está disponible esta tecnología? ? ?

1. 这个stream是操作消息队列的,简化,学习消息队列的成本降低。
2. 可操作rabbitMQ兔子message queue,kafaka,可理解为jdbc可操作oracle, mysql..
3. spring家的技术学就完了。。

Conceptos que debe comprender sobre los mensajes impulsados

(1) Documento del sitio web
https://spring.io/projects/spring-cloud-stream#overview

https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.1.RELEASE/reference/html/


(2. Introducción

什么是SpringCloudStream
官方定义Spring Cloud Stream是一个构建消息驱动微服务的框架。
应用程序通过inputs或者outputs与Spring Cloud Stream中binder对象交互。
通过我们配置来binding(绑定),
而Spring Cloud Stream的binder对象负责与消息中间件交互。
所以,我们只需要搞清楚如何与Spring Cloud Stream
交互就可以访便使用消息驱动的方式。
通过使用Spring Integration来连接消息代理中间件以实现消息事件驱动。
Spring Cloud Stream为一些供应商的消息中间件产品提供了个性化的自动化配置实现,
引用了发布-订阅、消费组、分区的三个核心概念。
目前仅支持RabbitMQ、Kafka.

(3) mq estándar

  • Mensaje

    • Los productores / consumidores confían en los medios de mensajes para transferir contenido de información
  • Canal de mensajes

    • El mensaje debe pasar por un canal específico
  • La subinterfaz SubscribableChannel del canal de mensajes MessageChannel, suscrito por el procesador de mensajes MessageHandler

    • ¿Cómo se consumen los mensajes del canal de mensajes ?, ¿quién es el responsable de recibirlos y enviarlos?

(4) Por qué utilizar Cloud Stream

1 ¿Por qué la corriente vinculante puede unificar las diferencias subyacentes?

  • En ausencia de binder cuando el concepto de situación, nuestra aplicación SpringBoot para intercambiar información directamente con el middleware de mensajería,
    en varios middleware de mensajería para construir una mente diferente, habrá una mayor diferencia en los detalles de su implementación
    por Defina la carpeta como la capa intermedia, que se da cuenta perfectamente del aislamiento entre la aplicación y los detalles del middleware de mensajes.
    Al exponer el canal unificado a la aplicación, la aplicación no necesita considerar varias implementaciones de middleware de mensajes.

2 arquitectura de carpetas

Inserte la descripción de la imagen aquí

INPUT对应于消费者
OUTPUT对应于生产者

(5) El método de comunicación de mensajes en Stream sigue el modelo de publicación-suscripción

Topic主题进行广播
在RabbitMQ就是Exchange 交换机
在kafka中就是Topic

(6) api común, anotación

Inserte la descripción de la imagen aquí

Productores, consumidores impulsados ​​por mensajes


  1. Pom productor
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>

abstenerse
server:
  port: 8802

spring:
  application:
    name: cloud-stream-consumer
  cloud:
    stream:
      binders: # 在此处配置要绑定的rabbitmq的服务信息;
        defaultRabbit: # 表示定义的名称,用于于binding整合
          type: rabbit # 消息组件类型
          environment: # 设置rabbitmq的相关的环境配置
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: guest
                password: guest
      bindings: # 服务的整合处理
        input: # 这个名字是一个通道的名称
          destination: studyExchange # 表示要使用的Exchange名称定义
          content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
          binder: defaultRabbit  # 设置要绑定的消息服务的具体设置

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://localhost:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
    instance-id: receive-8802.com  # 在信息列表时显示主机名称
    prefer-ip-address: true     # 访问的路径变为IP地址
 

Enviar interfaz de mensaje, darse cuenta

public interface IMessageProvider
{
    
    
    public String send();
}
 
 
/// 实现 
import com.atguigu.springcloud.service.IMessageProvider;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.integration.support.MessageBuilderFactory;
import org.springframework.messaging.MessageChannel;
import org.springframework.integration.support.MessageBuilder;
import javax.annotation.Resource;
import org.springframework.cloud.stream.messaging.Source;

import javax.annotation.Resource;
import java.util.UUID;


@EnableBinding(Source.class) //定义消息的推送管道
public class MessageProviderImpl implements IMessageProvider
{
    
    
    @Resource
    private MessageChannel output; // 消息发送管道

    @Override
    public String send()
    {
    
    
        String serial = UUID.randomUUID().toString();
        output.send(MessageBuilder.withPayload(serial).build());
        System.out.println("*****serial: "+serial);
        return null;
    }
}
 
  
 

  1. Al mismo tiempo, el consumidor yaml, pom, yaml debe cambiar el puerto.
    Definir el controlador para recibir mensajes
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.Message;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.stereotype.Component;

@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListenerController {
    
    
    @Value("${server.port}")
    private String serverPort;

    @StreamListener(Sink.INPUT)
    public void input(Message<String> message) {
    
    
        System.out.println("消费者1号,接受:"+message.getPayload()+"\t port:"+serverPort);
    }

}

Crear otro servicio, consumidor de mensajes, problema

1. 消息重复。发送者发送消息,两个消费者都会接收到消息,如果是支付多个模块,
收到一条消息,多个模块会收到坏账,需要分组,只对一个支付模块发消息.
2. 消息持久化。当关掉消费者,消息丢失。

a. Nueva configuración de grupo, grupo personalizado

group: damn

b. Persistencia, el servicio no funciona, para garantizar que el mensaje no se pierda

Solución de agrupación de configuración de número de página

Supongo que te gusta

Origin blog.csdn.net/qq_44783283/article/details/111397952
Recomendado
Clasificación