自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小道仙的后宫

快节奏,慢生活。

  • 博客(505)
  • 资源 (6)
  • 收藏
  • 关注

原创 Cursor助力Java开发(快捷键+配置篇)

如果某些快捷没反应、或快捷键冲突,可以自定义快捷键选中右边的识别键盘之后,按下对应的快捷键,就可以看到对应的快捷键的使用情况了。

2025-04-02 21:49:12 395

原创 使用Cursor搭建的一个应用,可当作毕业设计

看过很多使用Cursor,一天完成一个应用的文章或视频,前些日子脑子刚好有一个想法——搭建一个点餐管理系统,便用Cursor完成了前后端的开发。具体功能可以看视频里面的演示。也算是从0到1完成了一个小的项目构建,来说说对它的看法。

2025-03-23 15:38:29 242

原创 MCP入门实践,Cursor+MCP

学习之前,需要知道什么是MCP(Model Context Protocol,模型上下文协议),官方的解释如下MCP 是一种开放协议,它标准化了应用程序向 LLM 提供上下文的方式。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一种将 AI 模型连接到不同数据源和工具的标准化方式。我暂时把它理解成各种远程工具插件,比如一个获取天气的插件、一个获取热搜的插件、一个可以操作数据库的插件,可以是很多。

2025-03-16 10:33:53 1070

原创 写个漂亮的代码之二

分组构建的过程,会分别写在 UserCourseGroup 和 UserCourseMapping 中,这样就存在一个问题,当type类型再次新增一种的时候,我们需要对2个分组的方法都进行修改,很容易就忘记了修改某处。在Service层也写了很多的if逻辑,代码做了很多的兼容处理,虽然不复杂,但写的时候很难受,看的时候更难受。最终的做法就是在Controller里给默认值,当用户选择type-A的时候,X = 0, Y = 空,这样后面的逻辑就都统一了。,同时这张表里面还有一个type字段。

2025-03-08 21:59:28 291

原创 Cursor助力Java开发

这篇文章来教大家如何使用Cursor来开发Java,开始之前先来回答一个问题:Cursor是基于VSCODE二开的,可以用来写Java吗?答案是可以的,就我使用了一段时间来说,虽然不如IDEA那么顺手,但它的Ai功能完全掩盖其它的不足。

2025-02-18 22:07:19 5245 5

原创 使用AI生成Java单元测试,代码无BUG

从结果来看,要比预期好很多,最开始的目标是在写单元测试的效率提升 30%,从结果来看是要大于这个预期的。从结果来看就是 Cursor + 提示词,生成单元测试,如果想直接看结果可以直接跳到【四、使用Cursor】,如果想要看看对比,可以一步步往下看。对于各种IDEA插件生成的单元测试来说,几乎就只有手动调试一种方式,主要原因它们对整个代码库理解不是很好,很难对给出的异常做太多的优化。每一次对话,就会扣减上面 250次中的一次(对话框的左下角可以选择模型,有的模型是不限量的)

2025-01-04 22:23:27 2383

原创 Nacos热更新

(这里是循环获取本地的阻塞队列数据,至于Nacos如何把任务塞到队列的代码可以自行去看看,有了队列还会找不到塞的操作吗)判断的逻辑也很简单,拿配置文件里面的全部内容生成一个 md5,和上一次的md5进行对比,如果两个md5不一致,则说明有变化。最近有一个需求,需要把Nacos上某个配置文件,从A_data-id迁移到B_data-id上。,这个方法会去判断当前data-id的内容是否有变动,如果有变动就会发送事件去处理。这个方法里面会去解析配置文件里面的内容,然后发一个事件,这个事件就是热更新的核心了。

2024-12-29 16:26:08 883

原创 Dubbo生产者一次请求的过程 (Dubbo源码三)

Dubbo底层通讯是基于Netty,请求第一步肯定是从Netty收到消息开始的。Netty收到消息也肯定是不是明文的,这一节要解决如下问题Netty接收消息的入口如何把消息解析成明文怎么通过消息找到对应的服务

2024-12-15 15:15:35 649

原创 Dubbo消费者一次请求的过程 (Dubbo源码二)

基于@EnableDubbo > @EnableDubboConfig 找到每一个@DubboReference 生成代理对象生产的代理对象是一个嵌套对象,里面有两个重要的对象分别是 MigrationInvoker、CallbackRegistrationInvoker。

2024-11-03 11:29:11 815

原创 同一个Service内部调用开启事务

事务是基于代理实现的,方法内部调用正常情况下是不走代理的,所以如果是子方法开启事务,正常情况下是不生效的

2024-10-28 21:13:38 454

原创 优雅的入参校验,Valid常用校验

对于前端传递的参数,正常情况下后端是要进行一些必要的校验,最简单的做法是用 if效果是可以,但不优雅。使用 @Validator 代替 if,就会优雅很多ps:Validator 也可用于Dubbo参数校验。

2024-10-21 22:13:55 548

原创 No provider available from registry RegistryDirectory

最近在做配置文件升级,服务比较多,之前的Dubbo配置各个服务写的比较乱,有的用Nacos上的 data-id,有的又是在自己的服务引入配置遂准备统一了,全部都用Nacos上的配置,同时修改了Dubbo服务名发到线上的时候,线上崩了,部分服务出现如下错误注: IP和服务名做了隐藏处理。

2024-10-20 17:09:42 927

原创 Dubbo接口级和应用级注册,Dubbo消费者注册到Nacos

假设有一个服务A,里面提供了2个Dubbo接口XdxOneService、XdxTwoService,Dubbo生产者把服务注册到Nacos(或其它的注册中心)以应用级别注册,在Nacos上就只看到一个服务名称A(取自 dubbo.application.name)以接口级别注册,就会看到两个服务注:可以同时注册应用级和接口级。

2024-10-15 20:36:43 1149

原创 Dubbo源码解析之@DubboService、@DubboReference(Dubbo源码一)

对于Dubbo用的最多的就是@DubboService、@DubboReference,与之对应的就是服务的提供方、调用方。之所以加上注解就可以运行,定是生成了代理对象,这篇文章就来讲讲如何基于这两个注解生成代理对象。不管是服务端还是客户端,在使用Dubbo的时候都会先使用,比如下面的demo@EnableDubbo 是一个组合注解,它头上还有@DubboComponentScan和@EnableDubboConfig,它们就是分别来解析@DubboService、@DubboReference。

2024-08-28 21:56:54 2097

原创 谈谈我对微服务的理解2.0

服务拆分有一个简单的点就是,各个服务维护自己的表,比如A服务想要获取B服务的数据,一定是要B服务提供接口,而不能是A服务去直接连B服务的表,如果某个特别复杂的业务必须要连表才可以,那就弄一个聚合服务出来,对于各个服务的表的增、删、改一定要控制在自己的服务里。再举一个实际的例子,我们是做医疗系统的,有一个很重要的数据“病人”,所有的数据都是围绕这个病人来的,大部人业务数据都冗余了病人的id,但大部人业务的列表都要基于病人的手机号、唯一编号、姓名来查询,我们是怎么做的呢?而每一个资源都是单表的查询。

2024-08-04 21:12:16 991 1

原创 SkyWalking入门搭建【apache-skywalking-apm-10.0.0】

SkyWalking在Java中使用的是字节方式植入,是完全无代码侵入的VM options 添加,就是刚刚上面下的 java-agentEnvironment variables 添加,指定 SkyWalking的地址效果图操作步骤(idea 2023,其它版本百度操作)配置好后,启动服务会看到下面的日志,就说明 java-agent.jar 读取到了随机访问几下服务的接口,再去刷新SkyWalking 控制台,就可以看到了。

2024-07-21 19:01:18 3498 1

原创 SpringSecurity最新学习,spring-security-oauth2-authorization-server【spring-security-oauth2升级】

默认获取token是在 header中,还要拼接一个前缀 Bearer, 假如想改为从 url中获取 access_token, 只需要重写BearerTokenResolver// URI 中 Token 的参数名@Override// 从 URI 参数中获取 Token= null &&!上面的流程完成了授权和鉴权,但我们拿不到有用的参数,何为有用的参数比如: 用户的 userId不管是Opaque还是Jwt都可以在里面设置一些我们自己的参数——把参数放到 【claims】Opaque。

2024-07-03 07:53:02 1578

原创 Nominatim免费的地址解析,逆地址解析,OpenStreetMap开源地图数据【全网最全】

国内的一些地址解析供应商的API都开始付费了,就想找个免费的地址解析和逆地址解析的应用,最终选择了Nominatim + OpenStreetMap。

2024-06-22 14:45:55 4946 11

原创 免费开源的地图解析工具【快速上手】

这篇文章和【Nominatim】是相呼应的,在尝试了OSM数据一直有问题之后,通过别人的指点是不是可以换个思路,我的数据只需要精确到市级别,也可以不用OSM这样全的数据(主要原因还是OSM太过庞大了)在网上看到有人发布的一个地址解析和逆地址解析的SDK(下面称为 Geo),觉得是个思路,随即进行了数据测试Geo 文档。

2024-06-22 14:43:11 2275

原创 SpringBoot 热插拔AOP,动态的实现AOP【简单易懂,有大用】

下面就来实现一个动态的添加/删除动态代理的功能,它的源码很简单,但这会打开你的新世界

2024-05-25 17:23:37 1445 3

原创 Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】

最近在做系统升级的时候,引发了一个BUG,原本系统是有一个异常处理器A,引入了某个底包中也带了一个异常处理器B,最终走了底包的异常处理器B。在DispatcherServlet里面有一个onRefresh方法,它是重写的父类FrameworkServlet的,在初始化ServletBean的时候会被调用一次,它里面会做很多初始化的操作,其中一个就是获取容器里面的全局异常拦截器。并不是系统任何异常都会被它所拦截,因为我们已经知道它的执行点是在MVC的流程中,所以就只有HTTP异常才会被拦截处理。

2024-05-13 21:59:03 2956

原创 org.mockito.Answers.get()Lorg/mockito/stubbing/Answer

最近在做SpringBoot 版本升级,原本的版本是2.3.1,目标版本是2.7.17,升完之后发现powermock用不了,报标题的错。powermock官方已经不更新了,目前最新的版本停在 2.0.9,只能支持 junit4,所以想解决这个报错的办法有两个。降低 junit所需引入的包。

2024-05-13 21:36:10 1244

原创 Dubbo-Admin 实践,Dubbo3 配置多协议,同时提供Dubbo和HTTP协议

Dubbo是支持多协议的,它默认的Dubbo协议已经很好了,正常情况下,使用Dubbo是做服务之间的通信是不需要更换协议的。比如有两个服务的提供者提供相同的服务,可以给它们打上A、B标签,请求的时候可以根据标签去固定请求对应的服务。默认的协议就是 dubbo,所以在使用的时候不需要指定协议,如果使用其它协议需要指定对应的协议。Dubbo不只是作为服务间的通讯,它还涉及服务治理,今天就来一起学习下Dubbo的控制台使用。原本的dubbo协议是不需要提供路径的,现在的HTTP需要提供路径,改造如下。

2024-04-27 19:30:05 1406

原创 免费简单好用的内网穿透工具(ngrok、natapp),微信回调地址配置

在一些特殊的场景下,需要把我们的内网暴露出去,比如写了一个接口或网站想让别人看到,或者进行第三方开发调试的时候需要一个外网可用的回调地址。很早之前不会有这样一个中间页,如果只是临时访问,点一下 【Visit Site】也就可以了,但如果前后端对接或者第三方回调,就难办了。如果第三方不支持ngrok的时候可以使用natapp来替代,不然ngrok可以固定域名还是挺方便的。可以执行Command Line,把token进行设置, ngrok就是上一步下载的可执行文件。官方提供三个解决办法。

2024-04-27 19:08:38 2381 1

原创 Can not create registry service-discovery-registry、Create zookeeper service discovery failed.

zookeeper连接不上, Create zookeeper service discovery failed.

2024-04-06 10:24:23 935

原创 Dubbo入门项目搭建【Dubbo3.2.9、Nacos2.3.0、SpringBoot 2.7.17、Dubbo-Admin 0.6.0】

基于Dubbo3.2.9、Nacos2.3.0、SpringBoot 2.7.17、Dubbo-Admin 0.6.0、Jdk1.8 搭建的Dubbo学习Demo。

2024-04-04 11:50:01 1595

原创 RocketMQ 消费者源码解读:消费过程、负载原理、顺序消费原理

看完上面的源码你最少可以回答下面几个问题RocketMQ消费的流程是怎么样的为什么消费者大于queue的时候,消费者就没用了顺序消费如何保证顺序的添加消费者的时候,如何重新分配的。

2024-04-02 22:01:46 1184

原创 RocketMQ、Kafka、RabbitMQ 消费原理,顺序消费问题【图文理解】

1. RocketMQ,一个queue只能有一个consumer,消费者是多线程的,但开启顺序消费的时候,会对 queue加锁从而保证顺序2. Kafka,一个 partitions只能由一个consumer的一个线程去消费,基于单线程就保证了顺序性3. RabbitMQ,queue和consumer是多对多的,consumer的多个线程是独立的,要想保证顺序,只能让一个queue只有一个consumer,且consumer只有一个线程(但这样做效率就很低)

2024-03-10 14:57:45 2450 1

原创 Sentinel 规则持久化,基于Redis持久化【附带源码】

sentinel持久化原理:dashboard先把规则推送给A,再由A把规则下发到各个具体的应用服务。这样A就相当于一种中心存储,解决了数据存储的问题,同时A实时下发给应用服务解决了数据一致性的问题。

2024-03-03 16:39:09 1684 1

原创 Sentinel从入门到“精通”,从源码层面学习Sentinel

Sentinel提出了资源的概念,不管是如何使用本质都是在访问某个“资源”之前,先进行 SphU.entry。所以这个资源并不一定是接口,可以是我们想要限制的任何代码。可能有人好奇为啥dashboard 可以实时的添加/删除规则,如果熟悉代理的朋友应该知道,代理是可以动态的添加和删除的。基于上面实践发现使用Sentinel的限流可以有四种方式原生方式FilterAOP。

2024-02-18 16:05:08 1290

原创 JVM内存调优常用参数

查看某个参数的值:jinfo -flag ParallelGCThreads pid。查看某个参数的值:jinfo -flag G1HeapRegionSize pid。查看当前JDK版本所支持的垃圾回收器有哪些、以及默认使用的回收器。所谓的JVM调优,就是为了保证我们系统的稳定运行。注:pid 可以使用 jps/jcmd 查看。注: jstat -gc 结果描述。

2024-01-28 22:16:19 963

原创 JVM内存区域详解,一文弄懂JVM内存【内存分布、回收算法、垃圾回收器】

堆其实就是一大块内存区域,是用来存放对象的,对于一个应用来说最耗费内存的就是“对象”。因为在运行的过程中会创建无数个对象,所以内存回收(垃圾回收)的时候主要就是针对堆的垃圾进行回收。回收算法是理论,回收器是实践,不同回收器都是基于理论进行真正的实践,在讨论回收器之前需要先了解下面几个点。上面我们谈到内存空间,内存是有限的,想要健康持续的运行下去,就一定要回收“垃圾”。已经知道了哪些对象是可以回收的,那就需要按照某种回收算法,去回收它们。那怎么判定一个对象是不是垃圾呢,就成了新的问题。

2024-01-14 15:51:47 1074

原创 一文弄懂@Async代理执行原理(从源码的角度深入理解@EnableAsync 注解开启原理)

一直只知道 @Async是通过代理来实现的,在同一个方法里面调用为什么不可以,只是懵懂知道一点,抽时间刚好研究一下它的原理,发现和 @Transactional 的实现原理完全一样。

2023-12-16 10:35:56 652

原创 基于MyBatis二级缓存深入装饰器模式

装饰器模式是一种能够在不改变原对象代码的情况下,动态地为对象添加新功能的设计模式。通过将对象包装在装饰器类中,可以透明地、在运行时选择性地、以任意顺序地应用这些功能。最终效果是通过组合不同的装饰器,扩展原对象功能,使系统更灵活可扩展。

2023-12-10 18:36:00 339

原创 布隆过滤器,Redis之 bitmap,场景题【如果微博某个大V发了一条消息,怎么统计有多少人看过了】

Bitmap是一种精简而高效的数据结构,通过二进制位存储大规模布尔值信息,常用于快速处理用户在线状态、权限管理以及行为记录等应用场景。可以简单把它想象成是趋于无限大的数组,每个位置只能存储 1 和 0。它可以快速统计出有多少个 1,也可以快速统计某个区间内有多少个 1。基于此我们可以创建一个 bitmap, key 就是这条消息的id,每个位置就对应一个用户,1 就表示看过。

2023-12-02 17:12:20 441

原创 ES 8.x开始(docker-compose安装、kibana使用、java操作)

其实可以简单把ES中的索引(index)理解成表,那对于表的操作,肯定就是创建表、增删字段,以及对表中数据的增删改查。这里使用docker-compose来安装,方便后续迁移,Elasticserach和kibina一起安装。配置文件有两个,一个是ES的配置文件,一个docker-compose的配置文件。除了用id精准匹配,使用ES更多的是做高亮搜索,比如想要搜索 tags中带。查询 my-index-two 索引中,id = 2,的数据。索引,添加一条 id = 2,的数据。的索引,里面有三个字段。

2023-11-27 22:08:02 1175

原创 一文弄懂MySQL锁机制【记录锁、间隙锁、临键锁,共享锁、排他锁,意向锁】

没有使用索引做更新相关操作会锁表。通过唯一/主键索引等值加锁,只会锁具体的行,非唯一索引则不一定,SQL优化器会基于数据分布选择记录锁,或临键锁。只有在RR级别下才有间隙锁,目的是为了解决幻读,如果操作的数据是跨多个范围,就会加多个区间的间隙锁。MySQL默认的锁就是【临键锁】,所以在执行SQL的时候,记录锁和间隙锁是会同时存在的。范围是左开右闭的区间。

2023-11-10 23:17:10 7028 5

原创 Java日志源码详解,SpringBoot日志 slf4j、logback、log4j

在读取配置文件的时候无非就几种情况,既然有多种情况,那肯定是有一个优先级的——即下面的排序指定自己的配置文件 (logging.config: classpath:logback.xml)默认读取的配置文件,本质上和【1】一样,只是文件的位置不同logback自己的默认配置文件 (“logback-test.groovy”, “logback-test.xml”, “logback.groovy”, “logback.xml”)

2023-09-24 21:46:47 924

原创 EasyExcel导出模板实现下拉选(解决下拉超过50个限制)

先来看看最终实现效果,如果效果是你想要的,再看看实现逻辑。EasyExcel本身是支持设置下拉校验的,但有个问题,一旦下拉数据超过50个左右的时候就无法正常展示,当然,现在这个问题得到了解决。如果你之前使用过EasyExcel那上面主流程代码你将会很熟悉,下拉选相较于之前的导出只是多注册了一个 Handler。

2023-09-03 17:33:27 2113 2

原创 Java进阶之Dump文件初体验

最近线上频繁的内存告警,同事A通过分析dump文件解决了这个问题,我当然是不会放过这种学习的机会。

2023-07-30 19:29:50 5041

mybatis-generator-gui-0.9.0

window界面版,代码生成器。最简单的代码生成器,资源共享

2019-03-22

springmvc实现上传文件到七牛云

此包包含了springmvc单独运行的jar包,和java上传文件到七牛云的jar包

2018-08-14

java上传文件到七牛云需要的jar

此包是java上传七牛云所需要的官方jar包,从七牛云文档上copy的代码加上此包,直接使用

2018-08-14

okio-1.6.0.jar

内容如标题所示。 用七牛云上传文件异常。可以用此包

2018-08-14

hibernate基本配置

本资源,是hibernate配置的基本资料,因为写了个关于hibernate基本配置的博客,为了方便读者操作,便一同公布这个配置资料。

2018-06-14

表单校验-validate

此包里面有,validate的详细文档,和相对应的js包。也有我自己写的关于validate的校验规则,和自定义校验(判断用户名是否存在)。

2018-05-12

空空如也

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

TA关注的人

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