标签: Java

念旧。 | 14小时前 | 后端相关JavaSpring 全家桶

阿里一面:说一说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...

 7 |  0 |  0 后端相关Java

青木 | 1周前 | Java算法

架构设计中如何应对接口级故障?

在实际业务运行过程中,有一种故障影响可能没有那么大,但发生的概率较高,这就是今天聊的接口级的故障。 接口级故障的典型表现就是,系统并没有宕机、网络也没有中断,但业务却出现问题了,例如业务响应缓慢、大量访问超时和大量访问出现异常(给用户弹出提示“无法连接数据库”)。 这类问题的主要原因在于系统压力太大、负载太高,导致无法快速处理业务请求,由此引发更多的后续问题。最常见的情况就是,数据库慢查询将数据库的服务器资源耗尽,导致读写超时,业务读写数据库时要么无法连接数据库、要么超时,最终用户看到的现象就是访问很慢,一会儿访问抛出异常,一会儿访问又是正常结果。 如果进一步探究,导致接口级故障的原因可以分为两大类: 1. 内部原因 :包括程序bug导致死循环,某个接口导致数据库慢查询,程序逻辑不完善导致耗尽内存等。 2. 外部原因 :包括黑客攻击,促销或者抢购引入了超出平时几倍甚至几十倍的用户,第三方系统大量请求,第三方系统响应缓慢等。 解决接口级故障的核心思想和异地多活基本类似,都是 优先保证核心业务 和 优先保证绝大部分用户 。常见的应对方法有四种,降级、...

 42 |  0 |  0 Java算法

花小染 | 3周前 | 后端相关Java

如何使用 Java 读取 Excel、docx、pdf 和 txt 文件?

如何使用 Java 读取 Excel、"doc"、"docx"、"pdf" 和 "txt" 文件。 在 Java 开发中,我们经常需要读取不同类型的文件,包括 Excel 表格文件、"doc" 和 "docx" 文档文件、PDF 文件以及纯文本文件。 其中最常用的是 Apache POI 库。Apache POI 是一个流行的 Java 库,提供了许多 API 来读取和写入 Microsoft Office 文档,包括 Excel、Word 和 PowerPoint 等。 本文将介绍如何使用 Java 读取这些不同类型的文件。(本文的方法可供参考,还有其它方法读者自行查阅。) 1.举个栗子 以下是本人在开发过程中,读取"doc"、"docx"、"pdf" 和 "txt" 文件的代码例子,后面将详细解释。 txt文件读取不多说,用流读取。 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.apach

 59 |  0 |  0 后端相关Java

流苏 | 4周前 | 后端相关JavaSpring 全家桶

利用 Java 反射机制提高 SpringBoot 的代码质量

保持好的代码质量和遵守编码标准是开发可维护和健壮软件的重要方面。在 Spring Boot 应用程序中,确保始终遵循命名约定、代码结构和其他质量标准是一项艰巨的任务,尤其是当项目的复杂性和规模不断扩大时更是如此。 “在本文中,我们将探讨如何使用 Java 反射来提高 Spring Boot 应用程序的代码质量和可维护性。 代码质量的重要性 代码质量不仅仅是个人喜好的问题;它直接影响项目的可维护性、可扩展性和健壮性。代码质量的一致性对于基于团队的开发至关重要,因为它可以促进协作、减少混乱,并使得随着时间的推移更容易管理和发展代码库。 Spring Boot 项目中的痛点问题 Spring Boot 以其强大的功能和灵活性,使开发人员能够构建广泛的应用程序。然而,Spring Boot 极具吸引力的灵活性也可能导致代码质量不一致。开发人员可能会无意中偏离既定的命名约定、项目结构和编码标准。 使用 Java 反射来提高质量 为了解决这些代码质量带来的风险,我们可以利用 Java强大的反射功能来扫描和验证我们的代码库。Java 反射允许我们在运行时检查和操...

 78 |  0 |  0 后端相关Java

柚香 | 4周前 | 后端相关Java

常见 Java 代码缺陷及规避方式

问题列表 空指针异常 NPE 或许是编程语言中最常见的问题,被 Null 的发明者托尼·霍尔(Tony Hoare)称之为十亿美元的错误。在 Java 中并没有内置的处理 Null 值的语法,但仍然存在一些相对优雅的方式能够帮助我们的规避 NPE。 使用 JSR-305/jetbrain 等注解 1. NotNull 2. Nullable 通过在方法参数、返回值、字段等位置显式标记值是否可能为 Null,配合代码检查工具,能够在编码阶段规避绝大部分的 NPE 问题,建议至少在常用方法或者对外 API 中使用该注解,能够对调用方提供显著的帮助。 用 Optional 处理链式调用 Optional 源于 Guava 中的 Optional 类,后 Java 8 内置到 JDK 中。Optional 一般作为函数的返回值,强制提醒调用者返回值可能不存在,并且能够通过链式调用优雅的处理空值。...

 79 |  0 |  0 后端相关Java

追风少年 | 5周前 | 后端相关Java

常见 Java 代码缺陷及规避方式

问题列表 空指针异常 NPE 或许是编程语言中最常见的问题,被 Null 的发明者托尼·霍尔(Tony Hoare)称之为十亿美元的错误。在 Java 中并没有内置的处理 Null 值的语法,但仍然存在一些相对优雅的方式能够帮助我们的规避 NPE。 使用 JSR-305/jetbrain 等注解 1. NotNull 2. Nullable 通过在方法参数、返回值、字段等位置显式标记值是否可能为 Null,配合代码检查工具,能够在编码阶段规避绝大部分的 NPE 问题,建议至少在常用方法或者对外 API 中使用该注解,能够对调用方提供显著的帮助。 用 Optional 处理链式调用 Optional 源于 Guava 中的 Optional 类,后 Java 8 内置到 JDK 中。Optional 一般作为函数的返回值,强制提醒调用者返回值可能不存在,并且能够通过链式调用优雅的处理...

 101 |  0 |  0 后端相关Java

女王范 | 5周前 | 后端相关Java

聊聊Java中代码优化的30个小技巧

前言 我之前写过两篇关于优化相关的问题:《[聊聊sql优化的15个小技巧](https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ &mid=2247490473&idx=1&sn=ba07d64aa8c89054bd263efd660d3a3f&chksm=c0ebc341f79c4a579a6f41465df0459a696ab8ef0499a5f6fd76269af1064fde0286afdb027d&token=751314179&lang=zh_CN&scene=21 wechat_redirect)》和《[聊聊接口性能优化的11个小技巧](https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ &mid=2247490731&idx=1&sn=29ed0295c7990157a3a56ba33cf7f8be&chksm=c0ebc443f79c4d55a2bac81744992c96f97737e5d0717ec99231f4d08f57a7f0220eafdac9c9&token

 104 |  0 |  0 后端相关Java

追风少年 | 6周前 | 后端相关Java

Java 22 新增利器: 使用 Java Stream Gather 优雅地处理流中的状态

本文我们分析了 什么 是 “流”,对比了 Java 上几种常见的 “流”库,引入和详细介绍了 Java 22 中的 Stream Gather API 。同时也简单分享了利用 虚拟线程 如何简化 Stream <span mapConcurrent</span 操作符的实现。 01背景 Java Stream 自从 Java 1.8 引入以来,迅速成为了各位开发者手中信手拈来的工具,大家日常在工作中谈论起来也是如数家珍。但由于 Java Stream 的操作符不足够的丰富,经常会遇到捉襟见肘的情况。对于此,大家可能会继而采用操作符更加丰富的库来作为替代。作为 Java 标准库的一部分,Oracle 的 Java 架构师们也一直以来都在探索如何更好的适应日益增长的用户需求和语言的可维护性,随着 Stream Gather API 的到来,这个情况得到了极大的改善,下面让我结合自身经验,和大家分享 Java Stream Gather API。 02 什么 是 Stream ? 在编程语言生态中,Stream 是一个抽象的概念,代表了一组连...

 142 |  0 |  0 后端相关Java

一纸荒年 | 7周前 | 后端相关Java

Java线程池中线程异常后:是销毁还是复用?

“一个线程池中的线程异常了,那么线程池会怎么处理这个线程? 需要说明,本文的线程池都是 java.util.concurrent.ExecutorService 线程池,本文将围绕验证,阅读源码俩方面来解析这个问题。 代码验证 验证execute提交线程池中 测试代码: public class ThreadPoolExecutorDeadTest {     public static void main(String[] args) throws InterruptedException {         ExecutorService executorService = buildThreadPoolExecutor();         executorService.execute(()   exeTask("execute"));         executorService.execute(()   exeTask("execute"));         executorService.execute(()   exeT

 118 |  0 |  0 后端相关Java

心如止水 | 2个月前 | 后端相关Java

万字详解,带你彻底掌握 WebSocket 用法(至尊典藏版)

一、 简介 1.1 什么是WebSocket WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发,并于2011年成为标准。 1.2 WebSocket的优势和劣势 WebSocket的优势包括: 实时性: 由于WebSocket的持久化连接,它可以实现实时的数据传输,避免了Web应用程序需要不断地发送请求以获取最新数据的情况。 双向通信: WebSocket协议支持双向通信,这意味着服务器可以主动向客户端发送数据,而不需要客户端发送请求。 减少网络负载: 由于WebSocket的持久化连接,它可以减少HTTP请求的数量,从而减少了网络负载。 WebSocket的劣势包括: 需要浏览器和服务器都支持: WebSocket是一种相对新的技术,需要浏览器和服务器都支持。一些旧的浏览器和服务器可能不支持WebSocket。 ...

 151 |  0 |  0 后端相关Java

OOM | 2个月前 | Java

实现一款高可用的 TCP 数据传输服务器(Java版)

1.netty能做什么 首先netty是一款高性能、封装性良好且灵活、基于NIO(真·非阻塞IO)的开源框架。可以用来手写web服务器、TCP服务器等,支持的协议丰富,如:常用的HTTP/HTTPS/WEBSOCKET,并且提供的大量的方法,十分灵活,可以根据自己的需求量身DIV一款服务器。 用netty编写TCP的服务器/客户端 1.可以自己设计数据传输协议如下面这样: 图片 2.可以自定义编码规则和解码规则 3.可以自定义客户端与服务端的数据交互细节,处理socket流攻击、TCP的粘包和拆包问题 2.Quick Start 创建一个普通的maven项目,不依赖任何的三方web服务器,用main方法执行即可。 图片 加入POM依赖 <!--net

 115 |  1 |  1 Java

柚香 | 2个月前 | 后端相关Java

Java服务优雅上下线

在项目升级的时候,需要干掉旧的项目,然后启动一个新的项目。在这个过程中往往会出现服务的不可用,那么我们如何最大限度的做到发布的优雅,尽可能让我们升级的这个过程不影响到线上正在运行的业务?下面我将介绍几种不同的架构模式下Java项目的优雅上下线。 1. 背景 在项目升级的时候,需要干掉旧的项目,然后启动一个新的项目。在这个过程中往往会出现服务的不可用,那么我们如何最大限度的做到发布的优雅,尽可能让我们升级的这个过程不影响到线上正在运行的业务?这时我们就需要实现服务的优雅上下线。 2. 名词解释 服务的优雅上下线就是保证服务的稳定可用,避免流量中断,导致业务不可用。 优雅上线其实就是等服务启动完全就绪后,对外提供服务,也叫无损发布,延迟暴露,服务预热。 优雅下线其实就是在服务收到停机指令(kill -15 pid 或 kill -2 pid 或 kill -1 pid)后,要先到注册中心注销,拒绝新的请求后,将旧的业务处理完成。 3. 实现 3.1 单体项目 对于单体项目而言,优雅上下线比较容易,涉及不到服务间错综复杂的调用,我们只需要保证入口...

 134 |  0 |  0 后端相关Java

iron Man | 2个月前 | 后端相关Java

从Java到json:探索 Jackson 的魔力

引言 Jackson简介 Jackson是一个用于处理JSON数据的开源Java库。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于计算机解析和生成。在Java领域,Jackson已经成为处理JSON数据的事实标准库。它提供了丰富的功能,包括将Java对象转换为JSON字符串(序列化)以及将JSON字符串转换为Java对象(反序列化)。 Jackson主要由三个核心包组成: 1. jackson-databind:提供了通用的数据绑定功能(将Java对象与JSON数据相互转换) 2. jackson-core:提供了核心的低级JSON处理API(例如JsonParser和JsonGenerator) 3. jackson-annotations:提供了用于配置数据绑定的注解 为什么选择Jackson 尽管Java生态系统中有其他处理JSON数据的库(如Gson和JSON-java),但Jackson仍然是许多开发者的首选,原因包括: 1. 性能:Jackson性能优越,对内存和CPU的...

 124 |  0 |  0 后端相关Java

蔡文姬 | 2个月前 | 后端相关Java

强烈建议你不要再使用Date类了!!!

一、有什么问题吗java.util.Date? java.util.Date (Date从现在开始)是一个糟糕的类型,这解释了为什么它的大部分内容在 Java 1.1 中被弃用(但不幸的是仍在使用)。 设计缺陷包括: 它的名称具有误导性: 它并不代表一个日期,而是代表时间的一个瞬间。所以它应该被称为Instant——正如它的 java.time 等价物一样。 它是非最终的: 这鼓励了对继承的不良使用,例如 java.sql.Date (这意味着代表一个日期,并且由于具有相同的短名称而也令人困惑) 它是可变的: 日期/时间类型是自然值,可以通过不可变类型有效地建模。可变的事实Date(例如通过setTime方法)意味着勤奋的开发人员最终会在各处创建防御性副本。 它在许多地方(包括)隐式使用系统本地时区, toString() 这让许多开发人员感到困惑。有关此内容的更多信息,请参阅“什么是即时”部分 它的月份编号是从 0 开始的,是从 C 语言复制的。这导致了很多很多相差一的错误。 它的年份编号是基于 1900 年...

 135 |  0 |  0 后端相关Java

青木 | 2个月前 | 后端相关Java

Java异常处理神器:Guava Throwables类

第一章:Guava库简介 Guava由Google开发,它提供了大量的核心Java库,例如:集合、缓存、原生类型支持、并发库、通用注解、字符串处理和I/O操作等。这些功能在日常的Java开发中超级常用,而且Guava的设计哲学是简洁高效,这让咱们的代码不仅更加优雅,而且更加易于维护和阅读。 尤其是在异常处理这块,Guava提供了一个强大的工具类:Throwables。它简化了Java中的异常处理,让咱们在处理各种棘手的异常时可以更加得心应手。咱们下面就来具体看看这个Throwables类都能干些什么吧! 第二章:Java中的异常处理 在Java世界里,异常处理是个老生常谈的话题。异常处理不仅关系到程序的稳定性和安全性,还直接影响到代码的可读性和可维护性。传统的Java异...

 135 |  0 |  0 后端相关Java