自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(234)
  • 资源 (3)
  • 收藏
  • 关注

原创 Apache Dubbo 服务发布源码分析

1、源码分析思考按照对于 dubbo 的理解,如果要实现服务发布和注册,需要做哪些事情?配置文件解析或者注解解析服务注册启动 netty 服务实现远程监听2、Dubbo 对于 Spring 的扩展最早我们使用 Spring 的配置,来实现 dubbo 服务的发布,方便大家的同时,也意味着 Dubbo 里面和 Spring 肯定有那种说不清的关系。/** * (1)spring.schemas文件用来配置schame文件的位置; * (2)当spring容器扫描到配置文件,例如dubbo

2021-09-23 16:33:57 1004

原创 MyCat 基础入门

官网:http://www.mycat.io/Mycat 概要介绍:https://github.com/MyCATApache/Mycat-Server入门指南:https://github.com/MyCATApache/Mycat-doc/tree/master/%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%971、Mycat介绍与核心概念1.1 基本介绍历史:从阿里 cobar 升级而来,由开源组织维护,2.0 正在开发中。定位:运行在应用和数据库之间,可以当做.

2021-09-09 15:33:44 916

原创 分库分表基础

1、为什么要分库分表1.1 数据库性能瓶颈的出现对于应用来说,如果数据库性能出现问题,(1)要么是无法获取连接,是因为在高并发的情况下连接数不够了。(2)要么是操作数据变慢,数据库处理数据的效率除了问题。(3)要么是存储出现问题,比如单机存储的数据量太大了,存储的问题也可能会导致性能的问题。归根结底都是受到了硬件的限制,比如 CPU,内存,磁盘,网络等等。但是我们优化肯定不可能直接从扩展硬件入手,因为带来的收益和成本投入比例太低。所以我们先来分析一下,当我们处理数据出现无法连接,或者变慢的问题

2021-09-07 17:54:55 598

原创 Redis 原理

1、发布订阅模式1.1 列表的局限通过队列的 rpush 和 lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用 lpop 查看 List 中是否有等待处理的消息(比如写一个 while 循环)。 为了减少通信的消耗,可以 sleep()一段时间再消费,但是会有两个问题:1、如果生产者生产消息的速度远大于消费者消费消息的速度,List 会占用大量的内存。2、消息的实时性降低。list 还提供了一个阻塞的命令:blpop,没有任何元素可以弹出的时候,连接会被阻塞。基于 list

2021-09-03 13:53:20 1167

原创 Redis 入门与数据结构

1、redis 诞生历程08 年的时候有一个意大利西西里岛的小伙子,笔名 antirez(http://invece.org/),创建了一个访客信息网站 LLOOGG.COM。有的时候我们需要知道网站的访问情况,比如访客的 IP、操作系统、浏览器、使用的搜索关键词、所在地区、访问的网页地址等等。在国内,有很多网站提供了这个功能,比如 CNZZ,百度统计,国外也有谷歌的 Google Analytics。我们不用自己写代码去实现这个功能,只需要在全局的 footer 里面嵌入一段 JS 代码就行了,当页面被

2021-09-02 18:07:39 862

原创 程序运行原理:程序是如何运行又是如何崩溃的?

软件的核心载体是程序代码,软件开发的主要工作产出也是代码,但是代码被存储在磁盘上本身没有任何价值,软件要想实现价值,代码就必须运行起来。那么代码是如何运行的?在运行中可能会出现什么问题呢?1、程序是如何运行起来的软件被开发出来,是文本格式的代码,这些代码通常不能直接运行,需要使用编译器编译成操作系统或者虚拟机可以运行的代码,即可执行代码,它们都被存储在文件系统中。不管是文本格式的代码还是可执行的代码,都被称为程序,程序是静态的,安静地呆在磁盘上,什么也干不了。要想让程序处理数据,完成计算任务,必须把程序

2021-07-23 16:08:17 1734

原创 Apache Dubbo 之 内核剖析

本文的源码是基于 Dubbo 2.7.2 版本进行的分析1、Dubbo 的 SPI 机制在 Dubbo 中,SPI 贯穿在整个 Dubbo 的核心。所以有必要对 spi 做一个详细了解。SPI 机制在很多地方都有用到。1.1 关于 Java SPI了解 Dubbo 里面的 SPI 机制之前,我们先了解下 Java 提供的 SPI(service provider interface)机制,SPI 是 JDK 内置的一种服务提供发现机制。目前市面上有很多框架都是用它来做服务的扩展发现。简单来说,它是

2021-05-28 14:33:58 377 3

原创 Dubbo服务治理功能及新特性讲解

1、负载均衡1.1 负载均衡的背景到目前为止,dubbo 集成 zookeeper 解决了服务注册以及服务动态感知的问题。那么当服务端存在多个节点的集群时,zookeeper 上会维护不同集群节点,对于客户端而言,他需要一种负载均衡机制来实现目标服务的请求负载。通过负载均衡,可以让每个服务器节点获得适合自己处理能力的负载。负载均衡可以分为软件负载和硬件负载,在实际开发中,我们基础软件负载比较多, 比如 nginx,硬件负载现在用得比较少而且有专门的人来维护。Dubbo 里面默认就集成了负载均衡的算法和

2021-05-11 16:25:16 615 1

原创 微服务治理之 Dubbo 基础认识

1、为什么要用 Dubbo1.1 远程通信背景技术架构的发展从单体到分布式,是一种顺势而为的架构演进,也是一种被逼无奈的技术变革。架构的复杂度能够体现公司的业务的复杂度,也能从侧面体现公司的产品的发展势头是向上的。和传统的单体架构相比,分布式多了一个远程服务之间的通信,不管是 soa 还是微服务,他们本质上都是对于业务服务的提炼和复用。那么远程服务之间的调用才是实现分布式的关键因素。而在远程通信这个领域,其实有很多的技术,比如 Java 的 RMI、WebService、 Hessian、Dubb

2021-05-11 15:13:19 602 2

原创 如何优雅的自定义 ThreadPoolExecutor 线程池

1、概述java 中经常需要用到多线程来处理一些业务,非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。java中涉及到线程池的相关类均在 jdk 1.5 开始的java.util.concurrent包中,涉及到的几个核心类及接口包括:Executor、Executors、ExecutorService、ThreadPoolEx

2021-05-10 17:26:45 7621 2

原创 Java设计模式——策略模式

1、简介策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(Policy Pattern)。其定义如下:Define a family of algorithms, encapsulate each one, and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)我们看看策略模式的通用类图。策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握,我们再来看看策略模式的三个角色:Con

2021-05-10 17:15:18 438 1

原创 分布式缓存redis问题(2)

1、redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?redis 如果仅仅只是将数据缓存在内存里面,如果 redis 宕机了再重启,内存里的数据就全部都弄丢了啊。你必须得用 redis 的持久化机制,将数据写入内存的同时,异步的慢慢的将数据写入磁盘文件里,进行持久化。如果 redis 宕机重启,自动从磁盘上加载之前持久化的一些数据就可以了,也许会丢失少许数据,但是至少不会将所有数据都弄丢。这个其实一样,针对的都是 redis 的生产环境可能遇到的一些问题

2021-04-20 21:52:08 271

原创 分布式缓存 redis 问题(1)

1、项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?只要问到缓存,上来第一个问题,肯定是先问问你项目哪里用了缓存?为啥要用?不用行不行?如果用了以后可能会有什么不良的后果?项目中缓存是如何使用的?这个,需要结合自己项目的业务来。为什么要用缓存?用缓存,主要有两个用途:高性能、高并发。(1)高性能假设这么个场景,你有个操作,一个请求过来,吭哧吭哧你各种乱七八糟操作 mysql,半天查出来一个结果,耗时 600ms。但是这个结果可能接下来几个小时都不会变了,或者变了

2021-04-08 14:34:11 380

原创 MQ 消息队列问题整理

1、为什么要用消息队列?先说一下消息队列常见的使用场景吧,其实场景有很多,但是比较核心的有 3 个:解耦、异步、削峰。(1)解耦看这么个场景。A 系统发送数据到 BCD 三个系统,通过接口调用发送。如果 E 系统也要这个数据呢?那如果 C 系统现在不需要了呢?A 系统负责人几乎崩溃…在这个场景中,A 系统跟其它各种乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,很多系统都需要 A 系统将这个数据发送过来。A 系统要时时刻刻考虑 BCDE 四个系统如果挂了该咋办?要不要重发,要不要把数据

2021-03-31 15:17:54 928

原创 业务架构-可扩展架构

在实际工作中,业务需求总在不断变化,因此,经常会面临以下这些问题:(1)如何快速地上线新业务?老板很可能明天就想看到效果。(2)对某个功能进行修改,如何不影响到系统其它的功能?对于新的需求变化,我们一方面要快快搞定,另一方面要稳稳接住。但问题是软件虽然姓"软",但也不是想变就能变,如果事先没有经过良好的设计,调整起来,往往牵一发动全身,导致系统到处出问题。那如何设计一个具有良好扩展性的系统,能够快速支持业务变化落地呢?接下来,我们围绕系统的可扩展,先来了解下什么是系统,什么样的系统才能具备良好

2021-02-20 16:48:50 918

原创 并发编程的基本认识

1、并发的发展历史1.1 真空管和穿孔打卡最早的计算机只能解决简单的数学运算问题,比如正弦、余弦等。运行方式:程序员首先把程序写到纸上,然后穿孔成卡片,再把卡片盒带入到专门的输入室。输入室会有专门的操作员将卡片的程序输入到计算机上。计算机运行完当前的任务以后,把计算结果从打印机上进行输出,操作员再把打印出来的结果送入到输出室,程序员就可以从输出室取到结果。然后,操作员再继续从已经送入到输入室的卡片盒中读入另一个任务重复上述的步骤。操作员在机房里面来回调度资源,以及计算机同一个时刻只能运行一个程序,在程

2021-02-20 13:47:54 327 1

原创 JVM 性能优化

1、重新认识 JVMJVM的大体物理结构图:如上面架构图所示,JVM分为三个主要子系统:(1)类加载器子系统(Class Loader Subsystem);(2)运行时数据区(Runtime Data Area);(3)执行引擎(Execution Engine)。1.1 类加载器子系统(Class Loader Subsystem)Java的动态类加载功能由类加载器子系统处理,处理过程包括加载和链接,并在类文件运行时,首次引用类时就开始实例化类文件,而不是在编译时进行。1.1.1 加

2021-02-18 18:08:46 558

原创 JVM 垃圾回收

1、如何确定一个对象是垃圾对象要想进行垃圾回收,得先知道什么样的对象是垃圾。1.1 引用计数法对于某个对象而言,只要应用程序中持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,它就是垃圾。弊端:如果AB相互持有引用,导致永远不能被回收。例如:public class Main { public static void main(String[] args) { MyObject object1 = new MyObject(); M

2021-02-18 17:27:49 283

原创 Java虚拟机栈和内存模型

1、结合字节码指令理解Java虚拟机栈和栈帧栈帧:每个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间。每个栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向运行时常量池的引用(A reference to the run-time constant pool)、方法返回地址(Return Address)和附加信息。局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中,局部变量表中的变量不可直接使用,如需要使用的话,必须通过相关指令

2021-02-18 16:07:05 19043 1

原创 Java 代码编译和执行的整个过程

1、JDK/JRE/JVM之间的关系JVM:Java Virtual Machine(Java虚拟机),包含了Java最核心的类库。JRE:java runtime environment (java运行环境),包含了JVM和一些常见的Java运行类库,即JRE=JVM+常见运行类库。最大特点:安装了JRE之后,只能运行java程序,但不能开发java程序。因为JRE中没有包含开发者编译Java的相关工具。安装好的JRE文件夹内包含bin和lib两个文件夹,其中bin就是JVM,lib是Java核心类库

2021-02-05 17:48:13 523 1

原创 分库分表原理

1、为什么要分库分表1.1 数据库性能瓶颈的出现对于应用来说,如果数据库性能出现问题:(1)要么是无法获取连接,是因为在高并发的情况下连接数不够了。(2)要么是操作数据变慢,数据库处理数据的效率出了问题。(3)要么是存储出现问题,比如单机存储的数据量太大了,存储的问题也可能会导致性能的问题。归根结底都是受到了硬件的限制,比如 CPU,内存,磁盘,网络等等。但是我们优化肯定不可能直接从扩展硬件入手,因为带来的收益和成本投入比例太低。所以我们先来分析一下,当我们处理数据出现无法连接,或者变慢的问题

2021-02-04 16:13:47 1276

原创 分布式系统基础—序列化和反序列化

1、序列化的意义Java 平台允许我们在内存中创建可复用的 Java 对象,但一般情况下,只有当 JVM 处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比 JVM 的生命周期更长。但在现实应用中,就可能要求在 JVM 停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java 对象序列化就能够帮助我们实现该功能。简单来说序列化是把对象的状态信息转化为可存储或传输的形式过程,也就是把对象转化为字节序列的过程称为对象的序列化,反序列化是序列化的逆向过程,把字节数组反序列化

2021-02-03 15:18:01 657

原创 阻塞队列的原理解析

1、生产者消费者的实际使用大家都有使用过分布式消息队列,比如 ActiveMQ、 kafka、RabbitMQ 等等,消息队列的是有可以使得程序之间实现解耦,提升程序响应的效率。如果我们把多线程环境比作是分布式的话,那么线程与线程之间是不是也可以使用这种消息队列的方式进行数据通信和解耦呢?2、阻塞队列的使用案例2.1 案例注册成功后增加积分假如我们模拟一个场景,就是用户注册的时候,在注册成功以后发放积分。这个场景在一般来说,我们会这么去实现:但是实际上,我们需要考虑两个问题:性能,在注册这

2021-02-03 14:28:49 617

原创 技术架构

本文是阅读《极客时间-架构实战案例解析》的读书笔记1、概述对于开发人员来说,我们每天都在用技术。但我们写的代码,其实只是系统的一小部分,我们了解的技术,也只是系统用到的一小部分。要深入掌握技术架构,就需要了解整体的系统。面对一个复杂的系统,经常会有以下困扰:不清楚系统整体的处理过程,当系统出问题时,不知道如何有针对性地去排查问题。系统设计时,经常忽视非业务性功能的需求,也不清楚如何实现这些目标,经常是付出惨痛教训后,才去亡羊补牢。技术架构是从物理层面定义系统,并保障系统的稳定运行。那么先.

2021-02-03 11:08:03 9275

原创 redis 分布式解决方案

1、为什么需要 Redis 集群1.1 为什么需要集群?1.1.1 性能Redis 本身的 QPS 已经很高了,但是如果在一些并发量非常高的情况下,性能还是会受到影响。这个时候我们希望有更多的 Redis 服务来完成工作。1.1.2 扩展第二个是出于存储的考虑。因为 Redis 所有的数据都放在内存中,如果数据量大,很容易受到硬件的限制。升级硬件收效和成本比太低,所以我们需要有一种横向扩展的方法。1.1.3 可用性第三个是可用性和安全的问题。如果只有一个 Redis 服务,一旦服务宕机,那么所

2021-01-26 14:26:07 926

原创 业务架构

本文是阅读《极客时间-架构实战案例解析》的读书笔记作为开发人员,平常讨论比较多的是技术层面的东西,比如 Spring 框架、Redis 缓存、MySQL 数据库等等,我们喜欢讨论这些,是因为纯技术的东西比较通用,和业务相关性不大,沟通起来比较方便。但一个项目能否成功落地,首先需要的是把业务分析做到位,至于选用什么技术架构来实现,这是我们第二位才去考虑的因素。从架构角度看,业务架构是源头,然后才是技术架构。所以,就从业务架构开始说起。在软件开发的过程中,你肯定知道需求分析是怎么回事,但不一定知道业务.

2021-01-22 16:02:44 2310 1

原创 Kafka 的实现原理

1、消息中间件能做什么?1.1 异步处理消息中间件主要解决的就是分布式系统之间消息传递的问题,它能够屏蔽各种平台以及协议之间的特性,实现应用程序之间的协同。举个非常简单的例子,就拿一个电商平台的注册功能来简单分析下,用户注册这一个服务,不单单只是 insert 一条数据到数据库里面就完事了,还需要发送激活邮件、发送新人红包或者积分、发送营销短信等一系列操作。假如说这里面的每一个操作,都需要消耗 1s,那么整个注册过程就需要耗时 4s 才能响应给用户。但是我们从注册这个服务可以看到,每一个子操作都是相

2021-01-19 14:56:46 1930 3

原创 kafka 的基本应用

1、kafka 概述学过并发编程的同学应该知道,我们可以使用阻塞队列+线程池来实现生产者消费者模式。比如说在一个应用中,A方法调用B方法去执行一些任务处理。我们可以同步调用。但是如果这个时候请求比较多的情况下,同步调用比较耗时会导致请求阻塞。我们会使用阻塞队列加线程池来实现异步任务的处理。那么,问题来了,如果是在分布式系统中,两个服务之间需要通过这种异步队列的方式来处理任务,那单进程级别的队列就无法解决这个问题了。因此,引入了消息中间件,也就是把消息处理交给第三方的服务,这个服务能够实现数据的存储以及

2021-01-19 10:49:12 817

原创 架构的本质

本文是阅读《极客时间-架构实战案例解析》的读书笔记1、架构的本质物理学中有个很著名的“熵增定律”:一个封闭系统,都是从有序到无序,也就是它的熵(即混乱程度)会不断地增加,最终系统会彻底变得无序。这个理论放在软件系统的演化上,也是非常适用的。一方面,随着业务需求的增加,我们会往系统里不停地添加业务功能;另一方面,随着访问量的不断增加,我们会不断通过技术手段来加强系统非业务性功能。如果事先不做良好的设计,随着时间的推进,整个系统野蛮生长,就会逐渐碎片化,越来越无序,最终被推倒重来。不过.

2021-01-18 20:06:15 4557 6

原创 zookeeper 源码 之 watcher 原理分析

1、Watcher 的基本流程ZooKeeper 的 Watcher 机制,总的来说可以分为三个过程:(1)客户端注册 Watcher;(2)服务器处理 Watcher;(3)客户端回调 Watcher。客户端注册 watcher 有 3 种方式,getData、exists、getChildren;以如下代码为例来分析整个触发机制的原理。2、基于 zkclient 客户端发起一个数据操作maven 依赖<dependency> <groupId>com

2021-01-05 21:21:46 310

原创 深入分析Zookeeper的Leader选举原理

1、Zookeeper 的一致性1.1 Zookeeper 的来源对于 zookeeper 的一致性问题,先从来源层面梳理一遍一致性的问题。zookeeper 的来源,是来自于 google chubby。为了解决在分布式环境下,如何从多个 server 中选举出 master server。那么这多个 server 就需要涉及到一致性问题,这个一致性体现的是多个 server 就 master 这个投票在分布式环境下达成一致性。简单来说就是最终听谁的。但是在网络环境中由于网络的不可靠性,会存在消息

2020-12-14 21:21:22 1958

原创 深入分析 zookeeper 核心原理

1、分布式锁1.1 分布式锁的基本场景如果在多线程并行情况下去访问某一个共享资源,比如说共享变量,那么势必会造成线程安全问题。那么我们可以用很多种方法来解决,比如 synchronized、 比如 Lock 之类的锁操作来解决线程安全问题,那么在分布式架构下,涉及到多个进程访问某一个共享资源的情况,比如说在电商平台中商品库存问题,在库存只有 10 个的情况下进来 100 个用户,如何能够避免超卖呢?所以这个时候我们需要一些互斥手段来防止彼此之间的干扰。然后在分布式情况下,synchronized 或者

2020-12-12 14:01:27 845

原创 分布式协调服务zookeeper应用实战

1、zookeeper 的名词1.1 集群角色1.2 数据模型zookeeper 的视图结构和标准的文件系统非常类似,每一个节点称之为 ZNode,是 zookeeper 的最小单元。每个 znode 上都可以保存数据以及挂载子节点。构成一个层次化的树形结构。持久节点(PERSISTENT)创建后会一直存在 zookeeper 服务器上,直到主动删除持久有序节点(PERSISTENT_SEQUENTIAL)每个节点都会为它的一级子节点维护一个顺序临时节点(EPHEMERAL)

2020-12-12 13:19:46 372

原创 微服务下注册中心的实现

1、单体架构到微服务架构的带来的变化单体架构分布式架构假设一个电商的下单场景,完成一笔订单入库,需要做几个操作:创建订单卡券抵扣库存扣减那么在分布式架构下的调用链,可能是下面这种情况。那么服务和服务之间势必会存在远程通信。如上图,一个下单流程就包括,订单服务创建订单,然后通过调用卡券服务进行卡券抵扣,再库存服务进行库存扣减。微服务之间都存在着远程通信。远程通信主要有两种方式,Http 和 RPC。Http 和 RPC 框架的区别虽然现在服务间的调用越来越多地使用了 RP

2020-12-03 21:22:07 751

原创 Zookeeper 介绍

1、Zookeeper 的产生来源Apache ZooKeeper 是一个高可靠的分布式协调中间件。它是 Google Chubby 的一个开源 实现,那么它主要是解决什么问题的呢?那就得先了解 Google Chubby,Google Chubby 是谷歌的一个用来解决分布式一致性问题的组件,同时,也是粗粒度的分布式锁服务。1.1 分布式一致性问题什么是分布式一致性问题呢?简单来说,就是在一个分布式系统中,有多个节点,每个节点都会提出一个请求,但是在所有节点中只能确定一个请求被通过。而这个通

2020-08-19 22:28:10 637

原创 分布式系统基础

1、分布式架构的演进过程1.1 分布式架构的发展历史1946 年情人节(2.14) , 世界上第一台电子数字计算机诞生在美 国宾夕法尼亚大学大学,它的名字是:ENIAC; 这台计算机占地 170 平米、重达 30 吨,每秒可进行 5000 次加法运算。ENIAC 之后,电子计算机便进入了 IBM 主导的大型机时代,IBM 大 型机之父吉恩.阿姆达尔被认为是有史以来最伟大的计算机设计师 之一。1964 年 4 月 7 日,在阿姆达尔的带领下,历时三年,耗费 50 亿美元,第一台 IBM 大型机 SYS

2020-08-06 17:25:10 663

原创 SynchronousQueue 同步队列

1、概述第一次接触SynchronousQueue,是在java提供的四种线程池中,缓存线程池的源码实现中看到(缓存线程池允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM,不建议使用):public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

2020-05-25 21:12:44 1237

原创 BlockingQueue 阻塞队列 和 LinkedBlockingQueue 分析

1、概述阻塞队列(BlockingQueue)被广泛使用在“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除的方法。当队列容器已满,生产者线程会被阻塞,直到队列未满;当队列容器为空时,消费者线程会被阻塞,直至队列非空时为止。BlockingQueue 是一个接口,继承自 Queue ,所以其实现类也可以作为 Queue 的实现来使用,而 Queue 又继承自 Collection 接口。下面是 BlockingQueue 依赖关系图:下面是 BlockingQu

2020-05-25 21:09:38 893

原创 DDD—上下文映射图

一个项目的上下文映射图(Context Map)可以用两种方式表示,(1)比较容易的一种是画一个简单的框图来表示两个或多个限界上下文之间的映射关系。该框图表示了不同的限界上下文在解决方案空间中是如何通过集成相互关联的。(2)另一种更详细的方式通过限界上下文集成的源代码实现来表示。1、上下文映射图为什么重要在开始采用DDD时,首先应该为你当前的项目绘制一个上下文映射图,其中应该包含你项目中当...

2019-11-17 16:40:06 4621

原创 DDD案例说明

1、案例说明整个专栏的案例来源于一个虚构的公司,公司里有一个虚构的团队,他们真实的业务章程,并且有一个真实的软件系统需要部署开发部署,而他们所面临的DDD挑战和问题也是真实存在的。这个公司叫做SaaSOvation。正如名字所示,该公司旨在开发一系列SaaS产品,该产品作为一种服务被用户使用。公司计划先后开发两套产品。1、旗舰产品名为CollabOvation,这是一套企业协作(Collab...

2019-11-03 17:58:16 2456

CSDN_Example

RecyclerView+swipeRefreshLayout+ViewPager实现上拉加载更多下拉刷新,并添加头部广告栏

2016-11-07

显示gif图片的框架

ShowGif,GIF显示框架,重写了View类,用户使用时直接在XML文件中调用就好了

2015-12-06

解析Android软件的Xml文件

Android反编译利器 如何使用请查看我的CSDN博客

2013-04-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除