目录
一、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也顺利实现了:
文章来源:https://www.toymoban.com/news/detail-510854.html
后续将着手攻克Netty集群Channel共享的问题!文章来源地址https://www.toymoban.com/news/detail-510854.html
到了这里,关于SpringCloud Nacos Gateway 负载均衡 Netty的Websocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!