自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot 操作事务的这两种方式又方便又高效

本文我们介绍了两种事务的实现方式:编程式事务或声明式事务。其中编程式事务又分为两种实现:使用 TransactionTemplate 对象或更加底层的 TransactionManager 对象分别实现编程式事务,它们的优点是灵活性更高,可以在任何代码片段上添加事务;而声明式事务的实现更加简单,只需要在类或方法上添加 @Transactional 注解即可实现事务的自动开启和提交(以及回滚)。

2022-09-14 16:04:41 2655

原创 JAVA性能优化思路探究,让程序超顺畅

一个系统的上线除了常规的功能性测试外,还需要经过严格的性能测试,满足预期的性能指标(常见的有响应时间,tps等),才允许上生产环境。广义的性能测试一般还包含负载测试(用于测试系统的容量:即系统在保证一定响应时间的情况下能够允许多少并发用户的访问),压力测试(用于测试系统的稳定性:即在保证一定压力的情况下,查看测试系统的稳定性),并发测试(即测试系统多并发能力:即模拟多用户访问同一应用的测试,用于发现并发问题,比如线程锁,资源竞争,数据库死锁等)等。通过性能测试,可以帮助我们尽快发现系统的瓶颈。

2022-09-14 15:52:27 549

原创 JAVA中让Swagger产出更加符合诉求的描述文档,用好swagger,让其真正的成为项目的神兵利器。

好啦,关于如何补全Swagger接口的描述内容、如何自主决定某些内容的显示与隐藏等相关的内容,这里就给大家分享到这里啦。关于本篇内容你有什么自己的想法或独到见解么?欢迎在评论区一起交流探讨下吧。期待与你一起探讨,一起成长为更好的自己。

2022-09-14 15:39:08 349

原创 什么是链路追踪?分布式系统如何实现链路追踪?本文给你超清晰解答

链路追踪是分布式系统下的一个概念,它的目的就是要解决上面所提出的问题,也就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如,各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

2022-09-14 14:52:52 5440

原创 Spring关闭执行销毁方法有几种,看完才知道SmartLifecycle最快

这个问题让我很深刻,记得之前有一个面试就被问到有没有使用过。那他是什么?先来看下Spring容器的加载过程可以看到Bean从无到有主要是经历了四个步骤就是在成熟态的时候,在初始化生命周期执行回调方法主要是以接口或者注解的形式对外提供,注入到IOC容器中,完成对应的功能。今天主要整理了一下,Spring的关闭扩展点,在日常的业务开发中,我们经常需要针对不同的场景设计合理的方案,今天主要说了几种常用的方案,还有SmartLifecycle这种比较冷门的实现方式。

2022-09-14 13:54:57 644

原创 用Java实现Redis的RDB机制,一个专为系统数据安全而来的设计模式

它的宗旨就是,备忘录管理者角色,在保证备忘录数据安全性的前提下,通过备忘录角色,备份备忘录源角色的当前状态,以便在需要的时候,恢复备份备忘录源角色的状态。即使是备忘录管理者角色也不行。答案就是两个字,“安全”,为了所备份的数据的安全性,备忘录角色的接口,被称为“窄接口”,越窄越好,窄到极致,就成了标记接口,当然,不是必须的,如果有些数据可以暴露,可以提供一些接口。备忘录模式,就是在保障数据安全性的前提下,记录对象某个时刻的内部状态(可以是全部,也可以是一部分),以便以后,可以随时恢复对象的内部状态。

2022-09-14 13:52:04 130

原创 一篇文章玩转RPC通信原理,并使用Netty实现一个PRC(精华简版)

客户端 1.通过bean的初始化回调判断是否需要注入动态代理 2.在动态代理回调类中使用Netty调用远程服务,并发送约定协议的消息 3.使用回调机制返回服务端响应,并返回原始类服务端 1.在bean的回调判断是否为发布的服务,是的话保存在公共map中,初始化时启动Rpc服务 2.调用服务解析消息后,通过请求的service获取指定的service,通过反射调用,并将结果返回正常应该使用的是FactoryBean的方式注入的,这里只是为了搞懂原理,忽略!

2022-09-14 13:48:11 3242

原创 (超详细版)带你玩转Java这些内部类

顾名思义,内部类是指一个类在另外一个类的内部,是定义在另一个类中的类。根据类的位置和属性不同,可以分为下面几种。

2022-09-14 13:44:10 70

原创 JAVA基于Slack实现异常日志报警

Slack 它是一种基于Web的实时通信工具,可作为台式机/笔记本电脑、移动设备的单个应用程序以及Web应用程序使用。基本上,它是您的私人聊天和协作室。对于许多公司而言,它已取代电子邮件/私人论坛/聊天室成为主要的内部基于文本的沟通渠道。可以理解为它是聊天群组 + 大规模工具集成 + 文件整合 + 统一搜索。

2022-09-14 13:40:39 338

原创 一文带你深入理解Hashtable

HashTable底层的实现机制是什么?HashTable的扩容机制是什么?HashTable和HashMap的区别是什么?存储key-value键值对格式是无序的底层通过数组+链表的方式实现通过synchronized关键字实现线程安全key、value都不可以为null(为null时将抛出NullPointerException)实现了Map接口,提供了键值对增删改查等基础操作继承了Dictionary字典类,Dictionary是声明了操作"键值对"函数接口的抽象类。

2022-09-14 10:40:24 810

原创 Spring 中 Bean 的生命周期

Bean 的生命周期指的是 Bean 在 Spring(IoC)中从创建到销毁的整个过程。Bean 的生命周期主要包含以下 5 个流程: 1.实例化:为 Bean 分配内存空间;2.设置属性:将当前类依赖的 Bean 属性,进行注入和装配;执行各种通知;执行初始化的前置方法;执行初始化方法;执行初始化的后置方法。4.使用 Bean:在程序中使用 Bean 对象;5.销毁 Bean:将 Bean 对象进行销毁操作。

2022-09-13 16:47:30 188

原创 搞定接口返回数据脱敏 竟如此简单

自定义 Serializer,参考 jackson 的 StringSerializer,下面的示例只针对 String 类型进行脱敏。思来想去,定义数据脱敏注解和数据脱敏逻辑的接口, 在返回类上,对需要进行脱敏的属性加上,并指定对应的脱敏策略操作。当返回对象比较复杂,需要递归去反射,性能一下子就会降低,于是换种思路,我想到平时使用的。,跟我现在的场景很类似,通过自定义注解跟字段解析器,对字段进行自定义解析。

2022-09-13 16:43:39 144

原创 Java线程间的共享和协作,详细过程如下文,一眼懂

Java 支持多个线程同时访问一个对象或者对象的成员变量,关键字synchronized 可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性,又称为内置锁机制。对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的 class 对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个 class 对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。

2022-09-13 16:40:06 147

原创 一步一步带你熟悉SpringBoot 配置slf4j+logback

对于一个web项目来说,日志框架是必不可少的,日志的记录可以帮助我们在开发以及维护过程中快速的定位错误。相信很多人听说过slf4j,log4j,logback,等跟日志框架有关的词语,所以这里也简单介绍下他们之间的关系。

2022-09-13 16:26:03 1596

原创 Java高级语言特性——注解与反射(超详细解析,不怕看完不理解)

注解本身没有意义,单独的注解是一种注释,他需要结合其他如反射、插桩等技术才有意义 Java 注解(Annotation)又称 Java 标注,是JDK5.0 引入的一种注释机制。注解是元数据的一种形式,提供有关于程序但不属于程序本身的数据。注解对它们注解的代码的操作没有直接影响。

2022-09-13 16:19:10 254

原创 Java 下数据业务逻辑开发技术 JOOQ 和 SPL

很多开源技术都可以在Java下实现以数据库为核心的业务逻辑,其中JOOQ的计算能力比Hibernate强,可移植性比MyBatis强,受到越来越多的关注。esProc SPL是新晋的数据计算语言,同样在计算能力和可移植性方面优势突出。下面对二者进行多方面的比较,从中找出开发效率更高的数据业务逻辑开发技术。JOOQ商业版主要支持了商业数据库和存储过程,不在此次讨论范围。

2022-09-13 16:15:27 109

原创 一文带你全面深入了解TreeMap

TreeMap是Map家族中的一员,也是用来存放key-value键值对的。平时在工作中使用的可能并不多,它最大的特点是遍历时是有顺序的,根据key的排序规则来,那么它具体是如何使用,又是怎么实现的呢?本文基于jdk8做一个讲解。TreeMap是一个基于key有序的key value散列表。map根据其键的自然顺序排序,或者根据map创建时提供的Comparator排序不是线程安全的key 不可以存入null底层是基于红黑树实现的。

2022-09-13 16:06:03 28890

转载 详解:Spring Boot整合 NoSQL 数据库 Redis

这个企业级快速构建项目的框架之外,随着业务数据量的大幅度增加,对元数据库造成的压力成倍剧增。请求发送成功,获取到数据,测试成功,至此Spring Boot整合 Redis所有步骤已经完成,将redis相关的依赖引入到项目中之后,需要对redis进行一些配置,在。,是当今开发人员必备的一项技能,接下来对整合步骤进行详细说明。数据库已然整个项目架构中的不可或缺的一部分,懂得如何。构建完成Spring Boot项目工程之后,需要在。将所有的环境依赖和配置搭建完成之后,进行测试一把。在日常的开发中,除了使用。

2022-09-13 10:36:35 87

原创 这些Spring Cloud五花八门的分布式组件你都能理解吗

本文主要讲述了从单点应用到分布式架构的发展历程,并且描述了微服务当中为什么会诞生出一批组件,其根本原因就是为了解决微服务所带来的的挑战和问题,在文中最后对当前流行的分布式架构组件进行了分类整理,帮助大家梳理思路,这样就可以做到有目的的进行针对性的学习,希望通。

2022-09-09 15:37:30 186

原创 早想到这个就好了,JAVA诊断工具Arthas在Rainbond上实践~

Arthas 是款非常好的 Java 诊断工具,而在 Kubernetes 中使用较为复杂。Rainbond 底层基于 Kubernetes,在此之上抽象了应用模型,使用户更方便的在 Kubernets 中部署管理应用,并且通过 Rainbond 的插件机制让用户更便捷的使用 Arthas 诊断业务,降低了在 Kubernetes 中使用 Arthas 的门槛,用户只需关注业务。

2022-09-09 15:20:20 105

原创 一文参透并发编程,阿里资深架构师两万字总结 +40 张图文详解

从输出的结果就可以看到,任务都是挨着执行的。我为任务分配了五个线程,但是这五个线程不像是我们之前看到的有换进换出的效果,它每次都会先执行完自己的那个线程,然后余下的线程继续走完这条线程的执行路径。由于线程的本质,使你不能捕获从线程中逃逸的异常,一旦异常逃出任务的 run 方法,它就会向外传播到控制台,除非你采取特殊的步骤捕获这种错误的异常,在 Java5 之前,你可以通过线程组来捕获,但是在 Java 5 之后,就需要用 Executor 来解决问题,因为线程组不是一次好的尝试。

2022-09-09 10:40:43 202

原创 tomcat 集群监控与弹性伸缩

同时还可以根据在达到扩容阈值扩容的时候,观察线上真实的 CPU 和内存使用情况,可以基于 promethues + grafana 来进行监控,如果发现扩容时候 CPU 使用率和内存使用率 GC 评率比较低,那么可以再配置中心动态的调整线程池的大小。假如 tomcat 采用了原生线程池,核心线程为 10 个,最大线程为 100,队列为 200,并发来了 100 个请求,那么同时系统只能处理 10 个,剩下 90 个都得放入队列中让 10 个核心线程慢慢排队处理,延时必然非常高。

2022-09-09 09:52:05 243

原创 基于SpringDataElasticsearch+SpEL表达式实现ES动态索引

一般情况下,当我们使用去操作ES时,索引名称都会在@Document注解中写死,每次都是对这个固定的索引进行操作。假如我们现在处于一个多租户系统中,每个租户都有自己所对应的用户数据,而这些用户数据都会被导入到ES中,那怎么实现各个租户的用户数据索引隔离呢?换言之,在同一个索引结构的情况下怎么实现一个租户一个索引?解决方案:使用SpEL表达式动态获取索引。

2022-09-09 09:39:26 1904

原创 用Java实现Redis的RDB机制,一个专为系统数据安全而来的设计模式

它的宗旨就是,备忘录管理者角色,在保证备忘录数据安全性的前提下,通过备忘录角色,备份备忘录源角色的当前状态,以便在需要的时候,恢复备份备忘录源角色的状态。即使是备忘录管理者角色也不行。答案就是两个字,“安全”,为了所备份的数据的安全性,备忘录角色的接口,被称为“窄接口”,越窄越好,窄到极致,就成了标记接口,当然,不是必须的,如果有些数据可以暴露,可以提供一些接口。备忘录模式,就是在保障数据安全性的前提下,记录对象某个时刻的内部状态(可以是全部,也可以是一部分),以便以后,可以随时恢复对象的内部状态。

2022-09-08 11:24:29 470

原创 用 Arthas 定位 Spring Boot 接口的超时问题,速度直接起飞~

最近做了一个项目,其中主要问题就是时间优化。优化了代码之后,时间还是达不到要求;有一个诡异的100ms左右的耗时问题,在接口中打印了请求处理时间后,和调用方的响应时间还有差了100ms左右。比如程序里记录150ms,但是调用方等待时间却为250ms左右。下面记录下当时详细的定位&解决流程(其实解决很简单,关键在于怎么定位并找到解决问题的方法)

2022-09-08 09:42:27 427

原创 一个合格的程序员必须处理好的跨域问题(附解决办法)

跨域问题的本质是浏览器为了保证用户的一种安全拦截机制,想要解决跨域问题,只需要告诉浏览器“我是自己人,不要拦我”就行。它的常见实现方式有 5 种:通过注解实现局部跨域、通过配置文件实现全局跨域、通过 CorsFilter 对象实现全局跨域、通过 Response 对象实现局部跨域,通过 ResponseBodyAdvice 实现全局跨域。

2022-09-08 09:20:06 412

原创 Spring关闭执行销毁方法有几种,看完才知道SmartLifecycle最快

大家好,这段时间在写业务代码的时候用到了Spring容器关闭执行销毁方法来关闭正在执行中的业务。学习了多种触发销毁方法的方式,由于业务场景不同,我们可能需要尽快的做销毁动作,或者最晚才执行销毁动作。刚好最近在看RocketMQ的源码,发现了他的关闭方式和我们以往的不一样,他使用的SmartLifecycle不是那么多人知道,但是他却能够在Spring容器一收到通知的时候,就调用销毁方法。帮大家整理出来,给我们设计方案的时候提供更多的思路。这个问题让我很深刻,记得之前有一个面试就被问到有没有使用过。

2022-09-07 13:06:40 463

原创 一个合格的Java选手必须要掌握的并发锁知识

Java内置锁:基于Java语法层面(关键词)实现的锁,主要是根据Java语义来实现,最典型的应用就是synchronized。Java显式锁:基于JDK层面实现的锁,主要是根据基于Lock接口和ReadWriteLock接口,以及统一的AQS基础同步器等来实现,最典型的有ReentrantLock。使用方式:synchronized关键字互斥锁主要有作用于对象方法上面,作用于类静态方法上面,作用于对象方法里面,作用于类静态方法里面等4种方式。

2022-09-07 10:58:55 406

原创 Netty之揭开NioEventLoop的面纱

Netty之揭开NioEventLoop的面纱

2022-09-06 16:06:14 210

原创 Java程序性能优化-如何用多线程来开发

多线程大家肯定都不陌生,理论滚瓜烂熟,八股天花乱坠,但是大家有多少在代码中实践过呢?很多人在实际开发中可能就用用@Async,new Thread()。线程池也很少有人会自己去建,默认的随便用用。在工作中大家对于多线程开发,大多是用在异步,比如发消息,但是对于提效这块最重要的优势却很少有人涉及。因此本篇文章会结合我自己的工作场景带大家去发掘项目中的多线程场景,让你的代码快如闪电。

2022-09-06 13:43:35 604

原创 JAVA之Swagger,提升开发效率用它很有必要

前面已经找到了一种思路将我们的定制逻辑注入到Swagger的文档生成框架中进行调用,那么下一步我们就得确认一种相对简单的策略,告诉框架哪个字段需要使用枚举来自动生成取值说明,以及使用哪个枚举类来生成。这里我们使用自定义注解的方式来实现。Swagger为不同的场景分别提供了@APIParam、、等不同的注解,我们可以简化下,提供一个统一的自定义注解即可。// 接口文档上的显示的字段名称,不设置则使用field本来名称// 字段简要描述,可选// 标识字段是否必填// 指定取值对应的枚举类。

2022-09-06 10:09:01 645

原创 一篇文章学懂Java并发之AQS

基于AQS构建同步器:SemaphoreFutureTask优势:AQS 解决了在实现同步器时涉及的大量细节问题,例如自定义标准同步状态、FIFO 同步队列。基于 AQS 来构建同步器可以带来很多好处。它不仅能够极大地减少实现工作,而且也不必处理在多个位置上发生的竞争问题。

2022-09-05 16:47:59 67

原创 「JVM」深入剖析HotspotJVM内存区域

本文详细的讲述了Java虚拟机运行时数据区的程序计数器、虚拟机栈,本地方法栈,方法区,堆,常量池,以及直接内存(堆外内存),对各个区域的作用,服务对象以及其中可能产生的问题展开讨论。

2022-09-05 16:26:55 113

原创 并发编程Bug起源:可见性、有序性和原子性问题

操作系统进入多核、多进程、多线程时代,这些升级会很大的提高程序的执行效率,但同时也会引发可见性、原子性、有序性问题。多核CPU,每个CPU都有各自的CPU缓存,每个线程更新变量会先同步在CPU缓存中,而此时其他线程,无法获取最新的CPU缓存值,这就是不可见性。count += 1含有多个CPU指令。当发生线程切换,会导致原子问题。编译优化器会调整程序的执行顺序,导致在多线程环境,线程切换带来有序的问题。

2022-09-05 16:09:36 62

原创 一篇文章玩转Java中的ThreadLocal,讲解清晰明了

多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。

2022-09-05 15:29:11 112

原创 深入剖析synchronized实现原理,让代码更优化

synchronized关键字保证方法或者代码块在运行时,同一时刻只有一个方法可以进入临界区,同时它还可以保证共享变量的内存可见性。

2022-09-05 13:53:35 163

空空如也

空空如也

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

TA关注的人

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