天天看點

502 proxy error解決方法_解決socket負載均衡叢集方案和代碼實作

在考慮下socket 之間叢集 可以在Nginx 下可以 但是不同伺服器之間怎麼通訊呢 後來自己也想可不可以用什麼東西或者中間件來通訊 ,後來在百度之下 發現果然就是按照我所想的 ,在網上看了一個方案,架構如下:

502 proxy error解決方法_解決socket負載均衡叢集方案和代碼實作

說一下這個方案他們之間的作用

redis : 存取使用者和伺服器的關系,如果A想發一條資料,是發給B ,這時A發起一個mq訂閱模式推送的資料 ,然後B收到資料處理好 ,在推送給使用者就ok

mq : 是了橋接A和B 的之間的通訊

這樣A和B之間通訊就沒有問題了

以下是搭建過程

首先配置好nginx ,可以百度下載下傳和安裝 ,我的路徑是如下 打開配置nginx.conf vim nginx.conf 配置如下

502 proxy error解決方法_解決socket負載均衡叢集方案和代碼實作
502 proxy error解決方法_解決socket負載均衡叢集方案和代碼實作

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;

public class SocketServerHandler extends SimpleChannelInboundHandler {

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