被要求一个这样的需求:要求项目和websocket使用一个端口。经过一周激烈争论,领导终于同意可以可以开通一个端口,一个月了,端口还没有开。

正式环境已经通过此方法进行部署,没有问题。

前言

因涉及到内外网安全问题,被要求使用nginx进行代理,不能直连。即对websocket做一个反向代理即可。

项目信息:springboot(cloud等),yeauty集成的websocket(推荐使用,实现非常方便),nginx,websocket在线测试网站(百度搜有很多)

项目搭建

引入依赖

1     <dependencies>
2 <dependency>
3 <groupId>org.yeauty</groupId>
4 <artifactId>netty-websocket-spring-boot-starter</artifactId>
5 <version>0.7.5</version>
6 </dependency>
7 </dependencies>

添加代码

有两个文件,可以直接复制到项目中,如图:

Websocket.java:

 1 package com.example.springboottest.common.websocket;
2
3
4 import org.springframework.stereotype.Component;
5 import org.yeauty.annotation.*;
6 import org.yeauty.pojo.Session;
7
8 import java.util.ArrayList;
9 import java.util.List;
10
11 @Component
12 @ServerEndpoint(port = 9906,path = "/WebSocket")
13 public class WebSocket {
14
15 /**
16 * 存放所有在线的客户端
17 */
18
19
20 private static List<Session> clients = new ArrayList<>();
21
22 @OnOpen
23 public void onOpen(Session session) {
24 System.out.println("open");
25 System.out.println("remoteAddress" + session.remoteAddress());
26 //将新用户存入在线的组
27 clients.add(session);
28 sendMessage("hello Word!");
29 }
30
31 /**
32 * 客户端关闭
33 *
34 * @param session session
35 */
36
37
38 @OnClose
39 public void onClose(Session session) {
40 System.out.println(session.remoteAddress() + ":closeWebSocket");
41 }
42
43 /**
44 * 发生错误
45 *
46 * @param throwable e
47 */
48
49
50 @OnError
51 public void onError(Throwable throwable) {
52 System.out.println("websocket:error");
53 throwable.printStackTrace();
54 }
55
56 /**
57 * 收到客户端发来消息
58 *
59 * @param message 消息对象
60 */
61
62 @OnMessage
63 public void onMessage(String message, Session session) {
64 System.out.println(message);
65 sendMessage("hello Word!");
66 }
67
68 public void sendMessage(String message) {
69 try {
70 if (clients.size() > 0) {
71 for (Session session : clients) {
72 session.sendText(message);
73 }
74 }
75
76 } catch (Exception e) {
77 e.printStackTrace();
78 }
79
80 }
81 }
WebSocketConfig.java:
 1 package com.example.springboottest.common.websocket;
2
3 import org.springframework.context.annotation.Bean;
4
5 import org.springframework.context.annotation.Configuration;
6 import org.yeauty.standard.ServerEndpointExporter;
7
8
9 @Configuration
10 public class WebSocketConfig {
11 @Bean
12 public ServerEndpointExporter serverEndpointExporter() {
13 return new ServerEndpointExporter();
14 }
15 }

启动项目测试websocket

nginx代理

NGINX从1.3版本开始支持WebSocket,其可以作为一个反向代理和为WebSocket程序做负载均衡。此博客不涉及内部原理等,放个干货。

反向代理

先把我自己的nginx配置发出来:

 1 #user  nobody;
2 worker_processes 1;
3
4 #error_log logs/error.log;
5 #error_log logs/error.log notice;
6 #error_log logs/error.log info;
7
8 #pid logs/nginx.pid;
9
10
11 events {
12 worker_connections 1024;
13 }
14
15
16 http {
17 map $http_upgrade $connection_upgrade {
18 default upgrade;
19 '' close;
20 }
21
22 upstream websocket {
23 #ip_hash;
24 hash $remote_addr consistent;
25 server localhost:9907;
26 }
27
28 # 以下配置是在server上下文中添加,location指用于websocket连接的path。
29
30 server {
31 listen 9908;
32 server_name localhost;
33 #access_log /var/log/nginx/yourdomain.log;
34
35 location /WebSocket {
36 root html;
37 index index.html index.htm;
38 proxy_pass http://websocket/WebSocket;
39 proxy_connect_timeout 4s; #配置点1
40 proxy_read_timeout 60s; #配置点2,如果没效,可以考虑这个时间配置长一点
41 proxy_send_timeout 12s; #配置点3
42
43 proxy_set_header Host $host;
44 proxy_set_header X-Real-IP $remote_addr;
45 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
46
47 proxy_http_version 1.1;
48 proxy_set_header Upgrade $http_upgrade;
49 proxy_set_header Connection "upgrade";
50 }
51 }
52 }

代理端口为9908,坚挺的地址就是/WebSocket,下面测试一下:

至此反向代理已经完成。

负载均衡

如果想做负载均衡,可以在upstream websocket {}中加一个server就可以了,比如复制一下项目,将websocket端口改为9907

@ServerEndpoint(port = 9907,path = "/WebSocket")
连上之后发送信息为hello world!2
sendMessage("hello Word!2");

然后连上反向代理的链接,连接之后发现连的是9906的链接,如图:

此时我把9906断掉,再次连接时:

此时遇到问题,当负载均衡时,9906断了之后,没有自动转为9907的链接。在客户端监听此链接,如果查实连接不上则进行重新链接,即可使用9907的服务。

nginx反向代理,负载均衡和yeauty集成的websocket的使用的更多相关文章

  1. Nginx 反向代理 负载均衡 虚拟主机配置

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  2. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  3. 十.nginx反向代理负载均衡服务实践部署

    期中集群架构-第十章-nginx反向代理负载均衡章节章节====================================================================== 0 ...

  4. 【转】Nginx 反向代理 负载均衡 虚拟主机配置

    原文:http://www.cnblogs.com/itdragon/p/8059000.html Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代 ...

  5. Centos7.4 Nginx反向代理+负载均衡配置

    Ningx是一款高性能的HTTP和反向代理服务器,配置起来也比较简单. 测试环境: 172.16.65.190 Nginx-反向代理 172.16.65.191 Ningx-Web 172.16.65 ...

  6. 如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器

    Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...

  7. 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现

    实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...

  8. 项目实战2.1—nginx 反向代理负载均衡、动静分离和缓存的实现

    总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.html 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备 ...

  9. 项目实战02:nginx 反向代理负载均衡、动静分离和缓存的实现

    目录 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 2.下载编译安装tengine 3.设置代理服务器的配置文件 4.启动tengine服务 5.开启后端的web服务 6.测试 实验二:ng ...

  10. Centos 7.6配置nginx反向代理负载均衡集群

    一,实验介绍 利用三台centos7虚拟机搭建简单的nginx反向代理负载集群, 三台虚拟机地址及功能介绍 192.168.2.76    nginx负载均衡器 192.168.2.82    web ...

随机推荐

  1. study Rust-1【Rust的特点和应用场景】

    Rust语言的特点 高性能 - Rust 速度惊人且内存利用率极高.由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成. 可靠性 - Rust ...

  2. AI工具推荐:使用AnythingLLM帮助你学习

    AnythingLLM介绍 AnythingLLM 是一个最容易使用的全能 AI 应用,可以进行 RAG.AI 代理等多种功能,无需编写代码或担心基础设施问题. GitHub地址:https://gi ...

  3. Audio DSP boot 过程

    在智能手机或智能手表等SoC上通常有一块专门的audio DSP(简称ADSP)来做音频处理.要做音频处理,ADSP首先要被boot起来.本文以CEVA BX2为例来讲讲ADSP的boot过程. 在上 ...

  4. AndrodStudio构建时报错Could not find com.android.tools.build:gradle:xxx

    检查配置的版本号在maven仓库里有没有. maven仓库地址: https://repo1.maven.org/maven2/com/android/tools/build/gradle/ 选择需要 ...

  5. 附043.KubeEdge边缘云部署实施方案

    目录 KubeEdge介绍 KubeEdge概述 KubeEdge优势 KubeEdge架构 KubeEdge部署 部署依赖 部署规划 主机名配置 变量准备 互信配置 环境预配置 安装keadm 设置 ...

  6. FastAPI依赖注入性能优化策略

    title: FastAPI依赖注入性能优化策略 date: 2025/04/12 00:53:48 updated: 2025/04/12 00:53:48 author: cmdragon exc ...

  7. 🎀Excel-多表数据查找匹配(VLOOKUP)

    简介 Excel的VLOOKUP函数同样可以用来查找表格中的数据.VLOOKUP(垂直查找)是一个非常有用的函数,它可以在一个表格或数据表的一列中搜索特定的值,并返回与之在同一行上的另一列中的值. 环 ...

  8. jmeter从文档CSV内读取参数且文件路径为相对路径

    如下图,"全站链接扫描"脚本的参数化文件存储在同一目录的参数化文件夹内 预计实现读取该文件使用相对路径(非绝对路径,避免脚本在另一台电脑存在别的目录下能正常读取参数文件) 如读取& ...

  9. K8S 部署 Deepseek 要 3 天?别逗了!Ollama+GPU Operator 1 小时搞定

    最近一年我都在依赖大模型辅助工作,比如 DeepSeek.豆包.Qwen等等.线上大模型确实方便,敲几个字就能生成文案.写代码.做表格,极大提高了效率.但对于企业来说:公司内部数据敏感.使用外部大模型 ...

  10. JVM 有那几种情况会产生 OOM(内存溢出)?

    JVM 有哪些情况会产生 OOM(内存溢出)? JVM 的内存溢出(OutOfMemoryError, OOM)是指程序在运行过程中,JVM 无法从操作系统申请到足够的内存,导致程序抛出内存溢出异常. ...