自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring Boot集成WebSocket实现消息推送

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。浏览器和服务器仅需一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

2022-08-22 21:39:23 2520 1

原创 记一次简单的 JVM 调优

最近对负责的项目进行了一次性能优化,其中包括对 JVM 参数的调整,算是进行了一次简单的 JVM 调优,JVM 参数调整之后,服务的整体性能有 5% 左右的提升,还算不错。先介绍一下项目的基本情况:项目是一个高 QPS 压力的 web 服务,单机 QPS 一直维持在 1.5K 以上,由于旧机器的”拖累”,配置的堆大小是 8G,其中 young 区是 4G,垃圾回收器用的是 parNew + CMS。

2022-08-22 20:57:12 325

原创 Java Reference核心原理分析

本文通过两个问题引出了JDK中Reference相关类的源码分析,最终给出了问题的答案。但实际上一般开发规范中都会建议禁止重写Object#finalize方法同样与Reference类关系密切(具体而言是Finalizer类)。后面我还会继续分享一些自己觉得比较重要的东西给大家。由于个人能力有限,文中不足与错误还望指正。

2022-08-22 20:44:55 621

原创 Spring Boot引起的“堆外内存泄漏”排查及经验总结

▲流程图整个内存分配的流程如上图所示。MCC扫包的默认配置是扫描所有的JAR包。在扫描包的时候,Spring Boot不会主动去释放堆外内存,导致在扫描阶段,堆外内存占用量一直持续飙升。当发生GC的时候,Spring Boot依赖于finalize机制去释放了堆外内存;但是glibc为了性能考虑,并没有真正把内存归返到操作系统,而是留下来放入内存池了,导致应用层以为发生了“内存泄漏”。所以修改MCC的配置路径为特定的JAR包,问题解决。

2022-08-22 20:26:17 334

转载 JVM 源码分析之一个 Java 进程究竟能创建多少线程

通过对 JVM,glibc,Linux kernel 的源码分析,我们暂时得出了一些影响线程创建的因素,包括JVM:Xmx,Xss,MaxPermSize,MaxDirectMemorySize,ReservedCodeCacheSize 等Kernel:max_user_processes,max_map_count,max_threads,pid_max 等由于对 kernel 的源码研读时间有限,不一定总结完整,大家可以补充。

2022-08-22 19:59:15 211

转载 这些不可不知的JVM知识,我都用思维导图整理好了

JVM是面试中必问的部分,本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。

2022-08-22 16:54:19 85

转载 AQS同步组件-CountDownLatch解析和案例

所以当N个线程都调用了这个方法,count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务。(3)死锁检测:一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务。上面的代码中,我们定义了请求的数量为200,当这200个请求被处理完成之后,才会执行System.out.println("finish");CountDownLatch是一次性的,

2022-08-21 16:02:56 120

转载 分布式压测

到这里,大家也对分布式压测有个大概了解了,很多大厂都会采用该技术方案来保障线上环境的稳定,包括数列科技开源的Takin框架。

2022-08-21 15:51:08 303

转载 Spring Cloud | Nacos + Spring Cloud Gateway整合示例

断言是Java 8提供的一个函数式接口,它允许接收一个参数并返回一个布尔值,可以用于条件过滤、请求参数的校验。三者的版本应该是有对应关系的,如果版本对应不上,可能会有意想不到的BUG。这些断言会分别匹配 HTTP 请求的不同属性,并且多个断言可以通过 and 逻辑进行组合。我没有深究错误原因,然后就尝试了第二套版本,没有再报错。网关是所有微服务的门户,我总结了一些网关的常用应用场景。过滤器分为Pre类型的过滤器和Post类型的过滤器。最初的时候,我使用的是第一套版本。一个简单的用于测试接口的控制器类。

2022-08-21 15:41:11 351

转载 自定义springboot starter

日常工作中有时有一些独立于业务之外的功能或模块,可能这个项目在用,另一个项目也要用,如果每次都重新集成的话就会很麻烦,这时我们只要把这些功能或模块封装成一个个starter的话,在使用的时候引入进去就很方便了。新建两个模块,命名规范: springboot自带的starter命名规范为spring-boot-starter-xxx, 自定义的starter命名规范为xxx-spring-boot-starter● xxx-spring-boot-autoconfigure:自动配置核心代码。

2022-08-21 15:25:08 284

转载 SpringBoot:如何优雅地进行响应数据封装、异常处理?

本篇文章介绍了基于SpringBoot的实现,如果你的项目中采用了其他的技术栈,则可考虑对应的处理方式。像上面的示例,用200表示返回成功,这就是遵循HTTP响应状态码的形式来返回,比如还有其他的400、401、404、500等。在上述方法中,对一些常见的异常进行了统一处理。通常情况下,根据业务需要还会定义业务异常,并对业务异常进行处理,大家可以根据自己项目中异常的使用情况进行拓展。在此,笔者暂不评论每种形式的好坏,只列举了常规的几种形式,大家了解对应的情况,做到心中有数,有所选择即可。

2022-08-21 15:11:33 195

转载 Java多线程工具CompletableFuture

Future的问题写多线程程序的时候,可以使用Future从一个异步线程中拿到结果,但是如果使用过程中会发现一些问题:如果想要对Future的结果做进一步的操作,需要阻塞当前线程多个Future不能被链式的执行,每个Future的结果都是独立的,期望对一个Future的结果做另外一件异步的事情;没有异常处理策略,如果Future执行失败了,需要手动捕捉CompletableFuture应运而生。

2022-08-21 15:01:58 472

转载 深入剖析Spring Boot 的SPI机制

SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要用于框架中开发,例如Dubbo、Spring、Common-Logging,JDBC等采用采用SPI机制,针对同一接口采用不同的实现提供给不同的用户,从而提高了框架的扩展性。

2022-08-21 14:49:50 210

转载 吃透JAVA的Stream流操作,多年实践总结

在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过进行逐个处理,或者的方式进行处理。例如,现在有这么一个需求:从给定句子中返回单词长度大于5的单词列表,按长度倒序输出,最多返回3个在的代码中,我们会可以照如下的方式进行实现:在直观感受上,Stream的实现方式代码更加简洁、一气呵成。很多的同学在代码中也经常使用Stream流,但是对Stream流的认知往往也是仅限于会一些简单的filter、map、collect。

2022-08-21 14:21:57 162

转载 Java 定时任务技术趋势

定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等。Java 中自带的解决方案1使用 Timer创建 java.util.TimerTask 任务,在 run 方法中实现业务逻辑。通过 java.util.Timer 进行调度,支持按照固定频率执行。所有的 TimerTask 是在同一个线程中串行执行,相互影响。

2022-08-21 13:52:50 75

转载 一个优秀的Controller层逻辑

原来的代码中可以看到有几个问题抛出的异常不够具体,只是简单地把错误信息放到了 Exception 中抛出异常后,Controller 不能具体地根据异常做出反馈虽然做了参数自动校验,但是异常返回结构和正常返回结构不一致。

2022-08-21 13:26:12 976

转载 Maven依赖管理:控制依赖的传递

Maven的依赖机制(Dependency Mechanism)是Maven最著名的特性,并且是Maven在依赖管理领域中最令人称道的。因此,对Maven的依赖机制有深入的理解,对使用Maven非常必要。

2022-08-19 19:06:27 628

转载 分析开源项目源码,我们该如何入手分析?(授人以渔)

在工作之余开始写SpringBoot源码分析专栏前,跟小伙伴们聊聊“”这个话题,我们就随便扯皮,反正是跟小伙伴们一起学习交流,没必要太正式。小伙伴们看完本文后,若有自己的源码阅读心得可以在下面进行评论或私聊我进行分享,,嘿嘿。

2022-08-19 17:23:46 624

转载 可能是把 ZooKeeper 概念讲的最清楚的一篇文章

Zookeeper最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。关于“ZooKeeper”这个项目的名字,其实也有一段趣闻。在立项初期,考虑到之前内部很多项目都是使用动物的名字来命名的(例如著名的Pig项目),雅虎的工程师希望给这个项目也取一个动物的名字。

2022-08-19 17:14:53 70

转载 Dubbo 基础教程

当服务越来越多时,容量的评估,小服务资源的浪费等问题逐渐显现,此时需要增加一个调度中心基于访问压力实时管理集群容量,提供集群利用率。其中,用于提高机器利用率的资源调度和治理中心是关键。Dubbo 是阿里巴巴开源项目的一个分布式服务框架。其致力于提供高性能和透明化的 RPC 远程调用方案,以及 SOA 服务治理方案。2.2 原理dubbo 原理图1) 服务容器启动、加载和运行服务提供者;2) 服务提供者在启动时,向注册中心注册自己提供的服务;3) 服务消费者在启动时,向注册中心订阅自己所需的服务;

2022-08-19 17:00:11 243

转载 通俗易懂的Redis数据结构基础教程

Redis有5个基本数据结构,string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了。

2022-08-19 16:38:50 48

转载 Java后端学习路线

在写这个文章之前,我花了点时间,自己臆想了一个电商系统,基本上算是麻雀虽小五脏俱全,我今天就用它开刀,一步步剖析,我会讲一下我们可能会接触的技术栈可能不全,但是够用,最后给个学习路线。:请多欣赏一会,每个点看一下,看看什么地方是你接触过的,什么技术栈是你不太熟悉的,我觉得还算是比较全的,有什么建议也可以留言给我。不知道大家都看了一下没,现在我们就要庖丁解牛了,我从上到下依次分析。

2022-08-19 16:06:34 130

转载 必看!java后端,

你可能有所感悟。零散的资料读了很多,但是很难有提升。到处是干货,但是并没什么用,简单来说就是缺乏系统化。另外,噪音太多,雷同的框架一大把,我不至于全都要去学了吧。这里,我大体根据基础、Java基础、Java进阶给分了下类,挑的也都是最常用最重要的工具。

2022-08-19 15:53:36 1814

转载 分布式事务解决方案:

seata基于java的spi机制提供了自定义实现接口的功能,我们只需要在自己的服务中,根据seata的接口写好自己的实现类即可。SPI(Service Provider Interface)是JDK内置的服务发现机制,用在不同模块间通过接口调用服务,避免对具体服务服务接口具体实现类的耦合。

2022-08-19 15:18:15 201

转载 秒杀架构实践

尽量将请求拦截在上游。还可以根据 UID 进行限流。最大程度的减少请求落到 DB。多利用缓存。同步操作异步化。fail fast,尽早失败,保护应用。

2022-08-19 14:32:32 98

转载 SpringCloud整体架构概览

协调任何服务,简化分布式系统开发。构建分布式系统不应该是复杂的,SpringCloud对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性、可靠、协调的应用程序。SpringCloud是在SpringBoot的基础上构建的,使开发者可以轻松入门并快速提高工作效率。SpringCloud为开发人员提供了快速构建分布式系统架构的工具,例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,领导选举,分布式会话,集群状态等。

2022-08-19 14:03:35 273

转载 讲透JAVA Stream的collect用法与原理

前面我们演示了很多Collectors工具类中提供的收集器的用法,上一节中列出来的Collectors提供的常用收集器,也可以覆盖大部分场景的开发诉求了。但也许在项目中,我们会遇到一些定制化的场景,现有的收集器无法满足我们的诉求,这个时候,我们也可以自己来实现定制化的收集器。我们知道,所谓的收集器,其实就是一个Collector接口的具体实现类。所以如果想要定制自己的收集器,首先要先了解Collector接口到底有哪些方法需要我们去实现,以及各个方法的作用与用途。当我们新建一个。...

2022-08-18 20:47:54 627

转载 Java Agent 探针技术

Java Agent 直译为 Java 代理,也常常被称为 Java 探针技术。Java Agent 是在 JDK1.5 引入的,是一种可以动态修改 Java 字节码的技术。Java 中的类编译后形成字节码被 JVM 执行,在 JVM 在执行这些字节码之前获取这些字节码的信息,并且通过字节码转换器对这些字节码进行修改,以此来完成一些额外的功能。Java Agent 是一个不能独立运行 jar 包,它通过依附于目标程序的 JVM 进程,进行工作。...

2022-08-18 20:18:52 946

转载 Java线程池解析

LinkedBlockingQueue(可设置容量队列)基于链表结构的阻塞队列,按FIFO排序任务,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列,最大长度为Integer.MAX_VALUE,吞吐量通常要高于ArrayBlockingQuene;在使用线程池处理任务的时候,任务代码可能抛出RuntimeException,抛出异常后,线程池可能捕获它,也可能创建一个新的线程来代替异常的线程,我们可能无法感知任务出现了异常,因此我们需要考虑线程池异常情况。...

2022-08-18 20:04:34 618 1

转载 分布式系统中数据存储方案实践

在项目研发的过程中,对于数据存储能力的依赖无处不在,项目初期,相比系统层面的组件选型与框架设计,由于数据体量不大,在存储管理方面通常容易被轻视,当项目发展进入到中后期阶段,系统的复杂性很大程度来源于数据层面;从常规的微服务架构体系来看,对于系统中的数据存储可以划分如下几个模块:组件库、应用库、业务库、公共库、中间件数据、第三方;不同的场景下对数据存储能力的要求和依赖程度也各不相同;组件库:微服务架构下,诸多基础的框架组件都依赖数据的持久化存储,以此来确保服务能力的稳定可控,避免异常情况下的数据丢失问题。..

2022-08-18 19:46:09 113

转载 探秘Java:谈一谈JVM调优

以上的一些分析和总结都是基于ParNew+CMS垃圾收集器或者之前的经典的垃圾收集器,对于诸如G1、ZGC等新一代的垃圾收集器并不非常适用。这么说的原因主要在于随着垃圾收集器的不断进化,诸如上面提到的新生代大小的调节已经不需要人工进行处理,G1收集已经做到了可以根据应用程序运行时进行动态的调整以保证程序以最优的情况进行执行。这也是笔者在逛一些论坛或者看一些博客时,看到有人评论可能在未来的某一天JVM可以真正意义上实现内存的自动化管理,再也不需要人工调优。...

2022-08-18 19:36:00 73

转载 Java运行方式、程序结构以及notepad++

当JVM启动执行程序时,会寻找指定的类,定位到类中的main方法,接着执行main方法中的每条指令。在学习Java初期,主要是通过敲写一些相对简单的代码,运行并得到输出结果,不需要和其他进行交互,因此暂时还用不到如IDEA、eclipse等集成开发环境,仅仅需要一个简单的编辑器就可以了。atom是一款可以对代码进行高亮的编辑器,并提供了代码补充模式,它就是文本文档的高级形式,运行程序还需要通过命令行的形式,先对文件进行编译,之后再运行。main函数是程序的入口。源文件中有类,类中由方法,方法中有具体实现。.

2022-08-18 19:28:07 110

转载 JavaBeanInfo 和 Spring 之间的关系

从笔者的角度来看 Bean 这个对象我觉得可以分成这三种,第一种是关于 Bean 属性的,第二种是关于属性操作的方法,第三种是提供外部操作的方法。这个问题的答案其实就是我们前面所编写的那段创建对象的代码。我们通常情况下会有这两种对象的定义解释,那么这个定义解释在 Java 中是如何对其进行定义的呢。这样一个方法后,我们再来看一些生命周期,Spring 当中的各类生命周期其实就是围绕者这段代码的前后来做各种补充操作,对象,存在多个属性,我们在对这个 Bean 对象定义的时候正常情况下我们会放入。...

2022-08-18 19:18:09 138

转载 Java 之SpringBoot+Vue实现后台管理系统的开发

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。...

2022-08-18 19:02:43 2223

转载 Spring Boot Admin,贼好使!

Spring Boot Admin(SBA)是一个社区开源项目,用于管理和监视 Spring Boot 应用程序,它提供详细的健康 (Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存查看和管理等功能。...

2022-08-18 16:22:16 226

转载 FutureTask源码深度剖析

方法,这个线程会消费调用这个方法的线程一个许可证,因为线程的默认许可证的个数是0,如果调用一次那么许可证的数目就变成-1,当许可证的数目小于0的时候线程就会阻塞,因此如果线程从来没用调用。方法,同park方法一样,nanos表示最长阻塞超时时间,超时后park方法将自动返回,如果调用这个方法的线程有许可证的话也不会阻塞。,这整个操作是原子的(因为可能多个线程同时调用这个函数,因此需要保证操作是原子的),如果操作成功返回。类当中的方法进行实现的,他底层的方法是通过依赖JVM实现的。...

2022-08-18 15:56:59 88

转载 Spring 源码解析 | 核心功能

Spring Bean 是 Spring 通过 Spring 容器创建的 Java 对象。它们被 Spring IOC 容器初始化、装配和管理。这些 Bean 通过容器中配置的元数据创建。Spring 框架中定义的 Bean 默认都是单例的。可以通过注解进行标记,如果需要申明为原型 Bean 那么就可以用。Advice注解一共有五种,分别是:1.@Before前置通知前置通知在切入点运行前执行,不会影响切入点的逻辑2.@After后置通知。...

2022-08-17 21:52:52 64

转载 Java 并发编程解析 | 如何正确Java领域中的线程机制,我们应该知道的那些事?

综合Java EE的这些技术,我们可以根据我们的实际需要和满足我们的业务需求的情况下,可以快速构建出一个具备高性能,结构严谨且相对稳定的应用平台,虽然现在云原生时代异军突起许多基于非Java的其他技术平台,但是在分布式时代,Java EE是用于构建SOA架构的首先平台,甚至基于SpringCloud构建微服务应用平台也离不开Java EE 的支撑。当然,Java的发展也不是一帆风顺的,也曾被许多开发者诟病和嫌弃,但是就凭Java在行业里能否覆盖的场景来说,对于它的友好性和包容性,这不由让我们心怀敬意。...

2022-08-17 21:36:08 227

转载 Java面试题总结

应用类加载器,又称系统类加载器。它负责在 JVM 启动时,加载来自在命令 java 中的-classpath 或者 java.class.path 系统属性或者 CLASSPATH 操作系统属性所指定的 JAR 类包和类路径。扩展类加载器,主要负责加载 Java 的扩展类库,默认加载 JAVA_HOME/jre/lib/ext/ 目录下的所有 Jar 包或者由 java.ext.dirs 系统属性指定的 Jar 包。引导类加载器,又称启动类加载器,是最顶层的类加载器,主要用来加载 Java 核心类,如 rt

2022-08-17 21:07:59 81

转载 分布式限流

本文接着上文应用限流进行讨论。之前谈到的限流方案只能针对于单个 JVM 有效,也就是单机应用。而对于现在普遍的分布式应用也得有一个分布式限流的方案。限流在一个高并发大流量的系统中是保护应用的一个利器,成熟的方案也很多,希望对刚了解这一块的朋友提供一些思路。...

2022-08-17 16:02:56 244

空空如也

空空如也

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

TA关注的人

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