在考虑下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 {
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