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环境隔离

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

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

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

    (Java企业 / 公司项目)配置Gateway + Nacos应用名路由转发?

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

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

    在使用nacos时,如何将指定ip段注册在nacos中

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

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

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

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

    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日
    浏览(15)
  • SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

    SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

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

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

    【微服务】Nacos注册中心

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

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

    Nacos源码 (3) 注册中心

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

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

    微服务-Nacos(注册中心)

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

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

    Nacos 注册中心

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

    2024年02月02日
    浏览(6)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包