开启掘金成长之旅!这是我参与「掘金日新计划 · 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,我们就会在日志中看到事件。
这将展示一个Pub/Sub模型的基本示例。它有多个用例,可以用于开发聊天应用程序、仪表板、记分卡、电子商务和许多其他地方。