Redis作为消息代理

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

在这篇文章中,我们将讨论Redis作为消息代理的使用,这意味着Redis可以将消息发布到一个主题或通道,然后它也可以使用这些消息。所以我们可以在任何我们想要使用事件驱动架构的应用程序中使用Redis。如果我们正在开发一个基于微服务的应用程序,一个服务想要连接到另一个服务,那么我们可以使用Redis来连接这两个微服务。

Redis采用Pub/Sub模式。因此,一个Redis实例可以订阅一个或多个频道,而另一个实例可以向这些频道发布数据。一旦数据发布,订阅者将立即开始处理。

使用Spring Boot的代码演练

为了开发,我们需要遵循以下步骤:

创建一个Spring Boot项目。

配置包(config, controller, dto)和依赖项,如Jedis, web等。

从配置包开始,让我们创建一个Appconfig类。

在类中,我们需要有用于设置主题、消息侦听器的bean,以及用于管理侦听器、主题和connectionFactory的容器。

@Bean  
RedisConnectionFactory jedisConnectionFactory() {  
return new LettuceConnectionFactory();  
}  
  
@Bean  
public ChannelTopic topic() {  
return new ChannelTopic("pubsub:my topic");  
}  
  
//pass instance of the listener to listen to the messages  
@Bean  
public MessageListenerAdapter messagelisterner() {  
return new MessageListenerAdapter(new Receiver());  
}  
  
//need one container to manage this listener, topic and connection factory  
@Bean  
public RedisMessageListenerContainer getContainer() {  
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();  
redisMessageListenerContainer.setConnectionFactory(jedisConnectionFactory());  
redisMessageListenerContainer.addMessageListener(messagelisterner(), topic());  
return redisMessageListenerContainer;  
}

创建bean之后,让我们为Message创建一个名为Student的Dto类(我们希望将消息从一个服务转移到另一个服务,如Student data、Product Details等)

@RedisHash("student")  
public class Student implements Serializable {  
  
private Long id;  
private String name;  
private int age;  
private String city;  
}  
  
//getter setter toString

现在让我们创建用于发布数据的端点和用于消费数据的订阅者。

创建一个名为Publisher.java的RestController,它将把数据发布到通道中。请参阅下面的代码片段。

@RestController public class Publisher {

@Autowired
private RedisTemplate redisTemplate;

@Autowired
private ChannelTopic channelTopic;

@PostMapping("/publish")
public String publish(@RequestBody Student student) {
    redisTemplate.convertAndSend(channelTopic.getTopic(), student.toString());
    return "Event Published";
}

}

现在订阅服务器将打印消息,以显示它正在从特定通道接收事件。为此创建一个Receiver.java类。

import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import org.springframework.data.redis.connection.Message;  
import org.springframework.data.redis.connection.MessageListener;  
  
  
public class Receiver implements MessageListener {  
  
Logger logger = LoggerFactory.getLogger((Receiver.class));  
  
  
@Override  
public void onMessage(Message message, byte[] pattern) {  
logger.info("Receiving messages, consumed event : {}", message);  
}  
}

这将完成我们的基本工作,现在我们可以使用Postman进行测试。一旦我们点击了发布API,我们就会在日志中看到事件。

image.png

这将展示一个Pub/Sub模型的基本示例。它有多个用例,可以用于开发聊天应用程序、仪表板、记分卡、电子商务和许多其他地方。