springCloudGateway+Nacos注册与转发Netty+WebSocket

这篇具有很好参考价值的文章主要介绍了springCloudGateway+Nacos注册与转发Netty+WebSocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Netty+WebSocket是一开始单体应用中与前端交互使用的,最近开始搞Cloud想着移植过来使用

具体官方描述本文就不体现了 直接开始实现 以及解决过程中遇到的问题

1.首先编写netty端代码,由于是微服务模式就直接新建一个项目

        netty nacos spring,websocket,网络协议,网络,gateway

server:
  port: 8085
spring:
  application:
    name: mall-im
    
netty:
  # Netty端口
  port: 9001
  application:
    # Netty应用名称
    name: mall-im-netty

1.1 由于Netty 需要额外启动所以配置一个启动器,这里有一个小坑,很多同学习惯把自定义启动放到服务启动类里,其实也没事,但是只要你使用@RefreshScope注解后就会产生自定义启动被启动了两次的问题,感兴趣的同学可以自己尝试一下

/**
 * Netty 额外启动类
 *
 * @author 杨旭
 * @email 18811132173@163.com
 * @create 2023/11/16 17:25
 */
@Component
public class NettyCommandLineRunner implements CommandLineRunner {

    @Resource
    private NettyWebSocketServer nettyServer;

    @Override
    public void run(String... args) throws Exception {
        //netty 服务端启动的端口不可和Springboot启动类的端口号重复
        nettyServer.start();

        //关闭服务器的时候同时关闭Netty服务
        Runtime.getRuntime().addShutdownHook(new Thread(() -> nettyServer.destroy()));
    }
}

1.2 定义启动

/**
 * Netty启动类
 *
 * @author 杨旭
 * @email 18811132173@163.com
 * @create 2023/11/16 16:39
 */
@Slf4j
@Component
public class NettyWebSocketServer {

    private Channel channel;

    /**
     * bossGroup连接线程组,主要负责接受客户端连接,一般一个线程足矣
     */
    EventLoopGroup boosGroup = new NioEventLoopGroup();
    /**
     * workerGroup工作线程组,主要负责网络IO读写
     */
    EventLoopGroup workGroup = new NioEventLoopGroup();

    @Resource
    private NacosDiscoveryProperties nacosDiscoveryProperties;
    /**
     * Netty端口
     */
    @Value("${netty.port}")
    private Integer nettyPort;
    /**
     * Netty应用名称
     */
    @Value("${netty.application.name}")
    private String nettyName;

    @Async
    public void start() {
        log.error("=================Netty 端口启动:{}==================", nettyPort);
        try {
            //绑定端口
            ServerBootstrap bootstrap = new ServerBootstrap();
            // 临时存放已完成三次握手的请求的队列的最大长度
            bootstrap.option(ChannelOption.SO_BACKLOG, 1024);
            // 设置两个线程组
            bootstrap.group(boosGroup, workGroup)
                    // 非阻塞异步服务端TCP Socket 连接
                    .channel(NioServerSocketChannel.class)
                    // 使用本地地址,绑定端口号
                    .localAddress(nettyPort)
                    //初始化handler
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            log.info("=================收到新的链接:{}==================", socketChannel.localAddress());
                            ChannelPipeline pipeline = socketChannel.pipeline();
                            // 将请求和映带消息节码为HTTP消息
                            pipeline.addLast("http-codec", new HttpServerCodec());
                            // 向客户端发送HTML5文件
                            socketChannel.pipeline().addLast("http-chunked", new ChunkedWriteHandler());
                            // 将HTTP消息的多个部分合成一条完整的HTTP消息
                            pipeline.addLast("aggregator", new HttpObjectAggregator(8192));
                            // 进行设置心跳检测
                            socketChannel.pipeline().addLast(new IdleStateHandler(60, 30, 60 * 30, TimeUnit.SECONDS));
                            // 配置通道处理 来进行业务处理
                            pipeline.addLast("handler", new WebSocketHandler());
                        }
                    });
            registerNamingService(nettyName, nettyPort);
            //绑定Netty的启动端口
            channel = bootstrap.bind(nettyPort).sync().channel();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将Netty服务注册进Nacos
     *
     * @param nettyName 服务名称
     * @param nettyPort 服务端口号
     */
    private void registerNamingService(String nettyName, Integer nettyPort) {
        try {
            Properties properties = new Properties();
            properties.setProperty(PropertyKeyConst.SERVER_ADDR, nacosDiscoveryProperties.getServerAddr());
            properties.setProperty(PropertyKeyConst.NAMESPACE, nacosDiscoveryProperties.getNamespace());
            NamingService namingService = NamingFactory.createNamingService(properties);
            InetAddress address = InetAddress.getLocalHost();
            namingService.registerInstance(nettyName, address.getHostAddress(), nettyPort);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @PreDestroy
    public void destroy() {
        log.error("=================Netty服务关闭==================");
        if (channel != null) {
            channel.close();
        }
        boosGroup.shutdownGracefully();
        workGroup.shutdownGracefully();
    }
}

1.3 业务实现,由于具体的业务还没想好怎么做所以就空下来了,本文主要是集成

/**
 * Netty业务实现类
 *
 * @author 杨旭
 * @email 18811132173@163.com
 * @create 2023/11/16 16:42
 */
public class WebSocketHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
    @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {
        // TODO: 具体业务处理
    }
}

这个时候启动服务,可以看到已经成功启动了

netty nacos spring,websocket,网络协议,网络,gateway

netty nacos spring,websocket,网络协议,网络,gateway

使用工具访问一下netty nacos spring,websocket,网络协议,网络,gateway

netty nacos spring,websocket,网络协议,网络,gateway

2.接下来就是怎么将Netty用gateway 进行访问,同样具体的路由配置以及规则不进行赘述,大家自行百度

2.1 gateway增加路由

- id: mall-im
  uri: lb:ws://mall-im-netty
  predicates:
     - Path=/ws/**
  filters:
     - StripPrefix=1

2.2 增加路由后重新启动服务,并额外启动一个服务,开发环境多实例运行,注意(开发环境需要手动将.yml文件中端口号修改)多实例运行点击工具栏上方的启动,正常或调试均可

netty nacos spring,websocket,网络协议,网络,gateway

netty nacos spring,websocket,网络协议,网络,gateway

netty nacos spring,websocket,网络协议,网络,gateway

2.3 用gateway进行访问

 netty nacos spring,websocket,网络协议,网络,gateway

2.4 可以多尝试几次,这样就能实验出负载均衡的效果了

2.5 PS:如果是后端管理系统,发送个通知之类的 到目前为止,将业务处理实现就可以了,但如果是即时通讯,就会出现一个问题,A在9001,B在9002 这样两个人怎么进行通讯呢?

有思路的小伙伴咱们可以一起讨论下文章来源地址https://www.toymoban.com/news/detail-840471.html

到了这里,关于springCloudGateway+Nacos注册与转发Netty+WebSocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nacos服务注册或发现、Nacos服务分级模型、Nacos负载均衡策略、加权负载均衡、Nacos环境隔离

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    2024年01月16日
    浏览(41)
  • (Java企业 / 公司项目)配置Gateway + Nacos应用名路由转发?

    首先看项目的gateway, 没有进行路由转发的时候的缺点 在gateway模块中的配置的路径都是写死的,到时候我们更改了IP地址又要改这个代码,会很麻烦所以我们应该怎么样做才能使得请求更加方便?这是子模块 在我们请求模块member中配置文件中加入注册中心指定模块的名称,这

    2024年02月02日
    浏览(54)
  • 在使用nacos时,如何将指定ip段注册在nacos中

    在使用nacos时,如何将指定ip段注册在nacos中 @TOC 因为我们的电脑经常会安装虚拟机会产生虚拟网卡,所以在项目启动后,很有可能会将虚拟网卡的ip地址注册在nacos中,导致访问失败,此时我们可以在 bootstrap.yml文件中进行配置,将自己想注册在nacos中的ip地址配置进去 spring:

    2024年02月11日
    浏览(70)
  • zookeeper和nacos区别是什么,注册中心用zookeeper还是nacos

    注册中心对比和选型:Zookeeper、Eureka、Nacos、Consul和ETCD zookeeper和nacos区别是什么 Nacos集群raft选举算法原理 Zookeeper和Nacos是两个不同的分布式系统协调组件,它们在设计目标、功能特性和使用方式等方面存在一些区别。以下是它们的主要区别: 设计目标和适用场景: Zookeeper最

    2024年02月03日
    浏览(34)
  • docker部署的微服务,指定ip注册到nacos,dubbo指定ip和端口注册到nacos

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 docker的ip和docker主机所在局域网中的其他主机是不通的,这就导致本地启动的项目是不能访问docker部署的服务。 spring.cloud.nacos.discovery.ip = 192.168.1.100 设置docker的环境变量来解决 Rancher中配置docker的环境变

    2024年02月03日
    浏览(56)
  • SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

    注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。 服务注册中心(简称注册中心)是微服务框架的一个重要组件,在微服务架构里主要

    2024年02月22日
    浏览(69)
  • 微服务-Nacos(注册中心)

    Nacos是SpringCloud的一个功能非常强大的组件,想比eureka的功能更加丰富 Nacos(全称:Naming and Configuration Service)是一个开源的动态服务发现、配置管理和服务管理平台。它由阿里巴巴集团开发并贡献给开源社区,旨在帮助开发者更好地构建和管理微服务架构。 Nacos提供了以下核

    2024年02月12日
    浏览(47)
  • 【微服务】Nacos注册中心

    国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务

    2024年02月02日
    浏览(50)
  • Nacos 注册中心

    目录 1. 注册中心是什么 2. Nacos 的服务结构模型 3. 服务节点类型 3.1 临时节点 3.2 永久节点 4. 阈值保护功能 5. Nacos元数据 微服务场景下,服务被划分为多个应用,而这些应用间可能存在调用关系,例如 用户服务 调用 订单服务 来查看用户的订单。 用户服务若想调用订单服务

    2024年02月02日
    浏览(29)
  • Nacos源码 (3) 注册中心

    本文将从一个服务注册示例入手,通过阅读客户端、服务端源码,分析服务注册、服务发现原理。 使用的2.0.2的版本。 NacosNamingService提供两个构造方法: 第二个方法的properties的key在PropertyKeyConst常量类可以找到,如: namespace username password serverAddr clusterName 其他 构造方法中会

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包