自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 资源 (2)
  • 收藏
  • 关注

原创 Dubbo 框架设计与源码解读(配置解析优先级、线程分配、负载均衡、容错方案)

整体框架设计图例说明:图中左边淡蓝背景的为服务消费⽅使⽤的接⼝,右边淡绿⾊背景的为服务提供⽅使⽤的接⼝,位于中轴线上的为双⽅都⽤到的接⼝。图中从下⾄上分为⼗层,各层均为单向依赖,右边的⿊⾊箭头代表层之间的依赖关系,每⼀层都可以剥离上层被复⽤,其中, Service 和 Config 层为 API,其它各层均为 SPI。图中绿⾊⼩块的为扩展接⼝,蓝⾊⼩块为实现类,图中只显示⽤于关联各层的实现类。图中蓝⾊虚线为初始化过程,即启动时组装链,红⾊实线为⽅法调⽤过程,即运⾏时调时链,紫⾊三⻆箭头为继承,

2020-12-19 18:51:09 3052 3

原创 Mybatis 框架源码解读(详细流程图+时序图)

源码示例 public static void main(String[] args) { SqlSession sqlSession = null; try { // 获取到sqlSessiion sqlSession = SqlSessionFactoryUtil.openSqlSession(); // 获取到Mapper UserMapper userMapper =

2020-12-16 23:13:08 3417 2

原创 Kafka 设计架构原理详细解析(超详细图解)

什么是Kafka?Apache Kafka是一个开放源代码的分布式事件流平台,成千上万的公司使用它来实现高性能数据管道,流分析,数据集成和关键任务等相关的应用程序。Kafka的应用场景构造实时流数据管道,它可以在系统或应用之间可靠地获取数据 (相当于message queue),特别是在集群情况下,多个服务器需要建立交流构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)Kafka架构设计Produce

2020-12-06 18:39:17 11262 2

原创 领域驱动设计(DDD)相关架构介绍与演变过程分析(图文详解)

我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构涉及呢?专业术语各种服务IAAS:基础设施服务,Infrastructure-as-a-servicePAAS:平台服务,Platform-as-a-serviceSAAS:软件服务,Software-as-a-service架构演变从图中已经可以很容易看出架构的演进过程,通过对三个层的举例来进行说明:SAAS:比如我们最早的就是单体应用,多个业务之间可能都没有进行分层,之后我们业务多.

2020-12-04 22:56:43 6368 3

原创 RocketMQ如何保证消息顺序消费?又为何不解决消息重复消费问题?

消息的顺序消费对于业务系统来说非常重要,一笔订单产生了3条消息,分别是订单创建、订单付款、订单完成。消费时,必须按照顺序消费才有意义,与此同时多笔订单之间又是可以并行消费的。如何保证消息顺序消费?接下来我们通过订单的例子来展示RocketMQ如何保证消息顺序消费的:我们最容易想到的应该是如图这样,必须M1先消费后通知S2,M2才能够被消费问题是:M1、M2分别发送到S1、S2,这样就无法保证M1先到达MQ集群,也不能保证M1先被消费如果把多个需要顺序消费的消息都发送到同一个MQ Server.

2020-11-22 10:33:47 5683

原创 SpringBoot启动全流程源码解析(超详细版)

我们在使用SpringBoot启动项目的时候,可能只需加一个注解,然后启动main,整个项目就运行了起来,但事实真的是所见即所得吗,还是SpringBoot在背后默默做了很多?本文会通过源码解析的方式深入理解SpringBoot启动全过程SpringBoot启动过程流程图源码解析大家不要抗拒源码解析,这个非常优秀的代码,我们如果能够学会对自己代码编写水平大有裨益首先,我们先来看下SpringBoot项目的启动类@SpringBootApplicationpublic class Sp.

2020-11-04 20:30:09 19107 19

原创 SpringBoot自动配置实现原理及源码解析(2.3.x)

约定优于配置,这是SpringBoot中的一个很重要特性,此特性让我们可以在几秒中之内完成一个项目的搭建,无需任何配置,本文就通过深入源码的方式来探索下自动配置的实现过程为什么要自动配置手动配置很麻烦且容易出问题构建一个一样的项目耗时长且复杂Overview概括来说,就是借助@Import的支持,收集和注册特定场景相关的bean定义来进行自动配置eg:@EnableAutoConfiguration 是通过@Import将Spring自动配置相关的bean定义都加载到IoC容器,对应.

2020-11-01 15:05:15 4482

原创 HashMap 实现原理及源码解析(jdk8 底层⽤的是数组+链表/红⿊树)

本文会通过HashMap中的put方法为入口,进行源码解读,文章较长,需要耐心阅读说明/** */: 代表注释,区别于例子注释egx::代表例子注释解读前须知解读是通过HashMap的put方法为入口进行分析,其中eg注释的都是测试例子,具体测试代码如下:@Testpublic void testResize(){ HashMap hashMap = new HashMap(); // 下标0和1插入Node hashMap.put(0, "a0"); // 00000000 h.

2020-10-28 22:46:29 4022 7

原创 Docker入门与实战

what 什么是docker?dockker就想它的logo一样,docker是一只大鲸鱼,然后每个镜像container就是对应的集装箱docker是一款用go语言开发的容器docker的核心思想就是隔离,通过隔离机制,既可以保障每个集装箱里面的东西是互不影响的,也可以将服务器的资源压榨到最大程度。what docker能干嘛?下图展示了没有docker的部署上线和有docker之后的部署上线差异:docker与虚拟机的区别VM与docker的区别:VM会虚拟出完整的操作系统(

2021-05-16 12:55:34 529 1

原创 淘宝技术架构演进之路--精华版

淘宝最初的架构随着访问量和数据量的飞速上涨,问题很快就出来了,第一个问题出现在数据库上。MySQL当时是第4版的,我们用的是默认的存储引擎MyISAM,这种存储引擎在写数据的时候会把表锁住。当Master同步数据到Slave的时候,会引起Slave写,这样在Slave的读操作都要等待。还有一点是会发生Slave上的主键冲突,经常会导致同步停止,这样,你发布的一些东西明明已经成功了,但就是查询不到。数据库从mysql升级到oracle将php更换为java语言,并使用自研的 淘宝MVC自

2021-05-13 21:24:14 3804 2

原创 Spring Cloud Gateway 原理与应用场景

why 为什么需要网关?如图可知:在常规没有网关的情况下,无法对多个服务进行统一的处理,比如我需要做统一的鉴权,这时候需要在每个服务上增加鉴权功能来达到目的,工作量大且不好维护在有网关的情况下,可以将所有的流量都达到网关,然后通过网关来对请求做统一的鉴权处理,非常方便what 网关的应用场景降低复杂性,如前台请求多个服务,可以通过网关进行简化鉴权(网关中重点):用户是否合法?有哪些权限可以请求哪些服务安全性:登录态鉴权,如果鉴权不通过,直接被打回去多协议适配,可以针对.

2021-05-09 22:17:20 3562 8

原创 Windows平台下的Redis集群搭建(简单有效)

1. 下载redisWindows版本下载:https://github.com/MicrosoftArchive/redis/tags然后进入目录执行命令redis-server.exe redis.windows.conf2. 设置6个节点在redis中必须要有3个master,每个master必须要有一个slave,所有是六个节点,通过复制的方式完成,如图每个节点修改的配置如下,端口号对应节点的端口号6379~6384:port 6379bind 127.0.0.1logfile

2021-04-05 22:59:31 935

原创 Spring Cloud Sleuth 实现原理源码解读

Sleuth如何实现自动配置?在spring boot启动时,需要执行自动配置类。sleuth自动配置类都在spring-cloud-sleuth-core.jar包的spring.factories文件中:# Auto Configurationorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.cloud.sleuth.annotation.SleuthAnnotationAuto

2021-02-21 21:27:38 2606

原创 Spring Cloud Sleuth+Zipkin 构建微服务链路跟踪系统

什么是链路跟踪系统?在微服务中,多个服务分布在不同物理机器上,各个服务之间相互调用。如何清晰地记录服务调用过程,并在出现问题的时候能够通过查看日志和服务之间的调用关系来定位问题,这样的系统就叫做链路跟踪系统。分布式服务跟踪系统主要由五部分组成:数据采集数据传输数据存储数据分析数据可视化为什么需要链路跟踪系统?在微服务出现服务调用过程慢、服务无法调用成功等问题,都需要用到链路跟踪系统来进一步排查问题,否则就是盲人摸象,无从下手。Spring Cloud SleuthSpring Cl

2021-02-20 22:45:47 2962

原创 Sentinel实现限流熔断及与Spring Cloud整合

相关文档Sentinel官方文档

2021-02-08 21:49:40 1697 2

原创 Spring Cloud Stream 构建消息驱动微服务

what(Spring Cloud Stream介绍)Spring Cloud Stream 是一个用于构建消息驱动的微服务应用程序的框架,是一个基于Spring Boot创建的、独立生产级的、提供消息代理的Spring应用。why多个微服务之间消息中间件实现消息流达到多服务交互的目的。how(架构实现)应用程序通过inputs或outputs来与Spring Cloud Stream中的Binder交互,通过配置绑定。Spring Cloud Stream的Binder负责与中间件交互。抽

2021-02-05 00:03:41 1549

原创 Spring Cloud Bus 消息总线实现配置自动刷新

why当微服务太多的时候,服务之间需要建立通信或一个服务的改变需要广播到所有其它服务,这时就需要有一个总线来承担对应的职责。whatspring cloud bus 是通过轻量消息代理连接各个分布的节点,就类似于单体应用中常说的消息总线。主要作用是在一个或多个应用之间建立通信频道。how主要通过AMQP消息代理作为通道来实现消息通信。应用场景配置中心:当git仓库配置修改的时候,能够自动通知到所有服务重新拉取最新配置…消息总线实现所有服务配置刷新整体架构开始之前,我们先来看下整体架

2021-02-02 22:30:59 1928

原创 Spring Cloud Config 实现配置中心及自动刷新

why微服务数量多,修改配置需要重启服务或无法集中统一修改,所以有了spring cloud config,同类型的还有360的QConf、淘宝的diamond、百度的discon都是解决配置集中管理的问题whatspring cloud config 可以为微服务架构中的应用提供集中化的外部配置支持,它分为服务端、客户端两部分如何实现配置中心?这里我们选择将配置保存在github中,让spring cloud config去读取github仓库中的配置。核心功能集中管理各个环境的配置文件

2021-02-01 22:49:04 2244

原创 常用的四种限流算法图解

会使用分布式,那么就说明业务量是较大的,如果不对流量进行限制,很大几率就导致高峰期时机器宕机。而常用的限流算法有四种,这也是所有限流框架实现限流的基础,接下来就通过本文来认识下它们。计数器限流算法计数器是限流中最简单的,规定为:在指定周期内累加访问次数,当访问次数达到设定的阈值时,出发限流策略,当进入下一个时间周期时会将访问次数清零优点:实现简单临界问题:如图所示,当在8-10秒和10-12秒内分别并发500,虽然没有超过阈值,但如果算8-12秒,则并发数高达1000,已经超过了原先定义的10.

2021-01-25 21:31:45 2742

原创 数据结构与算法--图的表示与常用算法

什么是图?图(Graph)形结构中,是一种非线性结构,在图中每一个元素都可以有0或多个前驱,也可以有多个后驱。节点之间的关系是任意的,即图中任意两个数据元素之间都有可能相关。图的术语顶点:带有数字的圈圈都叫做顶点边:连接两个顶点之间的线叫做边度数:分为入度和出度,入度表示被指向的数,出度表示出发的数路径:如1到5的路径有向图、无向图:边是否带有箭头,图中表示有向图为什么需要图?假设一个项目中有多个任务,这些任务之间部分是存在现后顺序的,那么如何去正确的描述这种关系呢?如图所示,通

2021-01-24 18:34:07 2707 1

原创 数据结构与算法--递归(Recursion Algorithm)

什么是递归算法?把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解(基本问题),从而得到原来问题的解。什么时候改用递归算法?总是尝试解决一个规模更小的子问题,这样递归才能收敛到最简单的情况递归调用的父问题和尝试解决的子问题之间不应该有交集。总有一个最简单的情况,也就是递归结束的条件,一般是第一条语句if(xx) return递归的优缺点优点:代码更加简洁:代码一般都是对基本问题的求解,逻辑简单扩展性高:如

2021-01-16 16:51:08 2147

原创 数据结构与算法--基本介绍

我想计算机或相关专业都学过数据结构的课程吧,反正当时我是听的懵懵懂懂,而且压根不知道是干嘛用的,为什么要有这个东西,你们呢?欢迎评论区交流!什么是数据结构数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。软件开发人员主要关心的是如何为当前的问题来选择最优的数据结构。为什么需要数据结构?数据是程序的核心要素,无论你在写什么程序,都需要和数据打交.

2021-01-16 14:59:11 2239

原创 微服务治理之Eureka--源码浅析

Eureka集群项目介绍

2021-01-14 22:50:55 1858

原创 服务治理之Eureka--基本介绍

术语CAP什么是Eureka?为什么需要Eureka?Eureka拥有哪些能力?如何使用Eureka?五种服务治理技术对比

2021-01-12 21:59:19 2379

原创 微服务架构基本介绍与微服务设计模式

微服务与传统单体服务单体服务一个项目中包含了所有的服务叫做单体服务优点:开发简单,对技术栈要求不高部署、运维方便,只需要对一台机器、一个服务进行部署、运维服务监控、问题排查简单,只需要对一台机器的监控与日志分析缺点:可以对多个模块化组件的整体JVM进程进行水平扩展,而无法单独对某个模块化组件进行水平扩展当仅修改某个模块时,需要所有模块进行编译、打包和上线模块间相互依赖、相互耦合微服务微服务是把每一个职责单一的功能放在独立的服务中,且每个服务运行在一个单独的进程中,每个服务都

2021-01-10 16:49:50 2779

原创 Java 线程池ThreadPoolExecutor的应用与源码解析

ThreadPoolExecutor 应用ThreadPoolExecutor就像AQS一样,是属于比较底层的,也可以说是线程池的基础,我们平时所用到的CachedThreadPool、FixedThreadPool、ScheduledThreadPool、SingleThreadExecutor等都是基于ThreadPoolExecutor,通过对ThreadPoolExecutor的构造函数进行设置实现不同功能的线程池CachedThreadPool:创建一个可缓存线程池,如果线程池长度超过实际

2021-01-07 23:01:58 2639

原创 Java 并发编程CAS、volatile、synchronized原理详解

CAS(CompareAndSwap)What–CAS在Java中调用的是Unsafe的如下方法来CAS修改对象int属性的值: /** * * @param o 对象所在类本身的对象(一般这里是对一个对象的属性做修改,才会出现并发) * @param offset 属性在对象中的相对偏移量位置(获取偏移量也是通过unsafe的⼀个⽅法: objectFieldOffset(Fieldfield)来获取属性在对象中的偏移量;) * @param exp.

2021-01-05 22:55:11 2783

原创 Java 并发编程Semaphore的应用与源码解析

WhatSemaphore标识信号量,允许指定数量的线程同时访问某个资源How通过以下两部实现信号量:acquire方法用于获得准入许可(如果没有获得许可,则进行等待,直到有线程释放许可而获得许可为止)release用于释放准入许可应用场景实现某种资源池限制,类似于数据库连接池对容器施加边界,比如一个集合中最多只能添加5个元素资源并发访问数量限制当作普通的锁使用(信号量为1时相当于普通的锁 信号量大于1时共享锁)Semaphore代码示例import java.util.c

2020-12-29 22:47:54 2569

原创 Java 并发编程CyclicBarrier的应用与源码解析(基于ReentrantLock实现)

什么是CyclicBarrier?CyclicBarrie和上一篇中讲到CountDownLatch很类似,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于:所有必须同时到达栅栏位置才能够继续执行。也就是闭锁用于等待某个事件,栅栏用于等待其它线程CyclicBarrier的基本过程CyclicBarrier可以使一定数量的线程反复的在栅栏处汇集。当线程到达栅栏位置时将调用await方法,直到所有方法都到达栅栏位置当所有线程都到达栅栏位置后,那么栅栏将打开,所有的线程将被释放栅栏被

2020-12-29 21:21:40 2350

原创 Java 并发编程CountDownLatch的应用与源码解析

应用场景CountDownLatch是一个多线程控制工具。用来控制线程的等待。设置需要countDown的数量,然后每一个线程执行完毕后调用countDown()方法,而在主线程中调用await()方法等待,直到num个子线程执行了countDown()方法,则主线程开始继续执行示例:import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.con

2020-12-29 19:48:48 2574

原创 各种锁的介绍、锁之间的区别

公平锁/非公平锁 (FairSync/NotfairSync)公平锁:按照申请锁的顺序来获取锁。非公平锁:不是按照申请锁的顺序来获取锁。非公平锁的优点在于吞吐量比公平锁大。ReentrantLock可以通过构造函数来选择是公平锁or非公平锁。Synchronized也是一种非公平锁。由于是JVM控制的,所以没有任何办法使其变成公平锁。独占锁/共享锁 (ReadWriteLock 写入时——> 独占锁 读取时——> 共享锁)独享锁:指某个锁一次只能被一个线程所持有。共享锁:指

2020-12-29 14:58:51 7212

原创 Java 并发编程ReentrantLock--源码解析(底层AQS实现)

ReentrantLock 介绍ReentrantLock类使用AQS同步状态来保存锁重复持有的次数。当锁被一个线程获取时,ReentrantLock也会记录下当前获得锁的线程标识,以便检查是否是重复获取,以及当错误的线程试图进行解锁操作时检测是否存在非法状态异常。ReentrantLock 使用示例ReentrantLock lock = new ReentrantLock();try{ lock.lock(); // 其它逻辑} finally{ lock.unlock();}可以

2020-12-29 14:04:51 2805

原创 Java 并发编程AQS--源码解读

AQS的源代码实现AQS主要通过独占式、共享式同步状态的获取和释放,接下来我们来看下AQS代码是如何实现的源代码实现公平锁与非公平锁公平锁非公平锁Node节点在AQS中,是使用队列的方式来实现同步管理的,我们先来认识下队列中的Node节点数据结构 static final class Node { /** * 共享模式节点 */ static final Node SHARED = new Node();

2020-12-29 10:55:12 2678

原创 Java 并发编程AQS基本介绍

why-为什么需要AQS?

2020-12-23 22:01:04 2831 1

原创 Java 并发编程概念深入理解

why-为什么要有多线程?单线程情况下:在有IO操作的情况下,线程是在阻塞的,cpu什么事情也不干,直到IO操作完成如果没有IO操作且是单核cpu,可以是单线程多线程的情况下:有IO操作的情况下,分配其中一条线程去等待IO操作,让cpu去执行另一个线程的计算任务,直至IO操作完成,cpu切换到原来的线程继续执行任务在有用户交互的情况下,多线程是必须的what-什么是线程?它和进程有什么区别?进程进程是资源管理的最小单位进程拥有更多的系统权限:地址空间(Address space)公

2020-12-20 17:26:22 2594

原创 Dubbo 源码解析--限流

TPSLimiterTPSLimiter用于服务提供者,提供限流功能配置方式:源码分析:主要涉及三个类:TPSLimiterDefaultTPSLimiterStatItem/** * 限制服务或特定方法的TPS(每秒事务数)。 * Service或method url可以定义<b>tps</b>或<b>tps.interval</b>来控制。默认使用{@link DefaultTPSLimiter} * 作为它的限制检查器。如果提供

2020-12-19 23:25:15 2818 2

原创 Dubbo 基本介绍与项目搭建(SPI、泛化概念)

why-为什么需要Dubbo?单一应用架构 --> 垂直应用架构 --> 分布式服务架构 --> 流动计算架构 --> RPC单一应用架构:当流量很小时,只需要一个应用,所有模块都部署在一台服务器即可满足要求且开发、运维简单、数据库CRUD简单垂直应用架构当流量逐渐增大,单一应用的增加机器无法满足访问量需求,需要将应用进行垂直拆分为多个互不相干的应用,以提升效率。分布式服务架构当垂直应用越来越多,应用之间不可避免的要交互,将核心业务抽离出来作为独立

2020-12-19 11:42:25 2810 2

原创 Netty 基本介绍与核心组件(EventLoop、ChannelPipeline、ChannelHandler)

TCP 基础TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议连接:连接就是双方遵循约定,client、server相互了解,知道对方的信息并且保留地址、buffer、状态等信息的过程叫做连接字节流:流是一方发,另一方只需要读,收到的是一串01数字;而报文是发送的一个字符串或其它一组数据,组合在一个包中进行发送滑动窗口:每次发送包的数量,当这一批(窗口内)的包发送完成,移动到下一个窗口,删除已发送的包三次握手:client向server发送请求,server响应ack,然后client收到

2020-12-10 22:46:28 3194

原创 Redis RDB与AOF持久化详解

为什么要有RDB和AOF?Redis数据库基于内存储存数据,而内存的缺点就是当服务器挂掉了,数据就没了。所以Redis需要持久化来恢复数据,而持久化的方式就有RDB和AOFRedis 持久化RDB 持久化(snapshotting)把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中所有键值对数据)。恢复时是将快照文件直接读到内存里。自动触发:在redis.conf配置文件中,有自动保存的默认配置:save 900 1 // 在900s内修改或写入一次,则保存sav

2020-12-09 22:35:47 2900

原创 Redis中数据结构和编码详细图解(应用场景及优缺点)

专业术语sds:simple dynamic string 简单动态字符串embstr:embedded sds string embstr编码的sdsRedis 对象结构Redis 五种对象类型每一个redis对象都用一个key进行存储,在redis对象中有对象类型和编码,对象类型和编码的对应关系如下:string 类型使用场景:底层数据结构:string 相关命令命令行含义set key value赋值key的值为valueget key获取

2020-12-08 23:29:06 3817

HotSpot虚拟机主要参数表

包含参数如下: 1. 内存管理参数 2. 及时编译参数 3. 类型加载参数 4. 多线程相关参数‘ 5. 性能参数 6. 调试参数

2020-10-13

51单片机230个Proteus仿真实例

51单片机230个Proteus仿真实例

2015-11-15

空空如也

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

TA关注的人

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