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共享的问题!

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
SpringCloud+Nacos+Gateway是一种将Spring CloudNacosGateway进行整合的项目。它可以为微服务架构提供简单有效的统一的API路由管理方式。\[2\]在实战中,首先需要准备三个Spring Boot应用:spring-cloud-user-center(独立用户服务)、spring-cloud-order-center(独立订单服务)和spring-cloud-gateway(独立的网关服务)\[3\]。其中,用户服务可以通过引入相关依赖和配置yml文件来创建,然后编写测试类来实现具体的功能\[1\]。如果你有具体的问题或者需要更详细的实战指导,请提供更多的信息。 #### 引用[.reference_title] - *1* *3* [SpringCloud+Nacos+Gateway](https://blog.csdn.net/qq_44936392/article/details/129023413)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringCloud微服务实战:nacos+gateway网关统一拦截、转发、授权详细教程(附git源码)](https://blog.csdn.net/qq_42411805/article/details/124872461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值