自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

spring_root的博客

海内存知己,天涯若比邻

  • 博客(249)
  • 收藏
  • 关注

原创 Spring Boot实现多租户架构

本文详细介绍了如何使用Spring Boot和Spring Cloud实现一个支持多租户部署的应用。主要包括搭建Spring Boot和Spring Cloud环境、修改数据库设计、实现应用多租户部署、实现租户管理等方面

2024-04-24 22:15:00 863

原创 Spring Boot对接微信支付开发教程

最后,我们构造了一个返回结果,其中包括了必要的参数,如`appId`、`timeStamp`、`nonceStr`、`package`和`paySign`等,这些参数将被用于前端调起微信支付。在上面的代码中,我们使用WechatPayBuilder构建了一个WechatPayClient,它用于和微信支付接口进行交互。在上面的代码中,我们定义了两个接口:/wechat/pay/unifiedOrder用于下单请求,/wechat/pay/notify用于接收微信支付通知。

2024-03-28 22:00:00 919

原创 服务端如何防止订单重复支付

1、支付订单增加一个中间状态“支付中”,当同一个订单去支付的时候,先检查有没有状态为“支付中”的支付流水,当然支付(prepay)的时候要加个锁。2、支付中心这边要自己定义一个超时时间(比如:30秒),在此时间范围内如果没有收到支付成功回调,则应调用接口主动查询支付结果,比如10s、20s、30s查一次,如果在最大查询次数内没有查到结果,应做异常处理。支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。这个时候有可能产生投诉,或者用户重复支付。

2024-01-05 15:22:40 395

原创 基于Redis实现分布式锁

对于单机多线程来说,在 Java 中,我们通常使用类、关键字这类 JDK 自带的本地锁来控制一个JVM进程内的多个线程对本地共享资源的访问。下面是我对本地锁画的一张示意图。从图中可以看出,这些线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到本地锁访问共享资源。分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。于是,分布式锁就诞生了。举个例子:系统的订单服务一共部署了 3 份,都对外提供服务。

2023-10-31 17:35:25 133

原创 nacos上的注册过的服务实例掉线分析

最近生产上的xxl_job框架的一个执行器(nacos客户端)因为分配内存不大,导致频繁与nacos服务端的连接断开,而断开之后虽然客户端服务没有宕掉,但是就是无法重新注册到nacos的服务端上去。

2023-09-11 20:45:00 1250

原创 Nacos服务心跳和健康检查源码介绍

接下来我们看标记不健康时候的代码,这部分代码在客户端注册的时候也出现相同的代码,只是我们略过了,这部分也是观察者模式的重要体现,从这里我们可以学习到的东西在于结合Spring的事件机制,轻松实现观察者模式,当然这个里面也有部分我感觉写的不太好,哈哈,大佬们看到勿喷。重点部分就是看BeatTask,BeatTask继承Runnable,run方法就是我们的重点,该方法调用了NamingProxy的sendBeat方法,服务端请求地址为/instance/beat的方法。

2023-09-11 20:30:00 860

原创 Nacos使用和注册部分源码介绍

Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。接下来主要介绍Nacos作为注册中心的使用和注册部分的源码解析。

2023-09-11 15:18:34 178

原创 Java 中的 7 种重试机制

如果是基于 Spring 的项目,使用 Spring Retry 的注解方式已经可以解决大部分问题如果项目没有使用 Spring 相关框架,则适合使用 Google guava-retrying:自成体系,使用起来更加灵活强大。

2023-08-04 21:30:00 444

原创 Java 中使用枚举

static Direction valueOf(String name):通过枚举常量的名字返回Direction常量,注意,这个方法与Enum类中的valueOf()方法的参数个数不同。其实此类的枚举项的创建,就相当于其他类调用无参构造器 new 出来的对象,也就是这个枚举类创建了7次实例,所以输出了7个 hello。需要传入商品折扣计算价格,使用上面的常量定义就没有类型上的约束,传入任何 double 类型的值都可以,编译器不会发出警告。的所有成员的程序,或者是一种特定类型对象的计数。

2023-07-08 09:15:00 217

原创 SpringBoot 之实现 PDF 添加水印的方案

PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对 PDF 文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用 Spring Boot 来实现 PDF 添加水印的方式。

2023-07-05 22:15:00 768

原创 java 8 stream流之大数据篇

如果你会任意一门语言的stream流,没道理不会大数据开发。俗话说男追女隔座山,女追男隔层纱。如果说零基础学大数据,感觉前面是一座山,那么只要你会java或者任意一门语言的stream流,那大数据就只隔了一层纱。本文以java stream流计算为例,讲解一些基础的spark操作。另一个流行的大数据框架flink同理。

2023-07-05 09:33:38 262

原创 Spring Data JPA 报 HOUR_OF_DAY: 0 -> 1异常的解决过程和方案

HOUR_OF_DAY: 0 -> 1 解决方案

2023-06-26 11:20:07 1306

原创 spring boot:集成支付宝(沙箱环境)(spring boot 2.4.0 / wap/h5方式 )

支付宝小程序支付

2022-12-28 10:29:38 951 2

原创 SpringBoot内置工具类应有尽有,建议收藏!!

别再自己瞎写工具类了

2022-06-22 10:52:41 326 1

原创 非常实用的12条 SQL 优化方案

非常实用

2022-06-15 16:46:03 381

原创 Java8 Lambda 表达式中的 forEach 如何提前终止?

1

2022-06-14 17:27:08 458

原创 @RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法

@RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法

2022-05-31 21:04:50 1755

原创 玩转Java8 Stream,代码效率飞升

概述Stream

2022-05-31 20:36:26 285

原创 MySQL的自增 ID 用完了,怎么办?

最近看到这样的一个面试题。MySQL的自增 ID 用完了,怎么办?以下是这个面试题的解决方案。如果你用过或了解过MySQL,那你一定知道自增主键了。每个自增id都是定义了初始值,然后按照指定步长增长(默认步长是1)。虽然,自然数是没有上限的,但是我们在设计表结构的时候,通常都会指定字段长度,那么,这时候id就有上限了。既然有上限,就总有被用完的时候,如果id用完了,怎么办呢?今天就一起来学习下吧。自增id说到自增id,相信你的第一反应一定是在设计表结构的时候自定义一个自增id字段,那么就有一

2022-05-31 09:10:46 1908 4

原创 Java stream().sorted()实现排序(升序、降序、多字段排序)

stream().sorted()

2022-04-21 10:34:30 2247

原创 多账号统一登陆,账号模块的系统设计

现在几乎大部分的 App 都支持使用多个第三方账号进行登录,如:微信、QQ、微博等,我们把此称为多账号统一登陆。而这些账号的表设计,流程设计至关重要,不然后续扩展性贼差。本文不提供任何代码实操,但是梳理一下博主根据我司账号模块的设计,提供思路,仅供参考。

2022-04-13 14:19:02 431

原创 索引失效的场景

不知道你在实际工作中,有没有遇到过下面的这两种情况:1.在某个字段上加了索引,但实际上并没有生效。2.有时候生效了,有时候没有生效。

2022-04-12 15:28:31 159

原创 Java中的 BigDecimal如何使用

目录一、BigDecimal概述二、BigDecimal常用构造函数2.1、常用构造函数2.2、使用问题分析三、BigDecimal常用方法详解3.1、常用方法3.2、BigDecimal大小比较四、BigDecimal格式化五、BigDecimal常见异常5.1、除法的时候出现异常六、BigDecimal总结6.1、总结6.2、工具类推荐一、BigDecimal概述Java在java.math包中提供的API类BigDecimal,用来对超过

2022-04-12 14:20:29 753

原创 SQL优化万能公式

目录前言SQL优化一般步骤1、通过慢查日志等定位那些执行效率较低的SQL语句2、explain 分析SQL的执行计划3、show profile 分析4、trace5、确定问题并采用相应的措施场景分析案例1、最左匹配案例2、隐式转换案例3、大分页案例4、in + order by案例5、范围查询阻断,后续字段不能走索引案例6、不等于、不包含不能用到索引的快速搜索。(可以用到ICP)案例7、优化器选择不使用索引的情况案例8、复杂查询案例9、a

2022-04-12 11:06:43 276

原创 ES+Redis+MySQL,高可用架构设计

背景会员系统是一种基础系统,跟公司所有业务线的下单主流程密切相关。如果会员系统出故障,会导致用户无法下单,影响范围是全公司所有业务线。所以,会员系统必须保证高性能、高可用,提供稳定、高效的基础服务。随着同程和艺龙两家公司的合并,越来越多的系统需要打通同程 APP、艺龙 APP、同程微信小程序、艺龙微信小程序等多平台会员体系。例如微信小程序的交叉营销,用户买了一张火车票,此时想给他发酒店红包,这就需要查询该用户的统一会员关系。因为火车票用的是同程会员体系,酒店用的是艺龙会员体系

2022-04-12 09:38:09 298

原创 一个注解如何实现循环重试功能

前言在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败。 调用远程服务失败。 争抢锁失败。这些错误可能是因为网络波动造成的,等待过后重处理就能成功。通常来说,会用try/catch,while循环之类的语法来进行重处理,但是这样的做法缺乏统一性,并且不是很方便,要多写很多代码。然而spring-retry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。一、@Retryable是什么?spring系列的spring-retry是另一个实用程序模块,可以帮

2022-04-11 14:34:02 119

原创 最坑的SQL错误用法,你有没有踩过?

1、LIMIT 语句2、隐式转换3、关联更新、删除4、混合排序5、EXISTS语句6、条件下推7、提前缩小范围8、中间结果集下推总结sql语句的执行顺序:FROM<left_table>ON<join_condition><join_type>JOIN<right_table>WHERE<where_condition>GROUPBY<group_by_list>..

2022-04-08 17:20:40 139

原创 Spring 依赖注入方式

Spring 正如其名字,给开发者带来了春天,Spring 是为解决企业级应用开发的复杂性而设计的一款框架,其设计理念就是:简化开发。Spring 框架中最核心思想就是: IOC(控制反转):即转移创建对象的控制权,将创建对象的控制权从开发者转移到了 Spring 框架。 AOP(切面编程):将公共行为(如记录日志,权限校验等)封装到可重用的模块中,而使原本的模块内只需关注自身的个性化行为。 本文,将主要介绍 Spring 中 IOC 的依赖注入,控制反转 IOC就 IO..

2022-03-22 23:12:42 93

原创 教你如何优雅地处理重复请求(并发请求)

对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。重复的场景有可能是: 黑客拦截了请求,重放 前端/客户端因为某些原因请求重复发送了,或者用户在很短的时间内重复点击了。 网关重发 …. 本文讨论的是如果在服务端优雅地统一处理这种情况,如何禁止用户重复点击等客户端操作不在本文的讨论范畴。利用唯一请求编号去重你可能会想到的是,只

2022-03-22 20:44:06 634

原创 重温Git命令

git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和一些需彰显个人实力的场景,仍然需要我们掌握足够多的git命令。下边我们整理了45个日常用git合代码的经典操作场景,基本覆盖了工作中的需求。我刚才提交了什么?如果你用git commit -a提交了一次变化(changes),而你又不确定到底这次提交了哪些内容。你就可以用下面的命令显示当前HEAD上的最近一次的提交(c...

2022-03-22 20:07:40 307

原创 如何提高项目的吞吐量

一、异步执行实现方式二种: 使用异步注解@aysnc、启动类:添加@EnableAsync注解 JDK 8本身有一个非常好用的Future类——CompletableFuture @AllArgsConstructorpublicclassAskThreadimplementsRunnable{privateCompletableFuture<Integer>re=null;publicvoidrun(){...

2022-03-22 19:22:12 347

原创 23 种设计模式的通俗解释,虽然有点污,但是秒懂

01 工厂方法 02 建造者模式 03 抽象工厂 04 原型模式 05 单态模式 06 适配器模式 07 桥梁模式 08 合成模式 09 装饰模式 10 门面模式 11 享元模式 12 代理模式 13 责任链模式 14 命令模式 15 解释器模式 16 迭代模式 17 调停者模式 18 备忘录模式 19 观察者模式 ..

2022-03-18 13:40:41 88

原创 别再使用 TIMESTAMP 作为日期字段

在日常数据库设计中,几乎每张业务表都带有一个日期列,用于记录每条记录产生和变更的时间。比如用户表会有一个日期列记录用户注册的时间、用户最后登录的时间。又比如,电商行业中的订单表(核心业务表)会有一个订单产生的时间列,当支付时间超过订单产生的时间,这个订单可能会被系统自动取消。日期类型虽然常见,但在表结构设计中也容易犯错,比如很多开发同学都倾向使用整型存储日期类型,同时也会忽略不同日期类型对于性能可能存在的潜在影响。所以你有必要认真看看这篇文章,举一反三,在自己的业务中做好日期类型的设计。日期类型

2022-03-18 10:54:22 80

原创 MyBatis之如何解决数据库数据加密解密

前言:介绍一个简单的MyBatis加解密方式,日常学习工作中提及这种方法的比较少,所以拿来说说,如果已经知道这种方法的忽略本文一、背景在我们数据库中有些时候会保存一些用户的敏感信息,比如:手机号、银行卡等信息,如果这些信息以明文的方式保存,那么是不安全的。假如:黑客黑进了数据库,或者离职人员导出了数据,那么就可能导致这些敏感数据的泄漏。因此我们就需要找到一种方法来解决这个问题。二、解决方案由于我们系统中使用了Mybatis作为数据库持久层,因此决定使用Mybatis的TypeHandler或

2022-03-02 21:23:40 2167

原创 巧用Stream优化老代码

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读放大招,流如何简化代码如果有一个需求,需要对数据库查询到的菜肴进行一个处理: 筛选出卡路里小于400的菜肴 对筛选出的菜肴进行一个排序 获取排序后菜肴的名字 菜肴:Dish.javapublic class Dish { private String name; private boolean vegetar

2022-01-05 17:23:41 88

原创 SpringCloud 分布式日志采集方案

由于微服务架构中每个服务可能分散在不同的服务器上,因此需要一套分布式日志的解决方案。spring-cloud提供了一个用来trace服务的组件sleuth。它可以通过日志获得服务的依赖关系。基于sleuth,可以通过现有的日志工具实现分布式日志的采集。这里使用的是ELK,也就是elasticsearch、logstash、kibana。一、sleuth第一步:sleuth管理端sleuth一般单独放在一个工程中。需要添加如下依赖<dependency>...

2022-01-04 09:35:50 345

原创 SpringBoot线程池的创建、@Async配置步骤及注意事项

前言最近在做订单模块,用户购买服务类产品之后,需要进行预约,预约成功之后分别给商家和用户发送提醒短信。考虑发短信耗时的情况所以我想用异步的方法去执行,于是就在网上看见了Spring的@Async了。但是遇到了许多问题,使得@Async无效,也一直没有找到很好的文章去详细的说明@Async的正确及错误的使用方法及需要注意的地方,这里简单整理了一下遇见的问题,Sring是以配置文件的形式来开启@Async,而SpringBoot则是以注解的方式开启。我们可以使用springBoot默认的线程池,不过

2021-12-30 14:14:32 445

原创 transient关键字和@Transient 注解

注解 @Transient

2021-12-28 10:31:09 2008

原创 Java属性为什么不能是is开头的boolean

通常定义Java实体类时,对于boolean属性,阿里规约中明确要求不能使用is开头。至于为什么,我们稍后再讲。这里先讲一下前几天在工作中,项目遇到的一个问题。库表中某个字段存入了一个实体类的json字符串,在查询库表后,需要将json字符串转为实体类对象进行更改后再转为json字符串后返回给前端。在这当中就出现了一个问题,库表中存入的数据明明是isUpdate的字段,可是在返回到前端后的代码就是update。这个问题,起初并没有想到是字段定义的问题,通过一步一步的debug,最后才发现是

2021-12-01 11:24:43 6426

原创 原来 Lamda 表达式是这样写的

Lamda 表达式非常方便,在项目中一般在 stream 编程中用的比较多。List<Student>studentList=gen();Map<String,Student>map=studentList.stream().collect(Collectors.toMap(Student::getId,a->a,(a,b)->a));理解一个 Lamda 表达式就三步:1. 确认 Lamda 表达式的类型...

2021-11-10 10:24:02 257

空空如也

空空如也

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

TA关注的人

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