SpringCloudGateway+Nacos注册与转发Netty+WebSocket

server/2024/12/29 1:03:05/

背景

项目中有个拍卖服务是长连接的,需要加入到注册中心中方便统一的管理,并且方便动态扩容。

问题

Nacos没有对长连接的服务注册的支持,需要手动实现把服务注册上线下线,感知服务状态。并需要支持域名转发WebSocket的请求。

实现

  • 自动注册,下线服务
@Asyncpublic void start() {log.info("=================Netty服务开启==================");try {//ServerBootstrap 是一个启动类ServerBootstrap serverBootstrap = new ServerBootstrap();// 设置主从线程组// ... 业务// 注册到nacosnettyNacosService.registerNamingService();bindFuture = serverBootstrap.bind(nettyNacosService.getNettPort()).sync();log.info("netty监听端口:{},后台服务器启动.....", nettyNacosService.getNettPort());} catch (Exception e) {log.error("netty服务器启动异常:{}", e.getMessage());}}public void destroy() {//  将NacosNetty注销服务nettyNacosService.deregisterInstance();log.info("=================Netty服务关闭==================");if (bindFuture != null) {bindFuture.channel().closeFuture();}bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}// 注册伪代码:/*** 将Netty服务注册进Nacos*/
public void registerNamingService() {try {Properties properties = getNacosProperties();NamingService namingService = NamingFactory.createNamingService(properties);Instance nettyInstance = getNettyInstance();namingService.registerInstance(nettyInstance.getServiceName(),getGroup(),nettyInstance);} catch (Exception e) {throw new RuntimeException(e);}}private Properties getNacosProperties() {Properties properties = new Properties();properties.setProperty(PropertyKeyConst.SERVER_ADDR, nacosDiscoveryProperties.getServerAddr());properties.setProperty(PropertyKeyConst.NAMESPACE, nacosDiscoveryProperties.getNamespace());properties.setProperty(PropertyKeyConst.USERNAME, nacosDiscoveryProperties.getUsername());properties.setProperty(PropertyKeyConst.PASSWORD, nacosDiscoveryProperties.getPassword());return properties;}/*** 将NacosNetty注销服务*/public void deregisterInstance() {try {Properties properties = getNacosProperties();NamingService namingService = NamingFactory.createNamingService(properties);Instance nettyInstance = getNettyInstance();namingService.deregisterInstance(nettyInstance.getServiceName(),getGroup(),nettyInstance);} catch (Exception e) {throw new RuntimeException(e);}}
  • gateway增加路由
{"id": "web-socket","order": 3,"predicates": [{"args": {"pattern": "/ws/**"},"name": "Path"}],"filters":[{"name":"StripPrefix","args":{"parts":"1"}}],"uri": "lb:ws://web-socket"
}
  • nginx配置
    这里支持长连接的配置跟http稍微有点不同。
    主要看这个配置:$http_upgrade
map $http_upgrade $connection_upgrade {default upgrade;'' close;
}location /ws {proxy_pass https://abc.com/web-socket # 这里改为对应的域名proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;}

http://www.ppmy.cn/server/153667.html

相关文章

MTEB文本向量化评估基准:Massive Text Embedding Benchmark

Massive Text Embedding Benchmark 文本向量化评估基准 Bitext mining is the task of finding parallel sentences in two languages. 双语文本挖掘是识别两种语言中语义等价句子对的任务。 Classification is the task of assigning a label to a text. 文本分类是为文本分配…

卷积神经网络入门指南:从原理到实践

目录 1 CNN的发展历史 2 CNN的基本原理 3 CNN核心组件 3.1 卷积操作基础 3.2 卷积层详解 3.3 高级卷积操作 3.3.1 分组卷积(Group Convolution) 3.3.2 深度可分离卷积(Depthwise Separable Convolution): 3.3 池…

c# 线程 AutoResetEvent 的Set()函数多次调用

本文部分内容摘自ChatGPT 在 C# 中,AutoResetEvent 是一种用于线程同步的机制,它的行为类似于一个信号量,主要用于在多线程环境中发出信号并控制线程的执行。AutoResetEvent 的主要特点是每当调用 Set() 方法时,信号会被设置&…

C# Winform简单的俄罗斯方块小游戏源码2

文章目录 一、设计来源俄罗斯方块小游戏讲解1.1 主界面1.2 游戏界面1.3 游戏结束界面1.4 游戏积分界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载更多优质源码分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/…

Tonghttpserver6.0.1.3 使用整理(by lqw)

文章目录 1.声明2.关于单机版控制台和集中管理控制台3.单机版控制台3.1安装,启动和查看授权信息3.2一些常见的使用问题(单机控制台)3.3之前使用的是nginx,现在要配nginx.conf上的配置,在THS上如何配置3.4如何配置密码过…

动态头部:利用注意力机制统一目标检测头部

摘要 将定位和分类结合在目标检测中的复杂性促进了各种方法的蓬勃发展。先前的工作试图改进各种目标检测头(head)的性能,但未能给出一个统一的视角。在本文中,我们提出了一种新颖的动态头框架,通过注意力机制统一目标…

Android WebView 与 H5 双向通信实现详解

Android WebView 与 H5 双向通信实现详解 背景介绍 在 Android 原生应用中,WebView 与 H5 页面的双向通信是一个常见需求。本文将详细介绍如何实现一个完整的通信方案。 核心实现 1. H5 端实现 与之前类似,但需要针对 Android 环境做适配&#xff1…

ensp 基于EASY IP的公司出口链路配置

Easy IP Easy IP技术是NAPT的一种简化情况。Easy IP无须建立公网IP地址资源池,因为Easy IP只会用到一个公网IP地址,该IP地址就是路由器R连接公网的出口IP地址。Easy IP也会建立并维护一张动态地址及端口映射表,并且Easy IP会将这张表中的公网…