当前位置:首页 > CN2资讯 > 正文内容

iot 服务器配置 自建iot服务器

1周前 (09-24)CN2资讯


vue中SocketIO的正确使用方法,并且解决跨域问题 这篇文章中,我们介绍了SocketIO这款消息推送利器。今天我们来聊下怎么搭建一个生产可用的SocketIO集群。
由于单机资源的限制,一台机器能够支撑的tcp连接是有瓶颈的,而且也存在单点故障的弊端,所以在生产环境上使用SocketIO时,通常来讲,都是基于集群模式的。

将服务器进行水平扩展,最简单的做法就是使用负载均衡技术如nginx来实现。本文正是基于nginx教你如何一步步地搭建SocketIO集群。

搭建SocketIO服务器节点

我们首先在本地搭建2台服务器节点,服务器代码如下:
节点1:

public class Server1 { public static void main(String[] args){ Configuration config = new Configuration(); config.setPort(1337); final SocketConfig socketConfig = new SocketConfig(); socketConfig.setReuseAddress(true); config.setSocketConfig(socketConfig); SocketIOServer server = new SocketIOServer(config); server.addConnectListener(new ConnectListener() { @Override public void onConnect(SocketIOClient socketIOClient) { System.out.println(socketIOClient.getSessionId()+" has connected."); } }); server.start(); } }

节点2:

public class Server2 { public static void main(String[] args){ Configuration config = new Configuration(); config.setPort(1338); final SocketConfig socketConfig = new SocketConfig(); socketConfig.setReuseAddress(true); config.setSocketConfig(socketConfig); SocketIOServer server = new SocketIOServer(config); server.addConnectListener(new ConnectListener() { @Override public void onConnect(SocketIOClient socketIOClient) { System.out.println(socketIOClient.getSessionId()+" has connected."); } }); server.start(); } }

2个节点除了监听端口不一样之外,其他代码和逻辑都是一模一样的。

配置nginx负载均衡

以下是nginx的配置,可以看到,在upstream块中配置了2台SocketIO服务器节点的主机和端口。然后在location块中使用proxy_pass指令进行转发。这样就实现了最简单的负载均衡配置。

worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { proxy_pass http://nodes; } } upstream nodes { server localhost:1337; server localhost:1338; } }

启动服务并测试

接下来分别启动2台SocketIO服务器和nginx服务器。

再写一个客户端,测试下通过nginx转发后,客户端能不能与后端的SocketIO服务器正常建立连接。

客户端代码如下:

public class Client { public static void main(String[] args) throws Exception{ final Socket socket = IO.socket("http://localhost:80"); socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { @Override public void call(Object... args) { System.out.println("I have connected to server."); } }); socket.connect(); } }

需要注意的是,这里客户端建立连接的时候,设置的连接地址是nginx的主机和端口号。如果能够正常建立连接,那么客户端控制台就会打印"I have connected to server."这段话。


可以看到,客户端并没有打印任何日志,说明连接并没有建立成功。再看下SocketIO服务器1的控制台输出:


可以看到,SocketIO服务器1已经接收到连接请求了,但是客户端并没有接收到相应的回调。

再来看下SocketIO服务器2的情况:

可以看到一个奇怪的现象,那就是SocketIO服务器2不断地打印有新连接建立的日志,而且每个连接的id也都不一样。

实际上,这只是其中一部分截图,几乎每隔1秒钟,服务器2就会打印一条新连接建立的日志。这是为什么呢?

我们想要的只是让客户端与具体的某台SocketIO服务器建立连接,然后通过这条连接往客户端推送数据,但是从上述结果看来,似乎客户端会不断地尝试建立连接,但是最终也没能成功建立一条有效的连接,反而大大地浪费了服务器资源。

SocketIO官方的建议配置

接下来我们看下SocketIO官方是如何使用nginx来做水平扩展的。

打开官网,找到using-multiple-nodes这一节。


这一节开头就提到了,如果要使用多节点做水平扩展的话,需要保证一个客户端只跟具体的某台SocketIO服务器维持连接,否则的话,在WebSocket协议握手阶段,会因为握手失败而无法正常建立连接。

同时,官网还给出了nginx负载均衡的参考配置,我们将官方的配置搬过来试一下:

worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { proxy_pass http://nodes; # enable WebSockets proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } upstream nodes { # enable sticky session based on IP ip_hash; server localhost:1337; server localhost:1338; } }

可以看到,在upstream块里面,多了一个ip_hash的配置,这个配置可以使得nginx根据客户端的ip来做负载均衡,最终的效果是某一个ip的客户端只会被路由到某一台服务器上面。

还有一点不同的是,多了2个请求头的设置:Upgrade和Connection。这2个请求头都是HTTP协议升级到WebSocket协议的过程中会用到的。

接下来我们重启nginx服务器,再启动客户端。即可实现啦啦啦…

我们将nginx的配置改成官方提供的之后,就可以正常建立连接了。

那么我们之前那么配置,到底有什么问题呢?

之前我们配置upstream块的时候,并没有明确指定具体的负载均衡策略,因此nginx使用的是默认的轮询策略,而由于WebSocket协议握手的过程中不是一步而就的,它分了几个步骤,如果说上一次是与服务器1握手,下一次是与服务器2握手,那么肯定没法正常完成握手流程,连接也就没法正常建立了。

至于proxy_set_header这个配置,目的是将客户端在握手过程中的请求头传输给后端服务器,不过我试了将这个配置注释掉,发现也还是能正常建立连接的,在生产环境,建立还是把这个配置加上为好。

总结

以上就是使用nginx搭建SocketIO服务器的全过程了。虽然不复杂,但是其背后的原理还是有必要了解的。因为只有知道了原理,如果你们公司用的负载均衡技术不是nginx,那么你也能知道怎么配置负载均衡策略来实现SocketIO服务器的水平扩展。万变不离其宗,底层原理才是最重要的。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/23243.html

    分享给朋友:

    “iot 服务器配置 自建iot服务器” 的相关文章

    全面了解IP测试:提升网络安全与性能的方法

    IP 测试概述 在网络技术的日常运作中,我常常接触到一个重要的概念,那就是IP测试。解剖这个词,我们可以看到它的基本含义是对IP地址进行全面的检测和验证。这不仅仅是个技术角色,同时也是我维护网络安全和稳定的重要手段。通过IP测试,我能够迅速定位网络问题,从而提高整体的网络性能,确保我们日常使用网络的...

    VPS优惠活动解析:如何选择最划算的虚拟专用服务器方案

    在当今互联网环境中,VPS(虚拟专用服务器)为企业和个人用户提供了灵活、高效的解决方案。随着云计算的普及,VPS逐渐成为许多用户的首选。不管是建站、开发、还是日常的数据处理,选择一款合适的VPS至关重要。而在不同的VPS服务提供商中,优惠活动往往能让用户以更实惠的价格体验高质量的服务。 什么是VPS...

    如何安全地开放所有端口并规避网络风险

    我第一次接触网络配置的时候,看到“开放所有端口”这个词,心里有些忐忑。其实,开放端口是网络通信中非常基础的概念。简单来说,端口就像是网络中的开口,允许不同的应用程序和服务进行数据交换。每个端口都有其独特的号码,从1到65535不等,其中小于1024的端口通常用于系统服务,而大于1024的端口就属于应...

    如何在AWS搭建VPS:详细指南与实用技巧

    在当今这个数字化快速发展的时代,云计算扮演着越来越重要的角色。无论是企业处理大量数据,还是个人用户存储信息,云服务都提供了一种灵活、高效的解决方案。特别是随着远程工作和在线服务的普及,能够随时随地访问和管理自己的数据成为一种必需。在这个过程中,亚马逊云(AWS)凭借其强大的服务和稳定的性能,成为了众...

    Rocky Linux 更新源配置及优化方法

    我最近对Rocky Linux这款操作系统有了更深入的了解。Rocky Linux是一个以开源为基础的企业级操作系统,跟Red Hat Enterprise Linux(RHEL)兼容。它的设计宗旨在于为用户提供一个稳定和可靠的平台。因此,更新源就显得非常重要,影响着系统的升级和软件的安装。 选择合...

    如何选择合适的VPS进行购买:关键因素解析

    选择合适的VPS进行购买是一项涉及多个因素的决策。VPS,即虚拟专用服务器,是一种介于共享主机和独立服务器之间的托管解决方案。特别适合需要灵活性和可扩展性的用户,无论是个人开发者、企业还是网站管理员。这种灵活性让VPS成为现代网络环境中一个非常受欢迎的选择。 VPS与传统的共享主机存在显著区别。传统...