Netty in Order Service 2020-04-14 编写网络应用程序基本步骤 案例介绍 AuthOperation: 授权操作 OrderOperation:点单操作 KeepaliveOperation:保持连接操作 数据结构设计 Message Header * version 协议版本 * opCode 不同的opCode,Message Body 对应的 operation/operation result 也是不同的,在JSON 解析时需要根据 opCode 解析到不同的 Message Body 类型。 * streamId 相当于Message ID,标识信息的唯一 ID Message Body(JSON) * operation 操作 * operation result 操作结果 length * length 长度信息值得是整个Message(Header + Body) 套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机的 ....
Netty 背景与领域知识 2020-04-02 Netty 背景 Netty 由 Trustin Lee (韩国、Line 公司) 2004 年开发。 * 本质:网络应用程序框架 * 实现:异步、事件驱动 * 特性:高性能、可维护、快速开发 * 用于:开发服务器和客户端 为什么不直接使用 JDK NIO 直接使用 JDK NIO = 一个人在战斗。 Netty 做的更多 * 支持常用应用层协议。 * 解决传输问题:粘包、半包现象。 * 支持流量整形。 * 完善的断连、Idle 等异常处理等。 Netty 做的更好 * 规避 JDK NIO bug: epoll bug (异常唤醒空转导致 CPU 100%) JDK NIO 2.4 版本。 * API 更优化、更强大。 * 隔离变化、屏蔽细节。 * 直接用 JDK 实现,代码量太多、BUG 也多。 * Netty 已经维护了 15 年。 网络通信框架对比 Netty 没有竞争对手。 * Apache Mina (Trustin Lee 背书 Netty) * Sun Grizzly (用的少、文档少、更新少) * Apple Swift NIO、ACE 等 (其他语言、....
High Performance Cache 2020-03-30 缓存作用 缓存是在实际生产中非常常用的工具,用了缓存以后,我们可以避免重复计算,提高吞吐量。 一个功能完备、性能强劲的缓存,需要考虑的点非常多。 第一阶段 如果不使用 synchronized 多线程同时 put、扩容时候会出现线程安全隐患 使用 synchronized 性能差,多线程需要串行化的方式执行 doCompute 代码复用性差,代码侵入性强,违反开闭原则。 * 性能差:多个线程同时想计算的时候,需要慢慢等待(同步方法) import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 描述: 最简单的缓存形式:HashMap */ public class ImoocCache1 { //final 增加安全性,可读性 private final HashMap<String,Integer> cache = new HashMap<>(); public synchronized Integer computer(Str....
Future、Callable 2020-03-28 Runnable 缺陷 不能返回一个返回值 run() 方法中不能抛出 checked Exception (方法签名),只能在 run() 方法中使用 try/catch 进行异常捕获。 public abstract void run(); Callable 接口 类似于 Runnable,被其他线程执行的任务 实现 call 方法 有返回值 Future Future 的核心思想是:一个方法的计算过程可能非常耗时,一直在原地等待方法返回,显然不明智。可以把该计算过程放到线程池去执行,并通过 Future 去控制方法的计算过程,在计算出结果后直接获取该结果。 Callable 和 Future 的关系 Future.get() 来获取 Callable 接口返回的执行结果,Future.isDone()来判断任务是否已经执行完了,以及取消这个任务,限时获取任务的结果等。 在 call() 未执行完毕之前,调用 get() 的线程(假设是主线程)会被阻塞,直到 call() 方法返回了结果后,此时 future.get() 才会得到该结果,然后主线程 CIA 会切换到 ....
AbstractQueuedSynchronizer 2020-03-24 AQS 的作用 ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock 等类具有的 协作(同步)功能,底层都是一个共同的基类 AQS。 AQS 是一个用于构建锁、同步器、协作工具类的工具类(框架)。有了 AQS 以后,更多的协作工具类都可以很方便得被编写出来。 一句话总结:有了 AQS,构建线程协作类就容易多了。 Semaphore 和 AQS 的关系 Semaphore 内部有一个 Sync 类, Sync 类继承了 AQS。 如果没有 AQS 每个协作工具自己实现一些功能:(这些功能都是通用的) * 同步状态的原子性管理(例如:CountDownLatch 计数器) * 线程的阻塞与解除阻塞 * 队列的管理 在并发场景下,自己正确且高效实现这些内容,是相当有难度的,所以我们用 AQS 来帮我们把这些脏活累活都搞定,我们只关注业务逻辑就行了。甚至我们可以利用 AQS 自定义一个线程协作类。 AQS 的重要性、地位 AbstactQueuedSynchronizer 是 Doug Lea 写的,从....
SDKMAN 2020-03-23 SDKMAN简介 JDK版本迭代太快,多个版本手动改 JAVA_HOME 太痛苦。 安装 SDKMAN windows 安装需要 bash, zip, unzip, curl。 包含关系: chocolatey(Windows的包管理工具) - zip - unzip git bash(Windows的git终端) - bash - curl C:\> choco install unzip C:\> choco install zip # 安装Git # 打开 Git bash 终端,执行命令: curl -s "https://get.sdkman.io" | bash [root@master ~]# sdk ls java ================================================================================ Available Java Versions ==================================================================....
控制并发流程的工具类 2020-03-23 什么是控制并发流程? 控制并发流程的工具类,作用就是帮助开发者更容易得让线程之间合作。 让线程之间相互配合,来满足业务逻辑(按照预想的方式并发执行)。 比如:让线程 A 等待线程 B 执行完毕再执行等合作策略。 控制并发流程工具类纵览 CountDownLatch 直译 倒数门栓,类似于过山车,人满才会发车。 执行流程如下: 1. 线程开始运行 2. 进入等待,倒数结束之前,一直处于`等待`状态 3. 等待的过程中进行倒数(减) 4. 倒数结束,线程`继续`工作。 CountDownLatch 主要方法概览 * CountDownLatch(int count):仅有一个构造函数,参数 count 为需要倒数的数值。 * await():调用 await() 方法的线程会被挂起,它会等待直到 count 值为 0 才继续执行。 * countDown():将 count 值减1,直到为0时,等待的线程会被唤醒。 CountDownLatch 用法 * 一个线程等待多个线程都执行完毕,再继续自己的工作。 一等多 * 多个线程等待某个线程的信号,同时开始执行。 多等一 *....