标签: Spring 全家桶

晴天 | 2024-06-17 | Spring 全家桶后端相关

一张长图透彻理解SpringBoot 启动原理,架构师必备知识,不为应付面试!

虽然Java程序员大部分工作都是 CRUD ,但是工作中常用的中间件必须和Spring集成,如果不知道Spring的原理,很难理解这些中间件和框架的原理。 一张长图透彻解释 Spring启动顺序 Timeout重构 (2).jpg 测试对Spring启动原理的理解程度 我举个例子,测试一下,你对Spring启动原理的理解程度。 1. Rpc框架和Spring的集成问题。Rpc框架何时注册暴露服务,在哪个Spring扩展点注册呢?init-method 中行不行? 2. MQ 消费组和Spring的集成问题。MQ消费者何时开始消费,在哪个Spring扩展点”注册“自己?init-method 中行不行? 3. SpringBoot 集成Tomcat问题。如果出现已开启Http流量,Spring还未启动完成,怎么办?Tomcat何时开启端口,对外服务? SpringBoot项目常见的流量入口无外乎 Rpc、Http、MQ ...

 366 |  0 |  0 Spring 全家桶后端相关

青木 | 2024-06-17 | Spring 全家桶后端相关

面试官:说说Spring事务传播机制?

Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 既然是“事务传播”,所以事务的数量应该在两个或两个以上,Spring 事务传播机制的诞生是为了规定多个事务在传播过程中的行为的。比如方法 A 开启了事务,而在执行过程中又调用了开启事务的 B 方法,那么 B 方法的事务是应该加入到 A 事务当中呢?还是两个事务相互执行互不影响,又或者是将 B 事务嵌套到 A 事务中执行呢?所以这个时候就需要一个机制来规定和约束这两个事务的行为,这就是 Spring 事务传播机制所解决的问题。 Spring 事务传播机制有哪些? Spring 事务传播机制可使用 @Transactional(propagation=Propagation.REQUIRED) 来定义,Spring 事务传播机制的级别包含以下 7 种: 1. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 2. Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果...

 304 |  0 |  0 Spring 全家桶后端相关

OOM | 2024-06-14 | Spring 全家桶后端相关

用 Arthas 定位 Spring Boot 接口的超时问题,让应用起飞~

背景 公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑,主要是转换报文和参数校验之类的工作,起着一个承上启下的作用。 最近在优化接口的响应时间,优化了代码之后,但是时间还是达不到要求;有一个诡异的100ms左右的耗时问题,在接口中打印了请求处理时间后,和调用方的响应时间还有差了100ms左右。比如程序里记录150ms,但是调用方等待时间却为250ms左右。 下面记录下当时详细的定位&解决流程(其实解决很简单,关键在于怎么定位并找到解决问题的方法) 定位过程 分析代码 渠道系统是一个常见的spring-boot web工程,使用了集成的tomcat。分析了代码之后,发现并没有特殊的地方,没有特殊的过滤器或者拦截器,所以初步排除是业务代码问题 分析调用流程 出现这个问题之后,首先确认了下接口的调用流程。由于是内部测试,所以调用流程较少。 Nginx -反向代理  渠道系统 公司是云服务器,网络走的也是云的内网。由于不明确问题的原因,所以用排除法,首先确认服务器网络是否有问题。 先确认发送端到 Nginx Host

 369 |  1 |  0 Spring 全家桶后端相关

iron Man | 2024-06-12 | Spring 全家桶后端相关

网易面试:SpringBoot如何开启虚拟线程?

虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领域的一项重要创新。 PS:虚拟线程正式发布于 Java 长期支持版(Long Term Suort,LTS)Java 21(也就是 JDK 21)。 虚拟线程是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下: 1.虚拟线程使用 虚拟线程的创建有以下 4 种方式: 1. Thread.startVirtualThread(Runnable task) 2. Thread.ofVirtual().unstarted(Runnable task) 3. Thread.ofVirtual().fa...

 292 |  0 |  0 Spring 全家桶后端相关

大牛猫 | 2024-06-10 | Spring 全家桶后端相关

公司禁止在 SpringBoot 中使用 @Autowired 注解,为什么?

前言 Spring 官方已不推荐使用 Autowired 字段/属性注入 bean,一些大公司的新项目也明令禁止使用了。 说明 最近公司升级框架,由原来的 spring framework 3.0 升级到 5.0,然后写代码的时候突然发现 idea 在属性注入的 @Autowired 注解上给出警告提示,就像下面这样的,也是挺懵逼的,毕竟这么写也很多年了。 ❝Field injection is not recommended ❞ 查阅了相关文档了解了一下,原来这个提示是 spring framework 4.0 以后开始出现的,spring 4.0 开始就不推荐使用属性注入,改为推荐构造器注入和 setter 注入。 下面将展示了 spring 框架可以使用的不同类型的依赖注入,以及每种依赖注入的适用情况。 依赖注入的类型 尽管针对 spring framework 5.1.3 的文档只定...

 344 |  0 |  0 Spring 全家桶后端相关

孤音 | 2024-05-29 | Spring 全家桶后端相关

SpringBoot 动态加载 Jar 包,玩转动态配置!

本文将详细介绍如何在Spring Boot应用程序中动态加载Jar包。我们将探讨动态加载Jar包的基本概念,以及如何使用Spring Boot的类加载器和第三方库来实现Jar包的动态加载。 此外,我们将通过具体的示例来展示如何在Spring Boot应用程序中配置和使用Jar包的动态加载,以提高系统的灵活性和可扩展性。 ❝本文适合希望使用动态加载Jar包来增强Spring Boot应用程序功能的开发者阅读。 ❞ 一、引言 在现代Web应用程序中,动态加载组件是一种常见的技术,用于实现模块化和动态扩展功能。Jar包是Java应用程序的基本构建单元,动态加载Jar包可以提高系统的灵活性和可扩展性。 Spring Boot提供了一种简便的方式来集成动态加载Jar包,通过集成类加载器和第三方库来实现这一功能。本文将介绍如何在Spring Boot应用程序中实现动态加载Jar包,并探讨如何使用Spring Boot和第三方库来实现这一机制。 二、动态加载Jar包的基本概念 1. 什么是动态加载Jar包? 动态加载Jar包是指在应用程序运行时,动态...

 657 |  0 |  0 Spring 全家桶后端相关

大牛猫 | 2024-05-28 | Spring 全家桶后端相关

SpringBoot + 虚拟线程,性能炸裂!

什么是虚拟线程 虚拟线程是Java19开始增加的一个特性,和Golang的携程类似,一个其它语言早就提供的、且如此实用且好用的功能,作为一个Java开发者,早就已经望眼欲穿了。 虚拟线程和普通线程的区别 “虚拟”线程,望文生义,它是“假”的,它不直接调度操作系统的线程,而是由JVM再提供一层线程的接口抽象,由普通线程调度,即一个普通的操作系统线程可以调度成千上万个虚拟线程。 虚拟线程比普通线程的消耗要小得多得多,在内存足够的情况下,我们甚至可以创建上百万的虚拟线程,这在之前(Java19以前)是不可能的。 ❝其实如果有用过akka的朋友们会发现,其实两者很相似,只不过使用akka是应用程序来处理,而虚拟线程是JVM来处理,使用上更简洁且方便。 ❞ SpringBoot使用虚拟线程 下面我们会在SpringBoot中使用虚拟线程,将默认的异步线程池和http处理线程池替换为虚拟线程,然后对比虚拟线程和普通线程的性能差异,你会发现差别就像马车换高铁,不是一个时代的东西。 配置 首先我们使用的Java版本是java-20.0.2-ora...

 238 |  0 |  0 Spring 全家桶后端相关

布朗熊 | 2024-05-27 | Spring 全家桶后端相关

SpringBoot接口防抖(防重复提交)的一些实现方案

前言 作为一名老码农,在开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。 啥是防抖 所谓防抖,一是防用户手抖,二是防网络抖动。在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。要针对用户的误操作,前端通常会实现按钮的loading状态,阻止用户进行多次点击。而对于网络波动造成的请求重发问题,仅靠前端是不行的。为此,后端也应实施相应的防抖逻辑,确保在网络波动的情况下不会接收并处理同一请求...

 658 |  0 |  0 Spring 全家桶后端相关

温酒 | 2024-05-22 | Spring 全家桶后端相关

这些年背过的面试题——SpringCloud篇

Why SpringCloud Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如 服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控 等,都可以用 spring boot 的开发风格做到一键启动和部署。 SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案, 旨在快速搭建单个微服务 ,SpringCloud是依赖于SpringBoot的,而SpringBoot并不是依赖与SpringCloud,甚至还可以和Dubbo进行优秀的整合开发。 MartinFlower 提出的微服务之间是通过 RestFulApi 进行通信,具体实现: RestTemplate:基于HTTP协议; Feign:封装了ribbon和 Hystrix 、RestTemplate...

 336 |  0 |  0 Spring 全家桶后端相关

晴天 | 2024-05-21 | Spring 全家桶后端相关

一张长图透彻理解 SpringBoot 启动原理,架构师必备知识,不为应付面试!

虽然Java程序员大部分工作都是 CRUD ,但是工作中常用的中间件必须和Spring集成,如果不知道Spring的原理,很难理解这些中间件和框架的原理。 一张长图透彻解释 Spring启动顺序 测试对Spring启动原理的理解程度 我举个例子,测试一下,你对Spring启动原理的理解程度。 Rpc框架和Spring的集成问题。Rpc框架何时注册暴露服务,在哪个Spring扩展点注册呢? init-method 中行不行? MQ 消费组和Spring的集成问题。MQ消费者何时开始消费,在哪个Spring扩展点”注册“自己? init-method 中行不行? SpringBoot 集成Tomcat问题。如果出现已开启Http流量,Spring还未启动完成,怎么办?Tomcat何时开启端口,对外服务? SpringBoot项目常见的流量入口无外乎 Rpc、Http、MQ 三种方式。一名合格的架构师必须精通...

 274 |  0 |  0 Spring 全家桶后端相关

念旧。 | 2024-05-20 | Spring 全家桶Java后端相关

阿里一面:说一说Java、Spring、Dubbo三者SPI机制的原理和区别

今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。 其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是简单地介绍了一下Java、Spring的SPI机制,并没有进行深入,所以本篇就来深入聊一聊这三者的原理和区别。 什么是SPI SPI全称为 Service Provider Interface ,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。 简单来说SPI是一种非常优秀的设计思想,它的核心就是解耦、方便扩展。 Java SPI机制--ServiceLoader ServiceLoader是Java提供的一种简单的SPI机制的实现,Java的SPI实现约定了以下两件事: 文件必须放在 META-INF/services/ 目录底下 文件名必须为接口的全限定名,内容为接口实现的全限定名 这样就能够通过Service...

 237 |  0 |  0 Spring 全家桶Java

奈我何 | 2024-05-17 | Spring 全家桶后端相关

springboot + nacos + k8s 优雅停机

概念 优雅停机是什么?网上说的优雅下线、无损下线,都是一个意思。 优雅停机,通常是指在设备、系统或应用程序中止运作前,先执行一定的流程或动作,以确保数据的安全、预防错误并保证系统的整体稳定。 一般来说,优雅停机可以参考以下步骤以实现: 1. 备份数据 :立即将内存中的所有未保存的修改、缓存等数据保存到数据库或磁盘中。 2. 停止接收新的请求 3. 处理未完成的请求 4. 通知其他依赖组件 5. 等待所有要素安全退出后,关闭系统 在具体实施时,不同的设备、不同的系统、不同的应用,所需要的优雅停机步骤也不尽相同,甚至需要根据不同的场景来选择不同的方法。 例如,在某些情况下,你可能需要让用户知道,系统即将关闭,并告诉他们应当保存所有的工作并退出系统;而在另一些情况下,你可能需要设计一种策略,能够让系统在无用户介入的情况下,自动保存所有的状态,并在下次启动时恢复之。 但是,无论在哪种情况下,优雅停机的目标都是保护数据,避免错误,并尽量减少到访用户或使用者的不便。 上面的步骤,其实还缺了不少基础的内容,比如,停止请求外,还要停止接收...

 255 |  0 |  0 Spring 全家桶后端相关

iron Man | 2024-05-16 | Spring 全家桶后端相关

一万字教程详解:教会你如何在 SpringBoot 中使用 WebSocket

一、第一种方式-原生注解(tomcat内嵌) 1.1、引入依赖 <dependency    <groupId org.springframework.boot</groupId    <artifactId spring-boot-starter-websocket</artifactId </dependency 1.2、配置文件 package cn.jt.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; /    @author GXM    @version 1.0.0    @Description TODO    @createTime 2023年07月06日

 232 |  0 |  0 Spring 全家桶后端相关

雪千寻 | 2024-05-10 | Spring 全家桶后端相关

Spring Boot 调用外部接口的 3 种方式,还有谁不会?!

1、简介 SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部 url 链接的需求, 比如在apaas开发过程中需要封装接口在接口中调用apaas提供的接口(像发起流程接口submit等等)下面也是提供了三种方式(不使用dubbo的方式)供我们选择 2、方式一:使用原始httpClient请求 /    @description get方式获取入参,插入数据并发起流程    @author lyx    @date 2022/8/24 16:05    @params documentId    @return String   / // @RequestMapping("/submit/{documentId}") public String submit1(@PathVariable String documentId) throws ParseException {    

 315 |  0 |  0 Spring 全家桶后端相关

温酒 | 2024-05-09 | Spring 全家桶后端相关

SpringBoot 实现 RAS+AES 自动接口解密

一、讲个事故 接口安全老生常谈了 过年之前做了过一款飞机大战的H5小游戏,里面无限模式-需要保存用户的积分,因为使用的Body传参,参数是可见的。 为了接口安全我,我和前端约定了传递参数是:用户无限模式的积分+“我们约定的一个数字”+用户id的和,在用Base64加密,请求到服务器我再解密,出用户无限模式的积分;如下: {     "integral": "MTExMTM0NzY5NQ ", } 可是过年的时候,运营突然找我说无限模式积分排行榜分数不对: 这就很诡异了,第二名才一万多分,第一名就40多万分!!!! 一开始我以为是我解密有问题,反复看了好几变,可就两三行代码不可能有问题的!!! 没办法我去翻了好久的日志,才发现这个用户把我接口参数给改了。。。。 他把B

 235 |  0 |  0 Spring 全家桶后端相关