Netty实战之第一个应用

作为一个正在Java路上摸爬滚打的小菜鸡,之前在项目中也用过Netty,也因为Netty报名阿里的中间件大赛,但终究功力太浅,最终不了了之,最近工作中又遇到了Netty的小姐妹Mina。此时楼主觉得Netty还是需要潜心深入学习一下。就这样在成为大菜鸡的路上不消停的折腾……

NIO简介

  • Netty是Java世界知名的基于NIO的网络框架,因此说到Netty,介绍一下NIO还是有必要的。
  • Java NIO又称Non-blocking IO,NIO可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
  • Java NIO 主要由Channels,Buffers,Selectors,虽然Java NIO 中除此之外还有很多类和组件,但总体来说,Channel,Buffer 和 Selector 构成了核心的API。其他组件和类主要是围绕这三者进行的。对NIO感兴趣的小伙伴请移步Java NIO 系列教程

Netty快速入门

一般在楼主学习一项新技术时,首先得来个”Hello,World”来暖暖场。当然Netty也不例外,这里楼主实现一个echo服务器,那么echo是什么呢? 就是先启动客户端,然后建立一个连接并发送一个或多个消息发送到服务器,其中每相呼应消息返回给客户端。当然,这个应用程序没多大意义。但也可以帮助我们理解Netty,以及学习Netty的模板代码。

添加maven依赖

一般开源软件在maven仓库里面都可以找到,请移步maven厂库

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.12.Final</version>
</dependency>

代码实现

Echo的服务端代码实现,下面代码实现的主要逻辑是绑定端口号,启动服务,是Netty中常见的模板代码。

public class EchoServer {
    private final int port;

    public EchoServer(int port) {
        this.port = port;
    }

    public static void main(String[] args)
        throws Exception {
        // 服务器监听端口号
        int port = 8080;
        new EchoServer(port).start();
    }

    public void start() throws Exception {
        // NioEventLoopGroup是处理I/O操作的多线程事件循环
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            // ServerBootstrap是一个用于设置服务器的引导类。
            ServerBootstrap b = new ServerBootstrap();
            b.group(group)
                .channel(NioServerSocketChannel.class) // 使用NioServerSocketChannel类,用于实例化新的通道以接受传入连接
                .localAddress(new InetSocketAddress(port)) // 设置服务器监听端口号
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new EchoServerHandler()); // 添加请求处理
                    }
                });
            // 绑定到端口和启动服务器
            ChannelFuture f = b.bind().sync();
            System.out.println(EchoServer.class.getName() +
                " started and listening for connections on " + f.channel().localAddress());
            f.channel().closeFuture().sync();
        } finally {
            group.shutdownGracefully().sync();
        }
    }
}

EchoServerHandler实现代码,这里是使用Netty实现网络操作业务逻辑的主要阵地。在这里覆盖channelRead()事件处理程序方法。每当从客户端接收到新数据时,使用该方法来接收客户端的消息。

@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        // 覆盖channelRead()事件处理程序方法
        ByteBuf in = (ByteBuf) msg;
        System.out.println(
                "Server received: " + in.toString(CharsetUtil.UTF_8));
        ctx.write(in);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx)
            throws Exception {
        // channelRead()执行完成后,关闭channel连接
        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
                .addListener(ChannelFutureListener.CLOSE);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,
        Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}

客户端代码跟上面的代码大体类似,楼主就不在贴出来了,就当留个小作业吧,感兴趣的小伙伴请自行搞定。

楼主使用Netty的姿势

楼主基于Netty开发了应用配置管理平台服务,实现了“为业务提供统一的配置管理服务”,可以做到开箱即用,主要功能有:

  • 简单易用: 上手非常简单, 只需要引入maven依赖和一行配置即可;
  • 在线管理: 提供配置管理中心, 支持在线管理配置信息;
  • 实时推送: 配置信息更新后,实时推送配置信息, 项目中配置数据会实时更新并生效, 不需要重启线上机器;
  • 配置备份: 配置数据会在MySQL中会对配置信息做备份, 保证配置数据的安全性;

感兴趣的小伙伴请移步楼主的Netty实践

小结

虽然楼主经常使用到 Netty,但是很多时候对 Netty 的一些概念还是处于知其然,不知其所以然的状态,因此就萌生了重新捋一遍 Netty 实战,在有余力的情况下撸一下Netty的源码,并坚持写博客记录一下这个过程。由于楼主能力有限,博客中难免有不少错误之处,期望大家的建议,斧正。

作 者:haifeiWu 原文链接:http://www.hchstudio.cn/article/2018/73dd/ 版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王大锤

iOS AFNetworking “Request failed: unacceptable content-type: text/html”问题

3967
来自专栏为数不多的Android技巧

Binder学习指南

毫不夸张地说,Binder是Android系统中最重要的特性之一;正如其名“粘合剂”所喻,它是系统间各个组件的桥梁,Android系统的开放式设计也很大程度上得...

2321
来自专栏编程坑太多

『高级篇』docker之开发课程EdgeService(16)

PS:微服务跟之前说的一样就是互相通过RPC的方式进行通信,之间有自己的数据库,只是RPC暴露接口的方式来获取其他的微服务之间的数据。

763
来自专栏技术翻译

使用Spring Cloud Netflix的Kotlin微服务:第2部分

在本系列的第1部分中,我们使用Kotlin介绍了Spring Cloud。我们讨论了Config Server,Discovery Server(Eureka)...

1872
来自专栏菩提树下的杨过

spring cloud:Edgware.RELEASE版本hystrix超时新坑

升级到Edgware.RELEASE发现,zuul中不管如何设置hystrix的超时时间均不起作用,仍然是默认的1000ms.  降回低版本后正常,但是低版本的...

28010
来自专栏AI-vell

java轻量RESTful api服务搭建(jersey+jetty)

由于开始要搭建一个java + python的服务,java端提供数据库增删改查逻辑供python端调用,第一时间想到了用REST(Representation...

4297
来自专栏Ryan Miao

SpringCloud学习5-如何创建一个服务提供者provider

1193
来自专栏流柯技术学院

linux下安装rzsz

wget http://freeware.sgi.com/source/rzsz/rzsz-3.48.tar.gz

3481
来自专栏xingoo, 一个梦想做发明家的程序员

手把手教你搭建SpringMVC——最小化配置

为什么需要Spring MVC 最开始接触网页的时候,是纯的html/css页面,那个时候还是用Dreamweaver来绘制页面。 随着网站开发的深入,开始学习...

2165
来自专栏向治洪

XMPP客户端库Smack 4.0.6版开发之二

XMPP客户端库Smack 4.0.6版开发之二 三、Smack库的特征 1、极度简单易用,API功能强大 发送一条文本消息给某个用户只需几行代码: Abst...

2175

扫码关注云+社区