自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 nacos配置自动刷新源码解析

最近好奇 nacos 是怎么做到配置自动刷新的,于是就去debug跟了下源码,版本是 nacos2.2.1客户端创建RpcClient与服务端建立连接时会添加Handler处理服务端推送的请求,并且启动一个线程不断去监听配置变化当服务端某配置文件里的配置发生变化时,发送通知给到客户端,告知其某配置文件变化客户端收到变更通知,立即把该配置文件内容发送到服务端去对比,服务端返回变化的配置文件然后客户端会再次请求服务端,获取最新的配置内容,覆盖客户端的最后销毁有注解的 bean,重新初始化。

2024-02-08 15:21:29 945

原创 nacos报错com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception

因为我们现在项目用的 nacos 做注册中心,后台开发想和前台开发做联调时,后台开发需要起多个服务,很麻烦,加上最近架构师在搞灰度发布,我这边就顺便利用他的这个灰度发布,来简化本地的联调方式,所以就需要把开发的服务注册到测试环境的 nacos 上,在启动服务的时候,出现了这个报错:com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception。所以原因就是 nacos 的9848端口没有映射出来导致。

2024-01-12 18:54:57 3134

原创 Mysql死锁问题Deadlock found when trying to get lock;try restarting transaction

表的排他锁(lock_mode X),相当于两个事务都在等对方持有的排他锁,于是就死锁了。先去服务器上,看看死锁的日志,找到 mysql 的安装路径,使用如下命令登录 mysql。mysql -h 数据库IP地址 -P 数据库端口 -u 用户名 -p 库名。表的排他锁(lock_mode X),而事务2在根据主键ID更新。可以看到事务1在根据主键ID更新。去看了下代码,操作步骤如下。增加分布式锁,让并发不存在。1、根据主键ID更新。2、根据主键ID更新。3、根据主键ID更新。

2024-01-08 14:06:03 1275

原创 如何更新mongo每个数组中对象里的某个属性

最近项目中需要修复 mongo 中的数据,需要更新数组中对象的某一个属性,于是学会了一个 mongo 语句,记录下。现在我需要把订单号是 2024010500003 的订单里的两条菜品里的 foodNum 改成1。

2024-01-08 14:05:12 463

原创 Spring中是否可以存在两个相同ID的bean

1、在解析xml文件时,会去校验同一个文件中不能存在相同 ID 的 bean,如果存在,会抛异常2、在解析@Bean注解时,会去校验同一个配置类中如果存在相同名称的 bean,如果存在,先注册的生效,后面的将不注册3、在扫描@Component注解时,会校验名称相同的两个bean中,前一个如果是扫描注册的,且和后一个不是同一个bean,就会抛异常4、前3个校验都是在真正注册之前校验的,如果都通过了,会在真正进行注册的地方通过参数来判断是覆盖还是抛异常。

2023-09-26 08:44:39 897

原创 Gateway学习和源码解析

当我们的微服务越来越多,外部需要访问,为了安全,我们需要做身份认证,认证通过,才能访问我们的服务,而当请求过来,我们需要根据请求的不同,路由到不同的服务中,而一个服务会有多个实例,请求过来还需要做负载均衡,还有当请求过多的时候,我们需要做限流,以上这些都需要我们的网关来实现。目前网关有Zuul和Gateway,因为Zuul是阻塞式编程,而Gateway是基于的响应式编程,所以Gateway的吞吐会更好,下面我们就来学习Gateway!

2023-09-22 22:00:00 624

原创 十大排序算法及Java中的排序算法

非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(n log n),因此称为非线性时间比较类排序线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序最后总结下 Tim Sort 的整体流程数组长度小于2,直接返回,小于32,使用二分插入排序根据数组长度算出run(连续递增或递减的子数组) 的最小长度minRun开始循环获取run,得到run的长度,如果递减的,将其翻转,如果run的长度小于。

2023-09-13 22:15:00 380

原创 Java9-17新特性

由于 SpringBoot 3 最低支持的 JDK 版本是 17 了,加上 JDK 17 是一个 LTS 版本(Long-Term Support,长期稳定可靠的版本),所以还是有必要学习下 JDK 9 - JDK17 的新特性的。写这篇文章帮助自己记忆,也方便后续查阅。JDK 9-17 增加了许多新的特性,对我们的日常开发有很大帮助,JDK 11推出的 ZGC 是一款性能比 G1 还要好的垃圾回收器,JDK 17 也是史上最快的 Java 版本。

2023-08-30 19:45:00 284

原创 Java8新特性之——新日期时间 API

线程不安全、命名不清晰不统一、时区处理麻烦所以在 Java 8 中提供了新的日期时间 API,我们重点学习下LocalDateLocalTime三个类LocalDate年月日格式时间类型LocalTime时分秒格式时间类型年月日时分秒格式时间类型LocalDateLocalTime创建:now(),of(),parse()修改:with(),plus(),minus()比较:until(),compareTo(),isAfter(),isBefore(),isEqual()

2023-08-29 20:00:00 266

原创 Java8新特性之——Stream API

JDK 8 引入了 Stream API,它是用于处理集合数据的功能强大的库。Stream API 提供了一种更为简洁、灵活和函数式的方式来进行集合的操作和处理。不存储数据:Stream API 并不会在内存中存储数据,它仅仅是对源数据进行操作和处理的管道,当我们对一个集合或数组创建流时,流只是作为一种处理方式存在,并没有实际保存数据。不改变源数据:Stream API 的操作不会改变原始数据源中的元素,所有的中间操作(如过滤、映射、排序)都会产生一个新的流,而不是直接修改原始数据。

2023-08-25 22:00:00 171

原创 Java8新特性之——方法引用

实例方法引用(实例对象::实例方法名)静态方法引用(类名::静态方法名)类成员方法引用(类名::实例方法名)构造方法引用(类名::new)数组构造方法引用(类名[]::new)

2023-08-24 20:30:00 120

原创 Java8新特性之——Lambda表达式

Lambda 表达式是 JDK8 引入的一种新的编程语法,用于简化函数式接口的实现。Lambda 表达式的出现可以取代大多数匿名内部类,写出更简洁优雅的代码。

2023-08-24 20:00:00 131

原创 Java8新特性之——接口的默认方法和静态方法

因为实现类可以不重写接口中的默认方法,所以可以往现存接口中添加新的方法,不用强制那些已经实现了该接口的类也同时实现这个新加的方法,非常棒!在 JDK 8 之前,我们接口里只存在。默认方法可以定义方法的默认实现,使用。此外还可以在接口里定义静态方法,使用。在 JDK 8 版本里,增加了。

2023-08-24 10:17:39 96

原创 Lombok的使用及注解含义

Lombok可以通过注解来帮助我们简化实体对象(POJO)的代码书写。

2023-08-12 10:01:37 1146

原创 SpringBoot热部署

在 pom.xml 文件中添加 spring-boot-devtools 依赖。这个 key,后面打勾就可以了。在 IDEA 的设置里找到。这样就完成热部署的配置了。

2023-08-03 21:30:00 153

原创 Profile多环境配置以及结合Maven如何使用

我们在开发项目的过程中,会遇到需要使用多套环境配置的情况,因为不同环境可能存在不同的配置,比如数据库连接等等,这时候就可以用 profile 来解决。

2023-08-02 21:30:00 311

原创 Mysql删除重复数据通用SQL

在日常开发过程中,可能会出现一些 bug,导致 Mysql 数据库数据重复,需要删除重复数据,这里记录下删除重复数据的通用 SQL ,方便以后需要时查阅。

2023-08-01 22:00:00 555

原创 SpringBoot读取配置文件顺序

本文通过源码分析 SpringBoot 加载配置文件目录的顺序,以及 properties、xml、yml、yaml文件的读取顺序。

2023-07-30 12:44:36 680

原创 MyBatis-Plus自定义sql注入器

在日常开发过程中,我们可能会发现 MyBatis-Plus 提供的那些自带的 sql 语句无法满足我们的开发需求,想要加一些自定义的 sql,而且要应用于所有的 Mapper 上,需要怎么实现呢?官方文档地址:https://baomidou.com/pages/42ea4a/编写一个自定义 sql 类,要继承类,然后实现其方法来定义 sql 语句并加入到里,也可以重写getMethod方法来修改方法名。ps:这里以。

2023-07-29 17:48:40 422

原创 MyBatis-Plus自动填充

我们在建表的时候,所有的表都会有create_id(创建人id)create_time(创建时间)update_id(更新人id)、**update_time(更新时间)**这几个字段,属于是公共字段。在新增数据时:将创建人、更新人设置成当前系统登录人,将创建时间、更新时间设置成当前时间在更新数据时:将更新人设置成当前系统登录人,将更新时间设置成当前时间因为每张表里都有这些字段,而每次我们新增修改数据,都需要更新这些字段,即使是抽出共通方法,代码也很冗余写一个类实现接口,实现其方法和方法。

2023-07-27 22:30:00 1093

原创 Mysql执行计划字段解释

每次遇到 sql 优化,查看执行计划,其中的字段是什么含义总是会忘,所以有了这篇文章方便查阅。

2023-07-26 20:00:00 266

原创 FactoryBean源码解析

是 Spring 框架中的一个接口,用来创建特定类型的 Bean 对象。实现接口就可以自定义 Bean 对象的创建过程。本身也是 Bean,会在 Spring 中经历 Bean 的生命周期,而由创建的 Bean 不经历 Bean 的生命周期。

2023-07-19 18:20:01 999

原创 Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析

Spring有两种类型的后置处理器,分别是和,这里再贴出我画的 Spring 启动过程,可以看看这两种后置处理器在 Spring 启动过程中位置。总结一下执行顺序先执行了的方法,按照顺序Ordered> 其他;再执行了的方法;最后执行的方法,按照顺序Ordered> 其他;

2023-07-06 21:00:00 9887 2

原创 @Import注解源码解析

本文将对 Spring 如何处理@Import注解的源码进行解析。

2023-07-03 23:15:00 220

原创 SpringBoot自动装配原理

Spring Boot 的自动装配(Auto-configuration)是 Spring Boot 框架中一项强大的功能,它可以根据应用程序的依赖和配置自动完成大部分常见的配置工作,减少了开发者在项目中进行繁琐的手动配置的工作。自动装配其实是通过条件化装配、自动配置类、配置属性绑定来实现的条件化装配:Spring Boot 使用条件化注解()来实现自动装配。这些注解基于运行时环境的条件来决定是否需要装配某个组件。自动配置类:Spring Boot 通过在 classpath 下的。

2023-06-27 22:40:35 5064

原创 OpenFeign源码学习

1、在SpringBoot项目启动阶段,扫描所有@FeignClient注解标注的接口,为其创建代理对象,把接口中的方法交由 FeignInvocationHandler 处理。2、当客户端调用该代理对象上的方法时,FeignInvocationHandler 会将方法调用转化为http请求,发送给服务端。

2023-06-21 23:30:00 843

原创 Java生成数学计算题,并转成exe可执行文件

然后我想着分享给其他家长用,就用Launch4j转exe文件。如果有报错的话,估计是没有设置主清单属性。然后点击小齿轮,填上launch4j。pom文件中要引入itextpdf。需要在pom文件中增加如下代码。安装后运行会出现这样的画面。最后给上我转好的exe文件。在Basic下配置这两个。最后点击运行按钮就可以了。

2023-06-21 10:31:41 243

原创 Mybatis插件原理

首先自定义插件要实现 Mybatis 的 Interceptor 接口,然后实现这个接口的3个方法,最后在类上打上 @Intercepts 注解,并用 @Signature 注解标注要拦截的接口名称、方法名称以及参数列表。我们用 Executor 来举例//增加自己的逻辑 log . info("执行器-------自定义处理逻辑");} }

2023-06-18 11:08:07 351

原创 Mybatis源码学习

本篇文章只是简单的带大家过一下整个Mybatis的流程,先有个初步的认识,后续有机会,再针对性的剖析细节。

2023-06-13 18:19:42 1259

原创 Java8函数式接口Consumer的实际应用

在项目开发的过程中,发现有很多业务,需要对一个大的集合做分批处理,于是利用函数式接口Consumer写了一个共通的处理方法,如下。其中的doSomething是分批后的业务处理方法,自行修改。

2023-06-09 17:59:42 159

原创 MongoDB查询字符串日期列等于系统日的数据

帮项目组同事写一个sql,要求查询出业务日期等于系统日的数据,因为项目中业务日期字段用的是字符串格式,于是不知道怎么写,求助我,想到mongo是支持js脚本的,于是用js脚本先写了一个求当天日期字符串的函数,再去查询。把脚本里的 collection 改成自己的集合名,businessDate改成自己的字段名称。

2023-05-25 22:43:07 247

原创 SpringBoot内置tomcat参数调优,最大连接数、队列长度、最大工作线程数、最小工作线程数

因为看到一道面试题,问SpringBoot默认可以接受的最大并发量是多少,这个问题其实考的是web服务器的配置,因为SpringBoot默认的web服务器是tomcat,于是去了解了一下tomcat的相关配置。

2023-05-25 22:41:05 2366 1

原创 MyBatisPlus批量写入方法saveBatch速度很慢的解决方案

项目组在使用MyBatisPlus的批量插入方法saveBatch时速度缓慢,插入1w条数据,需要近1分钟的时间。

2023-05-25 22:39:22 4946

原创 MongoDB如何添加多数据源

由于项目有需求做MongoDB的数据迁移,所以需要配置多个数据源,其实可以通过配置多个 MongoTemplate 来实现。这里需要注意的是,如果配置了自己的转换器,必须要加上12-14行的代码,不然转换器在第二个数据源会失效。然后操作第二个数据源的时候,注入 hisMongoTemplate 就可以了。然后增加第二个数据源的 MongoTemplate 配置。首先在yaml文件中加上第二个数据源的信息。

2023-05-23 00:59:13 656

原创 MongoDB的Decimal128类型转换成Java的BigDecimal类型错误

项目组在使用mongo时,报类型转换错误,具体报错如下:org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.bson.types.Decimal128] to type [java.math.BigDecimal]原因是 MongoDB 的 Decimal128 类型无法转换成 Java 的 BigDecimal 类型导致可以

2023-05-19 18:38:29 549

原创 设计模式学习、装饰器模式

先看下装饰器的UML图:抽象组件(Component):定义一个抽象接口,用于规范核心组件(Concrete Component)和装饰器(Decorator)共同遵循的接口。具体组件(Concrete Component):实现抽象组件接口,并定义了一个具有基本功能的对象。抽象装饰器(Decorator):继承或实现抽象组件接口,并且持有一个抽象组件实例,在内部可以通过调用抽象组件接口方法来完成基础功能,并在此基础之上添加新的功能。

2023-05-11 00:37:12 562

原创 Java8新特性之——Optional类

Optional类是Java 8中引入的一个用于处理null值的容器类。它封装了某个类型的值,这个值可以是null,也可以是非null,通过它可以更优雅和简洁地处理包含null值的对象。Optional类的官方描述:翻译过来就是:一个可能包含null值的容器对象。如果值存在,isPresent()方法将会返回true,get()方法将会返回该值。

2023-04-09 17:30:00 1966

原创 Java8新特性之——函数式接口(Function、Consumer、Supplier、Predicate)

Java 8中的Consumer、Supplier、Predicate和Function都是函数式接口,它们的主要区别在于它们的输入参数和返回值的类型不同。可以看到,这四个接口的主要区别在于它们的输入和输出类型不同,因此它们在不同的场景下具有不同的用途。如果你需要对一个集合中的每个元素执行某个操作,那么可以使用Consumer接口;如果你需要从一个方法中获取一个结果,可以使用Supplier接口;:接受一个输入参数,并返回一个布尔值。:接受一个输入参数,并返回一个结果。:接受一个输入参数,但没有返回值。

2023-04-08 20:54:34 654

原创 Spring源码学习之RestTemplate

看完源码,我们知道,其实RestTemplate封装了原生的HttpURLConnection,采用Restful的理念,更优雅地来完成对HTTP服务的调用,那么什么是Restful风格,网上看到大神的回答用 URL 定位资源,用 HTTP 动词(GET,POST,DELETE,PUT)描述操作。用URL来指定具体的资源,如图片,文字,或者一个服务;用HTTP动词来描述操作;GET:请求服务器端已经存在的资源,通常将Query String查询条件以键值对的编码形式追加到URL中。

2023-04-01 09:17:22 406

原创 Git分支管理文档

分享一下,我在项目里是怎么使用git分支管理的。

2023-03-28 20:00:00 984

Java生成数学计算题,并转成exe可执行文件

Java生成数学计算题,并转成exe可执行文件

2023-06-21

空空如也

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

TA关注的人

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