11 2022 档案
摘要:一 源码 我fork的源码带注释 分支study 二 环境 | | 版本 | | | | | Netty | 4.1.169 | | Java | 8 | 三 Samples 1 服务端 1.1 启动类 /* * Copyright 2012 The Netty Project * * The Ne
阅读全文
摘要:一 接口 @SPI("netty") public interface Transporter { /** * Bind a server. * * @param url server url * @param handler * @return server * @throws RemotingE
阅读全文
摘要:一 源码 附上带注释的源码分支my-study-3.0.1 二 编译环境 | | 版本 | | | | | Spring-Boot | 3.0.1 | | OS | macOS 11.5.2 | | Java | 17.0.1 | | Gradle | 7.4.2 | | IDEA | 2022.2
阅读全文
摘要:一 源码 附上带注释的源码分支my-study-6.0.3 二 编译环境 | | 版本 | | | | | Spring | 6.0.3-SNAPSHOT | | OS | macOS 11.5.2 | | Java | 17.0.1 | | Gradle | 7.4.2 | | IDEA | 20
阅读全文
摘要:作用 远程配置中心的实现 ZookeeperRegistryFactory 实现zookeeper的远程配置中心,获取zk的读取zkClient 一 接口声明 @SPI("dubbo") public interface RegistryFactory { /** * Connect to the
阅读全文
摘要:一 接口声明 @SPI(HeaderExchanger.NAME) public interface Exchanger { /** * bind. * * @param url * @param handler * @return message server */ @Adaptive({Cons
阅读全文
摘要:作用 生产者将要导出的目标对象封装(代理技术或者反射技术)成Invoker对象 一 接口 @SPI("javassist") public interface ProxyFactory { /** * create proxy. * * @param invoker * @return proxy
阅读全文
摘要:作用 生产者 将Invoker对象导出 InjvmProtocol 没有真正的干活逻辑 仅仅是一些属性赋值 DubboProtol 启动Netty服务 RegistryProtol 通过DubboProtocol启动netty服务端 注册远程配置中心 消费者 创建Invoker对象 Registry
阅读全文
摘要:一 入口驱动 public static void main(String[] args) throws IOException { // 服务提供者暴露服务配置 封装了与注册中心的连接 ServiceConfig<DemoService> service = new ServiceConfig<D
阅读全文
摘要:一 类图 二 构造方法 public SynchronousQueue() { this(false); } /** * Creates a {@code SynchronousQueue} with the specified fairness policy. * * @param fair if
阅读全文
摘要:一 Dubbo SPI核心 核心实现都在ExtensionLoader中,比较重要的3个入口方法分别是 ExtensionLoader#getExtensionLoader() 扩展实现的加载器 ExtensionLoader#getDefaultExtension() 默认扩展实现 Extensi
阅读全文
摘要:一 类图 二 构造方法 // LinkedBlockingQueue.java // take锁 private final ReentrantLock takeLock = new ReentrantLock(); // put锁 private final ReentrantLock putLo
阅读全文
摘要:一 阻塞队列API | | Throws exception | Special value | Blocks | Times out | | | | | | | | Insert | add(e) | offer(e) | put(e) | offer(e, time, unit) | | Rem
阅读全文
摘要:一 Executors工具类创建ThreadPoolExecutor | | SingleThreadExecutor | newFixedThreadPool | newCachedThreadPool | newScheduledThreadPool | newSingleThreadSched
阅读全文
摘要:前言 之前使用的openjdk11调试JVM源码和Java源码是分开的,而且各自都有不足之处 openjdk在Clion引入头文件飘红 Java源码换行注释导致class和src对应不上 因此重新使用openjdk15解决上述问题 大于openjdk11u的源码中都含有CompileCommands
阅读全文
摘要:一 Demo public class ThreadTest00 { public static void main(String[] args) { Thread t0 = new Thread(() -> System.out.println("biz thread..."), "t0"); /
阅读全文
摘要:一 源码 二 系统工具 macOS Big Sur 11.5.2 Xcode 12.5.1 openjdk 11.0.11 Make 3.81 autoconf (GNU Autoconf) 2.71 Apple clang version 12.0.5 (clang-1205.0.22.11) c
阅读全文
摘要:有过之前对服务端bind流程的分析之后,客户端的connect流程就显得简单了 一 入口 // Bootstrap.java public ChannelFuture connect(String inetHost, int inetPort) { // 异步 return this.connect
阅读全文
摘要:研究服务端的启动流程 一 入口 // AbstractBootstrap.java /** * 异步非阻塞方法 * - 异步 比如main线程发起调用 真正的bind结果main线程并不是直接去取 而是将来真正bind成功的线程将结果回调 * - 非阻塞 比如main线程发起调用 最后真正执行bin
阅读全文
摘要:在Channel的初始化过程中会给每个Channel实例构造一个Pipeline,因此研究pipeline的入口就是构造方法 一 类图 是继承关系上看,pipeline的实现比较简单 二 JavaDoc Netty采用Reactor的线程模型,一个IO线程负责读写,至于怎么操作读写的逻辑则定义在不同
阅读全文
摘要:Netty为了提高系统的吞吐,大量使用异步线程模型 一 Demo public class FutureTest00 { public static void main(String[] args) throws InterruptedException, ExecutionException {
阅读全文
摘要:在ServerBootstrapAcceptor启用之前,此刻Reactor状态应该是 NioServerSocketChannel在IO多路复用器上关注着Accept(16)事件 pipeline中有4个handler head bossHandler ServerBootstrapAccepto
阅读全文
摘要:一 回顾几个时机点 pipeline的初始化 用户向pipeline添加ChannelInitializer辅助实例 Channel注册到复用器之后回调 1 pipeline的初始化 初始化Channel的时候触发了pipeline的初始化 // AbstractChannel.java pipel
阅读全文
摘要:一 类图关系 在Java的NIO体系中定义了ServerSocketChannel和SocketChannel Netty为了支持Reactor线程模型和异步编程,自己也实现了与Java中对应的两个实现 NioServerSocketChannel NioSocketChannel 从功能职责来看
阅读全文
摘要:在IO线程NioEventLoop中维护了一个队列实现,用于存放非IO任务,一个IO线程负责N个Channel,为了保证一个线程贯穿始终负责一个Channel的所有任务(任务执行次序有先后区分需要),因此可能IO线程自己将待执行的内容封装成异步任务,也有可能其他线程提交任务(立即执行或者定时任务)
阅读全文
摘要:前文已经了解过了NioEventLoopGroup和NioEventLoop 在Netty中是用的是Reactor线程模型(IO多路复用器+多个线程),真正处理业务流程的worker线程都是单个线程,一个线程处理多个Channel,一个Channel始终都是由特定的线程进行处理。 在这样的情况下,如
阅读全文
摘要:Netty对Selector的优化体现在两个方面 数据结构替换,数组替换hash表,轮询时直接寻址,提高查询效率 在Linux系统上分装的Selector可能存存在空轮询风险,尽量空轮询出现带来的负面影响 一 数据结构 // NioEventLoop.java NioEventLoop(NioEve
阅读全文
摘要:前言 Netty没有简单的使用线程池复用线程的方式,而是自己实现了一套EventLoopGroup管理器,管理着EventLoop。 一个Group多个线程方式保证服务器的吞吐率(每个线程负责一个Channel的整个生命周期事件,虽然单个事件效率可能下降,但是利用异步方式增加了吞吐率) 每个NioE
阅读全文
摘要:一 Demo public class FastThreadLocalTest00 { private final static FastThreadLocal<Long> v = new FastThreadLocal<Long>() { @Override protected Long init
阅读全文
摘要:一 定义 摘自源码JavaDoc /** * The {@link EventExecutorGroup} is responsible for providing the {@link EventExecutor}'s to use * via its {@link #next()} method
阅读全文