自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 idea常用插件

maven helper plantUML chatGPT GPT-4

2023-12-07 15:32:02 367

原创 Java如何优雅的记时间

【代码】Java如何优雅的记时间。

2023-12-07 15:11:23 412

原创 数据库字典表

update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人',`is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除(1:已删除,0:未删除)',`pid` bigint DEFAULT NULL COMMENT '字典上级id',`grade` int DEFAULT '1' COMMENT '等级',

2023-10-16 14:13:39 328

原创 分布式事务(七):分布式事务总结

基础知识回顾事务的基本概念以及本地事务特征。CAP、BASE理论的概念。2PC、TCC、可靠消息最终一致性、最大努力通知。不同分布式事务类型的应用场景分析。RocketMQ事务消息机制。Seata与传统XA原理上的差别。分布式事务对比分析在学习各种分布式事务的解决方案后,我们了解到各种方案的优缺点:2PC最大的诟病是一个阻塞协议。RM在执行分支事务后需要等待TM的决定,此时服务会阻塞并锁定资源。由于其阻塞机制和最差时间复杂度较高,因此这种设计不能适应随着事务涉及的服务

2022-03-01 19:27:46 257

原创 分布式事务(六):分布式事务案例

注册账号案例采用用户、账号分离设计(这样设计的好处是,当用户的业务信息发生变化时,不会影响认证、授权等系统机制),因此需要保证用户信息与账号信息的一致性。用户向用户用心发起注册请求,用户中心保存用户业务信息,然后通知统一账号服务新建该用户所对应登录账号。解决方案分析针对注册业务,如果用户与账号信息不一致,则会导致严重问题,因此该业务对一致性要求较为严格,即当用户服务和账号服务任意一方出现问题都需要回滚事务。采用seata实现2PC方案分析在用户中心发起全局事务,统一账户服务为

2022-03-01 17:52:16 875

原创 分布式事务(五):分布式事务解决方案之最大努力通知

什么是最大努力通知最大努力通知也是一种解决分布式事务的方案,下边是一个充值的例子:通过上边的例子我们总结最大努力通知方案的目标:发起方通知方通过一定的机制最大努力将业务处理结果通知到接收方。具体包括:1.有一定的消息重复通知机制。因为接收通知方可能没有接收到通知,此时要有一定的机制对消息重复通知。2.消息校对机制如果尽最大努力也没有通知到接收方,或者接收方消费消息后要再次消费,此时可由接收方主动向通知方查询消息信息来满足需求。最大努力通知和可靠消息最终一致性有什么不同

2022-02-28 22:28:53 1134

原创 分布式事务(四):分布式事务解决方案之可靠消息最终一致性

什么是可靠消息最终一致性可靠消息最终一致性方案是指当事务发起方执行完本地事务后并发出一条消息,事务参与方(消息消费者)一定能够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一直。此方案利用消息中间件完成,如下图:事务发起方(消息生产方)将消息发送给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息中间件之间,事务参与方(消息消费方)和消息中间件之间都是通过网络通信,由于网络的不确定性因素会导致分布式事务问题。因此可靠消息最终一致性方案要解决以下几个问

2022-02-25 16:14:09 1838

原创 分布式事务(三):分布式事务解决方案之TCC(Try、Confirm、Cancel)

什么是TCCTCC是Try、Contirm、Cancel三个词语的缩写,TCC要求每个 分支事务实现三个操作:预处理Try、确认Contirm、撤销Cancel。Try操作业务检查以及资源预留,Contirm做业务确认,Cancel实现一个与Try相反的操作即回滚。TM首先发起所有的分支事务的try操作,任何一个分支事务的try操作执行失败,TM将会发起所有分支事务的Cancel操作,若try操作全部成功,TM将会发起所有分支事务的Confirm操作,其中Confirm/Cancel操作若执行失败,TM

2022-02-22 16:03:37 3284

原创 分布式事务(二):分布式事务解决方案之2PC(两阶段提交)

什么是2PC2PC即两阶段提交,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase)。2是指两个阶段,P是指准备阶段,C是指提交阶段。举例:张三和李四好久不见,一起吃饭。饭店老板要求先买单,才能出票。只有张三和李四都付款,老板才能出票安排就餐。但由于张三和李四都是铁公鸡,形成了尴尬的一面:准备阶段:老板要求张三付款,张三付款。老板要求李四付款,李四付款。提交阶段:老板出票,两人拿票纷纷落座就...

2022-01-24 17:10:16 1890 2

原创 分布式事务(一):基础概念

基础概念什么是事务事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。本地事务在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,所以叫数据库事务。数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。事务的特性原子性:要么全部成功,要么全部失败。一致性:事务执行前后,数据库的一致性没有被破坏。张三给李四转账一百块,那么总金额不会变化。隔离性:两个事务互不影响。持久性:事务完

2022-01-22 15:43:56 2308

原创 SpringSecurity+OAuth2.0权限系统

2021-12-08 16:13:33 738

原创 探索SpringAOP

概览什么是AOPAOP是一种编程范式,并不是编程语言只能解决特定问题,不能解决所有问题是OOP的补充,不是替代使用AOP的好处集中处理某一关注点、横切逻辑可以很方便的添加、删除关注点侵入性少,增强代码可读性及可维护性AOP的应用场景权限控制缓存控制事务控制审计日志性能监控分布式追踪异常处理支持AOP的编程语言Java、.NET、C/C++、Ruby、Python、PHP......编程范式概览面向过程编程面向对象编程

2021-11-03 15:44:40 91

原创 并发编程与高并发(七):多线程并发拓展

一、死锁二、并发最佳实践使用本地变量 因为线程封闭导致线程安全使用不可变类 一旦创建就无法改变,保证线程安全最小化锁的作用域范围使用线程池的Executor,而不是new Thread执行宁可使用同步也不要使用线程的wait和notify使用BlockingQueue实现生产-消费模式使用并发集合而不是加了锁的同步集合使用Semaphore创建有界的访问宁可使用同步代码块,也不使用同步方法使用sync...

2021-10-26 21:49:55 94

原创 并发编程与高并发(六):线程调度-线程池

介绍所谓线程池,通俗的理解就是有一个池子,里面存放着已经创建好的线程,当有任务提交给线程池执行时,池子中的某个线程会主动执行该任务。如果池子中的线程数量不够应付数量众多的任务时,则需要自动扩充新的线程到池子中,但是该数量是有限的,就好比池塘的水界限一样。当任务比较少的时候,池子中的线程能够自动回收,释放资源。为了能够异步地提交任务和缓存未被处理的任务,需要有一个任务队列。new Thread弊端每次new Thread新建对象,性能较差线程缺乏统一管理,可能无...

2021-10-19 22:01:52 764

原创 并发编程与高并发(五):JUC之组件扩展

FutureJava创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口,这两种方式有一个共同的缺陷,那就是在执行完任务之后,无法获取执行结果。从Java1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果,Future模式的核心思想是能够让主线程将原来需要同步等待的这段时间用来做其他事情。(因为可以异步获得执行结果,所以不用一直同步等待去获得执行结果)Callable与Runnable先说一下java.lang.R

2021-10-14 15:09:52 133

原创 并发编程与高并发(四):JUC之AQS

一、介绍在JDK1.6之前,synchronized这个重量级的同步锁性能一直都是较为低下,虽然在1.6之后,进行了大量的锁优化策略,但是与Lock相比synchronized还是存在缺陷的。虽然synchronized提供了便捷性的隐式获取锁、释放锁的机制(基于JVM机制),但是它缺缺少了获取锁与释放锁的可操作性,可中断、超时获取锁,且它为独占式的锁在高并发场景下性能大打折扣。AQS是 AbstractQueuedSynchronizer 的缩写,也就是抽象队列同步器,它是JUC并发包下面的核心组

2021-10-08 20:17:13 222

原创 并发编程与高并发(三):线程安全策略

一、不可变对象二、线程封闭三、线程不安全类与写法四、同步容器

2021-09-22 15:17:40 398

原创 并发编程与高并发(二):安全发布对象

发布对象使一个对象能够被当前范围之外的代码所使用的叫做发布对象import java.util.Arrays;/** * 多线程的场景下无法保证其他线程对states的修改,所以这个对象是线程不安全的 */public class PublishNotSafe { private String[] states = {"a", "b", "c"}; public String[] getStates() { return states; }

2021-09-22 14:53:33 98

原创 并发编程与高并发(一):线程安全性

一、概览1.1什么是线程安全当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。1.2线程安全原子性:是指一次或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么全部回滚。可见性:一个线程对主内存的修改可以及时的被其他线程观察到。有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察记过一般杂乱无序。二、原

2021-09-07 17:40:54 708

原创 charles抓包工具入门

一、charles的概念原理二、charles的主要功能1、支持代理2、流量控制3、请求重发4、断点调试三、charles的优点1、支持多系统2、界面简洁3、反向代理4、网络类型可选择四、charles组件介绍...

2021-09-01 22:03:52 109

原创 JVM1.8(四):垃圾收集器

如果说垃圾收集算法是内存回收的方法论,name垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。下图展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明他们是可以搭配使用的。垃圾收集器的种类Serial收集器Serial收集器是最基础、历史最悠久的收集器。这是一个单线程工.

2021-07-19 17:30:42 831

原创 Java中的引用分类

强引用类似于下面这样的,不会被回收Object o = new A();软引用还有用但并不必须的对象。用SoftReference来实现弱引用非必须对象,比软引用还要弱,垃圾回收时会回收掉。用WeakReference来实现弱引用虚引用也成为幽灵引用或者幻影引用,是最弱的引用。垃圾回收时会回收掉。用PhantomReference来实现虚引用...

2021-07-19 15:03:40 73

原创 指令重排序

JVM为了优化,在条件允许的情况下,对指令进行一定的重新排列,直接运行当前能够立即执行的后续指令,避开获取吓一跳指令所需数据造成的等待线程内串行语义,不考虑多线程间的语义不是所有指令都能重拍比如写后读:a = 1;b = a;写一个变量之后,再读这个位置...

2021-07-16 10:54:21 181

原创 浅谈volatile

volatile基本上是JVM提供的最轻量级的同步机制,用volatile修饰的变量,堆所有的线程课件,即对volatile变量所做的写操作能立即反映到其他线程中用volatile修饰的变量,在多线程环境下仍然是不安全的volatile修饰的变量,是禁止指令重排优化的适合使用valatile的场景1.运算结果不依赖变量当前的值。a= a+ 1就不满足2.只有一个线程修改当前变量的值。...

2021-07-16 10:49:07 69

原创 JVM1.8(一):类加载和类加载器

类加载步骤图解类加载步骤详解加载最常见的加载类的方式:是从本地文件系统中加载、从jar文件中加载其他加载方式:将java源文件动态编译成class、从网络下载、从专有数据库中加载等等加载要完成的功能1.通过类的全限定名来获取类的二进制字节流2.把二进制字节流转化为方法区的运行时数据结构3.在堆上创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,并向外提供了访问方法区内部数据结构的接口类加载器分类启动类加载器启动类加..

2021-07-15 17:19:54 349

原创 JVM1.8(三):内存之间的交互操作

Java内存模型及交互操作简介JCP定义了一中Java内存模型,以前是在JVM规范中,后来独立出来成为JSR-133内存模型:在特定的操作写一下,堆特定的内存或告诉缓存进行读写访问的过程抽象Java内存模型主要关注JVM中把变量值存储到内存和从内存中取出变量值这样的底层细节内存模型基本要求所有变量(共享的)都存储在主内存中,每个线程都有自己的工作内存;工作内存中保存该线程使用到的变量的主内存的副本拷贝线程对变量的所有操作(读、写)都应该在工作内存中完成不同线程不能相互访问

2021-07-15 16:13:01 620

转载 浅谈Java中的常量池

图解一、常量池分类Java中的常量池分为:Class文件常量池、运行时常量池、全局字符串常量池、基本类型包装对象常量池1.1Class文件常量池class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,我们编写的Java文件就被编译为.class文件格式的二进制数据存放在磁盘中,其中就包括class文件常量池,class文件常量池在在编译阶段就已经确定。既然是常量池,name里面存放的肯定是常量,那么什么是《常量》呢?class文件常量池主要存放两大常量:字面量和符.

2021-07-15 15:20:57 2438 1

原创 使用Spring Actuator + Micrometer + Prometheus + Grafana监控Spring Boot应用程序

前言读取本文需要的知识:Java,Docker基本命令当某个应用在生产环境中运行时,监控其运行状态是必要的和明智的。通过实时了解应用程序的运行状况,你能在问题出现之前得到警告,也可以在客户端注意到问题之前解决问题。模块简单介绍Spring Actuator:在应用程序离提供众多Web接口,通过它们了解应用运行时的内部状况。Micrometer:为Java平台上的性能数据收集提供了一个通用的API,它提供了多种度量指标类型,同时支持接入 Influxdb,Graphite,Promet..

2021-07-08 14:59:53 1357

原创 Java : httpClient + testNG + jenkins 搭建自动化测试平台及测试报告的生成

前言读本文章需要的条件:Java + Linux基本命令文章内包含的所有代码已经放到github上面,拉下载直接就可以启动https://github.com/zhanzhuang/auto-test什么是httpClientHttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。什么是testNGTestNG,即Testing, ...

2021-07-08 14:30:53 2199

原创 JVM1.8(二):JVM1.8内存模型

1、内存模型概览本文介绍的是JDK1.8的内存模型。1.8同1.7相比,最大的差别就是元空间取代了永久代。元空间的本职和永久代类似,都是堆JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不存在虚拟机中,而是使用本地内存。内存模型概览如下:其中程序计数器、虚拟机栈、本地方法栈是线程私有的。方法区、堆是线程公有的。2、各区域详细介绍2.1、程序计数器程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。字节码解释器的工作就是通过改

2021-07-08 11:23:41 8862 2

空空如也

空空如也

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

TA关注的人

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