分布式WebSocket架构

1 篇文章 0 订阅

技术解决方案

  • 利用Redis的Pub/Sub
  • 大致流程

  • 具体代码Demo如下
@Configuration
public class RedisObserverConfig {

    public static final String TOPIC_ORDER_FOOD = "websocket:order_food";

    @Autowired
    private JedisConnectionFactory jedisConnectionFactory;

    @Bean
    RedisMessageListenerContainer redisContainer() {
        final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(jedisConnectionFactory);
        container.addMessageListener(messageListener(), orderFoodTopic());
        container.setTaskExecutor(Executors.newFixedThreadPool(4));
        return container;
    }

    @Bean
    MessageListenerAdapter messageListener() {
        return new MessageListenerAdapter(orderFoodListener());
    }

    @Bean
    ChannelTopic orderFoodTopic() {
        return new ChannelTopic(TOPIC_ORDER_FOOD);
    }

    @Bean
    OrderDishesListener orderFoodListener() {
        return new OrderDishesListener();
    }

}
<bean id="jedisConnectionFactory"
		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
		destroy-method="destroy">
		<property name="hostName" value="${redis.host}" />
		<property name="port" value="${redis.port}" />
		<property name="timeout" value="${redis.timeout}" />
		<property name="database" value="${redis.database}" />
		<property name="password" value="${redis.password}" />
		<property name="usePool" value="true" />
		<property name="poolConfig" ref="jedisPoolConfig" />
	</bean>
  • SendMessage
@Service
public class OrderFoodWebSocketService {

	@Autowired
	private RedisTemplate redisTemplate;

	public void sendMessage() {
		redisTemplate.convertAndSend(RedisObserverConfig.TOPIC_ORDER_FOOD, "hello");
	}
}
  • MessageListener
public class OrderDishesListener implements MessageListener {

    @Autowired
    private RedisSerializer<Object> jsonRedisSerializer;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        Object object = jsonRedisSerializer.deserialize(message.getBody());
        System.out.println("orderDishesListener message body = " + JSON.toJSONString(object));
    }
}

注意点

nginx支持WebSocket需要添加以下配置

location /wsapp/ {
    proxy_pass http://wsbackend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
}

nginx会把Http请求升级至WebSocket

参考资料

转自: https://blog.csdn.net/lidaqian11/article/details/83278913

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值