- 博客(516)
- 资源 (6)
- 收藏
- 关注
原创 Dubbo灰度实践
本文探讨了在UAT环境下实现Dubbo灰度调用的实践方案。通过parameters参数标记服务版本,利用Servlet Filter从HTTP请求头获取灰度标签并存入ThreadLocal。自定义Dubbo Filter实现标签在消费者和生产者间的透传,最后通过自定义Router基于标签选择服务。关键点在于:1) 服务打标区分环境;2) HTTP到RPC的标签传递;3) 调用链路的标签上下文管理;4) 基于标签的服务路由。该方案实现了UAT环境调用本地服务(DubboA→DubboB1→DubboC)的灰度
2025-11-18 22:16:03
693
1
原创 Dubbo如何使用Nacos做注册中心的
本文探讨了Dubbo与Nacos集成的关键机制,重点分析了服务注册和发现的过程。在服务注册方面,Dubbo通过自定义监听器触发注册流程,并建立了客户端心跳检测机制维护服务可用性。服务发现部分详细阐述了消费者如何通过接口定义获取提供者URL并创建Invoker的过程,包括服务URL匹配、Invoker生成及更新等核心步骤。文章通过源码分析揭示了Dubbo与Nacos集成时应用级注册的具体实现,为理解微服务间通信机制提供了实践参考。
2025-11-12 23:11:45
977
原创 源码解析Nacos是如何热更新的
摘要 文章分析了Nacos配置中心监听器的初始化流程。首先通过NacosConfigApplicationContextInitializer初始化配置文件和监听器,在NacosPropertySourcePostProcessor中创建匿名Listener监听配置变更。该Listener会被添加到ClientWorker的cacheMap和阻塞队列listenExecutebell中,由后台线程轮询处理。同时,通过@NacosValue注解标记需要热更新的bean,后置处理器会收集这些bean并以key-
2025-10-21 16:45:41
871
原创 Nacos配置文件如何初始化的
本文介绍了SpringBoot如何从Nacos加载配置并解析配置值的详细过程。主要内容包括: Nacos通过自定义初始化类NacosConfigApplicationContextInitializer在SpringBoot启动时加载配置; 加载过程会通过data-id请求Nacos服务端获取配置,生成NacosPropertySource并存入容器; 解析配置时,通过AutowiredAnnotationBeanPostProcessor处理@Value注解; 对于跨data-id的配置引用,Spring
2025-10-15 15:10:11
634
原创 Java分布式锁详解
摘要 Redis分布式锁在实际应用中存在原子性加锁、锁超时、误删锁等问题。通过Redis的NX/PX原子命令和Lua脚本可以解决部分问题,但最佳实践是使用Redisson工具。Redisson提供看门狗自动续期、锁等待时间设置、线程专属锁释放等特性,并支持可重入锁、公平锁等高级功能。建议通过自定义注解实现声明式加锁,将锁的key与方法参数绑定,简化开发流程。这种方式既能保证分布式锁的可靠性,又能让开发者专注于业务逻辑。
2025-09-08 21:59:39
783
原创 CompletableFuture初体验
Java异步编程对比:Future与CompletableFuture Future(Java 5)是基础的异步接口,仅支持阻塞获取结果和简单取消操作。CompletableFuture(Java 8)扩展了Future,支持链式操作、异常处理、多任务组合等现代异步特性,提供非阻塞获取、手动完成、回调函数等能力。常用方法包括:supplyAsync/runAsync创建任务,thenApply/thenCompose转换结果,allOf/anyOf组合多任务,exceptionally/handle处理异常
2025-09-01 20:59:43
957
原创 记一次RocketMQ消息堆积
【摘要】系统在从阿里云迁移到腾讯云后出现MQ消息堆积问题。经排查发现,问题根源在于腾讯云顺序消息的重试机制与阿里云不同:腾讯云采用阶梯式重试间隔(10s到2h),导致消费失败的消息长时间阻塞队列,而阿里云采用1秒固定间隔快速进入死信队列。临时解决方案是减少重试次数至2次并重启消费者。技术分析指出,顺序消息会锁定队列保证顺序性,且重试由客户端发起(服务端不可见),但阻塞仅影响当前消费组。该问题暴露了云服务商在消息队列实现细节上的差异风险。
2025-08-25 21:42:08
979
原创 jenkins对接、jenkins-rest
摘要:本文介绍了利用Jenkins REST API实现多线程批量构建项目的方法。通过接口调用替代手动操作,可一次性构建数十个项目。核心流程包括:获取queueId→通过queueId查询buildNumber→获取BuildInfo以判定构建状态。文章提供了关键代码示例(Java),涵盖参数配置、状态轮询和线程池设置(4线程/120队列)。该方法显著提升批量构建效率,适用于需频繁部署的持续集成场景。
2025-06-22 17:47:48
1048
原创 gitlab对接,gitlabRestApi,gitlab4j-api
这篇文章介绍了如何通过GitLab API实现代码合并流程的自动化。文章分为系统设计和代码开发两部分: 系统设计部分提出了一套自动化合并方案,包含分支校验和合并流程,要求MR满足标签、分支、版本号等条件才能合并。整个流程分为填写MR分支、校验、合并三个步骤。 代码开发部分详细讲解了如何使用gitlab4j-api库实现功能: 查询MR列表及模糊搜索 获取单个MR详情 执行MR合并操作 文中提供了完整的代码示例,包括API调用方法、MR数据结构和参数说明,展示了如何将原本复杂的手动合并流程简化为几个按钮操作。
2025-06-16 21:16:28
1300
原创 AI之Agent(Dify + SpringAi)
上一篇SpringAI入门搭建MCP,学习了一些AI相关的知识,今天在这些知识的基础之上,来做一个小小的应用:搭建一个套餐推荐的Agent。
2025-06-16 21:11:07
1357
原创 SpringAI入门搭建MCP
本文介绍了基于SpringAI框架的MCP(模型上下文协议)开发实践。主要内容包括:1)构建AI Agent的三个关键要素:大模型+提示词定义角色、知识库提供个性化数据、MCP接口实现业务功能;2)开发天气查询MCP服务的完整流程,通过SpringAI将传统REST API包装为MCP服务;3)MCP调试的两种方式。文章通过医美套餐推荐和天气查询两个案例,展示了MCP在简化人机交互流程方面的优势,以及如何借助SpringAI快速实现AI能力集成。开发过程中需要JDK17环境和特定依赖配置,最终产出可通过专业
2025-05-28 22:25:09
1291
1
原创 Cursor助力Java开发(快捷键+配置篇)
如果某些快捷没反应、或快捷键冲突,可以自定义快捷键选中右边的识别键盘之后,按下对应的快捷键,就可以看到对应的快捷键的使用情况了。
2025-04-02 21:49:12
7107
1
原创 使用Cursor搭建的一个应用,可当作毕业设计
看过很多使用Cursor,一天完成一个应用的文章或视频,前些日子脑子刚好有一个想法——搭建一个点餐管理系统,便用Cursor完成了前后端的开发。具体功能可以看视频里面的演示。也算是从0到1完成了一个小的项目构建,来说说对它的看法。
2025-03-23 15:38:29
658
原创 MCP入门实践,Cursor+MCP
学习之前,需要知道什么是MCP(Model Context Protocol,模型上下文协议),官方的解释如下MCP 是一种开放协议,它标准化了应用程序向 LLM 提供上下文的方式。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一种将 AI 模型连接到不同数据源和工具的标准化方式。我暂时把它理解成各种远程工具插件,比如一个获取天气的插件、一个获取热搜的插件、一个可以操作数据库的插件,可以是很多。
2025-03-16 10:33:53
2764
原创 写个漂亮的代码之二
分组构建的过程,会分别写在 UserCourseGroup 和 UserCourseMapping 中,这样就存在一个问题,当type类型再次新增一种的时候,我们需要对2个分组的方法都进行修改,很容易就忘记了修改某处。在Service层也写了很多的if逻辑,代码做了很多的兼容处理,虽然不复杂,但写的时候很难受,看的时候更难受。最终的做法就是在Controller里给默认值,当用户选择type-A的时候,X = 0, Y = 空,这样后面的逻辑就都统一了。,同时这张表里面还有一个type字段。
2025-03-08 21:59:28
388
原创 Cursor助力Java开发
这篇文章来教大家如何使用Cursor来开发Java,开始之前先来回答一个问题:Cursor是基于VSCODE二开的,可以用来写Java吗?答案是可以的,就我使用了一段时间来说,虽然不如IDEA那么顺手,但它的Ai功能完全掩盖其它的不足。
2025-02-18 22:07:19
14249
5
原创 使用AI生成Java单元测试,代码无BUG
从结果来看,要比预期好很多,最开始的目标是在写单元测试的效率提升 30%,从结果来看是要大于这个预期的。从结果来看就是 Cursor + 提示词,生成单元测试,如果想直接看结果可以直接跳到【四、使用Cursor】,如果想要看看对比,可以一步步往下看。对于各种IDEA插件生成的单元测试来说,几乎就只有手动调试一种方式,主要原因它们对整个代码库理解不是很好,很难对给出的异常做太多的优化。每一次对话,就会扣减上面 250次中的一次(对话框的左下角可以选择模型,有的模型是不限量的)
2025-01-04 22:23:27
5168
原创 Nacos热更新
(这里是循环获取本地的阻塞队列数据,至于Nacos如何把任务塞到队列的代码可以自行去看看,有了队列还会找不到塞的操作吗)判断的逻辑也很简单,拿配置文件里面的全部内容生成一个 md5,和上一次的md5进行对比,如果两个md5不一致,则说明有变化。最近有一个需求,需要把Nacos上某个配置文件,从A_data-id迁移到B_data-id上。,这个方法会去判断当前data-id的内容是否有变动,如果有变动就会发送事件去处理。这个方法里面会去解析配置文件里面的内容,然后发一个事件,这个事件就是热更新的核心了。
2024-12-29 16:26:08
1059
原创 Dubbo生产者一次请求的过程 (Dubbo源码三)
Dubbo底层通讯是基于Netty,请求第一步肯定是从Netty收到消息开始的。Netty收到消息也肯定是不是明文的,这一节要解决如下问题Netty接收消息的入口如何把消息解析成明文怎么通过消息找到对应的服务
2024-12-15 15:15:35
815
原创 Dubbo消费者一次请求的过程 (Dubbo源码二)
基于@EnableDubbo > @EnableDubboConfig 找到每一个@DubboReference 生成代理对象生产的代理对象是一个嵌套对象,里面有两个重要的对象分别是 MigrationInvoker、CallbackRegistrationInvoker。
2024-11-03 11:29:11
967
原创 优雅的入参校验,Valid常用校验
对于前端传递的参数,正常情况下后端是要进行一些必要的校验,最简单的做法是用 if效果是可以,但不优雅。使用 @Validator 代替 if,就会优雅很多ps:Validator 也可用于Dubbo参数校验。
2024-10-21 22:13:55
649
原创 No provider available from registry RegistryDirectory
最近在做配置文件升级,服务比较多,之前的Dubbo配置各个服务写的比较乱,有的用Nacos上的 data-id,有的又是在自己的服务引入配置遂准备统一了,全部都用Nacos上的配置,同时修改了Dubbo服务名发到线上的时候,线上崩了,部分服务出现如下错误注: IP和服务名做了隐藏处理。
2024-10-20 17:09:42
1378
原创 Dubbo接口级和应用级注册,Dubbo消费者注册到Nacos
假设有一个服务A,里面提供了2个Dubbo接口XdxOneService、XdxTwoService,Dubbo生产者把服务注册到Nacos(或其它的注册中心)以应用级别注册,在Nacos上就只看到一个服务名称A(取自 dubbo.application.name)以接口级别注册,就会看到两个服务注:可以同时注册应用级和接口级。
2024-10-15 20:36:43
1584
原创 Dubbo源码解析之@DubboService、@DubboReference(Dubbo源码一)
对于Dubbo用的最多的就是@DubboService、@DubboReference,与之对应的就是服务的提供方、调用方。之所以加上注解就可以运行,定是生成了代理对象,这篇文章就来讲讲如何基于这两个注解生成代理对象。不管是服务端还是客户端,在使用Dubbo的时候都会先使用,比如下面的demo@EnableDubbo 是一个组合注解,它头上还有@DubboComponentScan和@EnableDubboConfig,它们就是分别来解析@DubboService、@DubboReference。
2024-08-28 21:56:54
2733
原创 谈谈我对微服务的理解2.0
服务拆分有一个简单的点就是,各个服务维护自己的表,比如A服务想要获取B服务的数据,一定是要B服务提供接口,而不能是A服务去直接连B服务的表,如果某个特别复杂的业务必须要连表才可以,那就弄一个聚合服务出来,对于各个服务的表的增、删、改一定要控制在自己的服务里。再举一个实际的例子,我们是做医疗系统的,有一个很重要的数据“病人”,所有的数据都是围绕这个病人来的,大部人业务数据都冗余了病人的id,但大部人业务的列表都要基于病人的手机号、唯一编号、姓名来查询,我们是怎么做的呢?而每一个资源都是单表的查询。
2024-08-04 21:12:16
1120
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
5211
2
原创 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
2176
原创 Nominatim免费的地址解析,逆地址解析,OpenStreetMap开源地图数据【全网最全】
国内的一些地址解析供应商的API都开始付费了,就想找个免费的地址解析和逆地址解析的应用,最终选择了Nominatim + OpenStreetMap。
2024-06-22 14:45:55
9430
12
原创 免费开源的地图解析工具【快速上手】
这篇文章和【Nominatim】是相呼应的,在尝试了OSM数据一直有问题之后,通过别人的指点是不是可以换个思路,我的数据只需要精确到市级别,也可以不用OSM这样全的数据(主要原因还是OSM太过庞大了)在网上看到有人发布的一个地址解析和逆地址解析的SDK(下面称为 Geo),觉得是个思路,随即进行了数据测试Geo 文档。
2024-06-22 14:43:11
2995
原创 SpringBoot 热插拔AOP,动态的实现AOP【简单易懂,有大用】
下面就来实现一个动态的添加/删除动态代理的功能,它的源码很简单,但这会打开你的新世界
2024-05-25 17:23:37
1718
3
原创 Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】
最近在做系统升级的时候,引发了一个BUG,原本系统是有一个异常处理器A,引入了某个底包中也带了一个异常处理器B,最终走了底包的异常处理器B。在DispatcherServlet里面有一个onRefresh方法,它是重写的父类FrameworkServlet的,在初始化ServletBean的时候会被调用一次,它里面会做很多初始化的操作,其中一个就是获取容器里面的全局异常拦截器。并不是系统任何异常都会被它所拦截,因为我们已经知道它的执行点是在MVC的流程中,所以就只有HTTP异常才会被拦截处理。
2024-05-13 21:59:03
3391
原创 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
1768
原创 Dubbo-Admin 实践,Dubbo3 配置多协议,同时提供Dubbo和HTTP协议
Dubbo是支持多协议的,它默认的Dubbo协议已经很好了,正常情况下,使用Dubbo是做服务之间的通信是不需要更换协议的。比如有两个服务的提供者提供相同的服务,可以给它们打上A、B标签,请求的时候可以根据标签去固定请求对应的服务。默认的协议就是 dubbo,所以在使用的时候不需要指定协议,如果使用其它协议需要指定对应的协议。Dubbo不只是作为服务间的通讯,它还涉及服务治理,今天就来一起学习下Dubbo的控制台使用。原本的dubbo协议是不需要提供路径的,现在的HTTP需要提供路径,改造如下。
2024-04-27 19:30:05
1735
原创 免费简单好用的内网穿透工具(ngrok、natapp),微信回调地址配置
在一些特殊的场景下,需要把我们的内网暴露出去,比如写了一个接口或网站想让别人看到,或者进行第三方开发调试的时候需要一个外网可用的回调地址。很早之前不会有这样一个中间页,如果只是临时访问,点一下 【Visit Site】也就可以了,但如果前后端对接或者第三方回调,就难办了。如果第三方不支持ngrok的时候可以使用natapp来替代,不然ngrok可以固定域名还是挺方便的。可以执行Command Line,把token进行设置, ngrok就是上一步下载的可执行文件。官方提供三个解决办法。
2024-04-27 19:08:38
3259
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
1187
原创 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
1869
原创 RocketMQ 消费者源码解读:消费过程、负载原理、顺序消费原理
看完上面的源码你最少可以回答下面几个问题RocketMQ消费的流程是怎么样的为什么消费者大于queue的时候,消费者就没用了顺序消费如何保证顺序的添加消费者的时候,如何重新分配的。
2024-04-02 22:01:46
1307
原创 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
2893
1
原创 Sentinel 规则持久化,基于Redis持久化【附带源码】
sentinel持久化原理:dashboard先把规则推送给A,再由A把规则下发到各个具体的应用服务。这样A就相当于一种中心存储,解决了数据存储的问题,同时A实时下发给应用服务解决了数据一致性的问题。
2024-03-03 16:39:09
2049
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅