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

Java引用netty依赖 java 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厂库1

2 io.netty

3 netty-all

4 4.1.12.Final

5

代码实现

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

public class EchoServer {
2 private final int port;
3
4 public EchoServer(int port) {
5 this.port = port;
6 }
7
8 public static void main(String[] args)
9 throws Exception {
10 // 服务器监听端口号
11 int port = 8080;
12 new EchoServer(port).start();
13 }
14
15 public void start() throws Exception {
16 // NioEventLoopGroup是处理I/O操作的多线程事件循环
17 EventLoopGroup group = new NioEventLoopGroup();
18 try {
19 // ServerBootstrap是一个用于设置服务器的引导类。
20 ServerBootstrap b = new ServerBootstrap();
21 b.group(group)
22 .channel(NioServerSocketChannel.class) // 使用NioServerSocketChannel类,用于实例化新的通道以接受传入连接
23 .localAddress(new InetSocketAddress(port)) // 设置服务器监听端口号
24 .childHandler(new ChannelInitializer() {
25 @Override
26 public void initChannel(SocketChannel ch) throws Exception {
27 ch.pipeline().addLast(new EchoServerHandler()); // 添加请求处理
28 }
29 });
30 // 绑定到端口和启动服务器
31 ChannelFuture f = b.bind().sync();
32 System.out.println(EchoServer.class.getName() +
33 " started and listening for connections on " + f.channel().localAddress());
34 f.channel().closeFuture().sync();
35 } finally {
36 group.shutdownGracefully().sync();
37 }
38 }
39}

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

1@Sharable
2public class EchoServerHandler extends ChannelInboundHandlerAdapter {
3 @Override
4 public void channelRead(ChannelHandlerContext ctx, Object msg) {
5 // 覆盖channelRead()事件处理程序方法
6 ByteBuf in = (ByteBuf) msg;
7 System.out.println(
8 "Server received: " + in.toString(CharsetUtil.UTF_8));
9 ctx.write(in);
10 }
11
12 @Override
13 public void channelReadComplete(ChannelHandlerContext ctx)
14 throws Exception {
15 // channelRead()执行完成后,关闭channel连接
16 ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
17 .addListener(ChannelFutureListener.CLOSE);
18 }
19
20 @Override
21 public void exceptionCaught(ChannelHandlerContext ctx,
22 Throwable cause) {
23 cause.printStackTrace();
24 ctx.close();
25 }
26}

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

明哥使用Netty的姿势

明哥基于Netty开发了应用配置管理平台服务,实现了“为业务提供统一的配置管理服务”,可以做到开箱即用,主要功能有:简单易用: 上手非常简单, 只需要引入maven依赖和一行配置即可;

在线管理: 提供配置管理中心, 支持在线管理配置信息;

实时推送: 配置信息更新后,实时推送配置信息, 项目中配置数据会实时更新并生效, 不需要重启线上机器;

配置备份: 配置数据会在MySQL中会对配置信息做备份, 保证配置数据的安全性;