当前位置: 首页 > article >正文

SpringCloudGateway+Nacos注册与转发Netty+WebSocket

背景

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

问题

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

实现

  • 自动注册,下线服务
@Async
    public void start() {
        log.info("=================Netty服务开启==================");
        try {
            //ServerBootstrap 是一个启动类
            ServerBootstrap serverBootstrap = new ServerBootstrap();
            // 设置主从线程组
            // ... 业务
            // 注册到nacos
            nettyNacosService.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.kler.cn/a/449864.html

相关文章:

  • Jenkins 任意文件读取(CVE-2024-23897)修复及复现
  • Vue常用指令
  • 负载均衡的原理
  • 深入了解蓝牙Profile类型与设备的对应关系
  • 图像配准有哪些技术?
  • linux firewalld 命令详解
  • 02-8.python入门基础一函数的高级使用
  • 一次性部署:使用Docker部署PHP应用
  • 源码分析之Openlayers中ZoomSlider滑块缩放控件
  • 【C语言】深入探讨 C 语言 `int` 类型大小及其跨平台影响
  • 【机器人】ATM 用于策略学习的任意点轨迹建模 RSS 2024 | 论文精读
  • 音视频入门基础:MPEG2-TS专题(20)——ES流简介
  • 取多个集合的交集
  • Spring Boot @Conditional注解
  • 设计模式--工厂方法模式【创建型模式】
  • [vLLM vs TensorRT-LLM] :系统调度schedule比较
  • 浅谈算法交易
  • MySQL表名传参SP
  • Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
  • Windows开启IIS后依然出现http error 503.the service is unavailable
  • 使用 ffmpeg 拼接合并视频文件
  • 代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
  • 软考——RIP路由协议
  • 数据结构漫游记:静态链表的实现(CPP)
  • HTTP常见异常状态码
  • Android Bootable Recovery 中的 `bspatch.cpp` 文件详解