解决socket负载均衡集群方案和代码实现

本文介绍了如何利用Nginx进行Socket负载均衡,并通过Redis存储用户与服务器的关系,结合MQ作为通信桥梁,解决不同服务器间的通讯问题。在Nginx配置中设置权重以调整服务器获取连接的机会,并通过延长读取超时时间保持长链接。同时,提到了ActiveMQ作为MQ的实现,并指出此架构需关注Redis和MQ的高可用性。
摘要由CSDN通过智能技术生成

有一段时间,在考虑下socket 之间集群 可以在Nginx 下可以 但是不同服务器之间怎么通讯呢 后来自己也想可不可以用什么东西或者中间件来通讯 ,后来在百度之下 发现果然就是按照我所想的 ,在网上看了一个方案,架构如下:

说一下这个方案他们之间的作用

redis : 存取用户和服务器的关系,如果A想发一条数据,是发给B ,这时A发起一个mq订阅模式推送的数据 ,然后B收到数据处理好 ,在推送给用户就ok 

mq : 是了桥接A和B 的之间的通讯

这样A和B之间通讯就没有问题了

以下是搭建过程

首先配置好nginx ,可以百度下载和安装 ,我的路径是如下 打开配置nginx.conf   vim nginx.conf 配置如下

 

 map $http_upgrade $connection_upgrade {

      default upgrade;

      '' close;

    }

 

    upstream ws_name {

      server 127.0.0.1:12345 weight=1; ## weight 权重越大越大获取链接机会就越大

      server 127.0.0.1:12346 weight=1;

    }

    server {

        listen       9999;

        server_name  localhost;

        location / {

            proxy_pass   http://ws_name/;

            proxy_http_version 1.1;

            proxy_set_header Upgrade $http_upgrade;

            proxy_set_header Connection "Upgrade";

           ### 以下配置是为了解决在nginx 下 socket 短时间的断开 ,即使你配置长链接也没用 必须有如下的配置

            proxy_connect_timeout 4s;

            proxy_read_timeout 600s; #这个配置连接保持多长时间 这配置十分钟 ,然后可以自己心跳来保证长链接

            proxy_send_timeout 12s;

 

 

        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

以上是nginx的配置 然后启动就ok 启动 命令 :./nginx 

查看是否启动 命令  ps -ef |grep nginx

 然后 mq 我的mq是 activemq  这个可以百度看看怎么安装 ,因为这个安装比较简单所以就不说太多了 

接下来是代码的实现了 :

package com.yw.socket;

import com.yw.mq.Producer;
import com.yw.redis.JedisUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.group.ChannelGroup;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.handler.codec.http.websocketx.*;
import io.netty.util.CharsetUtil;

import javax.jms.JMSException;
import java.util.Date;
import java.util.Iterator;


/**
 * @program: mqYw
 * @description:
 * @author: yw
 * @create: 2018-07-06 21:29
 **/
public class SocketServerHandler extends SimpleChannelInboundHandler<Object> {

    private String URLSTR="ws://%s:%s/%s";

    private String ws="";

    private String port="";



    private WebSocketServerHandshaker handshaker;

    public SocketServerHandler(String url,String port,String name){
        ws = String.format(URLSTR, url,port,name);
        this.port=port;

    }

    public SocketServerHandler(String port,String name){
        this("127.0.0.1",port,name);
    }

    public  SocketServerHandler(String port){
        this("127.0.0.1",port,"websocket");
    }

    public  SocketServerHandler(){

    };
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {


        if (msg instanceof FullHttpRequest) {
            System.out.println("handleHttpRequest  FullHttpRequest");
            ///处理第一次连接过来的请求
            handleHttpRequest(channelHandlerContext,(FullHttpRequest)msg);
        }  else if (msg instanceof WebSocketFrame) {

            handlerWebSocketFrame(channelHandlerContext,(WebSocketFrame)msg);
        }

    }



    /**
     * 添加新的连接
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        super.channelActive(ctx);
           System.out.println("有新的连接进来了额  " + ctx.channel().id() + 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值