SpringCloud Nacos Gateway 负载均衡 Netty的Websocket

目录

一、Gateway的WS协议配置

二、问题引出

三、解决方法


一、Gateway的WS协议配置

- id: im-server_router
  uri: lb:ws://im-server
  predicates:
  - Path=/ws/**
  filters:
     - StripPrefix=1

ws: 代表通过websocket长连接协议,其他是gateway的常规配置。

二、问题引出

我已搭建了传统的Netty聊天室服务,即一个SpringBoot项目中同时存在web项目与Netty服务器,配置如下:服务器实际上会使用到两个端口,此时我们启动服务器并将其注册到Nacos当中!

server:
  port: 8081

# netty服务器的启动端口,必须和应用启动端口不一样
netty:
  port: 8888

#Spring
spring:
  application:
    name: im-server

问题来了:经过我的排查,发现gateway负载均衡的端口出里问题,我的netty服务端口是8888,而注册到Nacos当中的服务端口其实是web服务器的端口8081,所以gateway找不到对应的Netty服务器。

WebSocketHandshakeException: Invalid handshake response getStatus: 404

三、解决方法

读过Nacos底层源码的朋友应该知道,将服务注册到Nacos当中只需几行代码即可,如下在启动Netty服务时一并将Netty服务注册到Nacos当中即可!

    @Value("${netty.port}")
    private Integer port;

    @Value("${netty.application.name}")
    private String serverName;

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;    


    public void start() throws Exception {
        //注册到Nacos里
        registerNamingService(serverName, String.valueOf(port));

        channel = serverBootstrap.bind(port).sync()
                .channel().closeFuture().sync().channel();
    }

    /**
     * 注册到 nacos 服务中
     *
     * @param nettyName netty服务名称
     * @param nettyPort netty服务端口
     */
    private void registerNamingService(String nettyName, String nettyPort) {
        try {
            NamingService namingService = NamingFactory.createNamingService(nacosDiscoveryProperties.getServerAddr());
            InetAddress address = InetAddress.getLocalHost();
            namingService.registerInstance(nettyName, address.getHostAddress(), Integer.parseInt(nettyPort));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

由于我使用了springBoot我将其配置修改如下:

server:
  port: 8081

# netty服务器的启动端口,必须和应用启动端口不一样
netty:
  port: 8888
  application:
    name: im-server

#Spring
spring:
  application:
    name: im-web-server

再次启动Netty服务器,可以看到Netty服务器已经注册到Nacos里了,gateway也可以对Netty集群进行负载均衡了:

 通过网关访问websocket也顺利实现了:

 后续将着手攻克Netty集群Channel共享的问题!

猜你喜欢

转载自blog.csdn.net/qq_50909707/article/details/129010931