0%

EventLoop组件分析

EventLoopGroup是一组EventLoop的抽象,含有多个EventLoop,可以注册channel,用于在事件循环中进行选择,netty为了更好地利用多核cpu资源,一般会有多个EventLoop同时工作,每个EventLoop维护一个Selector实例,EventLoopGroup提供了next方法,来从组内按照一定的规则获取EventLoop来处理任务

NioEventLoop

1
2
3
4
5
// bossGroup用于接收Client端连接,会将请求交给workerGroup
// NioEventLoopGroup中的子线程数默认是cpu核数*2,是一个NioEventLoop线程组,NioEventLoop实现了Executor接口和EventLoop接口,本质是一个Executor
EventLoopGroup bossGroup = new NioEventLoopGroup();
// workerGroup会获取到真正的连接,然后和连接进行通信,workerGroup用于实际业务处理的
EventLoopGroup workerGroup = new NioEventLoopGroup();
阅读全文 »

BootStrap组件分析

作用是配置整个Netty程序,串联各个组件,Netty中BootStrap类是客户端的启动引导类,ServerBootStrap是服务端的启动引导类

常用方法

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
// 服务端设置EventLoopGroup
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup)

// 客户端设置EventLoopGroup
public B group(EventLoopGroup group)

// 指定通道的实现
// NioServerSocketChannel 异步的服务端TCP socket连接
// NioSocketChannel 异步的客户端TCP socket连接
// NioDatagramChannel 异步的UDP连接
// NioSctpChannel 异步的客户端Sctp连接
// NioSctpServerChannel 异步的服务端Sctp连接
// 会根据所传入的channelClass来创建channel对象
public B channel(Class<? extends C> channelClass)

// 专属于ServerSocketChannel bossGroup
public B handler(ChannelHandler handler)

// 设置业务处理所用到的handler,自定义 workerGroup
public ServerBootstrap childHandler(ChannelHandler childHandler)

// 给Channel通道进行配置 bossGroup
// 传入TCP参数
public <T> B option(ChannelOption<T> option, T value)

// 给用来接收的Channel进行配置 workerGroup
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value)

// 服务端绑定端口
public ChannelFuture bind(int inetPort)

// 客户端连接服务器
public ChannelFuture connect(String inetHost, int inetPort)

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
40
41
42
43
44
45
46
47
48
public class Server {
public static void main(String[] args) throws InterruptedException {
// NioEventLoopGroup是用来处理IO操作的多线程事件循环器
// 这里使用了两个
// 一个bossGroup用于接收Client端连接
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
// 一个workerGroup用于处理被接收的数据,一旦bossGroup接收到连接,就会把连接信息注册到worker上
EventLoopGroup workerGroup = new NioEventLoopGroup();
try{
// 辅助启动类 对server进行一系列的配置
ServerBootstrap bootstrap = new ServerBootstrap();
// 将两个工作线程组加入进来
bootstrap.group(bossGroup,workerGroup)
// 指定NioServerSocketChannel类型的通道
.channel(NioServerSocketChannel.class)
// ChannelInitializer是一个特殊的处理类,目的是帮助使用者配置一个新的Channel
// 使用childHandler绑定具体的事件处理器
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
// 管道中加入处理器
// pipeline本质是一个处理网络事件的职责链,负责管理和执行ChannelHandler
// pipeline是一个双向链表 包含 AbstractChannelHandlerContext head; 和AbstractChannelHandlerContext tail;
socketChannel.pipeline().addLast(new ServerHandler());
}
})
// tcp缓冲区,线程队列等待连接的个数
// option是提供给NioServerSocketChannel用于接收进来的连接
.option(ChannelOption.SO_BACKLOG,128)
// 保持活动连接状态
// childOption提供给由父管道ServerChannel接收到的连接
.childOption(ChannelOption.SO_KEEPALIVE,true);

System.out.println("服务器启动");
// 绑定端口并同步 ChannelFuture继承了Future,异步结果
ChannelFuture future = bootstrap.bind(8765).sync();
// 阻塞 防止关闭 只有关闭事件触发才会执行
future.channel().closeFuture().sync();
} catch (Exception e){
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}


}
}
阅读全文 »

UML简介

UML(统一建模语言)是一个通用的可视化建模语言,用于对软件进行描述,可视化处理、构造和建立软件系统制品的文档,主要有类图、用例图、构件图、部署图、状态机图、活动图、顺序图、协作图

  • 静态建模:类图、对象图、用例图
  • 动态建模:序列图(顺序图、时序图)、通信图(协作图)、状态图、活动图
  • 物理建模:构件图(组件图)、部署图
  • 交互图:序列图(顺序图、时序图)、通信图(协作图)

以下来简单地描述一个各种图,大致分为两个类,结构图和行为图

结构图

结构图属于静态图

类图

类图是以类为中心来组织的,类图中的其他元素或属于某个类或与类相关联,描述的是一组类、接口、协作和它们之间的关系。类图给出了系统的静态设计视图,活动类的类图给出了系统的静态进程视图。对系统词汇、简单协作、逻辑数据库模式建模有帮助。

类图中类用矩形来表示,属性和操作分别列在分格中,关系用类框之间的连线来表示,不同的关系用连线上和连线端头处的修饰符来区别

类图

阅读全文 »

进程管理

进程就是执行中的程序,是系统进行资源分配和调度的基本单位,其使得操作系统资源利用率大幅提升。由程序块、进程控制块(PCB)和数据块三部分组成。

进程控制块(PCB)

进程控制块是用于描述和控制进程运行的通用数据结构,来记录进程当前状态和控制进程运行的全部信息,使得进程是能够独立运行的基本单位。是常驻内存的,进程控制块的组成

  • 标识符 唯一标记一个进程,就是进程id
  • 状态 标记进程的进程状态,如运行态
  • 优先级
  • 程序计数器 进程即将被执行的下一条指令的地址
  • 内存指针 程序代码、进程数据相关指针
  • 上下文数据 进程执行时处理器存储的数据
  • IO状态信息 被进程IO操作所占用的文件列表
  • 记账信息 进程使用处理器时间、时钟数总和等
阅读全文 »