自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(258)
  • 收藏
  • 关注

原创 架构之架构

架构演进

2022-07-16 10:04:47 187 1

原创 架构之领域模型

领域模型

2022-07-16 09:50:49 519

原创 信息安全(一):RSA加密算法

如果你问我,哪一种算法最重要?我可能会回答"公钥加密算法"。因为它是计算机通信安全的基石,保证了加密数据不会被破解。你可以想象一下,信用卡交易被破解的后果。进入正题之前,我先简单介绍一下,什么是"公钥加密算法"。一、一点历史1976年以前,所有的加密方法都是同一种模式:  (1)甲方选择某一种加密规则,对信息进行加密;  (2)乙方使用同一种规则,对信息进行解密。由于加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算法"(Symmetric-key algo

2021-10-19 17:08:39 2887

原创 帐号登录:单点登录

什么是单点登录?单点登录(sso,SingleSign On):在同一帐号平台下的应用系统中,用户只需登录一次,就可访问所有的应用系统。是怎么实现单点登录的呢?单点登录分为两种,一种是相同的父域名下的单点登录,我们称之为同域单点登录,例如:bbs.youzan.com、toutiao.youzan.com,这两个父级域名都是youzan.com;还有一种是不同域名(跨域)的单点登录,例如:www.youzan.com、d.dell.com。域名等级划分顶级域名,又称一级域名..

2021-09-17 11:59:00 493

原创 帐号登录:session

什么是Session由于Http协议是无状态的协议,所以服务端需要记录用户的状态时,就需要某种机制来标识具体的用户,这个机制就是Session。Session是在服务端保存的一个数据结构,用来跟踪用户的状态。什么是Session ID用于标识Session,由服务端生成,一般存储在客户端Cookie中。Session ID特点1、short-lived——存活时间短2、secret——安全,不可预测3、unique——唯一,防止用户身份篡掉Session ID的生成规

2021-09-17 11:53:47 351

原创 帐号登录:oAuth2.0流程

定义如果用户在微信等三方中访问贵司的页面,贵司可以通过三方平台提供的网页授权机制,来获取用户基本信息,进而实现业务逻辑。通过这一套网页授权机制登录系统的方式,就称为授权登录。简言之,授权登录就是三方平台提供的,获取三方标识的能力OAuth2.0协议理解授权登录,首先需要理解Oauth2.0的授权过程。过程名词较多,所以我们以快递员问题来介绍。快递员问题我住在一个大型的居民小区。小区有门禁系统。进入的时候需要输入密码。我经常网购和外卖,每天都有快递员来送货。我必

2021-09-17 11:49:03 1119

原创 Java多线程(二十): J.U.C 之LongAdder:LongAdder原理

前面介绍了Java中的一些原子类,但是基本都是通过CAS来实现原子性操作,白白浪费CPU资源。JDK8中新增了一个原子性递增或者递减类LongAdder用来克服高并发下使用AtomicLong的缺点。LongAdder的思路是把一个变量分解为多个变量,让同样多的线程去竞争多个资源。如图所示:使用LongAdder时,内部维护了多个Cell变量,每个Cell里面有一个初始值为0的long型变量,这样同时争取一个变量的线程就变少了,而是分散成对多个变量的竞争,减少了失败次数。如果竞争某个Cell变量失败,它不

2021-01-22 13:42:22 167

原创 架构(三):中台是如何炼成的?

目录聚合外卖订单架构小程序下单架构统一订单服务架构中台架构总结通过前面的介绍,我们已经很清楚了共享服务和中台的价值,但在实践中,要不要对系统做这样的升级,我们还需要结合业务来判断,比如说: 1. 业务上有什么重大变化,导致当前系统的弊端已经很明显,不能适应业务发展了呢? 2. 架构改造时,如何在业务、系统、资源三者之间做好平衡,对系统进行分步式的改造呢? 我们知道,架构没有最好,只有最合适的。随着业务的发展,系统需要不断地升级,这是一 个螺旋式上升的过程,如何结..

2021-01-21 10:34:09 311

原创 架构(二):如何对现有系统做微服务改造?

  很多早期的互联网公司都有巨大的单体应用,底层的数据表集中放在一个数据库里,这些表加起来可能有几百张。对于这样的应用系统和数据库,我们往往需要对它们进行拆分,通过微服务化改造,保证系统能够不断地扩展和复用。  相比从头开始落地服务,对现有系统做微服务化改造,这会面临更多的挑战。  首先,应用和数据表紧密耦合在一起,代码模块和表是多对多的依赖关系。一个模块会访问多张表,多个模块也会对同一张表进行访问,而且由于表都在一个数据库里,开发人员往往会随意对表做关联,有时候甚至 Join 5~6 张表以上。这样,

2021-01-20 17:15:01 1982

原创 架构(一):你需要一个中台吗?

这个营销思路很棒,老板希望能马上验证,前台好改,但后台调整起来需要好几个月;后台系统技术旧,性能差,接口不开放,前台对接起来很麻烦,而且一有促销活动,后台立马就挂。

2021-01-18 18:19:24 331

转载 RocketMQ(二):底层存储

存储介质-磁盘一般而言消息中间件的消息都存储在本地文件中,因为从效率来看直接放本地文件是最快的,并且稳定性最高。毕竟要是放类似数据库等第三方存储中的话,就多一个依赖少一份安全,并且还有网络的开销。那对于将消息存入磁盘文件来说一个流程的瓶颈就是磁盘的写入和读取。我们知道磁盘相对而言读写速度较慢,那通过磁盘作为存储介质如何实现高吞吐呢?顺序读写答案就是顺序读写。首先了解一下页缓存,页缓存是操作系统用来作为磁盘的一种缓存,减少磁盘的I/O操作。在写入磁盘的时候其实是写入页缓存中,使得对磁盘

2020-07-29 10:32:48 341

原创 Dubbo(二):协议详解

(1)协议支持Dubbo支持多种协议,如下所示:Dubbo协议 Hessian协议 HTTP协议 RMI协议 WebService协议 Thrift协议 Memcached协议 Redis协议在通信过程中,不同的服务等级一般对应着不同的服务质量,那么选择合适的协议便是一件非常重要的事情。你可以根据你应用的创建来选择。例如,使用RMI协议,一般会受到防火墙的限制,所以对于外部与内部进行通信的场景,就不要使用RMI协议,而是基于HTTP协议或者Hessian协议。(2)默认使用Dub

2020-07-28 17:48:17 498

原创 kryo序列化的优缺点

其实之前在“Kryo序列化生效位置”处已经提到了Kryo序列化的优点,这里总结一下,大致为:1. 算子函数中使用到的外部变量,使用Kryo以后:优化网络传输的性能,可以优化集群中内存的占用和消耗;2. 持久化RDD,优化内存的占用和消耗,持久化RDD占用的内存越少,task执行的时候,创建的对象,就不至于频繁的占满内存,频繁发生GC;3、shuffle:可以优化网络传输的性能。Kryo序列化机制比默认的Java序列化机制速度要快,序列化后的数据要更小,大概是Java序列化机制的1...

2020-07-10 18:03:45 1681

原创 DDD(四):会员系统-支撑子域

订单域1、订单域2、核心流程订单:1、创建订单(个人订单)2、付款(团体订单)3、退款(部分退款)套餐:3、实体与值对象订单:套餐:

2020-06-09 10:40:00 762

原创 DDD(三):会员系统-核心子域

一、通用语言服务项目是对数字健康平台、医疗机构等能够提供的医疗服务资源进行的统一抽象。名称 服务编码 分类 服务方式 链接 缩略图 优惠类型 支持场景 服务简介 服务说明 服务提供者 服务簇是一组具有 "单一相关性"的服务项目的聚集。比如: 问诊服务簇,表示的是所有的问诊服务的集合。 问诊服务簇 = 图文问诊服务 + 专家问诊服务 + 视频问诊服务;注意:一个服务也可以自成一簇,如果该服务没有与之有相关性的服...

2020-06-09 10:32:18 1005

原创 DDD(二):会员系统-限界上下文与集成

会员平台限界上下文映射关系

2020-06-09 10:26:54 588

原创 DDD(一):会员系统-事件风暴

通用语言 服务项目 服务簇 服务类目 权益 使用限制 优惠方式 卡权益归属主体 卡默认使用者 共享人 使用范围 服务提供者 事件风暴...

2020-06-09 10:23:48 1379

原创 Redis(十):redis的I/O多路复用

引出IO多路复用为什么 Redis 中要使用 I/O 多路复用这种技术呢?首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而I/O 多路复用就是为了解决这个问题而出现的。要弄清问题先要知道问题的出现原因由于进程的执行过程是线性的(也就是顺序执行),当我们调用低速系统I/O(read,write,acce..

2020-06-03 15:45:23 416 1

原创 阿里代码规范检查工具的安装使用

该插件由阿里巴巴 P3C 项目组研发。代码已经开源,GitHub:https://github.com/alibaba/p3c阿里介绍文章:https://mp.weixin.qq.com/s/IbibsXlWHlM59kfXJqRvZA#rd插件支持了IDEA、Eclipse,在扫描代码后,将不符合规约的代码显示出来,甚至在 IDEA 上,还基于 Inspection 机制提供了实时检测功能,编写代码的同时也能快速发现问题所在,还实现了批量一键修复的功能。IDEA 下如何使用?1.打开

2020-05-13 10:29:35 262

转载 深度介绍分布式系统原理

1 概念 1.1 模型 1.2 副本 1.3 衡量分布式系统的指标 2 分布式系统原理 2.1 数据分布方式 2.2 基本副本协议 2.3 Lease 机制 2.4 Quorum 机制 2.5 日志技术 2.6 两阶段提交协议 2....

2020-04-29 19:49:08 496

原创 分布式事务(三):分布式事务问题的几种方案

这种方案说实话几乎很少人使用,我们用的也比较少,但是也有使用的场景。因为这个事务回滚实际上是严重依赖于你自己写代码来回滚和补偿了,会造成补偿代码巨大,非常之恶心。比如说我们,一般来说跟钱相关的,跟钱打交道的,支付、交易相关的场景,我们会用 TCC,严格保证分布式事务要么全部成功,要么全部自动回滚,严格保证资金的正确性,保证在资金上不会出现问题。而且最好是你的各个业务执行的时间都比较短...

2020-04-29 19:46:44 258

原创 IO(六):深入探秘 Netty、Kafka 中的零拷贝技术

零拷贝,从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能。我们也经常在 Java NIO,Netty,Kafka,RocketMQ 等框架中听到零拷贝,它经常作为其提升性能的一大亮点下面从 I/O 的几个概念开始,进而再分析零拷贝。I/O 概念缓冲区缓冲区是所有 I/O 的基础,I/O 讲的无非就是把数据移进或移出缓冲区;进程执行 I/O 操作,就是向...

2020-04-13 16:38:05 247

原创 Java多线程(十九): J.U.C 之线程池:ThreadPoolExecutor

作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它。下面我们就通过源码来一步一步弄清楚它。内部状态线程有五种状态:新建,就绪,运行,阻塞,死亡,线程池同样有五种状态:Running, SHUTDOWN, STOP, TIDYING, TERMINATED。 private final Ato...

2020-04-02 14:21:44 183

原创 Java多线程(十八): J.U.C 之阻塞队列LinkedBlockingDeque

前面的BlockingQueue都是单向的FIFO队列,而LinkedBlockingDeque则是一个由链表组成的双向阻塞队列,双向队列就意味着可以从对头、对尾两端插入和移除元素,同样意味着LinkedBlockingDeque支持FIFO、FILO两种操作方式。LinkedBlockingDeque是可选容量的,在初始化时可以设置容量防止其过度膨胀,如果不设置,默认容量大小为Integer...

2020-04-02 14:19:41 137

原创 Java多线程(十七): J.U.C 之阻塞队列SynchronousQueue

作为BlockingQueue中的一员,SynchronousQueue与其他BlockingQueue有着不同特性:SynchronousQueue没有容量。与其他BlockingQueue不同,SynchronousQueue是一个不存储元素的BlockingQueue。每一个put操作必须要等待一个take操作,否则不能继续添加元素,反之亦然。 因为没有容量,所以对应 peek, co...

2020-04-02 14:18:34 155

原创 Java多线程(十六): J.U.C 之阻塞队列DelayQueue

DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue主要用于两个方面:缓存:清掉缓存中超时的缓存数据 任务超时处理DelayQueueDelayQueue实现的关键主要有如下几...

2020-04-02 14:17:37 139

原创 Java多线程(十五): J.U.C 之阻塞队列PriorityBlockingQueue

我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? PriorityBlockingQueue 。PriorityBlockin...

2020-04-02 14:16:52 122

原创 Java多线程(十四): J.U.C 之阻塞队列ArrayBlockingQueue

1. 简介ArrayBlockingQueue,一个由数组实现的有界阻塞队列。该队列采用 FIFO 的原则对元素进行排序添加的。ArrayBlockingQueue 为有界且固定,其大小在构造时由构造函数来决定,确认之后就不能再改变了。ArrayBlockingQueue 支持对等待的生产者线程和使用者线程进行排序的可选公平策略,但是在默认情况下不保证线程公平的访问,在构造时可以选择公...

2020-04-02 14:15:50 186

原创 Java多线程(十三): 深入分析 ThreadLocal

ThreadLocal是什么?ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底是什么呢?API是这样介绍它的:This class provides thread...

2020-04-01 17:19:52 155

原创 Java多线程(十二):J.U.C 之 Condition

在没有 Lock 之前,我们使用synchronized来控制同步,配合 Object 的#wait()、#notify()等一系列方法可以实现等待 / 通知模式。在 Java SE 5 后,Java 提供了 Lock 接口,相对于synchronized而言,Lock 提供了条件 Condition ,对线程的等待、唤醒操作更加详细和灵活。下图是 Condition 与 Object...

2020-04-01 17:10:57 271

原创 Java多线程(十一):J.U.C 之并发容器ConcurrentSkipListMap/ConcurrentLinkedQueue

到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash、TreeMap,这两种数据结构各自都有着优缺点。Hash表:插入、查找最快,为O(1);如使用链表实现则可实现无锁;数据有序化需要显式的排序操作。 红黑树:插入、查找为O(logn),但常数项较小;无锁实现的复杂性很高,一般需要加锁;数据天然有序。然而,这次介绍第三种实现key-value的数据结构:Sk...

2020-04-01 16:29:57 351

原创 Java多线程(十):J.U.C 之并发容器ConcurrentHashMap

HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近100%。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式,一个线程在读时其他线程必须等待,吞吐量较低,性能较为低下。故而Doug Lea大神给我...

2020-04-01 16:27:32 329

原创 Java多线程(九):J.U.C 之CyclicBarrier/CountDownLatch/Semaphore

1. 简介CyclicBarrier ,一个同步辅助类,在 AP I中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点(Common Barrier Point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 Barrier 在释放等待线程后可以重用,所以称它为循环( Cyclic ) 的 屏障( Barrie...

2020-04-01 16:20:10 272

原创 Java多线程(八):深入分析 CAS

1. 概述CAS ,Compare And Swap ,即比较并交换。Doug Lea 大神在实现同步组件时,大量使用CAS 技术,鬼斧神工地实现了Java 多线程的并发操作。整个 AQS 同步组件、Atomic 原子类操作等等都是基 CAS 实现的,甚至 ConcurrentHashMap 在 JDK 1.8 的版本中,也调整为 CAS +synchronized。可以说,CAS 是整个...

2020-04-01 16:15:37 183

原创 Java多线程(七):J.U.C 之 ReentrantLock和ReentrantReadWriteLock

1. 简介ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是 ReentrantLock 提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。API 介绍如下:一个可重入的互斥锁定 Lock,它具有与使用synchronized方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义...

2020-04-01 16:12:36 276

原创 三个线程交替顺序打印ABC

题目描述建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。5种方法使用synchronized, wait和notifyAll使用Lock->ReentrantLock 和 state标志使用Lock->ReentrantLock 和Conditio...

2020-04-01 10:00:12 365

原创 jdk集合源码阅读(八):并发下1.7HashMap死循环,1.8解决过程

前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。1.jdk1.7中的HashMap在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jdk1.7多线程环境下HashMap容易出现死循环,这里我们先用代码来模拟出现死循环的情况: 1 public clas...

2020-04-01 09:51:44 510

原创 远程接口设计

每年系统调用复盘的时候,我都会听到以下声音你们调我的接口报错了竟然不会自己重试? 我的返回值应该从这里取 我返回isSuccess() == true,不代表业务成功,你还需要判断ERROR_CODE 这个ERROR_CODE没说全部都要重试啊! 这个ERROR_CODE必须要重试!还有很多了,本文的目标就是帮助大家思考,如何设计自己的远程接口,让接口做到健壮、易用,节省大家在这块泥...

2020-03-31 17:01:17 596

原创 函数式接口代码应用

@Slf4jpublic class RemoteInvoker<T> { private final Supplier<StandardResult<T>> invoker; private volatile boolean ignoreFailure; private volatile Supplier...

2020-03-31 16:10:49 198

原创 使用kryo做序列化遇到的几个坑

其中在整合kryo的时候,遇到了一些挑战,记录如下:问题一:在系列化有Hashtable、Hashmap之类的对象属性的时候,会遇到异常:com.esotericsoftware.kryo.KryoException: Class cannot be created (missing no-arg constructor): java.util.Collections$Synchroniz...

2020-03-31 10:40:50 4948

空空如也

空空如也

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

TA关注的人

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