单片机学习小组
直播中

张鑫

7年用户 960经验值
私信 关注

怎样使用springboot整合netty来开发一套高性能的通信系统呢

怎样使用springboot整合netty来开发一套高性能的通信系统呢?为什么要用这两个框架来实现通信服务呢?如何去实现呢?

回帖(1)

刘梅

2022-2-22 14:42:25
这篇来讲述一个springboot整合netty框架与单片机TCP/UDP通信开发小案例,开源架构正在开发当中,到时候开发者就可以像dubbo一样使用netty来进行通信,从而把关注点放到业务层面。

随着移动5G的快速发展,物联网应用将会出现个爆发是增长,在这里使用springboot整合netty来开发一套高性能的通信系统,成为一种快速高效的实现方案。
为什么要用这两个框架来实现通信服务呢?其中的优势在我另一篇文章中会有体现,在这里我们只讨论实现的步骤。

实现步骤



  • 准备的原材料工具
    我构建是用gradle来构建的,所以需要gradle、Google guava
    单片机、通讯板子(具备网络连接模块)
  • 构建springboot工程
    使用idea构建springboot工程,构建完成后的工程目录如下:

  • 添加netty组件

  • 工程初始化
    工程构建完成后,就到了整个springboot和netty的核心部分了
    为什么要对工程进行初始化,这个就要从Netty本身的原理说起,初学的同学建议先了解一下netty的基本原理,然后再接着读下面的内容。
    springboot是为了简化Spring应用的初始搭建以及后续开发过程的一个框架,在这次整合中我依然整合的是web架构。
    boot工程的主程序如下图:

    很显然,如上图的代码是无法启动netty来提供TCP服务的,所以我们需要在启动spring工程后来初始化netty,用以提供完整的TCP链接服务。
    初始化netty的代码如下图:

  • 实现一个实时监控连接数的功能
    如下图效果:

  • 客户端的代码
    客户端使用的编码解码器是netty的String类型


public class NettyClient implements Runnable {

    @Override
    public void run() {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group);
            b.channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true);
            b.handler(new ChannelInitializer() {
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline pipeline = ch.pipeline();
                    pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));
                    pipeline.addLast("frameEncoder", new LengthFieldPrepender(4));
                    pipeline.addLast("decoder", new StringDecoder(CharsetUtil.UTF_8));
                    pipeline.addLast("encoder", new StringEncoder(CharsetUtil.UTF_8));

                    pipeline.addLast("handler", new ClientHandler());
                }
            });

            ChannelFuture f = b.connect("127.0.0.1", 8000).sync();
            f.channel().writeAndFlush("Netty Hello Service!" + Thread.currentThread().getName() + ":--->:" + Thread.currentThread().getId());
            f.channel().closeFuture().sync();
            InetSocketAddress socketAddress = (InetSocketAddress) f.channel().localAddress();
            System.out.print(String.format("Client port:{%s}", socketAddress.getPort()));

        } catch (Exception e) {
            System.out.print("netty服务异常了:{}");
            e.printStackTrace();
        } finally {
            group.shutdownGracefully();
            System.out.print("netty服务端断开了链接:" + Thread.currentThread().getId());
        }
    }
}

如果要请求链接,直接实例化该类即可,连接到服务端
也可以用其他形式的请求链接方式,比如单片机使用WIFI模块来链接

8.

总结




  • 在使用netty之前一定要掌握netty的基本原理,做到知其然、知其所以然,才能够在自己的业务系统中灵活得使用netty,才能够做到和自己现有知识体系下的框架无缝结合。
  • 任何框架必须是建立在能够解决实际的业务需求基础上的,不然就是空中楼阁,所以我们要做到架构落地,切勿不切实际的空谈。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分