Netty实战之第一个应用

代码星冰乐

专注成就未来

首页 归档 关于

Netty实战之第一个应用

Jun 21, 2018 | haifeiWu | Java | 阅读
文章目录
  1. 1. NIO简介
  2. 2. Netty快速入门
    1. 2.1. 添加maven依赖
    2. 2.2. 代码实现
  3. 3. 楼主使用Netty的姿势
  4. 4. 小结

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


由于版权原因,请阅读原文 --> Netty实战之第一个应用

关注我们

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

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

作为一个正在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厂库

1
2
3
4
5
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.12.Final</version>
</dependency>

代码实现

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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()事件处理程序方法。每当从客户端接收到新数据时,使用该方法来接收客户端的消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

@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
原文链接:https://www.hchstudio.cn/article/2018/73dd/
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

分享
Java源码解析
golang重构博客统计服务使用Spring Boot实现博客统计服务
微信关注我们
分类
  • Android8
  • Go4
  • Java59
  • Kafka,Java1
  • Kotlin2
  • Linux1
  • MapReduce1
  • Python2
  • Raft1
  • Redis1
  • ThreadPoolExecutor1
  • go1
  • 工具1
  • 总结8
  • 旅游日记1
标签
Nginx ChanghuiN haifeiWu Android Java 设计模式 hexo Kotlin 算法 MySQL 源码解析 Python Redis golang web Kafka 配置中心 总结 性能优化 旅游日记 Shell Go 问题排查 译文 Docker Spring Boot 工具 学习笔记 WebFlux 性能测试 go 散列表 源码 netty Raft
最近文章
  • Kafka的日志复制机制
  • 从20到21
  • go 并发编程
  • 【译】了解Linux CPU负载-您何时应该担心?
  • Zookeeper 与分布式锁
  • 基于Redis的分布式锁到底安全吗?
  • 【译】Raft 学生指南
  • ThreadPoolExecutor 的简单梳理
  • MapReduce 的简单实现
  • 使用 Map 实现策略模式
福利专区
    免费SSL证书
      阿里云红包
        腾讯云专属福利
        Copyright © 2021 代码星冰乐. Powered by ChanghuiN. 版权所有 晋ICP备15001365号
        特别感谢: 云服务器服务商 、 CDN 服务商