[编织消息框架][设计协议]opCode】的更多相关文章

OpCode的全称 OpCode(Operation Code) 操作码的意思. OpCode 有几种域组成,不同领域格式组成不同 1.指令号 2.数据范围 3.数据内容 如 {code}{addr range}{data} {1}{2-5}{2至5地址内容为 "你好"} {2}{6-10}{6至10地址内容为 "hello"} 这种编码可以应用到其它领域,本项目用的格式是 {data model}{data} QOpCode 类维护所有opCode /** * @…
理论部分 一个long占8byte,大多数应用业数值不超过int每次传输多4byte会很浪费 有没有什么办法可以压缩long或int呢? 答案是有的,原理好简单,如果数值不超过int.max_value的话就"自动变成"int类型 现在问题又出现了读取时如果知道原来的类型是什么? 可以先写一个byte是什么类型,再写入值,读时先读一个byte,根据类型做不同解释 源码解读 public abstract class PacketUtil { public final static by…
理论部分 1字节等于8比特,也就是8个二进数,如下面公式 1Byte = 8bits = 0111 1111 1Short = 2Btye 1Int = 4Byte 那学这些有什么用呢? 可以用来做数据存储,如状态,操作类型 如:拿1Byte演示 操作数据 状态数据 小结:1个Byte可以存储 -127~127 个数,也就是有256个标识可以使用 我们可以用4bits做状态,4bits做操作,1Byte容量组合成两种数据 小提示:可以用计算器来计算转换,window系统在附件里能找到 有的状态是…
eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/消费者模型,生产者只需要生成执行上下文需要的数据,消费者集中实现处理逻辑,无需要关注太多关系层次问题 3.可根据业务按单一类型事件独立分配一套event system ,提高并行处理而又解决一些并行产生的并发问题 那作为一个消息框架,处理的事件有那些呢? 主要分为系统事件同用户事件 如消息编解码.s…
OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型. 该体系结构标准定义了网络互连的七层框架(物理层.数据链路层.网络层.传输层.会话层.表示层和应用层),即ISO开放系统互连参考模型. OSI网络体系结构各层协议: (1)应用层:TELNET.FTP.TFTP.SMTP.SNMP.HTTP.BOOTP.DHCP.DNS(2)表示层:                        …
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract class AbstractProcessor implements Processor { protected ProcessingEnvironment processingEnv; public Set<String> getSupportedOptions() { SupportedOpti…
既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 图1 阻塞IO 大部分的IO接口都是阻塞型的.所谓阻塞型接口是指系统调用(一般是IO接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回. 当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的…
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架,使用的是RMI技术. 比较经典的应用jdk bin目录下 jconsole,jvisualvm 来看下如何使用jconsole简单使用 打开jconsole 菜单->新建连接 打开相应的应用程序,我们拿ServerRMI 接着测试. 选择线程选项RMI应用一共占了11个线程,每次运行线程数不是固定,接着运行ClientRMI 当运行client超过初始化线程数时,每…
NioEventLoop 是jdk nio多路处理实现同修复jdk nio的bug 1.NioEventLoop继承SingleThreadEventLoop 重用单线程处理 2.NioEventLoop 是组成 pool EventLoopGroup 基本单元 总之好多边界判断跟业务经验之类的代码,非常烦碎 重要属性 public final class NioEventLoop extends SingleThreadEventLoop { //绑定 selector Selector se…
Unsafe 是channel的内部接口,从书写跟命名上看是不公开给开发者使用的,直到最后实现NioSocketChannelUnsafe也没有公开出去 public interface Channel extends AttributeMap, ChannelOutboundInvoker, Comparable<Channel> { interface Unsafe { RecvByteBufAllocator.Handle recvBufAllocHandle(); SocketAddr…
QException是项目业务异常基类 按模块划分子类异常,方便定位那块出错 有个来源码属性code作用定位某个功能处理出错逻辑,数字类型节省内存空间,同时减少创建子类的子类 QSocketException 是通信层出错 凡是来自QSocketException 统一认为非法请求,强制关闭socket连接 QJsonException 是json编解码出错 json很流行种数据格式,跨平台特点,经常处理 QEnhanceException 是Javassist动态生成java class技术,…
应用动态代理技术要先掌握annotation技术 注解是JDK1.5之后才有的新特性,JDK1.5之后内部提供的三个注解 @Deprecated 意思是“废弃的,过时的” @Override 意思是“重写.覆盖” @SuppressWarnings 意思是“压缩警告” 注解可以加在类名,方法,参数,属性等,为开发者自定义编译处理,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解 所以注解是做框架必备技术 先来看看如何书写Annotation im…
根据设计生成两个接口,IRpcSend send方法返回数据要求包装成QResult对象 public interface IRpcSend { public <T> QResult<T> send(byte command, Object... args); } public interface IRpcReceive { public <T> T receive(byte command, Objec[] args); } public interface IRpc…
动态代理这篇比较长,是框架组成的重要基础 回顾下学到的应用技术 1.异常应用 2.annotation技术 3.数值与逻辑分享 4.jdk.cglib.javassist等动态代理技术 5.懒处理.预处理.编译处理 6.rpc设计,与实现 7.扫描class 8.系统服务水平扩展支持…
上面测试论证系统内核在read data时会阻塞,如果我们在把第一个阶段解决掉那么性能就会提高 NIO 编程 JDK 1.4中的java.nio.*包中引入新的Java I/O库,其目的是提高速度.实际上,“旧”的I/O包已经使用NIO重新实现过,即使我们不显式的使用NIO编程,也能从中受益.速度的提高在文件I/O和网络I/O中都可能会发生,但本文只讨论后者.NIO 简介 NIO我们一般认为是New I/O(也是官方的叫法),因为它是相对于老的I/O类库新增的(其实在JDK 1.4中就已经被引入…
为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的根本目的是让开发者专注写引擎部分,无需关注太多业务上的边界,条件等 需要分离什么类型数值? 如活动开启时间,购买满足条件,购买上限等 这些不确定用户具体需求,全都可以弄成动态获取 分离技术实现有很多 如使用数据库mysql等 linux 常用的配置文本config 表格csv,json文件等 本项目…
基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract class AbstractProcessor implements Processor { protected ProcessingEnvironment processingEnv; public Set<String> getSupportedOptions() { SupportedOpti…
rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服务,传相应参数,返回内容就可以 而提供者根据调用相应服务同参数,工作处理后响应内容即可 根据他们的关系可以用JAVA 接口同实现类 来约束书写完成功能 @QModel(1) public interface ITestEnhance { @QCommond(1) public void a(double a); @QCommond(2) public void b(float a); @QCommond(3) public v…
需要用到的工具  jdk : javac javap class 反编译 :JD-GUI http://jd.benow.ca/ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class TestJdkProxy { public interface UserService { public String get…
接下来如何实现 第一步:先把服务类,调用方法转换成数字,方便传输 第二步:提取元信息,提取又有三种方式,三种各有优点,最优方式是第一种 1.编译java时处理 2.程序启动时处理,预处理 3.调用时处理,懒处理 第三步:编码解释 第四步:请求方式 第五步:分布式支持 第一步: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface QModel { short value(); } @Targ…
基础部份: 修改class我们用到javassist,在pom.xml添加 <properties> <javassist.version>3.18.2-GA</javassist.version> </properties> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <ve…
private static Map<Short, Map<Byte, Method>> RECEIVE_METHOD_INFO = new HashMap<>(); public static <T> T registerReceiveProxy(Object obj) { Class<?> target = obj.getClass(); if (target.isInterface()) { throw new RuntimeExcepti…
之前介绍的annotationProcessor能在编译时生成自定义class,但有个缺点,只能每次添加/删除java文件才会执行,那天换了个人不清楚就坑大了 还记得之前介绍的编译时处理,懒处理,还有个预处理没介绍对吧 预处理:应用程序启动前做的处理,如setup 扫描class处理 1.从ClassLoader 和 System.getProperty("java.class.path") 读取所有classPath 2.解释每个classPath ,用正则匹配jar/class 文…
服务分为系统服务同用户服务两种 水平扩展是基于系统服务,而拆分方式又有几种方案,按数据跟业务情况来做决策 1.每个服务独立存储(图1):每个服务只负责一个或多个领域实体存储,A服务不能直接修改B服务的存储,会造成数据不同步 2.每个服务区域存储(图2):每个服务按不同区域存储,可根据业务按地区或平台存储.如广东地区的用户数据只能存放在广州机房上,A平台用户数据只能存放在A机器上,以至为例B.... 3.特殊服务独立存储(图3):这种服务比较重要,如金额交易之类的 4.混合 图1: 图2: 图3:…
asynchronous I/O (the POSIX aio_functions)—————异步IO模型最大的特点是 完成后发回通知. [编织消息框架][网络IO模型]NIO(select and poll) 与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可.这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序:对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序. …
测试代码 public class ServerSTCP { static int SERVER_PORT = 3456; static int US_STREAM = 0; static int FR_STREAM = 1; static SimpleDateFormat USformatter = new SimpleDateFormat("h:mm:ss a EEE d MMM yy, zzzz", Locale.US); static SimpleDateFormat FRfo…
分析NioEventLoopGroup最主有两个疑问 1.next work如何分配NioEventLoop 2.boss group 与child group 是如何协作运行的 从EventLoopGroup接口约定通过register方法从channel或promise转换成ChannelFuture对象 next方法就是用来分配NioEventLoop public interface EventLoopGroup extends EventExecutorGroup { @Overrid…
ChannelPipeline 负责channel数据进出处理,如数据编解码等.采用拦截思想设计,经过A handler处理后接着交给next handler ChannelPipeline 并不是直接管理handler 而是通过 context 包装管理,一般以context 命名的是个重量级对象,提供给多层使用 public interface ChannelPipeline extends ChannelInboundInvoker, ChannelOutboundInvoker, Ite…
Unsafe是托委访问socket,那么Channel是直接提供给开发者使用的 Channel 主要有两个实现 NioServerSocketChannel同NioSocketChannel 致于其它不常用不在研究范围内 NioServerSocketChannel 是给server用的,程序由始至终只有一个NioServerSocketChannel NioSocketChannel 是给客户端用的,每个连接生成一个NioSocketChannel 对象 NioSocketChannel同Ni…
因为jdk ByteBuffer使用起来很麻烦,所以netty研发出ByteBuf对象维护管理内存使用ByteBuf有几个概念需要知道1.向ByteBuf提取数据时readerIndex记录最后读取坐标,目的是下次从readerIndex开始读2.向ByteBuf写入数据时writerIndex记录最后写数据坐标3.提取数据范围是readerIndex<=writerIndex,因为先写入数据然后才能读取数据4.自动扩容,当writerIndex达到一定阀值时,会扩大capacity 所以Byt…