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;
    }

相关推荐
2301_780789666 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
2501_915106326 小时前
抓包抓到乱码或压缩字节怎么解析,TraceEagle五种查看模式和一键解码
网络协议·计算机网络·网络安全·ios·adb·https·udp
情 九7 小时前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
学长毕设7 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒7 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
步行cgn7 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川8 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵8 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
星融元asterfusion8 小时前
工业网络升级实战:100G 双轨 Leaf-Spine 架构破解高并发出货网络瓶颈
网络·架构·spine
Da Da 泓8 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目