保存成功
订阅成功
保存失败,请重试
提交成功
加多

加多

资深开发工程师
加多,某大型互联网公司资深开发工程师,并发编程网编辑;热衷并发编程,微服务架构设计,中间件基础设施,著作《Java并发编程之美》《Java异步编程实战》等,微信公众号:技术原始积累...更多
创作文章41

Apache Dubbo 的协议帧与编解码原理

Apache Dubbo 是阿里巴巴开源的高性能可扩展分布式 RPC 框架,目前其在各大厂内部被广泛使用。RPC 框架客户端在发送消息前会对 POJO 的消息内容编码为二进制流,然后通过 TCP 通道发送到服务端,服务端接受到二进制流后需要解码为 POJO 对象,那么这中间过程真的是那么简单吗?其实不然,本 Chat 旨在揭开这神秘的面纱。 本 Chat 内容如下: - 什么是 TCP 半包与粘包问题,如何解决? - Apache Dubbo 自定义的协议帧是怎样的? - Apache Dubbo 客户端发送消息时是如何对消息进行编码的? - Apache Dubbo 服务端接受消息时是如何对消息进行解码的?如何处理半包、粘包问题的?
Dubbo
108 订阅

基于 Netty 与 CompletableFuture 模拟 RPC 同步与纯异步调用

Netty 是一个异步非阻塞、基于事件驱动的网络编程框架,其使用范围越来越广,比如 Apache RocketMQ、Apache Dubbo 底层网络通信都是使用的 Netty;而 CompletableFuture 则是 JDK8 中新增的类,其的出现用来解决传统 Future 的缺陷;那么当 Netty 结合 CompletableFuture 时候会产生什么火花?本 Chat 就使用 Netty 与 CompletableFuture 的结合来模拟 RPC(远程过程调用)同步与纯异步调用。 本 Chat 内容如下: - 基于 Netty 实现 RPC 服务端 - 基于 Netty 实现 RPC 客户端 - 基于 Netty 与 CompletableFuture 实现 RPC 同步调用 - 基于 Netty 与 CompletableFuture 实现 RPC 纯异步调用 - 基于 RxJava 适配 CompletableFuture 实现 Reactive 风格异步调用
Netty
153 订阅

Spring WebFlux 的异步非阻塞处理

虽然 Web Servlet 技术栈的不断发展实现了异步处理与非阻塞 IO,但是其异步是不彻底的,因为受制于 Servlet 规范本身,比如其规范是同步的(Filter,Servlet)或阻塞(getParameter,getPart)。 所以新的使用少量线程和较少的硬件资源来处理并发的非阻塞 Web 技术栈应运而生- WebFlux,其是与 Servlet 技术栈并行存在的一种新的技术,其基于 JDK8 函数式编程与 Netty 实现天然的异步、非阻塞处理。 本 Chat 则主要讲解 Spring 框架 5.0 中引入的新的 WebFlux 技术栈,内容如下: - WebFlux 存在的价值与意义是什么 - WebFlux 的并发模型是怎样的 - WebFlux 的的两种编程模型是怎样的 - 如何使用 WebFlux 进行编程 - WebFlux 内部实现原理是怎么样的 - WebFlux 的适用场景是什么
178 订阅

Apache Dubbo 的异步调用与异步执行

Apache Dubbo 是阿里巴巴开源的高性能可扩展分布式 RPC 框架,在 Dubbo 2.7.0 版本其服务消费端异步调用实现中引入了 JDK8 中的 CompletableFuture 类实现了真正意义上的异步调用;服务提供端则为了避免不同服务共用同一个 Dubbo 内部线程池造成相互影响,提供了异步处理能力,从而实现了全链路异步。 本 Chat 内容如下: - Dubbo 提供的异步调用与异步处理模型 - Dubbo 2.7.0 版本前服务消费端如何使用异步调用,及其缺点 - Dubbo 2.7.0 版本后服务消费端如何使用异步调用 - 服务提供端如何基于定义 CompletableFuture 签名的接口实现异步执行 - 服务提供端如何使用 AsyncContex t实现异步执行
180 订阅

谈谈 Netty 的线程模型

Netty 是一个异步、基于事件驱动的网络应用程序框架,其对 Java NIO 进行了封装,大大简化了 TCP 或者 UDP 服务器的网络编程。其应用还是比较广泛的,比如 Apache Dubbo 、Apache RocketMQ、Zuul 2.0 服务网关、Spring WebFlux、Sofa-Bolt 底层网络通讯都是基于 Netty 来实现的,本节我们谈谈 Netty4 中的线程模型。 本文已参加 GitChat「我的技术实践」有奖征文活动,活动链接:[ GitChat「我的技术实践」有奖征文活动](https://gitbook.cn/gitchat/activity/5d5e3d9d877aaf2c49e5c87e)
免费
223 订阅

Reactive(反应式)编程导论

反应式编程是一种涉及数据流和变化传播的异步编程范例。这意味着可以通过所采用的编程语言轻松地表达静态(例如阵列)或动态(例如事件发射器)数据流。 本文已参加 GitChat「我的技术实践」有奖征文活动,活动链接:[ GitChat「我的技术实践」有奖征文活动](https://gitbook.cn/gitchat/activity/5d5e3d9d877aaf2c49e5c87e)
免费
150 订阅

Java 异步编程导论

异步编程是可以让程序并行运行的一种手段,其可以让程序中的一个工作单元与主应用程序线程分开独立运行,并且等工作单元运行结束后通知主应用程序线程它的运行结果或者失败原因。使用它有许多好处,例如改进的应用程序性能和减少用户等待时间等。 本文已参加 GitChat「我的技术实践」有奖征文活动,活动链接:[ GitChat「我的技术实践」有奖征文活动](https://gitbook.cn/gitchat/activity/5d5e3d9d877aaf2c49e5c87e)
免费
203 订阅

Java 异步编程实战(上篇)

异步编程是可以让程序并行运行的一种手段,其可以让程序中的一个工作单元与主应用程序线程分开独立运行,并且等异步工作单元运行结束后通知主应用程序线程它的运行结果或者失败原因。使用异步编程有许多好处,例如改进应用程序性能和减少用户等待时间等。 本 Chat 旨在研究 Java 中异步编程的实践,从最简单的每当需要异步执行时候开启一个线程来执行,到使用线程池来复用线程执行异步任务,到使用可以产生异步执行结果的 Future 实现异步编程,再到 JDK8-Stream 与 Future 的完美结合,再到 Reactive 实现的异步非阻塞编程,再到 Spring 框架提供的异步处理功能,再到 Servlet 3.0 提供的异步处理,Servlet 3.1 提供的非阻塞 IO。 本 Chat 主要内容列为如下: - Java 异步编程简介 - 使用 Thread&Runnable 实现异步编程 - 使用 FutureTask 实现异步编程,弥补 Thread&Runnable 方式没有返回值 - 使用 CompletableFuture 实现异步编程,弥补多个 FutureTask 不可进行组合 - JDK8-Stream 以及其如何与 CompletableFuture 进行结合产生强大的异步处理能力 - 为何需要 Reactive 编程,以及如何使用其实现异步非阻塞编程:主要讲解 rxjava 的异步编程能力 - Spring 框架中提供的异步处理能力 - Servlet 3.0 提供的异步处理与 Servlet 3.1 提供的非阻塞 IO 能力
Java
289 订阅

Dubbo 框架内核原理剖析

Dubbo 是阿里巴巴开发的一个开源的高性能的远程服务调用框架,致力于提供高性能和透明化的 RPC 远程调用服务解决方案。作为阿里巴巴 SOA 服务化治理方案的核心框架,目前它已进入 Apache 卵化器项目,其前景可谓无限光明。 本 Chat 我们来探讨支撑 Dubbo 框架的内核原理,包含: - Dubbo 框架整体架构分析; - Dubbo 的适配器原理; - Dubbo 的动态编译原理; - JDK 标准 SPI 原理,Dubbo 增强 SPI 原理,以及其如何实现 AOP 与 IOC 功能; - Dubbo 如何使用 JavaAssist 减少反射调用开销。
Dubbo
250 订阅

JDK8 Lambda 表达式&Stream

JDK8 可谓是 JDK 发展史上一个里程碑式的版本,其中新增了很多新特性,本 Chat 我们来探讨新特性 Lambda 表达式与 Stream 式编程。 首先我们看下这些特性可以给我们带来什么变化: - 可以让我们编写出简单、干净、易读的代码,特别是对于集合的操作; - 可以让我们简单的使用并行计算提高性能; - 可以让我们开发出简单不易出错的并发代码; - 可以让我们更好的对问题进行建模。 通过本 Chat 你可以学习到: - 如何使用 Lambda 表达式,编写出简单、干净、易读的代码; - 正确理解 JDK8 Stream 常用操作符特性; - 如何正确利用并行流来提高程序效率。
JDK
334 订阅

Java NIO 框架 Netty 之美: 搭建文件上传服务器

Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它的设计参考了许多协议的实现,比如 FTP、SMTP、HTTP 和各种二进制和基于文本的传统协议,因此 Netty 成功的实现了兼顾快速开发、性能、稳定性、灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。Netty 的应用还是比较广泛的,比如阿里巴巴开源的 Dubbo 和 Sofa-Bolt 框架底层网络通讯都是基于 Netty 来实现的。 本 Chat 我们来使用 Netty 搭建一个文件上传服务,主要包含下面内容: - 使用 Netty 搭建文件上传服务端,自定义协议格式,自定义解码处理器,允许一个长连接连续上传多个文件; - 使用 Netty 搭建文件上传客户端,从本地读取文件,按照自定义协议格式通过 Netty 连接传输文件到服务器端 。
严选Java
509 订阅

Java NIO 框架 Netty 之美:源码剖析之一

Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它的设计参考了许多协议的实现,比如 FTP,SMTP,HTTP 和各种二进制和基于文本的传统协议,因此 Netty 成功的实现了兼顾快速开发,性能,稳定性,灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。Netty 的应用还是比较广泛的,比如阿里巴巴开源的 Dubbo 和 Sofa-Bolt 框架底层网络通讯都是基于 Netty 来实现的。 本 Chat 作为 Netty 系列的源码剖析篇,主要包含下面内容: - Netty Server 启动源码剖析,您将能学到服务端如何进行初始化,何时接受客户端请求,何时注册接受 Socket 并注册到对应的 EventLoop 管理的 Selector 等。 - Netty Client 启动源码剖析, 您将能学到客户端如何进行初始化,何时创建的 DefaultChannelPipeline 等。 - Netty的零拷贝技术内幕
Java
287 订阅

Java 网络编程基础篇

网络通讯在系统交互中是必不可少的一部分,无论是职场面试还是工作中都是绕不过去的,本节我们来谈谈 Java 网络编程中的一些知识。 本 Chat 内容如下: - 网络通讯基础知识,剖析网络通讯的本质和需要注意的点。 - 使用 Java BIO 阻塞套接字,实现简单 TCP 网络通讯。 - 使用 Java NIO 非阻塞套接字,实现简单非阻塞 TCP 网络通讯。 - Java IO 模型与 Java NIO 中 ByteBuffer。
Java
484 订阅

微服务核心组件 Zuul 网关原理剖析

Zuul 网关是具体核心业务服务的看门神,相比具体实现业务的系统服务来说它是一个边缘服务,主要提供动态路由、监控、弹性、安全性等功能。在分布式的微服务系统中,系统被拆为了多套系统,通过 Zuul 网关来对用户的请求进行路由,转发到具体的后台服务系统中。 本 Chat 主要内容如下: - 服务网关演化历程 - Zuul 1.0 服务架构与源码剖析 - Zuul 2.0 服务架构新特性
严选微服务
844 订阅

JDK 中 ScheduledThreadPoolExecutor 原理探究

前面讲解过 Java 中线程池 ThreadPoolExecutor 原理探究,ThreadPoolExecutor 是 Executors 工具类里面的一部分功能,下面来介绍另外一部分功能也就是 ScheduledThreadPoolExecutor 的实现,后者是一个可以指定一定延迟时间后或者定时进行任务调度执行的线程池。 本 Chat 内容如下: - ScheduledThreadPoolExecutor 整体结构剖析。 - 单次任务执行的 Schedule 方法原理剖析。 - 周期性任务、固定延迟执行的 ScheduleWithFixedDelay 方法原理剖析。 - 周期性任务、固定频率执行的 ScheduleAtFixedRate 方法原理剖析。
严选JDKThreadPoolExecutor
234 订阅

JDK 中 ThreadPoolExecutor 原理探究

线程池主要解决两个问题:一方面当执行大量异步任务时候线程池能够提供较好的性能,在不使用线程池的时候,每当需要执行异步任务时候是直接 new一线程进行运行,而线程的创建和销毁是需要开销的。使用线程池时候,线程池里面的线程是可复用的,不会每次执行异步任务时候都重新创建和销毁线程。另一方面线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等,每个 ThreadPoolExecutor 也保留了一些基本的统计数据,比如当前线程池完成的任务数目等。 本 Chat 讲代领大家深入探究线程池内核实现原理,内容如下: - 线程池整体结构剖析; - 线程池核心内核原理剖析; - 线程池使用时候需要注意的事项。
严选JDKThreadPoolExecutor
326 订阅

如何正确使用 MySQL 的流式查询

MySQL 是目前使用比较广泛的关系型数据库,而从数据库里面根据条件查询数据到内存的情况想必大家在日常项目实践中都有使用。 当指定条件的数据量特别大时候一般是通过分页的方式在前端页面通过 Tag 标签一页页的加载数据到内存;但是有些情况下却不需要用户切换 Tag 标签的方式一页页的加载数据,这时候如果一下子全部把数据加载内存,就有可能会导致 OOM,虽然这时候可以通过程序控制分页查询,但是每次查询时候数据库都需要把所有符合条件的数据查询出来然后根据当前页的返回来返回指定的页,这无疑加重了 MySQL 服务器不必要的开销。 其实在 MySQL 中提供了流式查询,这允许把符合条件的数据一部分一部分的加载到内存,本 Chat 就来具体讲解如何在 MySQL中使用流式查询: - 使用流式查询前,我们是如何在 MySQL 中进行查询数据的,整个过程发生了什么? - 如何使用 JDBC 编程方式在 MySQL 中使用流式查询? - 如何在 Mybatis 中使用 MyBatisCursorItemReader 进行流式查询? - 如何在 Mybatis 中使用 ResultHandler 进行流式查询? - 什么是客户端流式查询和服务器端流式查询?
严选MySQL数据库
731 订阅

分布式高性能消息中间件 RocketMQ:搭建篇

Apache RocketMQ 是一个分布式消息中间件,其具有低延迟、高性能和可靠性、万亿级容量、灵活的可扩展性特性;它是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于2017年9月25日成为 Apache 的顶级项目。 本场 Chat 作为 RocketMQ 系列开端,先教大家如何编译 RocketMQ 的源码并搭建一个简单的 RocketMQ 环境;因为要研究一个东西的原理,必须先能把环境搭建起来,并且会使用它。 在这个系统里面会包含 NameSever、Broker、Console、发送消息服务、接收消息服务、麻雀虽小,却五脏俱全。 通过本 Chat 你将能学到(内含 Demo): - 五大组件的关系,谁与谁之间在通信。 - 如何编译源码并搭建 NameServer? - 如何编译源码并搭建 Broker? - 如何编译源码并搭建 Console,并监控消息? - 基于SpringBoot搭建一个消息发送与接收的服务。
RocketMQ
758 订阅

Spring IOC 级联容器原理探究

Spring 框架核心组件之一是 IOC,IOC主要负责管理 Bean 的创建和 Bean 之间的依赖注入;在一般的项目实践中我们只需要一个 IOC 容器来管理所有的 Bean 就可以了,但是这不是必然的,在 Spring MVC 框架中就是用了两级 IOC 容器来更好的管理业务 Bean 与Controller Bean;另外使用级联容器我们可以实现子 IOC 容器共享父容器的 Bean,并且可以达到各个子IOC容器的 Bean 相互隔离。 本 Chat 内容如下: - Spring MVC 框架级联容器原理探究,父子容器如何创建的?各自作用是什么? - Webx 框架中级联容器原理探究,父子容器如何创建的?各自作用是什么? - Demo演示如何使用级联 IOC,实现不同 IOC 管理的Bean相互隔离、子 IOC 共享父 IOC 管理的 Bean。
Spring容器
289 订阅

Spring 事务配置解惑

事务是数据库区别于文件系统的一个重要特征,数据库通过事务保证了数据库中数据的完整性,也就是一个事务内的 N 多操作要么全部都提交,要么全部都回滚。在 Spring 框架中使用事务,我们需要在 XML 里面配置好多 Bean,而这些 Bean 背后都做了哪些事情那,并不是每个人都清楚。通过本场 Chat 您将能弄清楚 Mybatis 结合 Spring 中 XML 文件里面配置事务时,每个配置项 Bean 背后究竟在做些什么?从而对 Spring 事务配置能够达到知其然,也知其所以然,避免入坑。 本Chat内容如下: - 当您在 XML 里面配置了一个 SqlSessionFactoryBean 后,其究竟做了什么? - 当您在 XML 里面配置了一个 MapperScannerConfigurer 后,其究竟做了什么? - 上面两个 Bean 如何通过动态代理生成数据库操作类的? - 当您执行 Mapper 接口的查询方法后,发生了什么? - &lt;tx:advice/&gt;、&lt;aop:config&gt; 标签如何创建事务切面的? - <tx:annotation-driven/>标签添加后为何就可以使用注解式事务了?
Spring
870 订阅

分布式事务原理探究

在单个数据库实例时候,我们可以使用一个数据源的事务([本地事务](https://gitbook.cn/gitchat/activity/5b339cc2b3d1de6cd5e3cecb) )来保证事务内的多个操作要么全部执行生效,要么全部不生效。在多数据库实例节点时候,我们对多个实例的数据源进行操作时候就没办法把多个操作放到一个大的事务内来管理了,因为多个实例操作的是不同的数据源,而数据库自带的事务是针对单个数据源来说的,这时候就需要分布式事务了。 本 Chat 主要讲解分布式事务的原理,主要包含下面内容: - 何为分布式事务二阶段提交协议,二阶段提交存在哪些缺点? - 何为分布式事务三阶段提交协议,三阶段相比二阶段提交存在哪些优点? - 何为分布式事务 TCC 编码模式,并结合蚂蚁金服的 XTS 进行概要介绍。 - MySQL 中基于 XA 实现的分布式事务。 - 事务管理器 Atomikos 实现的分布式事务(有demo源码)。
分布式事务
880 订阅

本地事务原理探究

事务是数据库区别于文件系统的一个重要特征,数据库通过事务保证了数据库中数据的完整性,也就是一个事务内的 N 多操作要么全部都提交,要么全部都回滚。事务具有 ACID 特性,其中 I 就是隔离性,也是本场 Chat 要讲解的内容,在 Spring 框架中又引入了事务的传播性的概念用来解决嵌套事务问题。但凡系统一般都会用到数据库,而事务是数据库保证数据的完整性的不二法宝,无论项目实践还是跳槽面试都是不能绕开的话题。 本 Chat 作为后面分布式事务的基础,先来讲解下本地事务的原理,本 Chat 主要包含下面内容: - 什么是事务的隔离性,事务隔离性有哪些级别,MySQL 默认隔离级别是什么? - 什么是幻读,什么是脏读?什么隔离级别可以避免这些问题? - MySQL 中事务的隔离性如何实现的? - Spring 框架中事务的传播性是什么?有哪些传播性,各自特点是什么? - 实战演示事务的传播性与隔离性(demo实战)。
本地事务
285 订阅

分布式锁原理探究

在同一个 JVM 进程中时,我们可以使用 JUC 提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个的不同 JVM 进程中的线程共同竞争同一个共享资源时候,JUC 包的锁就无能无力了,这时候就需要分布式锁了。 本 Chat 主要讲解几种常见的分布式锁实现方案以及原理,主要内容如下: - 分布式锁与 JUC 包锁的不同; - 使用 Zookeeper 的序列节点来实现分布式锁; - 使用 Redis 来实现分布式锁; - 使用数据库锁来实现分布式锁; - 三种方案的简单对比。
946 订阅

Java NIO 框架 Netty 之美:粘包与半包问题

Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它的设计参考了许多协议的实现,比如 FTP,SMTP,HTTP 和各种二进制和基于文本的传统协议,因此 Netty 成功的实现了兼顾快速开发,性能,稳定性,灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。Netty 的应用还是比较广泛的,比如阿里巴巴开源的 Dubbo 和 Sofa-Bolt 框架底层网络通讯都是基于 Netty 来实现的。 本 Chat 作为 Netty 中粘包与半包问题,主要包含下面内容: - 什么是粘包与半包问题,为何会出现,如何避免? - 如何使用包定长 FixedLengthFrameDecoder 解决粘包与半包问题?原理是什么? - 如何使用包分隔符 DelimiterBasedFrameDecoder 解决粘包与半包问题?原理是什么? - Dubbo 在使用 Netty 作为网络通讯时候是如何避免粘包与半包问题? - Netty框架本身存在粘包半包问题?什么时候需要考虑粘包与半包问题?
严选Java
414 订阅

Java NIO 框架 Netty 之美:基础篇之一

Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程。Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题,它的设计参考了许多协议的实现,比如 FTP,SMTP,HTTP 和各种二进制和基于文本的传统协议,因此 Netty 成功的实现了兼顾快速开发,性能,稳定性,灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。Netty 的应用还是比较广泛的,比如阿里巴巴开源的 Dubbo 和 Sofa-Bolt 框架底层网络通讯都是基于 Netty 来实现的。 本 Chat 作为 Netty 系列的开篇,主要包含下面内容: - 初识 Netty; - 使用 Java NIO 搭建简单的客户端与服务端实现网络通讯; - 使用 Netty 搭建简单的客户端与服务端实现网络通讯; - Netty 底层操作与 Java NIO 操作对应关系; - Netty 中常用术语的概念澄清:Channel 与 Socket 什么关系,Channel 与 EventLoop 什么关系,Channel 与 ChannelPipeline 是什么关系,EventLoop 与 EventLoopGroup 是什么关系等等?
严选Java
500 订阅

关于为何以及如何阅读源码的一点心得

日常交流过程中,经常会被问到为何要阅读源码和如何阅读源码的问题,本 Chat 从自己的角度来写下对这两个问题的理解,希望大家共同探讨,共同进步。 本 Chat 内容: - 为何要阅读源码,阅读源码能给我们的成长带来什么? - 如何来阅读源码,阅读源码有什么技巧?
免费严选源码
1031 订阅

分布式系统中服务降级策略探究

在分布式系统架构中多个系统之间通常是通过远程RPC调用进行通信,也就是 A 系统调用 B 系统服务,B 系统调用 C 系统的服务。当尾部应用 C 发生故障而系统 B 没有服务降级时候可能会导致 B,甚至系统 A 瘫痪,这种现象被称为雪崩现象。所以在系统设计时候要使用一定的降级策略,来保证当服务提供方服务不可用时候,服务调用方可以切换到降级后的策略进行执行。 本 Chat 我们主要围绕下面主题展开: - Dubbo 中服务降级策略的使用; - Dubbo 中服务降级策略的实现原理; - Hystrix 熔断机制的使用; - Hystrix 中基于自反馈,调节熔断状态的算法原理讲解; - Hystrix 中熔断器状态转换源码分析 - RXJAVA 基础知识讲解(Hystrix 的熔断机制使用到了这些知识); - Hystrix 中如何使用 RXJAVA 实现统计数据收集 - Dubbo 的服务降级策略与 Hystrix 的熔断机制的简单对比。
分布式
782 订阅

Java 并发编程之美:并发编程实践

Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。 本 Chat 作为 Java 并发编程之美系列的终章,我们来讲解并发编程中的一些实践与经常会遇到的问题,内容如下:(建议先阅读 [并发编程高级篇之三-锁](http://gitbook.cn/gitchat/activity/5ac85e1b2a04fd6c837137a2) ) - Logback 日志框架中异步日志打印中 ArrayBlockingQueue 的使用,Logback 是如何借助队列将同步转换为异步,节省调用线程 RT 响应时间的? - 并发组件 ConcurrentHashMap 使用注意项,虽然 ConcurrentHashMap 是并发安全的组件,但是使用不当还是会造成程序错误,这里列出一些常见的出错点,并讲解如何避免。 - 使用定时器 Timer 的时候需要注意的一些问题,结合源码讲解出现问题的原因,以及如何避免。 - SimpleDateFormat 是线程不安全?为啥?应该如何正确使用? - 线程池使用 FutureTask 时候需要注意的一点事,FutureTask 使用不当可能会造成调用线程一直阻塞,如何避免? - 使用 ThreadLocal 不当可能会导致内存泄露,本节讲解为何会出现内存泄露,以及如何避免。
Java
991 订阅

Java 并发编程之美:并发编程高级篇之五

Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。 本 Chat 作为 Java 并发编程之美系列的高级篇之五,讲解 JUC 包中提供的三种线程同步器的使用与原理分析内容如下:(建议先阅读 [并发编程高级篇之三-锁](http://gitbook.cn/gitchat/activity/5ac85e1b2a04fd6c837137a2) ) - JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 Join 方法更好的选择, CountDownLatch 与线程的 Join 方法区别是什么? - JUC 中回环屏障 CyclicBarrier 的使用与分析,它也可以实现像CountDownLatch一样让一组线程全部到达一个状态后再全部同时执行,但是 CyclicBarrier 可以被复用。那么CyclicBarrier内部的实现与 CountDownLatch 有何不同? - JUC 中 Semaphore的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那么,Semaphore 的内部实现是怎样的? - 最后对上面三种同步器实现进行简单对比。
严选Java
1019 订阅

Java 并发编程之美:并发编程高级篇之四

Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。 本 Chat 作为 Java 并发编程之美系列的高级篇之四,图形结合讲解JDK中线程安全的并发队列实现原理,内容如下:(建议先阅读 [并发编程高级篇之三-锁](http://gitbook.cn/gitchat/activity/5ac85e1b2a04fd6c837137a2) ) - JDK 中基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理剖析,ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程安全? - JDK 中基于链表的阻塞队列 LinkedBlockingQueue 原理剖析,LinkedBlockingQueue 内部是如何使用两个独占锁 ReentrantLock 以及对应的条件变量保证多线程先入队出队操作的线程安全?为什么不使用一把锁,使用两把为何能提高并发度? - JDK 中基于数组的阻塞队列 ArrayBlockingQueue 原理剖析,ArrayBlockingQueue 内部如何基于一把独占锁以及对应的两个条件变量实现出入队操作的线程安全? - JDK 中无界优先级队列 PriorityBlockingQueue 原理剖析,PriorityBlockingQueue 内部使用堆算法保证每次出队都是优先级最高的元素,元素入队时候是如何建堆的,元素出队后如何调整堆的平衡的? - 浅谈上面各种队列的对比,以及给出部分队列在开源框架中使用样例。
严选Java
1021 订阅

Java 并发编程之美:并发编程高级篇之三

借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。 本 Chat 作为 Java 并发编程之美系列的高级篇之三,主要讲解锁,内容如下:(建议先阅读 [Java 并发编程之美:并发编程高级篇之二](http://gitbook.cn/gitchat/activity/5ac034eb67727920220cb904) ) - 抽象同步队列 AQS (AbstractQueuedSynchronizer)概述,AQS 是实现同步的基础组件,并发包中锁的实现底层就是使用 AQS 实现,虽然大多数开发者可能从来不会直接用到 AQS,但是知道其原理对于架构设计还是很有帮助的。 - 独占锁 ReentrantLock 原理探究,ReentrantLock 是可重入的独占锁或者叫做排它锁,同时只能有一个线程可以获取该锁,其实现分为公平与非公平的独占锁。 - 读写锁 ReentrantReadWriteLock 原理,ReentrantLock 是独占锁,同时只有一个线程可以获取该锁,而实际情况下会有写少读多的场景,显然 ReentrantLock 满足不了需求,所以 ReentrantReadWriteLock 应运而生,本文来介绍读写分离锁的实现。 - StampedLock 锁原理探究,StampedLock 是并发包里面 jdk8 版本新增的一个锁,该锁提供了三种模式的读写控制。
严选Java
1073 订阅

Java 并发编程之美:并发编程高级篇之二

借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。 本 Chat 作为 Java 并发编程之美系列的高级篇之二,主要讲解内容如下:(建议先阅读 [Java 并发编程之美:基础篇](http://gitbook.cn/m/mazi/activity/5aafb17477918b6e8444b65f) ) - rt.jar 中 Unsafe 类主要函数讲解, Unsafe 类提供了硬件级别的原子操作,可以直接操作内存变量,其在 JUC 源码中被广泛的使用,了解其原理为研究 JUC 源码奠定了基础。 - rt.jar 中 LockSupport 类主要函数讲解,LockSupport 是个工具类,主要作用是挂起和唤醒线程,是创建锁和其它同步类的基础,了解其原理为研究 JUC 中锁的实现奠定基础。 - 讲解 JDK8 新增原子操作类 LongAdder 实现原理,并讲解 AtomicLong 的缺点是什么,LongAdder 是如何解决 AtomicLong 的缺点的,LongAdder 和 LongAccumulator 是什么关系? - JUC 并发包中并发组件 CopyOnWriteArrayList 的实现原理,CopyOnWriteArrayList 是如何通过写时拷贝实现并发安全的 List?
严选Java
1078 订阅

Java 并发编程之美:并发编程高级篇之一

借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了。相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。 本 Chat 作为 Java 并发编程之美系列的高级篇之一,主要讲解内容如下:([建议先阅读Java 并发编程之美:基础篇](http://gitbook.cn/m/mazi/activity/5aafb17477918b6e8444b65f) ) - ThreadLocal 的实现原理,ThreadLocal 作为变量的线程隔离方式,其内部是如何做的? - InheritableThreadLocal 的实现原理,InheritableThreadLocal 是如何弥补 ThreadLocal 不支持继承的特性? - JDK 并发包中 ThreadLocalRandom 类原理剖析,经常使用的随机数生成器 Random 类的原理是什么?其内部是如何使用 CAS 算法保证多线程下新种子的唯一性?及其局限性是什么?ThreadLocalRandom 是如何利用 ThreadLocal 的原理来解决 Random 的局限性? - 最后 ThreadLocal 的一个使用场景,Spring 框架中如何使用 ThreadLocal 实现 request scope 作用域 Bean
严选Java
1149 订阅

Java 并发编程之美:并发编程基础晋级篇

借用 Java 并发编程实践中的话;编写正确的程序并不容易,而编写正常的并发程序就更难了;相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。 本 Chat 作为 Java 并发编程之美系列的并发编程必备基础晋级篇,通过图文结合,使用通俗易懂的方式来和大家聊聊多线程并发编程中涉及到的高级基础知识([建议先阅读Java 并发编程之美:线程相关的基础知识](http://gitbook.cn/gitchat/activity/5aa4d205c2ff6f2e120891dd) ),具体内容如下: - 什么是多线程并发和并行。 - 什么是线程安全问题。 - 什么是共享变量的内存可见性问题。 - 什么是Java中原子性操作。 - 什么是Java中的CAS操作,AtomicLong实现原理。 - 什么是Java指令重排序。 - Java中Synchronized关键字的内存语义是什么。 - Java中Volatile关键字的内存语义是什么。 - 什么是伪共享,为何会出现,以及如何避免 - 什么是可重入锁、乐观锁、悲观锁、公平锁、非公平锁、独占锁、共享锁。
严选Java
1366 订阅

使用 Dubbo 搭建一个简单的分布式系统

随着阿里巴巴开源的高性能分布式 RPC 框架 Dubbo 正式进入 Apache 孵化器,Dubbo 又火了一把。本场 Chat 作为 Dubbo 系列开端,先教大家使用 Dubbo 搭建一个简单的分布式系统,因为要研究一个东西的原理,必须先能把环境搭建起来,并且会使用它。 在这个系统里面会包含服务提供者,服务消费者,服务注册中心(本 Chat 使用 ZooKeeper),管理控制台(Dubbo-Admin),监控平台(Dubbo-Monitor),麻雀虽小,却五脏俱全。 通过本 Chat 你将能学到(内含demo): - 五大组件的关系,谁与谁之间在通信。 - 如何基于 Spring 配置搭建一个简单的分布式系统。 - 如何基于 Dubbo API 搭建一个简单的分布式系统。 - 何为服务端异步调用,如何使用异步调用,使用异步调用好处是什么。 - 何为泛化调用,如何使用泛化调用,什么时候使用泛化调用。
严选源码
1069 订阅

Java 并发编程之美:线程相关的基础知识

借用 Java 并发编程实践中的话;编写正确的程序并不容易,而编写正常的并发程序就更难了;相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的。 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步;而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫切需求的。 本 Chat 作为 Java 并发编程之美系列的开篇,首先通过通俗易懂的方式先来和大家聊聊多线程并发编程线程有关基础知识(本文结合示例进行讲解,定会让你耳目一新^-^),具体内容如下: - 什么是线程?线程和进程的关系。 - 线程创建与运行。创建一个线程有那几种方式?有何区别? - 线程通知与等待,多线程同步的基础设施。 - 线程的虚假唤醒,以及如何避免。 - 等待线程执行终止的 join 方法。想让主线程在子线程执行完毕后在做一点事情? - 让线程睡眠的 sleep 方法,sleep的线程会释放持有的锁? - 线程中断。中断一个线程,被中断的线程会自己终止? - 理解线程上下文切换。线程多了一定好? - 线程死锁,以及如何避免。 - 守护线程与用户线程。当main函数执行完毕,但是还有用户线程存在的时候,JVM进程会退出?
严选Java
1366 订阅

Spring 中常用注解原理剖析

Spring 框架核心组件之一是 IOC,IOC主要负责管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用<bean/>标签来配置,对于 Bean 之间的依赖可以使用构造方法注入、Set 方法注入。但是使用这种方式会使XML 变的比较臃肿庞大,并且还需要开发人员一个个的在 XML 里面配置 Bean 之间的依赖,这简直是一个灾难,还好 Spring 框架给我们提供了一系列的注解让开发人员从这个灾难中解脱出来,比如在一个类的成员变量上标注了一个简单的@Autowired 注解就可以实现了 Bean 之间的自动依赖注入,在一个类上标注了一个简单的@Component 注解就可以让一个 Bean 注入到 Spring 容器..……而 Spring 框架是如何通过注解简化我们的工作量,实现这些功能的。本 Chat 就来解开这神秘的面纱。另外SpringBoot可谓是把注解运用的活灵活现,SpringBoot中已经不推荐使用xml进行配置了,主张使用注解。 本 Chat 主要内容如下: - 我们经常使用@Autowired进行依赖注入,那么为何能够直接使用?它又是如何工作的,@Required 又是如何起到检查xml里面属性有没有被配置那? - Spring 框架是如何把标注@Component 的 Bean 注入到容器? - 我们经常使用的@Configuration,@ComponentScan,@Import,@Bean 注解又是如何工作的? - 我们经常使用@PropertySource 引入配置文件,那么配置文件里面的配置是如何被注册到 Spring 环境里面的? - 最后讲解如何通过自定义注解实现一个简单的树形文档生成
Spring
1530 订阅

Spring 框架之 AOP 原理剖析

AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构的另一种考虑,补充了面向对象编程(OOP)。在 OOP 中模块化的关键单元是类,而在 AOP 中,模块化单元是切面。也就是说 AOP 关注的不在是类,而是一系列类里面需要共同能力的行为。 本 Chat 内容如下: - 讲解OOP与AOP的简单对比,以及AOP基础名词,比如面试中经常会被问到的 point cut,advice,Join point 等 - 讲解面试经常会被问到的 JDK 动态代理和 CGLIB 代理原理以及区别 - 讲解 Spring 框架中基于 Schema 的 AOP 实现原理 - 讲解 Spring 框架中如何基于 AOP 实现的事务管理
严选Spring
2337 订阅

Spring 框架常用扩展接口揭秘

评价一个框架是否优秀,其中必有一点是看该框架是否留足了可扩展的接口。我们在实际做项目或者研发框架时,很多情况下就是在框架留出的扩展接口上进行定制,所以很有必要对这些框架留出了哪些扩展点,这些扩展点是干啥用的有个心知肚明的了解。 本 Chat 将使用Spring 5.0.3版本针对其常用扩展点进行介绍,主要内容包括: - 对 Spring 框架在上下文刷新(Refresh 阶段),创建 Bean(getBean),上下文销毁(close)阶段中的扩展接口进行讲解; - 讲解Spring框架中的 ContextLoaderListener 扩展接口, 并结合Webx 框架和 SpringMVC 框架讲解该接口如何让 Tomcat 与应用框架联系起来。
严选Spring
967 订阅

Spring Boot 核心模块原理剖析

最近微服务很火,SpringBoot 以其轻量级、内嵌 Web 容器、一键启动、方便调试等特点被越来越多的微服务实践者所采用。然而知其然还要知其所以然,本 Chat 就来讲解 SpringBoot 核心模块的实现原理,在面试的时候也是会被经常问到的,核心内容主要包括: - spring-boot-load 模块,正常情况下一个类加载器只能找到加载路径的 jar 包里面当前目录或者文件类里面的 *.class 文件,SpringBoot 允许我们使用 java -jar archive.jar 运行包含嵌套依赖 jar 的 jar 或者 war 文件,那么 SpringBoot 是如何实现的? - spring-boot-autoconfigure 模块,Spring的出现给我们管理 Bean 的依赖注入提供了便捷,但是当我们需要使用通过 pom 引入的 jar 里面的一个 Bean 时候,还是需要手动在 XML 配置文件里面配置。Springboot 则可以依据 classpath 里面的依赖内容自动配置 Bean 到 Spring 容器。 - spring-boot 模块,提供了一些特性用来支持 SpringBoot 中其它模块,本文会讲解到该模块都提供了哪些功能以及原理。
严选Spring Boot
1070 订阅

Java 类加载器揭秘

类加载器作为 JVM 加载字节码到内存中的媒介,其重要性不言而喻,另外在职场面试时候也会被频繁的问道,了解类加载器的原理,能灵活的自定义类加载器去实现自己的功能显得尤为重要。 主要内容: - 讲解 Java 中自带的三种类加载器,以及构造原理 - 讲解类加载器原理 - 讲解一种特殊的与线程相关类加载器 - 讲解 Tomcat 框架中多级类加载器的实现原理 - 讲解如何使用类加载器实现简单的模块间隔离
严选Java
1628 订阅