- 博客(749)
- 资源 (1)
- 收藏
- 关注
转载 Netty接口ChannelHandlerContext
在ChannelHandler 添加到 ChannelPipeline 时会创建一个实例,就是接口 ChannelHandlerContext,它代表了 ChannelHandler 和ChannelPipeline 之间的关联。接口ChannelHandlerContext 主要是对通过同一个 ChannelPipeline 关联的 ChannelHandler 之间的交互进行管理ChannelHandlerContext 中包含了有许多方法,其中一些方法也出现在 Channel 和ChannelPi
2021-08-25 11:13:47 652
转载 Netty 出站入站机制详解
前段时间在B站学习Netty,讲到出站入站的机制时一直没搞明白到底是怎么弄的,直到开始讲源码部分时才终于搞明白。先来看看Netty官方有关出站入站机制的解释:按照图片的理解,则是在通道中,每次出现读事件时,会从头至尾依次调用Inbound即入站方法处理;而触发写事件时,则会从尾到头依次调用outbound即出站方法处理。这里会给人一种错觉,那就是netty在内部维护了两个单向链表实现出站入站操作,而事实上,ChannelPipeline中实际上是维护了一条由ChannelHandlerCo
2021-08-25 11:01:40 1224
原创 ProtoBuf 编解码
在网络程序开发过程中,数据在网络中是以二进制字节码的格式传输的,在发送业务数据前,先对业务数据进行编码,经过网络传输,收到数据后对数据进行解码,Netty提供了一些编解码器,它们底层采用了java序列号技术,有一定的弊端:首先不支持跨语言;序列化体积较大;序列化性能不高。针对这些问题,可以采用ProtoBuf来解决:ProtoBuf是一种支持跨语言传输、高性能、高可靠的数据存储格式,支持序列化,适合用作RPC远程调用的数据交换格式。ProtoBuf的使用是先编写.proto文件来描述消息,然后使用proto
2021-08-23 17:32:18 1461
原创 Netty实现WebSocket长连接
WebSocket协议是使用单个TCP连接进行全双工通信的协议,浏览器与服务器使用一个长连接,可以双向数据传输,且服务器可以主动给浏览器推送数据。Netty是通过给通道绑定的管道,添加一个WebSocketServerProtocleHandler处理器,将http协议升级为WebSocket协议的,数据传输采用帧WebSocketFrame的形式,比如常用的文本帧TextWebSocketFrame传输文本数据。服务器package com.tech.netty.netty.w...
2021-08-20 16:54:44 1220
原创 Netty心跳检测机制
Netty提供了心跳检测机制,它的使用是在通道绑定的管道上添加空闲事件处理器,它可以检测在相应的时间里是否进行过数据读取、数据写入或者数据读写,如果没有发生过则产生读空闲事件、写空闲事件或者读写空闲事件,这些事件会传递给管道的下一个处理器,下一个处理器使用用户事件触发器方法对空闲事件进行处理,比如关闭通道。package com.tech.netty.netty.heartbeat;import io.netty.bootstrap.ServerBootstrap;import ...
2021-08-20 11:11:00 202
原创 基于Netty的简单群聊系统
客户端上下线信息被服务器端转发给其他客户端;客户端发送的信息被服务器端转发给其他客户端;服务端:package com.tech.netty.netty.groupchat;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOpt
2021-08-19 18:01:32 94
原创 SimpleChannelInboundHandler 中常用的事件方法
从建立连接到断开连接,会触发各种事件,每个事件的触发都会关联处理器中的某个方法被调用。从建立连接到断开连接会依次执行下列方法:事件 方法 新的客户端连接事件 handlerAdded 通道注册事件 channelRegistered 通道处于活动状态事件 channelActive 通道数据可读取事件 channel..
2021-08-19 15:11:01 1715
原创 Unpooled和ByteBuf
ByteBuf是Netty的数据容器对象;Unpooled是操作数据容器的工具类;package com.tech.netty.buf;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;/** * @author lw * @since 2021/8/18 */public class NettyByteBuf { public static void main(String[] args) {
2021-08-18 16:34:13 737
转载 Netty中的Option和ChildOption参数解析
前言Netty中的Option和ChildOption的区别:1.Netty中的option主要是设置的ServerChannel的一些选项,而childOption主要是设置的ServerChannel的子Channel的选项。2.如果是在客户端,因为是Bootstrap,只会有option而没有childOption,所以设置的是客户端Channel的选项。本文转载自:Netty:option和childOption参数设置说明一.通用参数CONNECT_TIMEOUT_MILLIS
2021-08-18 11:29:38 721
原创 Netty实现简易版Http服务
浏览器访问服务端监听的端口,服务端做出应答package com.tech.netty.http;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;/** * @autho
2021-08-17 15:26:16 118
原创 Netty非阻塞模型
Netty的很多操作是非阻塞的,像bind、connect、write等,这些操作调用后紧接着返回一个ChannelFuture,它是一个异步执行结果,通过ChannelFuture可以获取执行状态及添加监听器,当执行完成会通知监听器。package com.tech.netty.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.chann
2021-08-13 15:34:24 350
原创 通过任务队列实现 推送消息 功能
在服务器端每次初始化通道时,把新通道添加到一个集合中; 在处理器中,获取当前所有客户端对应的通道,根据通道获取通道所属的事件循环,往事件循环的任务队列提交发送消息的任务; 循环事件的任务会被执行,通过任务将消息发送到对应通道;服务端:package com.tech.netty.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.c
2021-08-13 14:11:46 294
原创 提交任务到任务队列
在服务端处理器中,对于比较耗时的任务,可以提交任务到任务队列进行异步执行; 任务队列有两种任务队列,和定时任务队列,定时任务队列在放入任务开始计时,到时在队列取出执行; 提交任务队列需要先获取通道,根据通道获取EventLoop,根据事件循环的方法提交任务到任务队列;服务端:package com.tech.netty.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture
2021-08-13 11:27:54 356
原创 Netty入门实例 TCP服务
基于Netty开发一个入门程序,主要功能:服务端启动后监听一个端口,客户端启动后会给服务端发送一条消息,服务端收到后通过Handler读取消息,进行处理,读取完通过Handler反馈一条消息给客户端。服务端:Serverpackage com.tech.netty.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.
2021-08-11 17:10:01 216
原创 零拷贝 示例程序
示例程序实现 客户端程序将本地文件经网络IO发送至服务端。客户端程序package com.tech.netty.zerocopy;import java.io.FileInputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.nio.channe
2021-08-05 10:57:00 121
转载 双重检查锁为什么要使用volatile字段?
前言从Java内存模型出发,结合并发编程中的原子性、可见性、有序性三个角度分析volatile所起的作用,并从汇编角度大致说了volatile的原理,说明了该关键字的应用场景;在这补充一点,分析下volatile是怎么在单例模式中避免双检锁出现的问题的。并发编程的3个条件1、原子性:要实现原子性方式较多,可用synchronized、lock加锁,AtomicInteger等,但volatile关键字是无法保证原子性的;2、可见性:要实现可见性,也可用synchronized、lock,
2021-08-04 11:23:18 1254
原创 NIO 简易版群聊系统
服务端启动后,接收客户端发送的消息,把当前消息转发到选择器中注册的其他客户端对应的通道中,实现简单群聊系统。服务端:package com.tech.netty.groupchat;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;import java.
2021-08-03 15:30:19 113
原创 NIO编程入门示例
首先在服务端创建一个ServerSocketChannel,监听指定端口,然后创建一个选择器,ServerSocketChannel在选择器上注册客户端连接事件;当客户端发送连接请求时,事件触发,基于ServerSocketChannel创建SocketChannel,在选择器上注册相关事件(比如数据读取事件);通过选择器的select方法对选择器上注册的所有通道进行事件监听,当有事件触发时会把发生事件的通道关联的SelectionKey保存到内部集合中,并返回发生事件的通道数量;根据Selec
2021-08-02 17:04:06 162
转载 RabbitMQ笔记
1 MQ引言1.1 什么是MQMQ(Message Quene) : 翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。1.2 MQ有哪些当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、Rab
2021-08-01 11:55:40 256
转载 RabbitMQ 七战 Kafka,差异立现!
作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择RabbitMQ还是Kafka?”。基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择RabbitMQ还是Kafka没什么差别,但是这两种技术在底层实现方面是有许多差异的。不同的场景需要不同的解决方案,选错一个方案能够严重的影响你对软件的设计,开发和维护的能力。这篇文章会先介绍RabbitMQ和Apache Kafka内部实现的相关概念。紧接着会主要介绍这两种技术的主要不同点以及他们各自的优缺点,
2021-07-31 18:58:26 75
原创 缓冲区数组依次读取或依次写入
通过通过缓冲区进行数据的读写,还可以使用缓冲区数组进行依次读取或依次写入。package com.tech.netty.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import jav
2021-07-30 17:57:39 442
原创 MappedByteBuffer 堆外内存修改文件
MappedByteBuffer在对文件修改时,可以直接在堆外内存对文件修改,不用拷贝到堆内内存去操作。内核空间:包括内核读缓冲区和内核写缓冲区,是运行内核程序的地方;用户空间:包括堆外内存和堆内内存,是运行用户程序的地方;java传统的拷贝过程:从磁盘文件读取数据到内核读缓冲区,从内核读缓冲区拷贝数据到堆外内存,从堆外内存拷贝数据到堆内内存,在堆内内存对文件数据修改,修改完成后拷贝到堆外内存,然后再拷贝到内核写缓冲区,然后写入磁盘。java 通过MappedByteBu...
2021-07-30 15:39:07 234
转载 java NIO零拷贝、顺序读写、MappedByteBuffer
参考文章:https://blog.csdn.net/zhxdick/article/details/81084672https://blog.csdn.net/zl1zl2zl3/article/details/89378682https://blog.csdn.net/emprere/article/details/98860883一、顺序读写:写数据,操作文件时,采用追加的方式。速度非常快(接近内存写的速度)读数据,也不要自己去seek指定偏移量,而是按顺序read(因为r
2021-07-30 15:12:50 313
原创 ByteBuffer存入取出数据类型一致 创建只读副本
ByteBuffer中put的类型要和get类型保持一致,否则有可能会抛出异常。package com.tech.netty.nio;import java.nio.ByteBuffer;/** * @author lw * @since 2021/7/30 **/public class ByteBufferReadWrite { public static void main(String[] args) { ByteBuffer byteBuffer =
2021-07-30 11:05:18 255
转载 ElasticSearch之mapping分词器选择
前言市场上分词器,眼花缭乱,让你一脸懵逼。Standard: 单字切分法,一个字切分成一个词。CJKAnalyzer: 二元切分法, 把相邻的两个字, 作为一个词.SmartChineseAnalyzer: 对中文支持较好, 但是扩展性差, 针对扩展词库、停用词均不好处理.paoding`: 庖丁解牛分词器, 没有持续更新, 只支持到lucene3.0。mmseg4`: 支持Lucene4.10, 且在github中有持续更新, 使用的是mmseg算法.Whitespace分词器:
2021-07-29 17:31:51 686
原创 Channel应用实例FileChannel
FileChannel用于对文件数据进行读写。通过FileChannel将内存中的数据写入到文件,其实现过程:首先创建ByteBuffer缓冲区,因为通道是和缓冲区交互的;将内存中数据写入到缓冲区;将缓冲区中的数据写入到通道;package com.tech.netty.nio;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import jav
2021-07-29 14:10:12 223
原创 Nio 缓冲区使用的简单示例
NIO 三大核心组成:Selector(选择器)、Channel(通道)和Buffer(缓冲区)。通过缓冲区进行数据的读写,它是双向的,既可以读也可以写,通过flip方法进行切换。package com.tech.netty.nio;import java.nio.IntBuffer;/** * @author lw * @since 2021/7/27 **/public class BasicBuffer { public static void main(String[]
2021-07-27 15:52:58 100
原创 JAVA BIO编程的一个应用示例
服务端创建ServerSocket; 客户端创建Socket用于和服务端进行通信; 客户端发送链接请求,询问服务端是否有可用线程; 客户端在收到服务端响应后,等待响应完成,继续执行后续操作;package com.tech.netty.bio;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import
2021-07-26 21:48:45 190
转载 Bio、Nio与Aio区别整理
IO:即输入(Input)和输出(Output)阻塞:当试图对该文件描述符进行读写时,如果当时没有东西可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止(强迫症,必须这件事做完才能做其他事情,否则一直等待)非阻塞:如果没有东西可读,或者不可写,读写函数马上返回,而不会等待。(先取号,可以去做其他事情,叫号后,过来完成该事情)同步:指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪(亲力亲为且专注于一件事)异步:异步是指用户进程触发IO...
2021-07-26 10:37:20 146
转载 太厉害了,终于有人能把TCP/IP协议讲的明明白白了!
太厉害了,终于有人能把TCP/IP协议讲的明明白白了!从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。作者:Java技术架构来源:今日头条|2019-06-17 08:30收藏分享一图看完本文一、 计算机网络...
2021-07-25 16:20:00 131
转载 Java并发之AQS详解
一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。 以下是本文的目录大纲: 概述 框架 源码详解 简单应用 若有不正之处,请谅解和批评指正,不胜感激。
2021-07-16 14:58:38 88
转载 java 偏向锁、轻量级锁及重量级锁synchronized原理
Java对象头与Monitorjava对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的。对象头包含两部分:Mark Word 和 Class Metadata Address其中Mark Word在默认情况下存储着对象的HashCode、分代年龄、锁标记位等以下是32位JVM的Mark Word默认存储结构由于对象头的信息是与对象自身定义的数据没有关系的额外存储成本,因此考虑到JVM的空间效率,Mark W
2021-07-16 09:58:36 192
转载 java中SoftReference与WeakReference应用于高速缓存示例
前言:本文首先介绍强引用StrongReference、软引用SoftReference、弱引用WeakReference与虚引用PhantomReference之间的区别与联系;并通过一个高速缓存的构建方案,来了解SoftReference的应用场景。本文参考书籍Thinking in Java以及多篇博文。一、Reference分类Reference即对象的引用,根据引用的不同类型,对JVM的垃圾回收有不同的影响。1. 强引用StrongReference通常构建对象的引
2021-07-13 15:04:21 434
转载 谈谈ThreadLocal与内存泄漏
谈谈ThreadLocal与内存泄漏噜噜呀阿里巴巴 Java研发工程师22 人赞同了该文章阅读本文前,需要先了解ThreadLocal的原理。我们将从下面这些问题开始,寻找ThreadLocal中内存泄漏的罪魁祸首。一、ThreadLocal,Thread,ThreadLocalMap,Entry<k,v>之间的关系?先来看看Thread源码可以发现,每一个Thread中维护了一个ThreadLocalMap成员变量(也称threadLocals)..
2021-07-13 10:18:19 345
原创 Jenkins基于Kubernetes搭建持续集成平台CICD以及部署SpringCloud应用程序
一 环境准备kubernetes集群:对容器资源编排 阿里云镜像仓库:存储部署工具镜像,存储对应用程序构建出的镜像 Jenkins:持续部署组件,搭建部署流水线 GitLab:代码管理,存储提交的应用程序代码,存储部署流水线配置文件Jenkinsfile文件二 搭建Kubernetes集群集群搭建参考《使用kubeadm搭建kubenetes集群 部署Nginx》搭建集群,示例用两个节点搭建了一个Kubernetes集群。# 集群搭建成功[root@localhost ~]# .
2021-07-05 13:51:40 357
转载 kubernetes常用命令
kubectl常用示例查看类命令# 获取节点和服务版本信息kubectl get nodes# 获取节点和服务版本信息,并查看附加信息kubectl get nodes -o wide# 获取pod信息,默认是default名称空间kubectl get pod# 获取pod信息,默认是default名称空间,并查看附加信息【如:pod的IP及在哪个节点运行】kubectl get pod -o wide# 获取指定名称空间的podkubectl get pod -n kube
2021-07-04 11:54:41 351
原创 kubernetes资源管理平台ratel
ratel是一个kubernetes集群资源管理平台,使用它可以对多种资源进行创建 查看 修改和删除操作,支持配置多个集群的管理。官网:https://github.com/dotbalo/ratel-doc需要注意在安装时配置 server.yaml# 先拷贝集群配置文件到当前目录:cp /root/.kube/config test1.config# kubeConfigPath 按如下去写,不用在/mnt下手动创建test1.config# 不用配置serverAdminUser s
2021-06-30 14:43:59 901
原创 K8s-yaml的使用及命令
YAML配置文件管理对象对象管理:# 创建deployment资源kubectl create -f nginx-deployment.yaml# 查看deploymentkubectl get deploy# 查看ReplicaSetkubectl get rs# 查看pods所有标签kubectl get pods --show-labels# 根据标签查看podskubectl get pods -l app=nginx# 滚动更新镜像kubectl set image d.
2021-06-30 10:29:03 411
原创 Retrofit 依赖okhttp3报错
retrofit是一款好用的http框架,在项目集成retrofit时,有时候会启动报关于okhttp错,如下:the follollowing method did not exists: okhttp3.HttpUrl.get(Ljava/lang/String;)Lokhttp3/HttpUrl;解决思路:排除retrofit 的okhttp3依赖,强依赖okhttp3 3.12.0版本<dependency> <groupId>com.g...
2021-06-29 10:14:42 1085
rocketmq-console.zip
2021-11-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人