自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RocketMQ 应用场景

1、异步解耦场景描述作为淘宝/天猫主站最核心的交易系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、阿里妈妈、流计算分析等等,整体业务系统庞大而且复杂,架构设计稍有不合理,将直接影响主站业务的连续性;高可用松耦合架构设计通过上、下游业务系统的松耦合设计,即便下游子系统(如物流、积分等)出现不可用甚至宕机,都不会影响到核心交易系统的正常运转;灵活适应业务的快速增长商场如战场,通过 MQ 的异步化设计,可以灵活高效的适应因业务快速发展而带来的变化,如新增

2022-01-04 17:20:58 1833

原创 RPC接口设计

初识 RPC 接口设计由于 RPC 中的术语每个程序员的理解可能不同,所以文章开始,先统一下 RPC 术语,方便后续阐述。大家都知道共享接口是 RPC 最典型的一个特点,每个服务对外暴露自己的接口,该模块一般称之为 api;外部模块想要实现对该模块的远程调用,则需要依赖其 api;每个服务都需要有一个应用来负责实现自己的 api,一般体现为一个独立的进程,该模块一般称之为 app。api 和 app 是构建微服务项目的最简单组成部分,如果使用 maven 的多 module 组织代码,则体现为如

2021-07-21 16:32:06 2021

转载 springboot实现热部署

1. 前言在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受啊。在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。下面我=我们就看看对于简单的类修改的热部署怎么实现。2. 原理深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三

2021-07-15 14:29:56 217

原创 使用postman进行并发测试

使用postman进行并发测试1、打开postman软件左侧栏点击+号键,创建一个并发测试文件夹2、主面板点击+号键,输入一个测试地址,点击save按钮保存到并发测试文件夹3、点击三角箭头,再点击Run,弹出Collection Runner插件4、设置并发数和延时时间,点击Run5、运行结果会依次排序,显示结果状态和耗时从图中可以看到百度的响应速度还是非常快的。点击Run Summary可以看到运行结果概述:测试全部通过测试结果也可.

2021-04-26 20:31:49 19866 11

转载 Mybatis foreach 性能问题

背景最近在做一个类似于综合报表之类的东西,需要查询所有的记录(数据库记录有限制),大概有1W条记录,该报表需要三个表的数据,也就是根据这 1W 个 ID 去执行查询三次数据库,其中,有一条查询 SQL 是自己写,其他两条是根据别人提供的接口进行查询,刚开始的时候,没有多想,直接使用 in 进行查询,使用 Mybatis 的 foreach 语句;项目中使用的是 jsonrpc 来请求数据,在测试的时候,发现老是请求不到数据,日志抛出的是 jsonrpc 超时异常,继续查看日志发现,是被阻塞在上面的三条S

2021-04-25 17:03:46 615

原创 雪花算法生成的主键太长,js精度丢失怎么办?

实体类Long属性转为string @JsonFormat(shape = JsonFormat.Shape.STRING) private Long id;前端在发送回数据时,也要做处理:JSON.stringify({ 'id': id, 'name': data })

2021-04-09 11:15:22 468

转载 浏览器的跨域问题以及解决方案

1、为什么会有跨域问题的存在?JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象,即同源政策。2、什么是同源?1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"。(1)协议相同(2)域名相同(3)端口相同具体实例 比如:http://www.example.com/zw/i...

2021-03-31 10:50:26 870

转载 springboot整合规则引擎URule

相比其他规则引擎,urule有如下特点:响应毫秒级支持规则在client的缓存,并自动比对更新时间,减少网络IO,但客户端需要引入jar原生支持动态规则和两种规则持久化方式(文件,数据库)支持决策树,决策表等集成了可视化规则管理界面,管理规则方便社区活跃度低,技术支持需要付费功能强大,但开源版功能有限这里介绍一下如何将URule整合到springBoot项目中官方文档:http://www.bstek.com/resources/doc/先来瞅瞅他的管理界面长啥样!按层级从...

2021-03-24 17:13:08 2409

原创 mysql虚拟列(Generated Columns)及JSON字段类型的使用

mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟列及json字段类型一、先创建一个测试表: 1 2 3 4 5 6 7 8 9 droptableif exists t_people; CREATETABLEt_people( `id`INT(11)NOTNULLAUTO_INCREMENT, `name`va...

2021-03-15 17:02:02 370

转载 SOFA RPC 泛化调用

SOFARPC —— Generic Service (泛化调用) 解析今晚心情无比激动,多云转晴!原因在于弄懂些 Generic Service 实现原理,很有成就感。各位看官莫笑,今晚,小小的收获,也是非常满足的。下面进入正题!一、前言普遍RPC在客户端需要提供接口,如果不提供则无法进行调用。同时,因为客户端也依赖提供的接口,服务端的升级、优化所带来的更新,客户端也要及时的更新API,否则会带来影响。这样,就带来了依赖接口,常常更新API(接口)的麻烦。为了解决这个问题,需要进行泛.

2021-03-10 11:50:51 1286

转载 Java实现自定义注解

正文 注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。注解的基本元素 声明一个注解要用到的东西修饰符 访问修饰符必须为public,不写默认为pubic; 关键字 关键字为@interface; 注解名称 注解名称为自定义注解的名称,使用时还会用到; 注解类型元素 注解类型元素是注...

2021-02-18 15:38:52 95

原创 配置IDE中Custom VM Options参数及含义

# custom PyCharm VM options#Xms128m --最小堆内存#Xmx750m --最大堆内存#XX:ReservedCodeCacheSize=240m --保留缓存大小#XX:+UseConcMarkSweepGC --设置年老代为并发收集#XX:SoftRefLRUPolicyMSPerMB=50 -“软引用”的对象在最后一次被访问后能存活50毫秒(默认为1秒)#ea --设置jvm是否启动断言机制(从JDK 1.4开始支持),缺省时jvm关闭断言机制。#-Dsu

2021-02-18 15:37:20 854

转载 easyexcel-统一监听器

说明项目说明:在公司中做了某一个项目,这个项目的作用就是做文档的导入导出 有的数据文档的数据是直接导入AND更新 有的数据是直接导入 期间的关联关系是某一个值项目采用的springboot、mybatos-plus、easyexcel思路先把导入的所有数据放入到List中 将要查询的值封装成一个对象, 进行批量查询 将查出来的数据转换成Map<特定值,T> 把所有要查询的数据也转换成Map<特定值,T> 数据转换 批量更新and插入代码...

2021-02-09 17:33:29 1593 3

转载 spring 参数校验

有参数传递的地方都少不了参数校验。在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全。试想一下,如果在controller层中没有经过任何校验的参数通过service层、dao层一路来到了数据库就可能导致严重的后果,最好的结果是查不出数据,严重一点就是报错,如果这些没有被校验的参数中包含了恶意代码,那就可能导致更严重的后果。因此,对于请求参数,一般上都需要进行参数合法性校验的,原先的写法时一个个字段一个个去判断,这种方式太不通用了,并且当参数较多的时候,代码回显的很臃肿,例如

2021-02-02 14:10:52 944 1

转载 OceanBase数据库

OceanBase 是一款由阿里巴巴公司自主研发的高性能、分布式的关系型数据库,支持完整的 ACID 特性,高度兼容MySQL协议与语法,能够以最小的迁移成本使用高性能、可扩张、持续可用的分布式数据服务。OceanBase 实现了数千亿条记录、数百 TB 数据的跨行跨表业务,支持了天猫大部分的 OLTP 和 OLAP 在线业务。OceanBase 特性OceanBase 最初是为了处理淘宝网的大规模数据而产生的。传统的 Oracle 单机数据库无法支撑数百 TB 的数据存储、数十万的 QPS,..

2021-01-11 13:59:03 2539

转载 通用mapper

在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper。本次例子地址:https://github.com/wz2cool/tk-mybatis-demo传统Mybatis用法Spring boot引用基本的jar到pom<dependency> <groupId>org.mybatis</groupId>

2021-01-11 10:18:52 106

原创 Spring事务注解 Transactional 失效

前情提要:当Service接口实现类中存在内部方法调用,并且方法需要支持事务控制时,事务控制失效,事务的传播级别为默认REQUIRED(默认模式)。1、简化版翻车代码:Service接口层Service接口实现类2、需求说明:(1)数据库表主要有两个,t_user(用户表),t_sms(发送短信记录表);(2)主业务为新用户注册,往数据库中添加用户记录,t_user表中有记录存在,后面的其他操作不应该影响此操作(方法有事务);(3)辅助功能(方法有事务),先往t_sms表

2021-01-07 18:06:23 146

原创 Spring中的@Transactional(rollbackFor = Exception.class)属性详解

今天我在写代码的时候,看到了。一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法;异常如下图所示,我们都知道Exception分为运行时异常RuntimeException和非运行时异常error是一定会回滚的如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的..

2021-01-07 18:02:52 230

转载 SqlSessionTemplate是如何保证MyBatis中SqlSession的线程安全的?

一、DefaultSqlSession的线程不安全性在MyBatis架构中SqlSession是提供给外层调用的顶层接口,实现类有:DefaultSqlSession、SqlSessionManager以及mybatis-spring提供的实现SqlSessionTemplate。默认的实现类为DefaultSqlSession如。类图结构如下所示:对于MyBatis提供的原生实现类来说,用的最多的就是DefaultSqlSession,但我们知道DefaultSqlSession这个类不是线程安全的

2020-12-23 18:10:43 203

原创 分布式下mybatis二级缓存数据一致性解决办法

背景:实际项目中,很多地方需要把数据缓存起来,以加快数据访问速度。比如字典表,比如数据机房表等等,缓存的实现有很多方式,如果项目中有用到mybatis,可以使用二级缓存来解决数据的缓存问题。现状:一般mybatis通过oscache来实现他的二级缓存,然而这种方式存在如下几个问题:1、oscache可以用来缓存页面和数据对象,但数据通常存放在内存中,项目多实例环境下无法解决缓存更新和过期的问题。2、oscache可以将数据通过io写到硬盘保持数据一致性,但此举会浪费资源解决方案:

2020-12-23 18:00:14 1976

转载 java DDD领域驱动

领域驱动设计的概念大家都知道软件开发不是一蹴而就的事情,我们不可能在不了解产品(或行业领域)的前提下进行软件开发,在开发前通常需要进行大量的业务知识梳理,然后才能到软件设计的层面,最后才是开发。而在业务知识梳理的过程中,必然会形成某个领域知识,根据领域知识来一步步驱动软件设计,就是领域驱动设计(DDD,Domain-Driven Design)的基本概念 。为什么需要 DDD在业务初期,功能大都非常简单,普通的 CRUD 就基本能满足要求,此时系统是清晰的。但随着产品的不断迭代和演化,业务逻辑变

2020-12-23 17:53:48 3250 1

原创 mybatis mapper加载的3种方法

mapper加载的3种方法<!--mapper加载有3种方法:1:通过resource或url加载单个mapper2:通过mapper接口类名加载单个mapper3:通过package批量加载多个mapper(推荐使用)--><mappers><!-- 通过resource或url加载单个mapper --><!--<mapper resource="sqlmap/User.map.xml" /><mapper re

2020-12-23 17:51:24 1301

转载 Mybatis一级缓存失效原因详解

前言 1、mybatis整合spring,一级缓存会失效,mybatis会在每次查询之后自动关闭sqlSession。2、二级缓存多线程共享,开启方式(注解)@CacheNamespace或者在xml文件中开启,开启方式为<settingname='cacheEnabled'value='true'/>3、二级缓存有一个很大的坑,缓存是针对命名空间而言的,也就是说如果你创建了两个Mapper对象,那么两个Mapper之间的缓存是不共用的。并且mybatis的缓存只适用单机环境,如..

2020-12-23 17:50:01 1716

转载 Redis集群详解

Redis集群详解Redis有三种集群模式,分别是:* 主从模式* Sentinel模式* Cluster模式1 2 3 4 5三种集群模式各有特点,关于Redis介绍可以参考这里:NoSQL(二)——RedisRedis官网:https://redis.io/,最新版本5.0.4主从模式主从模式介绍主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。其中主从复制有如下特点:* 主数据库可.

2020-12-18 16:30:32 108 1

转载 java线程池

什么是线程池?线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。为什么要使用线程池?创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再加上业务工作线程,消耗系统资源的时间,可能导致系统资源不足。(我们可以把创建和销毁的线程的过程去掉)线..

2020-11-20 16:42:13 64

转载 几种分布式事务

事务严格意义上的事务实现应该是具备原子性、一致性、隔离性和持久性,简称 ACID。 原子性(Atomicity),可以理解为一个事务内的所有操作要么都执行,要么都不执行。 一致性(Consistency),可以理解为数据是满足完整性约束的,也就是不会存在中间状态的数据,比如你账上有400,我账上有100,你给我打200块,此时你账上的钱应该是200,我账上的钱应该是300,不会存在我账上钱加了,你账上钱没扣的中间状态。 隔离性(Isolation),指的是多个事务并发执行的时候

2020-11-13 16:19:09 215

原创 Java线程池详解

1、线程池的优势(1)、降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;(2)、提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;(3)方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。(4)提供更强大的功能,延时定时线程池。2、线程池的主要参数public ThreadPoo.

2020-11-13 09:52:35 73

转载 Redis吊打面试官的经典面试题整理

1、Redis为什么是key,value的,为什么不是支持SQL的?这题第一眼看到有点懵逼选择key-value的原因:key-value简单粗暴,使用方便?效率更佳?为什么不支持sql:因为redis的内存模型是一个hashtable,不使用表来存储数据,也不会预定义或强制要求用户对redis储存的不同数据进行关联。2、Redis是多线程还是单线程?redis中io多路复用器模块是单线程执行,事件处理器也是单线程执行,两个线程不一样。所以实际redis应该是单进程多线程,只是不同的.

2020-11-09 16:48:00 239

原创 redis的持久化开启了RDB和AOF下重启服务是如何加载的

1) AOF持久化开启且存在AOF文件时,优先加载AOF文件,2) AOF关闭或者AOF文件不存在时,加载RDB文件,3) 加载AOF/RDB文件成功后,Redis启动成功。4) AOF/RDB文件存在错误时,Redis启动失败并打印错误信息...

2020-11-09 14:52:56 1174

原创 linux磁盘已满,你该如何处理

使用df -h查看磁盘空间占用情况Filesystem Size Used Avail Use% Mounted onudev 3.9G 0 3.9G 0% /devtmpfs 799M 3.1M 796M 1% /run/dev/vda1 99G 99G 0G 100% /tmpfs 3.9G 0 3.9G 0% /dev/shmtmpfs

2020-09-11 13:04:04 416

转载 Spring IOC 容器源码分析

Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。本文采用的源码版本是 4.3.11.RELEASE,算是 5.0.x 前比较新的版本了。为了降低难度,本文所说的所有的内容都是基于 xml 的配置的方式,实际使用已经很少

2020-09-08 10:45:57 101

转载 MySQL索引凭什么让查询效率提高这么多?

背景我相信大家在数据库优化的时候都会说到索引,我也不例外,大家也基本上能对数据结构的优化回答个一二三,以及页缓存之类的都能扯上几句,但是有一次阿里P9的一个面试问我:你能从计算机层面开始说一下一个索引数据加载的流程么?(就是想让我聊IO)我当场就去世了....因为计算机网络和操作系统的基础知识真的是我的盲区,不过后面我恶补了,废话不多说,我们就从计算机加载数据聊起,讲一下换个角度聊索引。正文MySQL的索引本质上是一种数据结构让我们先来了解一下计算机的数据加载。磁盘IO和预读:

2020-09-08 09:58:11 167

转载 Java中的并发队列

从有界无界上分常见的有界队列为ArrayBlockingQueue 基于数组实现的阻塞队列 LinkedBlockingQueue 其实也是有界队列,但是不设置大小时就时Integer.MAX_VALUE,内部是基于链表实现的 ArrayBlockingQueue 与 LinkedBlockingQueue 对比一哈 ArrayBlockingQueue 实现简单,表现稳定,添加和删除使用同一个锁,通常性能不如后者 LinkedBlockingQueue 添加和删除两把锁是分开的,所以竞..

2020-09-04 16:56:10 204

转载 独占锁与共享锁

前言独占锁和共享锁同样是一种概念。我们先介绍一下具体的概念,然后通过 ReentrantLock 和 ReentrantReadWriteLock 的源码来介绍独占锁和共享锁。概念引入独占锁概念独占锁也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据A加上排他锁后,则其他线程不能再对A加任何类型的锁。获得排它锁的线程即能读数据又能修改数据。JDK中的synchronized和 JUC中Lock的实现类就是互斥锁。共享锁概念共享锁是指该锁可被多个线程所持有。如果线程T对数据

2020-09-02 17:28:05 897

转载 synchronized四种锁状态的升级

synchronized四种锁状态的升级一、背景在 Java 语言中,使用 Synchronized 是能够实现线程同步的,即加锁。并且实现的是悲观锁,在操作同步资源的时候直接先加锁。加锁可以使一段代码在同一时间只有一个线程可以访问,在增加安全性的同时,牺牲掉的是程序的执行性能,所以为了在一定程度上减少获得锁和释放锁带来的性能消耗,在 jdk6 之后便引入了“偏向锁”和“轻量级锁”,所以总共有4种锁状态,级别由低到高依次为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。这几个状态会随着竞争情

2020-09-02 17:08:19 225

转载 接口重试机制的最佳实践 - Guava-retrying的应用

项目开发中,调用第三方接口会因为网络延迟、异常导致调用的服务出错,重试几次可能就会调用成功(例如上传图片),所以需要一种重试机制进行接口重试来保证接口的正常执行。重试机制除了用代码实现外,guava-retry可以灵活的实现这一功能,github 地址:https://github.com/rholder/guava-retrying/tree/master/src/main/java/com/github/rholder/retry本文首先介绍如何用java代码实现接口的重试机制,然后介绍下gua.

2020-08-28 17:27:22 598

转载 springboot集成spring-retry实现接口重试

今天需要通过http接口推送数据,根据协议接口失败情况下,需要重试3次。springboot 版本1.5,1.maven依赖 <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactI </dependency> <dependency> .

2020-08-28 17:24:14 578

转载 java 分布式锁

什么是锁?在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。 而同步的本质是通过锁来实现的。为了实现多个线程在一个时刻同一个代码块只能有一个线程可执行,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的线程结束同步代码块取消标记后再去尝试设置标记。这个标记可以理解为锁。 不同地方实现锁的方式也不一样,只要能满足所有线程都

2020-08-26 16:02:22 107

原创 浅谈 synchronized 和 ReentrantLock 的区别

① 两者都是可重入锁“可重入锁”概念是:自己可以再次获取自己的内部锁。比如,一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁时,还可以再获取的;如果不可锁重入的话,就会造成死锁;同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时,才能最终释放锁。② synchronized 依赖于 JVM,而 ReentrantLock 依赖于 APIsynchronized 是依赖于 JVM 实现的,Java 虚拟机团队在 JDK1.6 为 synchr

2020-08-26 10:13:51 95

转载 Spring系列之Spring常用注解总结

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少

2020-08-20 23:51:29 129

空空如也

空空如也

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

TA关注的人

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