自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 解决Feign的自定义解码器在接口返回值为void时不执行的问题

项目的接口有一个全局的响应包装器,将接口的所有返回,包括各种类型如List、Entity,或者void,以及抛出的异常,封装成统一的结构给到前端,所以在使用Feign发起远程调用的时候,需要一个自定义的解码器,来对正常的返回值做一个拆包处理,同时对可能返回的异常重新抛出。通过debug查看接口的调用栈,发现接口在执行的时候,会经过一个AsyncResponseHandler的类处理,然后执行一个判断是否为空的方法isVoidType,目测跟我们遇到的问题有关联。”,散发着非常可疑的气息。

2023-10-09 21:44:07 1165

原创 通过BeanFactotyPostProcessor动态修改@FeignClient的path

扫描的代码基本上就是Feign的源码,略微修改,扫描的路径是自定义的,而不是从根路径扫,因为我们自己的项目,Feign接口是在指定位置的,然后扫描到的BeanDefinition,转化为类名,这样就得到了所有@FeignClient标注的类名列表。看到这里,便已经有了大致思路了,这里的InstanceSupplier,持有了从@FeignClinent中解析到的各种属性,并在将来实例化的时候,将这些属性处理为FeignClient的请求路径。

2023-10-05 14:00:31 573

原创 SpringBoot源码解析(二十)ApplicationRunner

上篇文章介绍完SpringBoot内置tomcat的启动流程后,SpringBoot在Spring容器启动流程中做的扩展就大体介绍完了,本节继续SpringBoot的run方法,介绍一个比较有用的扩展点:ApplicationRunner当然,在内置tomcat启动完成,到这行callRunners被调用,中间还经历了一些事件的发布,比如ApplicationStartedEvent,我们之前已经介绍过事件发布的原理,并详细分析了好几个事件了,它们发布的流程都是一致的,相信看到这里的朋友,已经很熟悉Spr

2022-10-03 12:54:21 1796 1

原创 SpringBoot源码解析(十九)启动内置tomcat

SpringBoot最初开始流行的时候,一个很重要的区别就是,我们不需要单独配置tomcat了,在传统的SSM项目中,我们要为项目指定tomcat目录,开发完上线的时候,要把项目打成一个war包,部署到tomcat中,而SpringBoot已经默认为我们的web项目内置了一个tomcat。initThemeSource主要是初始化了web项目的UI主题,它检查了容器中是否存在名为themeSource的Bean,如果不存在的话,就初始化一个ResourceBundleThemeSource。...

2022-07-23 11:25:58 789

原创 SpringBoot源码解析(十八)自动配置

前几篇文章聊完了prepareContext方法,本文继续SpringApplication#run方法的下一行:refreshContext这是Spring容器启动过程最重要的一个步骤,所有的扫描、解析、注入等等都在这里面完成的,当然本文依然是把焦点聚集在SpringBoot上,它的自动配置,也是在容器refresh的过程中执行的作为SpringBoot项目,启动类会加一个注解@SpringBootApplication,我们从这个注解开始入手,看它都做了哪些初始化,怎么整合到容器的启动流程并完成自

2022-04-04 01:19:17 636

原创 SpringBoot源码解析(十七)ApplicationPreparedEvent

本文分析SpringBoot启动过程中的ApplicationPreparedEvent事件,它跟上文的事件ApplicationContextInitializedEvent一样,都是在prepareContext方法中发布的,同样算是对该方法的补充,正常情况下,接收到该事件的监听器一共有四个

2022-03-18 00:13:46 1504

原创 SpringBoot源码解析(十六)ApplicationContextInitializedEvent

这篇也是对prepareContext方法的补充,在执行完内置的ApplicationContextInitializer后,该方法发布了一个事件ApplicationContextInitializedEvent,在默认情况下,接收到事件的监听器有两个

2022-03-09 23:14:52 1117 2

原创 SpringBoot源码解析(十五)内置ApplicationContextInitializer

本篇文章是对上篇prepareContext的补充,在该方法的执行过程中,遍历了最初从META-INF/spring.factories文件中加载到的ApplicationContextInitializer,依次调用了其initialize方法回顾第一篇文章,SpringApplication初始化的时候,一共加载到了6个内置的ApplicationContextInitializer,本篇文章就逐一分析每个内置的初始化器做了哪些事情```javaorg.springframework.boot.

2022-03-02 00:09:03 877

原创 SpringBoot源码解析(十四)prepareContext

本文继续SpringApplication的run方法往下分析,看prepareContext这行代码先看下几个入参,context是刚新建的容器,environment是已经完成了配置文件装在等一系列加工的环境对象,listeners中有一个事件发布器,内部含有springboot内置的监听器列表,applicationArguements是对命令行参数的一个封装,printerBanner是上面打印过的启动banner进入方法实现 private void prepareContext(C

2022-02-20 21:51:48 1554

原创 SpringBoot源码解析(十三)SpringBootExceptionReporter

容器创建完成后,继续本文介绍SpringBootExceptionReporter,它是SpringBoot项目启动过程的异常的分析器public ConfigurableApplicationContext run(String... args) { ...... ...... try { ...... ...... exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.cl

2022-02-14 15:26:07 881

原创 SpringBoot源码解析(十二)创建容器

Spring容器创建的过程,本文并不准备详细介绍,因为本系博文的主题是分析SpringBoot源码,重点放在SpringBoot基于Spring所做的扩展这个系列最初的目标,是把SpringBoot的源码一行一行地掰扯清楚,我也尽力在按这个标准来写,但要说把Spring源码也逐行分析清楚,我还不敢夸下这个海口,而且就我目前掌握的皮毛,感觉没有个几十篇文章也下不来的…所以接下来进入容器相关的流程后,对Spring源码还不太熟悉的朋友,可以先找资料研究下Spring的源码,包括后续进入容器的refresh过

2022-02-10 15:56:34 754

原创 SpringBoot源码解析(十一)自定义banner

上篇文章结束了prepareEnvironment方法的分析,本篇继续SpringApplication的run方法往下走,看一个比较简单的点——banner打印所谓banner就是SpringBoot应用启动的时候打印在控制台的一个logo涉及到的代码就是下面这行printBanner在这之前,先简单说下上面的这行configureIgnoreBeanInfo private void configureIgnoreBeanInfo(ConfigurableEnvironment env

2022-02-06 00:11:02 886

原创 SpringBoot源码解析(十)prepareEnvironment收尾

最近很多篇都是围绕prepareEnvironment方法在分析,上篇补充了ApplicationEnvironmentPreparedEvent事件的处理,相当于下面的listeners.environmentPrepared方法就结束掉了,本文就把这个方法中剩下的几行代码收下尾 private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners, ApplicationArgumen

2022-01-28 10:15:29 795

原创 SpringBoot源码解析(九)ApplicationEnvironmentPreparedEvent

最近两篇文章主要分析了ConfigFileApplicationListener对事件ApplicationEnvironmentPreparedEvent的处理,包括EnvironmentPostProcessor扩展点和系统配置文件的加载,而之前也提到过,实际上有很多监听者都会监听该事件的发布,本文对其它几个监听者的相关处理做个大致的介绍首先看下收到回掉的监听者列表ConfigFileApplicationListener以及介绍地很详细了,接下来对剩下的监听器做逐一分析AnsiOutputAp

2022-01-07 10:08:49 2239

原创 github禁用密码 导致idea推送代码443 timeout

记得去年某个晴朗的周末,在家里写着代码,喝着小酒,唱着歌,突然就被github给443了!不过当时并没有在意,因为网络原因,github连不上的现象时有发生,加上个人项目不着急推送,便暂时作罢期间时不时想起来就去看下,依然从未推送成功直到今天,突然想起,跟github失联已有数月之久!!显然哪里出了点问题,网上一顿搜索,从登陆http://github.com.ipaddress.com/#ipinfo获取ip地址配置到hosts文件,到idea里修改github连接超时时间,全都无效,十脸懵逼之

2022-01-05 11:34:06 664

原创 SpringBoot源码解析(八)加载配置文件

上篇文章介绍了EnvironmentPostProcessor接口,在ConfigFileApplicationListener的接口实现中调用了addPropertySources,这个方法第一行添加了一个提供随机数的RandomValuePropertySource,第二行涉及到配置文件的加载,还没有进行说明,本文就继续分析这一加载流程 protected void addPropertySources(ConfigurableEnvironment environment, ResourceL

2021-12-31 14:57:41 1513

原创 SpringBoot源码解析(七)EnvironmentPostProcessor

本文将重点介绍SpringBoot提供给我们的另一个扩展点EnvironmentPostProcessor,它允许我们到任意的指定目录、以任意的方式加载一组配置,并赋予任意的优先级上文对prepareEnvironment方法的configureEnvironment做了一个收尾,本文继续看第三行代码listeners.environmentPrepared private ConfigurableEnvironment prepareEnvironment(SpringApplication.

2021-12-30 14:54:51 2231

原创 SpringBoot源码解析(六)ActiveProfiles初始化

Environment中有个属性ActiveProfiles,是将来要激活的配置本文主要对上篇文章剩下的一个点做个收尾上篇文章讲了配置的优先级,主要涉及到getOrCreateEnvironment和configureEnvironment两个方法其中configureEnvironment方法还剩最后一行configureProfiles没有提到 protected void configureEnvironment(ConfigurableEnvironment environment,

2021-12-28 00:09:57 4999

原创 SpringBoot源码解析(五)Environment配置优先级

上篇文章分析了PropertySource,描述它是一组属性的集合,算是对接下来Environment环节的铺垫,它可以看做项目的运行时环境,是系统运行的基础,最此之前,我们先来聊一下系统配置的优先级回想一下之前的面试,有没有遇到过这样的问题:在一个springboot项目中,命令行参数、系统环境变量、配置文件,它们的优先级是怎么样的?这个问题也将在本文中,从源码的角度给出答案本文的主角,即SpringApplication的run方法中,这行prepareEnvironment这个方法的入参是Sp

2021-12-24 13:12:54 1381

原创 SpringBoot源码解析(四)PropertySource

上篇文章分析了对ApplicationStartingEvent事件的处理,接下来回到SpringApplication.run()方法的流程本文主要着眼于基础环境的准备,涉及到如下两行代码首先第一行,new了一个DefaultApplicationArguments,其作用是把项目的启动参数保存起来ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);public class Defau

2021-12-22 16:27:38 682

原创 SpringBoot源码解析(三)ApplicationStartingEvent

上篇文章分析了SpringBoot事件发布机制的大致原理,并且提到了SpringBoot启动过程中的第一个事件ApplicationStartingEvent,以及监听了该事件的四个监听器:DelegatingApplicationListenerLoggingApplicationListenerLiquibaseServiceLocatorApplicationListenerBackgroundPreinitializer首先还是先简单说下为什么这四个监听器能监听到Application

2021-12-21 11:39:46 1374

原创 SpringBoot源码解析(二)事件发布机制

上篇文章从springboot应用的启动开始说起,分析完了SpringApplication对象的初始化流程 public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return (new SpringApplication(primarySources)).run(args); }这篇文章开始分析后面的run方法 publ

2021-12-17 16:17:05 1388

原创 SpringBoot源码解析(一)SpringApplication初始化

通常来说,一个基本的SpringBoot应用的启动类长这个样子:@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}我们从启动类开始,分析SpringBoot的源码流程,进入run方法 public static Configurab

2021-12-17 11:44:54 1224 2

原创 skywalking环境搭建 踩坑记录

环境搭建到官网下载skywalking压缩包http://skywalking.apache.org/downloads/由于我测试服务器上的ES版本是6.X,最新版本建议使用ES7了,这里选了一个稍旧的版本下载到压缩包后上传到服务器,解压后的目录agent就是增强我们应用的探针,后续需要拷贝到我们应用所在服务器bin目录下有一些启动脚本conf下是一些配置,包括告警配置、skywalking数据存储的配置等这里先修改conf下的application.yml,修改数据存储方式为es

2021-12-14 14:20:56 4289

原创 记一次本地JVM内存溢出但不报异常的排查

背景是后台一个分片上传的需求,对文件切片后通过HttpClient发送到远程接口,在本地调试过程遇到了JVM内存溢出,但没有任何相关的异常信息打印通过传入文件路径,根据配置好的分片大小来计算文件需要切片的数量,然后起线程进行上传,使用CountDownLatch进行同步,全部上传结束后调用上传完成接口通知第三方合并文件 /** * 上传 */ public void upload(String filePath, Long mediumID) throws Except

2021-07-01 11:18:39 390 2

原创 Spring整合MyBatis实现Mapper代理源码解析

以springboot为例,在启动类中,通过@MapperScan注解指定要扫描的mapper路径@SpringBootApplication@MapperScan("com.application.mapper")public class Application {}MapperScan注解:@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Import({MapperScannerReg

2021-06-30 14:16:57 661

原创 自制JDK基础镜像

上传JDK编写DockerFile在JDK同目录下编写DockerFileFROM centos:7 #使用centos:7作为基础镜像MAINTAINER BYFRUN mkdir -p /home/java #创建java目录作为JAVA_HOMEADD jdk-8u11-linux-x64.tar.gz /home/java #将JDK复制到java目录,ADD指令在复制的时候会自动解压ENV JAVA_HOME /home/java/jdk1.8

2021-06-08 09:54:51 1387

原创 修改xxl-job源码,新增dubbo调用方式

背景公司项目服务间使用dubbo通信,引入xxl-job后,需要按照xxl-job的语法对任务予以改造,比如增加@XxlJob注解,修改返回参数等,并且每个服务要配置调度中心的地址,涉及到几十个服务,比较繁琐,并且公司之所以引入xxl-job,主要原因是之前定时任务运行在各自的服务内,没有统一的监控,引入xxl-job后就可以很方便的查看任务运行情况,以及邮件告警、重试等,对于任务具体的调度方式不是很关心,所以这里任务调度不再使用原生的xxl-rpc,而是引入dubbo的调度方式,与之前的项目风格保持一致

2021-04-02 18:21:19 883

原创 SM3算法对大文件做摘要

有个项目需要用到SM3做摘要算法,在github上找了一个实现,很多博客里用的也是这一套,看文件开头的声明类似下面,就基本是同一套实现方案了算法的实现是通过获取源文件byte[],先调用一个叫padding的方法对末位补齐,然后提取hash,起初因为只需要处理文本、图片等小文件,也没有在意,只加了一个接收inputstream的方法,调用原算法的内容转byte[],直到后来需要处理视频等大文件,生产上报了内存溢出,才发现算法的所有分支,最终都是获取完整的byte[],没办法处理大文件先看下原算法获取完

2021-02-24 11:10:31 5203 4

原创 (jenkins系列五)docker搭建jenkins

题外话有段时间没用了,进服务器发现jenkins不见了,还有其他各种文件都没了,第一反应是被黑了,排查下来果然,有个es的漏洞,把我测试数据删了,还找我勒索比特币来着。。。这里就要奉劝各位,云服务上,任何组件,能设置登录密码的一定要设置,然后细分账号权限,当然很多人的服务器都是测试写demo玩的,比如我这台,但是最少最少,不要使用默认端口启动服务,改下端口,安全系数能有很大的提升。。。拉取镜像docker pull jenkins查看下载到本地的镜像:创建容器docker run -d

2021-02-09 10:48:10 94

原创 记一次服务突然被kill掉的问题排查

问题出现项目部署在阿里云服务器,运行在docker容器中,后来发现容器会突然挂掉,没有任何日志输出排查执行命令:dmesg | grep killed process再执行命令查看内存空间:free -h内存确实不多了,尤其是lowmem查看oom-killer执行情况:sudo less /var/log/messages | grep oom-killer与服务挂掉的时间能对上,基本确定是内存不足引发了oom-killer,根据一定规则(占用内存、存活时间)kill掉了某些进程可

2021-01-26 15:55:54 1009

原创 (jenkins系列四)jenkins发布项目到docker

准备环境先自制一个jdk容器,上传到自己的阿里云(阿里云免费提供镜像仓库服务),后面基于这个环境构建自己的应用容器新建目录/home/dockerfile,新建Dockerfile文件,并将JDK的压缩包拷贝到该目录下:编写Dockerfile:FROM centos:7MAINTAINER yiyuankafeiADD jdk-8u11-linux-x64.tar.gz /usr/local/ENV JAVA_HOME /usr/local/jdk1.8.0_11ENV PATH $

2020-05-21 14:37:42 495

原创 记录一次FTP遇到的坑-主动模式与被动模式

一、背景公司要接入一个三方的应用,需要使用FTP下载对方的数据文件,因为对方测试环境没有提供FTP的下载渠道,所有开发过程为了模拟FTP下载,我在自己的阿里云linux上搭建了一个FTP服务器(采用vsftpd),起初在本机windows上测试一切正常,发布到公司测试环境后,FTPClient.listFiles一直是空,并且ftpClient.retrieveFile下载不到文件二、最初的F...

2020-04-04 22:43:16 1073

原创 springboot定时任务接入xxl-job

一、环境准备下载镜像docker pull xuxueli/xxl-job-admin:2.1.2初始化数据库通过xxl-job-admin/doc/db中的脚本初始化数据库源码地址:https://github.com/xuxueli/xxl-job.git启动服务启动参数中设置数据库连接地址等,其中spring.mail.username为报警邮件的发送方spring.mail...

2020-02-18 22:18:44 586

原创 (jenkins系列三)多分支发布

下载插件上篇博文中,我们只能发布指定的分支,实际情况下,一个项目的迭代过程会出现很多分支,甚至会频繁地更换测试环境中的分支版本,应对这种情况,需要我们能在构建发布的时候可以手动选择要发布的分支jenkins可以借助插件git-parameter实现这个需求,首先到系统管理 -> 插件管理 -> 可选插件,搜索git-parameter并立即安装配置参数进入项目 -> 配置...

2020-01-21 11:09:17 567

原创 (jenkins系列二)jenkins发布web项目

环境准备本次整合使用jenkins发布github项目到服务器的tomcat,所以需要准备好git、jdk、maven环境,这里列下我的环境版本JDK:1.8.0.11Maven:3.6.3Git:1.8.3.1能查看各组件版本号说明环境准备OKjenkins全局设置系统管理 -> 全局配置配置jdk,别名任取2. 配置git,别名任取git目录根据安装方式可能...

2020-01-20 14:12:15 766

原创 (jenkins系列一)搭建jenkins服务器以及遇到的坑

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...

2020-01-19 23:23:41 642

空空如也

空空如也

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

TA关注的人

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