- 博客(170)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 探秘RocketMQ分布式事务消息的设计原理
Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式事务消息,而且实现了对外部组件的零依赖。接下来,本文将详细探秘RocketMQ事务消息的设计原理以及实现机制。一 需求缘起在微服务架构中,随着服务的逐步拆分,数据库私有已经成为共识,这也导致所面临的分布式事务问题成为微服务落地过程中一个非常难以逾越的障碍,但是目前尚没有一个完整通用的解决方案。其实不仅仅是在微服务架构中,
2021-03-15 09:38:51
372
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 Netty 相关知识点:
NIO 基本概念阻塞(Block)与非阻塞(Non-Block)阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。阻塞 IO :非阻塞 IO :同步(Synchronous)与异步(Asynchronous)同步和异步都是基于应用程序和操作系统处理 I
2021-03-13 15:52:36
266
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 从ReentrantLock的实现看AQS的原理及应用
前言Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync
2021-03-12 10:01:09
404
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 分布式事务:
分布式事务随着互联网技术的不断发展,系统越来越复杂,几乎所有 IT 公司的系统都已经完成从单体架构到分布式架构的转变,分布式系统几乎无处不在。谈到分布式系统,特别是微服务架构,我们不得不谈分布式事务。今天就跟大家一起聊聊分布式事务以及常用解决方案。基础理论在讲解具体方案之前,我们有必要了解一些分布式事务所涉及到的基础理论知识。事务事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不
2021-03-08 12:00:20
503
原创 RocketMQ 事务消息实现流程
在面过的几家大厂中,几乎每轮的面试官(「没写错,几乎是每轮面试官」)都问了同样一个问题:你们的系统是分布式的系统吗?答:是。面试官:那么你们分布式的系统是如何解决分布式事务这个问题的呢?也就是如何保证数据的一致性。答:我们的系统中通过 RocketMQ 的事务消息来保证数据的最终一致性。面试官:那你说说它是如何来保证数据的最终一致性的?答:分两部分来回答,第一部分先回答事务消息的实现流程,第二部分解释为什么它能保证数据的最终一致性。事务消息的实现流程事务消息首先服务 A 发送一个半事务消
2021-03-17 10:14:00
940
原创 Java开发手册 空指针 最佳实践
1 引导语话不多说,先看手册指引的规范手册已经帮助我们总结了常见问题场景,让我们详细了解下这些场景吧。2 问世间空指针为何物2.1 源码定位应用需要一个对象时却传入了 null,包含如下场景:调用 null 对象的实例方法访问或者修改 null 对象的属性获取值为 null 的数组的长度访问或者修改值为 null 的二维数组的列时把 null 当做 Throwable 对象抛出时。在开发中遇到这些场景时,务必注意代码处理,防止NPE。2.2 继承体系3. 空指针案例全方位
2021-03-05 18:38:37
480
转载 RabbitMq使用
RabbitMQ 实战教程1.MQ引言1.1 什么是MQMQ(Message Quene) : 翻译为 消息队列,通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件 通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。1.2 MQ有哪些当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、
2021-03-05 18:28:19
1061
原创 docker安装RabbitMq添加用户
docker安装RabbitMqrabbitMQ是一款开源的高性能消息中间件,最近项目要使用,于是使用docker搭建,快速方便一、获取镜像使用docker search rabbitMq命令获取镜像列表2.使用docker pull docker.io/rabbitmq:3.8-management拉取镜像我们选择了STARS数最多的官方镜像,此处需要注意,默认rabbitmq镜像是不带web端管理插件的,所以指定了镜像tag为3.8-management,表示下载包
2021-03-05 17:52:30
3764
2
原创 Thread类源码解析
1 类注释程序中执行的线程。JVM允许应用程序拥有多个并发运行的执行线程。每个线程都有一个优先级。优先级高的线程优先于优先级低的线程执行。每个线程可能被标记为守护线程,也可能不被标记为守护线程。当在某个线程中运行的代码创建一个新 Thread 对象时,新线程的优先级最初设置为创建线程的优先级,并且只有在创建线程是一个守护线程时,新线程才是守护线程。当JVM启动时,通常有一个非守护的线程(它通常调用某个指定类的main方法)。JVM 继续执行线程,直到发生以下任何一种情况时停止:Runtime 类
2021-02-28 11:35:13
470
转载 IDEA 设置项目的默认pull 和 push的远程分支
修改前如图,项目默认从origin/master分支pull2:去你的项目的workspace里面刷新git远程分支列表命令:git remote update origin --prune右键 git bash here 窗口里面执行:git branch --set-upstream-to=origin/dev master(就从master切到默认dev分支了)3:我们再去看看项目pull的时候,已经变成默认从dev分支pull了...
2020-10-20 16:26:30
4142
1
转载 MongoDB:4种插入数据的方法
https://blog.csdn.net/wangliqiang1014/article/details/16803817
2020-10-14 15:47:19
2557
原创 SpringCloud -Nacos服务注册与发现
Nacos简介Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 具有如下特性:服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置;动态 DNS 服务:动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更
2020-10-04 15:16:54
651
原创 SpringCloud -Gateway网关
Gateway 简介Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等。Spring Cloud Gateway 具有如下特性:基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建;动态路由:能够匹配任何请求属性
2020-10-04 15:04:29
2195
1
原创 SpringCloud -Feign远程调用
Feign简介Feign是声明式的服务调用工具,我们只需创建一个接口并用注解的方式来配置它,就可以实现对某个服务接口的调用,简化了直接使用RestTemplate来调用服务接口的开发量。Feign具备可插拔的注解支持,同时支持Feign注解、JAX-RS注解及SpringMvc注解。当使用Feign时,Spring Cloud集成了Ribbon和Eureka以提供负载均衡的服务调用及基于Hystrix的服务容错保护功能。创建一个feign-service模块这里我们创建一个feign-service
2020-10-04 14:58:47
281
原创 SpringCloud - Hystrix 服务降级和熔断
Hystrix 简介在微服务架构中,服务与服务之间通过远程调用的方式进行通信,一旦某个被调用的服务发生了故障,其依赖服务也会发生故障,此时就会发生故障的蔓延,最终导致系统瘫痪。Hystrix实现了断路器模式,当某个服务发生故障时,通过断路器的监控,给调用方返回一个错误响应,而不是长时间的等待,这样就不会使得调用方由于长时间得不到响应而占用线程,从而防止故障的蔓延。Hystrix具备服务降级、服务熔断、线程隔离、请求缓存、请求合并及服务监控等强大功能。创建一个hystrix-service模块这里我们
2020-10-04 14:51:27
800
1
原创 SpringCloud -Ribbon负载均衡
Ribbon简介在微服务架构中,很多服务都会部署多个,其他服务去调用该服务的时候,如何保证负载均衡是个不得不去考虑的问题。负载均衡可以增加系统的可用性和扩展性,当我们使用RestTemplate来调用其他服务时,Ribbon可以很方便的实现负载均衡功能。RestTemplate的使用RestTemplate是一个HTTP客户端,使用它我们可以方便的调用HTTP接口,支持GET、POST、PUT、DELETE等方法。GET请求方法<T> T getForObject(String u
2020-10-04 14:41:37
235
原创 SpringCloud - Eureka服务注册和发现
什么是Spring CloudSpring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署
2020-10-04 13:18:16
302
原创 Git常用命令
配置用户名和邮箱$ git --version # 查看git的版本信息$ git config --global user.name # 获取当前登录的用户$ git config --global user.email # 获取当前登录用户的邮箱# 如果刚没有获取到用户配置,则只能拉取代码,不能修改 要是使用git,你要告诉git是谁在使用$ git config --global user.name 'userName' # 设置git账户,userName为你的git账
2020-10-04 12:51:29
290
1
原创 Redis常见的面试题 - 3
1.了解什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 Redis 的穿透?缓存雪崩对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。缓存雪崩的事前事中事后
2020-10-03 16:44:23
287
原创 计算机网络相关面试题:
一 OSI与TCP/IP各层的结构与功能,都有哪些协议?学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。结合互联网的情况,自上而下地,非常简要的介绍一下各层的作用。1.1 应用层应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用
2020-10-03 16:09:58
1260
原创 JVM故障排除和调优:
1. JDK 监控和故障处理工具总结JDK 命令行工具这些命令在 JDK 安装目录下的 bin 目录下:jps (JVM Process Status): 类似 UNIX 的 ps 命令。用户查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;jstat( JVM Statistics Monitoring Tool): 用于收集 HotSpot 虚拟机各方面的运行数据;jinfo (Configuration Info for Java) : Configuration
2020-10-03 16:02:56
493
1
原创 JVM垃圾回收
1 JVM 内存分配与回收Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。Java 堆是垃圾收集器管理的主要区域,因此也被称作GC 堆(Garbage Collected Heap).从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor 空间等。进一步划分的目的是更好地回收内存
2020-10-03 15:58:40
230
原创 类加载过程和类加载器详解:
类的生命周期一个类的完整生命周期如下:类加载过程Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢?系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。加载类加载过程的第一步,主要完成下面3件事情:通过全类名获取定义此类的二进制字节流将字节流所代表的静态存储结构转换为方法区的运行时数据结构在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问
2020-10-03 15:52:30
409
原创 JVM内存区域详解
掌握JVM,是Java面试的必经之路。(这里没有特别说明都是指的是HotSpot虚拟机)JVM内存结构:概述:对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。运行时数据区域: Jav
2020-10-03 15:40:20
323
原创 java.lang.IllegalArgumentException: Could not find class异常解决方式
进行项目的搭建的时候出现Could not find class [org.springframework.cloud.client.discovery.composite.reactive.ReactiveCompositeDiscoveryClientAutoConfiguration]异常java.lang.IllegalArgumentException: Could not find class [org.springframework.cloud.client.discovery.compos
2020-10-02 13:04:07
19185
3
原创 Docker 安装 升级 Linux 内核版本3.10以上
0. 假期想做一个项目:需要使用Docker 系统版本是Centos 6因为由于安装Docker时,Docker支持3.10或更高的版本,所以需要将内核进行升级 这里将过程进行记录。1. 升级步骤:查看默认的内核版本。uname -r安装elrepo的yum源,升级内核需要使用elrepo的yum源,在安装yum源之前还需要我们导入elrepo的key。如果这两步失败了需要更新 nssyum update nss升级yum --enablerepo=elrepo-kerne
2020-10-02 10:22:39
2498
原创 SpringMVC常见的面试题:
先来看一下什么是 MVC 模式MVC 是一种设计模式.MVC 的原理图如下:SpringMVC 简单介绍SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口。SpringMVC 使用需要在 web.xml 中配置 DispatcherServlet 。并且需要配置 Spring 监听器ContextLoaderL
2020-09-17 09:58:34
268
原创 多线程常见的面试题
多线程常见的面试题:1. 什么是线程和进程? 线程与进程的关系,区别及优缺点?进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行的进程(.exe 文件的运行)。线程与进程相似,
2020-09-16 16:21:58
17811
9
原创 Spring面试之事务
1. 什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。我们系统的每个业务方法可能包括了多个原子性的数据库操作,比如下面的 savePerson() 方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的,它们要么都执行,要不就都不执行。public void savePerson() { personDao.save(person); personDetailDao.save(personDetail);}另外,需要格外注意的是:事务能否生效数据库引擎是
2020-09-14 16:09:37
1109
原创 Spring面试之Spring使用的设计模式
Spring 中的设计模式。Design Patterns(设计模式) 表示面向对象软件开发中最好的计算机编程实践。 Spring 框架中广泛使用了不同类型的设计模式,下面我们来看看到底有哪些设计模式?控制反转(IoC)和依赖注入(DI)IoC(Inversion of Control,控制反转) 是Spring 中一个非常非常重要的概念,它不是什么技术,而是一种解耦的设计思想。它的主要目的是借助于“第三方”(Spring 中的 IOC 容器) 实现具有依赖关系的对象之间的解耦(IOC容器管理对象,你
2020-09-14 16:07:58
392
原创 Spring 面试之bean生命周期和作用域
在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean。简单地讲,bean 就是由 IOC 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了。而 bean 的定义以及 bean 相互间的依赖关系将通过配置元数据来描述。Spring中的bean默认都是单例的,这些单例Bean在多线程程序下如何保证线程安全呢? 例如对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求,引入Spri
2020-09-14 16:07:00
364
原创 Spring 面试之常见的注解使用
1. @SpringBootApplication这里先单独拎出@SpringBootApplication 注解说一下,虽然我们一般不会主动去使用它。@SpringBootApplicationpublic class SpringSecurityJwtGuideApplication { public static void main(java.lang.String[] args) { SpringApplication.run(SpringSecurityJwtGu
2020-09-14 16:05:26
509
原创 Spring 面试之IoC 和 AOP
Spring IoC什么是IoCIoc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:控制是什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器
2020-09-14 16:04:22
12530
原创 Mybatis 常见的面试题
1、什么是Mybatis?答:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。2、讲下 MyBatis 的缓存?答:MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态),可在它的映射文件中配置3、#{}和${}的区别是什么?答:${}是 Properties 文件中的变量占位符,它可以用于标签属性值
2020-09-14 15:59:55
118
原创 Redis常见的面试题 - 2
10. Redis 给缓存数据设置过期时间有啥用?一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢?因为内存是有限的,如果缓存中的所有数据都是一直保存的话,分分钟直接Out of memory。Redis 自带了给缓存数据设置过期时间的功能,比如:127.0.0.1:6379> exp key 60 # 数据在 60s 后过期(integer) 1127.0.0.1:6379> setex key 60 value # 数据在 60s 后过期 (setex:[
2020-09-13 17:22:38
184
原创 Redis常见的面试题 - 1
1. 简单介绍一下 Redis简单来说 Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。另外,Redis 除了做缓存之外,Redis 也经常用来做分布式锁,甚至是消息队列。Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。2. 分布式缓存常见的技术选型方案有哪些?分布式缓存的话,使用的比较多的
2020-09-13 17:21:29
464
1
原创 MySQL 提高篇
提高篇:1.MySQL是怎么保证主备一致的:主备切换流程:在状态 1 中,客户端的读写都直接访问节点 A,而节点 B 是 A 的备库,只是将 A 的更新都同步过来,到本地执行。这样可以保持节点 B 和 A 的数据是相同的。当需要切换的时候,就切成状态 2。这时候客户端读写访问的都是节点 B,而节点 A 是 B的备库。在状态 1 中,虽然节点 B 没有被直接访问,但是我依然建议你把节点 B(也就是备库)设置成只读(readonly)模式。这样做,有以下几个考虑:有时候一些运营类的查询语句会被放到
2020-09-13 15:40:37
135
原创 MySQL 实践篇
2. 实践篇1. 普通索引和唯一索引,应该怎么选择?普通索引和唯一索引对更新语句性能的影响这个问题,先介绍一下change buffer。当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这
2020-09-13 15:36:41
195
原创 LinkedHashMap源码分析
1. 概述:众所周知,HashMap 提供的访问,是无序的。而在一些业务场景下,我们希望能够提供有序访问的 HashMap 。那么此时,我们就有两种选择:TreeMap :按照 key 进行排序。LinkedHashMap :按照 key 的插入和访问的顺序。LinkedHashMap ,在 HashMap 的基础之上,提供了顺序访问的特性。而这里的顺序,包括两种:按照 key-value 的插入顺序进行访问。按照 key-value 的访问顺序进行访问。通过这个特性,我们实现基于
2020-09-13 15:15:57
112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人