摘要:
Bootstrap、ServerBootstrap 1) Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件, Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 阅读全文
摘要:
之前的案例如下 现在将ChannelInitializer提取出来 编写服务端 public class TestServer { public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = 阅读全文
摘要:
简介 1) 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者。 2) Netty 中的 I/O 操作是异步的,包括 Bind、Write、Connect 等操作会简单的返回一个ChannelFuture。 3) 阅读全文
摘要:
任务队列中的 Task 有 3 种典型使用场景 1) 用户程序自定义的普通任务 [举例说明] 2) 用户自定义定时任务 3) 非当前 Reactor 线程调用 Channel 的各种方法 例如在推送系统的业务线程里面,根据用户的标识,找到对应的 Channel 引用,然后调用 Write 类方法向该 阅读全文
摘要:
导入依赖 // https://mvnrepository.com/artifact/io.netty/netty-all implementation group: 'io.netty', name: 'netty-all', version: '4.1.51.Final' 服务端 public 阅读全文
摘要:
简介 Netty 主要基于主从 Reactors 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor 1) BossGroup 线程维护Selector , 只关注Accecpt2) 当接收到Accept事件,获取到对应的 SocketChannel, 封装成 NI 阅读全文
摘要:
根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现 1) 单 Reactor 单线程 2) 单 Reactor 多线程 3) 主从 Reactor 多线程 单 Reactor 单线程 1) Select 是前面 I/O 复用模型介绍的标准网络编程 API,可以实现应用程序通 阅读全文
摘要:
原生NIO存在的问题 1) NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。 2) 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor模 阅读全文
摘要:
在 Java 程序中,常用的零拷贝有 mmap(内存映射射) 和 sendFile 传统io mmap优化 mmap 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据。 这样,在进行网络传输时,就可以减少内核空间到用户控件的拷贝次数 sendFile优化 Linux 2.1 阅读全文
摘要:
简介 1) 编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2) 实现多人群聊 3) 服务器端:可以监测用户上线,离线,并实现消息转发功能 4) 客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到) 编写服务端 阅读全文
摘要:
SelectionKey 1) SelectionKey,表示 Selector 和网络通道的注册关系, 共四种: int OP_ACCEPT:有新的网络连接可以 accept,值为 16 int OP_CONNECT:代表连接已经建立,值为 8 int OP_READ:代表读操作,值为 1 int 阅读全文
摘要:
编写服务端 public class NIOServer { public static void main(String[] args) throws Exception{ //创建ServerSocketChannel -> ServerSocket ServerSocketChannel se 阅读全文
摘要:
阅读全文
摘要:
简介 1) Java 的 NIO,用非阻塞的 IO 方式。可以用一个线程,处理多个的客户端连接,就会使用到Selector(选择器) 2) Selector 能够检测多个注册的通道上是否有事件发生(注意:多个Channel以事件的方式可以注册到同一个Selector),如果有事件发生,便获取事件然 阅读全文
摘要:
ByteBuffer 支持类型化的put 和 get, put 放入的是什么数据类型,get就应该使用相应的数据类型来取出,否则可能有 BufferUnderflowException 异常。 代码案例 public class NIOByteBufferPutGet { public static 阅读全文
摘要:
简介 1) NIO的通道类似于流,但有些区别如下: • 通道可以同时进行读写,而流只能读或者只能写 • 通道可以实现异步读写数据 • 通道可以从缓冲读数据,也可以写数据到缓冲 2) BIO 中的 stream 是单向的,例如 FileInputStream 对象只能进行读取数据的操作,而 NIO 中 阅读全文
摘要:
简介 缓冲区(Buffer):缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块, 缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Bu 阅读全文
摘要:
简介 1) Java NIO 全称 java non-blocking IO,是指 JDK 提供的新API。从 JDK1.4 开始,Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO(即 New IO),是同步非阻塞的 2) NIO 相关类都被放在 java.nio 包及子包下,并且对 阅读全文
摘要:
简介 1) Java BIO 就是传统的java io 编程,其相关的类和接口在 java.io 2) BIO(blocking I/O) : 同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理, 如果这个连接不做任何事情会造成不必要的线程开销,可以通 阅读全文
摘要:
简介 1) Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github上的独立项目。 2) Netty 是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序。 3) Netty主要针对在TCP协议下,面向Clients端的高并发应用,或者Pe 阅读全文
摘要:
项目结构 microservice-parent: 统一管理所有模块的 jar 包版本信息 microservice-bean: 统一管理所有模块的用到的 pojo 类 microservice-common:统一管理所有模块的用到的工具类、枚举类、异常处理、日志文件、统一返回结果信息 micros 阅读全文
摘要:
参考 必须配合插件使用 配置环境 build.gradle中导入插件 plugins { id 'org.springframework.boot' version '2.3.7.RELEASE' //维护springboot版本号,不单独使用,和下面两个插件一起用 id 'io.spring.de 阅读全文
摘要:
生命周期中的这些钩子函数都是由 gradle 自动回调完成的,利用这些钩子函数可以帮助我们实现一些我们想要的功能 # Gradle 初始化阶段: 1.在 settings.gradle 执行完后,会回调 Gradle 对象的 settingsEvaluated 方法 2.在构建所有工程 build. 阅读全文
摘要:
将项目发布到服务器上给其他人使用 导入插件 plugins { id 'java' id 'maven-publish' // 用于发布 } 发布所需配置 publishing { publications { myLibrary(MavenPublication) { groupId = 'org 阅读全文
摘要:
1. build.gradle 是一个 gradle 的构建脚本文件,支持 java、groovy 等语言。 2. 每个 project 都会有一个 build.gradle 文件,该文件是项目构建的入口,可配置版本、插件、依赖库等信息。 3. 每个 build 文件都有一个对应的 Project 阅读全文
摘要:
插件的引用 apply plugin: '插件名' apply plugin: '插件id' 主要任务 可通过 gradle tasks 查看 工程目录结构 一些插件对工程目结构有约定,所以我们一般遵循它的约定结构来创建工程,这也是 Gradle 的“约定优于配置”原则。 例如 java 插件规定的 阅读全文
摘要:
将buildSrc 目录复制一份,修改文件夹名,然后在 settings.gradle 文件中,使其作为1个子模块 在插件子模块的build.gradle中配置如下 # 添加插件 apply plugin: 'maven-publish' publishing { publications { my 阅读全文
摘要:
自定义插件 -> 参考 interface GreetingPluginExtension { Property<String> getMessage() Property<String> getGreeter() } class GreetingPlugin implements Plugin<P 阅读全文
摘要:
插件的作用 1、可以添加任务【task】到项目中,从而帮助完成测试、编译、打包等。 2、可以添加依赖配置到项目中。 3、可以向项目中拓展新的扩展属性、方法等。 4、可以对项目进行一些约定,如应用 Java 插件后,约定 src/main/java 目录是我们的源代码存在位置,编译时编译这个目录下的 阅读全文
摘要:
方式1:gradle自己解决 dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5 阅读全文
摘要:
编译时:如果 libC 的内容发生变化,由于使用的是 api 依赖,依赖会传递,所以 libC、libA、projectX 都要发生变化, 都需要重新编译,速度慢,运行时:libC、libA、projectX 中的 class 都要被加载。 编译时:如果 libD 的内容发生变化,由于使用的是 im 阅读全文
摘要:
导入依赖案例 dependencies { //①.依赖当前项目下的某个模块[子工程] implementation project(':subject01') //②.直接依赖本地的某个jar文件 implementation files('libs/foo.jar', 'libs/bar.jar 阅读全文
摘要:
本地文件 使用 Project.file(java.lang.Object)方法,通过指定文件的相对路径或绝对路径来对文件的操作,其中相对路径为相对当前project[根 project 或者子 project]的目录。 其实使用 Project.file(java.lang.Object)方法创建 阅读全文
摘要:
任务执行顺序 1、dependsOn 强依赖方式 2、通过 Task 输入输出 3、通过 API 指定执行顺序 动态执行任务 在循环中注册同一类型的多个任务 # 注册4个同一类型的任务 4.times { counter -> tasks.register("task$counter") { doL 阅读全文
摘要:
任务定义方式 通过 Project 中的 task()方法 task('A',{//任务名称,闭包都作为参数 println "taskA..." }) task('B'){//闭包作为最后一个参数可以直接从括号中拿出来 println "taskB..." } task C{//groovy语法支 阅读全文
摘要:
任务执行语法:gradle [taskName...] [--option-name...] 常见任务 gradle build: 构建项目:编译、测试、打包等操作 gradle run :运行一个服务,需要 application 插件支持,并且指定了主启动类才能运行 gradle clean: 阅读全文
摘要:
任务名可以使用单引号、双引号、不使用引号 参数方式依赖 task A { doLast { println "TaskA.." } } task 'B'{ doLast { println "TaskB.." } } //参数方式依赖: dependsOn后面用冒号 task 'C'(depends 阅读全文
摘要:
# 执行任务 gradle -i 任务名 也可以定义到任务的外面 action使用 def map=new HashMap<String,Object>(); //action属性可以设置为闭包,设置task自身的行为 map.put("action",{println "taskD.."}) ta 阅读全文
摘要:
Gradle 项目的生命周期分为三大阶段: Initialization -> Configuration -> Execution. 每个阶段都有自己的职责 Initialization 阶段主要目的是初始化构建, 它又分为两个子过程,一个是执行 Init Script,另一个是执行 Settin 阅读全文
摘要:
简介 测试任务自动检测并执行测试源集中的所有单元测试。测试执行完成后会生成一个报告。支持 JUnit 和 TestNG 测试 默认测试目录及标准输出 Gradle 对于 Junit4.x 支持 dependencies { testImplementation group: 'junit' ,nam 阅读全文