
Java
文章平均质量分 85
游北亮
位于福州,从事技术团队管理、架构师、DevOps等
展开
-
谷歌开通第三方平台OAuth登录及Java对接步骤
调研起因:当然还是因为手头的海外项目,用户注册通常要用邮箱,正常流程需要给用户邮箱发送验证码,再让用户输入密码进行注册。为了简化流程,让用户使用谷歌邮箱一键完成注册或登录,我们直接获取谷歌邮箱、谷歌注册里的头像、姓名等信息,所以要进行谷歌对接。废话不多说,直接开始步骤说明吧:注意:要注册和对接,必要的科学上网还是需要的,这个自己想办法吧。原创 2025-01-01 09:15:00 · 3126 阅读 · 0 评论 -
SpringBoot项目升级到3.*,并由JDK8升级到JDK21
使用JDK21+ spring-boot-starter3.3.1 + spring-cloud-starter-openfeign4.1.2创建项目过程中碰到的问题小结,并提供项目Demo。原创 2024-11-20 20:34:33 · 1773 阅读 · 0 评论 -
一段代码读取Chrome存储的所有账号密码和Cookie
介绍了如何用代码读取Chrome存储的账号密码,以及Cookie的数据,并警醒这些数据泄露的可能性很大,日常电脑使用一定要注意安全。原创 2024-06-16 19:13:01 · 3809 阅读 · 0 评论 -
前端不暴露ak/sk直接上传阿里云oss的方案
介绍如何在不暴露ak/sk的情况下,使用javascript直接上传阿里云 oss的方案,并小小的吐槽一下原创 2023-07-07 10:20:37 · 3171 阅读 · 0 评论 -
Java库Lombok常用注解使用
Lombok已经是很多Java项目最常用的库之一了,本文通过示例代码介绍那些常用的注解。原创 2023-06-11 09:46:13 · 1148 阅读 · 1 评论 -
SpringBoot项目登录并接入MFA二次认证
MFA多因素认证():一些需要身份认证的服务(如网站),为了提升安全性,通常会在账号密码登录成功后,要求用户进行第二种身份认证,以确保是正确用户登录,避免用户密码泄露了或其它原因导致用户信息泄露。不过,用户体验就比较差,因为要登录2次嘛。本文只介绍网站的MFA软件接入方案,并采用手机应用进行认证。原创 2023-06-04 22:13:40 · 7203 阅读 · 1 评论 -
SpringCloudConfigServer配置刷新优化方案
Config-Server端:提供管理API,用于开发人员更改 最近配置刷新时间提供客户端API,用于客户端定时拉取最近的配置刷新时间,并判断是否需要重新加载配置和刷新Config-Client端:定时轮询Config-Server端的API,获取自己的最近的配置刷新时间;如果比上一次刷新时间大,则进行配置刷新/*** 客户端使用:获取指定app的配置更新时间} /*** 管理端使用:设置指定app的配置更新时间,以触发该app更新配置if(!原创 2023-05-29 09:49:18 · 863 阅读 · 0 评论 -
IDEA常用提升效率的操作小记
Ctrl+鼠标左键点击方法,会转到方法的定义点击变量,会转到变量的定义注:如果进入了反编译的代码,可以点右上角的【下载源码】看带注释的正常代码。原创 2023-04-29 22:44:05 · 1133 阅读 · 0 评论 -
kafka使用详解、最佳实践和问题排查
kafka常用概念、与RabbitMQ对比、最佳实践、工具推荐、Spring快速使用和问题排查原创 2023-04-25 20:15:50 · 3703 阅读 · 0 评论 -
分享一个自研的工具项目:代码生成|表结构对比|配置对比
从MySQL读取表结构,并生成对应的Java源码文件和对应的前端VUE编辑/列表页面,可以直接复制到项目中,entitymapperservicecontrollerdtoentity与dto互转的mapstruct-mapper转换类基于VUE2.0的前端html页面点击页面的下载文件, 并解压解压的文件,除html,其它文件复制到你的SpringBoot项目对应的java目录下html复制到你的SpringBoot项目的目录下复制项目根目录下的res.zip。原创 2023-04-21 19:25:02 · 609 阅读 · 0 评论 -
SpringCloudConfigServer配置中心使用与刷新详解
介绍SpringCloud原生的配置中心部署、使用,以及如何自动刷新配置的完整步骤。原创 2023-03-22 15:24:15 · 1606 阅读 · 0 评论 -
DevOps-7:Jenkins API介绍
简要介绍了在Java里使用FeignClient调用Jenkins的API进行构建的具体代码。原创 2022-12-26 10:34:36 · 2475 阅读 · 0 评论 -
前端不暴露ak/sk直接上传aws S3的方案
前端通过Javascript直接上传S3的预签名URL,避免暴露ak/sk的方法原创 2022-12-08 18:42:53 · 5158 阅读 · 5 评论 -
SpringBoot的Cacheable缓存问题一则
SpringBoot的缓存无作用问题排除与解决原创 2022-08-26 21:12:12 · 1153 阅读 · 0 评论 -
SpringBoot项目配置明文密码泄露问题处理
在项目开发过程中,需要配置数据库连接密码、Redis密码、网盘上传的AK/SK等敏感信息,都需要保存在配置文件里,或者配置中心。这些信息如果泄露,还是会造成一定的困扰,这里介绍2种处理方案:1、使用系统环境变量储存密码比如K8S的环境变量、Windows的环境变量、Centos的环境变量等等,然后在程序里使用 System.getenv()方法读取。这种方式的好处:只有运维人员知道,连开发都不知道生产的密码。密码变更也简单,运维直接操作就好了。缺点就是部署时,容易遗漏,不过可以通过统一的环境镜原创 2022-01-20 17:17:50 · 2803 阅读 · 2 评论 -
SpringBoot项目日志输出为JSON格式,方便Elastic采集
这段时间,使用K8S部署项目,同时使用Elastic采集日志并提供给开发检索,使用过程中,经常出现换行日志无法完整采集和展示的问题。比如抛出的Exception会有换行,被ES采集后,变成多条日志,极其不方便检索和排错。经运维提示,并参考 https://groups.google.com/g/fluent-bit/c/XoOibAxGGeI改用json输出项目日志,本地调试依然使用旧日志格式。注:本文基于:spring-boot-starter:2.4.11 或 spring-boot-star原创 2022-01-19 14:56:44 · 1652 阅读 · 0 评论 -
生产问题一则:ThreadLocal使用不当导致的内存泄露
先简单介绍一下 ThreadLocal,它是一个线程级的数据存储对象,生命周期是从一个线程的创建到该线程销毁。ThreadLocal里的数据,只能被所持有的线程读取,所以是线程安全的(前提是该数据不是多线程共享的)。ThreadLocal的get、set、remove等方法,其实是对Thread.threadLocals字段的封装,而Thread.threadLocals的类型是ThreadLocalMap,它维护了一个key/value键值对,ThreadLocalMap.set方法简略代码如下:/原创 2021-07-28 15:31:29 · 1053 阅读 · 0 评论 -
SpringCloudGateway限流后,默认返回429的改造:改302跳转或增加响应body
上篇介绍了使用SpringCloudGateway如何在内存中进行限流操作。但是,SpringCloudGateway默认是返回HttpStatus.TOO_MANY_REQUESTS 429状态,可是我们并不希望用户看到这个不友好的提示,而是希望用户看到我们的自定义界面,更好看,或者去一个游戏界面让用户玩玩游戏吧。有一个解决方案,一般在api网关的前面还会部署一个nginx服务,用于网关的负载均衡,那么可以在nginx收到429响应时,转向特定页面进行展示。但是如果我们希望根据不同的服务,转向不同的原创 2021-03-25 15:06:10 · 5274 阅读 · 1 评论 -
SpringCloudGateway内存中基于令牌桶进行限流
研究了一下网上的很多文章,基本都是使用 RedisRateLimiter,即根据Redis来进行限流操作。这样有个好处,就是网关的集群可以使用同一套数据进行限流;当然也有缺点,网关本来就是所有流量的集中出入口,如果每个请求都要往返一次Redis,无疑加重了网关的负担,性能有下降。本文介绍了如何直接在内存中进行限流,内存限流的缺点,当然就是对集群不友好了,比如有3个网关实例在运行,每个网关按每秒1个令牌,令牌桶容量为10,那么实际上就是每秒3个令牌,最大容量是10~30波动,不过基于令牌桶算法的控制,我原创 2021-03-24 11:52:36 · 1113 阅读 · 0 评论 -
Spring Cache缓存使用问题整理
接上篇,解读了Spring框架的缓存实现原理后,本文记录一些使用过程中的怎么办问题。前言:在没有引入其它类库,也没有自定义配置的情况下,一些默认的缓存实现:CacheManager: org.springframework.cache.concurrent.ConcurrentMapCacheManagerCacheResolver: org.springframework.cache.interceptor.SimpleCacheResolverKeyGenerator: org.spring原创 2021-01-23 17:06:15 · 1388 阅读 · 3 评论 -
Spring框架的Cache缓存实现源码解读与原理解析
项目需要,对Spring的Cache缓存实现做了一次分析,写一篇小结在此。本文基于 spring-context 5.2.12.RELEASE的源码:<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.12.RELEASE</version> <原创 2021-01-14 08:00:52 · 2076 阅读 · 2 评论 -
Spring项目统一cacheManager出错:No CacheResolver specified, and no unique bean of type CacheManager found
起因,一些基础数据的接口访问量居高不下,在高峰期很容易出现服务性能问题,并经常需要扩容。最早的解决方案,是让各调用方,自己添加缓存,避免频繁访问基础服务接口。该方案存在的问题,就是数据经常不一致,基础数据变了,但是调用方不知道,如果用MQ去通知,技术方案又复杂了。第二期的解决方案,是在基础数据提供方添加缓存,因为这些数据是否变化,只有提供者知道并可以及时过期处理。该方案效果还是比较明显的,但是监控数据上的TPS依旧存在,大量的HTTP请求也依然存在性能浪费的问题。而且各个服务的缓存方案各不一致,比如原创 2021-01-09 14:35:06 · 8190 阅读 · 1 评论 -
Java单元测试:使用PowerMockito库对方法进行进一步mock
单元测试第七篇,在第六篇中,介绍了mockito对public方法的mock,但是mockito不支持私有方法、静态方法等,因此,本文介绍PowerMockito库,它在mokito上进行增强,可以mock 静态方法、私有方法、final方法、enum、构造函数等等。注:要使用PowerMockito,必须使用org.junit.Test,且class和method都必须是public参考:https://github.com/powermock/powermock/issues/1030。相关代码原创 2020-12-17 15:55:46 · 1787 阅读 · 0 评论 -
Java单元测试:使用mockito库进行方法级mock,完成单元测试
单元测试第六篇,演示在单元测试时,如何拦截某些方法的访问,让它们返回我们想要的值,而不是执行该方法本身,以便其它代码的测试和验证。相关代码已经放在Github上:源代码注:前面5篇,是介绍在单元测试中避免访问外部中间件,但有时,我们想进行测试的代码,调用了一些我们并不想测试的函数方法,此时,就可以用mockito框架来mock掉这些不想测试的方法。下面简述开发过程:1、首先,还是正常建立项目,并完成一些常规的业务逻辑开发;2、项目添加mockito库的引用,打开pom.xml,添加:<!-原创 2020-12-17 15:43:53 · 8284 阅读 · 0 评论 -
Java单元测试:使用spring-boot-test库完成MVC控制器的单元测试
单元测试第五篇,演示在单元测试时,如何模拟浏览器访问Controller里的方法,进行测试和验证。相关代码已经放在Github上:源代码下面简述开发过程:1、首先,还是正常建立项目,并有常规的MongoDB操作的业务逻辑;2、项目添加spring-boot-starter-test库的引用,打开pom.xml,添加:<dependency> <groupId>org.springframework.boot</groupId> <artif原创 2020-12-08 13:54:59 · 561 阅读 · 0 评论 -
Java单元测试:使用de.flapdoodle.embed.mongo库完成MongoDB的操作mock
单元测试第四篇,演示在单元测试时,如何对MongoDB操作进行mock,便于本地或CI/CD环境的质量测试、覆盖率测试。相关代码已经放在Github上:源代码注:该库在首次运行时,会真的去下载并搭建一个Mongo运行环境,因此:1、运行时,需要外网网络,并且质量不能太差,一个包上百兆呢(只会下载一次)2、每次运行,都需要清理旧数据,否则可能对你的测试代码造成干扰。下面简述开发过程:1、首先,还是正常建立项目,并有常规的MongoDB操作的业务逻辑;2、项目添加mock库的引用,打开pom.xm原创 2020-12-07 20:15:25 · 2717 阅读 · 0 评论 -
Java单元测试:使用embedded-redis库完成Redis的操作mock
单元测试第三篇,演示在单元测试时,在没有安装Redis服务时,如果对Redis操作进行mock。相关代码已经放在Github上:源代码注:有些资料说,embedded-redis存在一些问题,我在具体使用中,因为只使用了基本的key value操作,暂时未发现。下面简述开发过程:1、首先,还是正常建立项目,并有常规的REDIS操作的业务逻辑;2、项目添加mock库的引用,打开pom.xml,添加:<dependency> <groupId>it.ozimov<原创 2020-12-02 11:59:00 · 6644 阅读 · 1 评论 -
Java单元测试:使用RabbitMQ mock库完成消息生产和消费的mock模拟
单元测试第二篇,演示在单元测试时,RabbitMQ生产者和消费者的mock。相关代码已经放在Github上:源代码要注意的是,因为不是真实的消息队列中间件,只是进程内mock,因此,生产的消息无法被其它服务(进程)消费,消费者也无法收到真实的MQ消息。下面简述开发过程:1、首先,还是正常建立项目,并有常规的生产消息或消费消息的业务逻辑;2、项目添加mock库的引用,打开pom.xml,添加:<dependency> <groupId>com.github.fri原创 2020-11-28 22:25:27 · 3264 阅读 · 3 评论 -
Java单元测试:使用内存数据库h2完成JPA的mock模拟
为了让兄弟们快速介入单元测试的基本使用,整理了一系列不同场景的,基于SpringBoot的单元测试Demo,并梳理一下相关使用过程和注意事项。首先是数据库,本文基于JPA进行说明,开发使用MySql,单元测试使用H2数据库。这样,单元测试可以在Jenkins构建环境或其它管道模式下运行,便于业务的正确性测试和覆盖率检测。相关代码已经放在Github上:源代码下面简述开发过程:1、项目已经正常建立,并有常规的仓储层操作业务逻辑;2、项目添加h2数据库的引用,打开pom.xml,添加:<de原创 2020-11-20 16:54:26 · 2859 阅读 · 5 评论 -
日志记录:注解方式记录方法日志
前面分别讲了5篇,包括:Feign、JPA、MVC、Redis、RabbitMQ。对业务项目无侵入,在框架层面实现全局日志记录的解决方案。一些通用的日志需要已经差不多了。但是实际业务中,还是经常需要按实际需要,记录一些日志的.本文就介绍,如何在方法上加一个注解,就完成了对方法的输入输出及耗时,进行记录日志。具体的Demo演示代码,已经上传到:Github代码具体实现,是通过 spring-boot-starter-aop 切面实现的。1、定义一个只能用于方法的注解:import java.l原创 2020-11-06 15:51:50 · 1884 阅读 · 0 评论 -
全局记录RabbitMQ的消费者消息日志
还是为了方便不同环境的问题排查,需要记录 消费者收到的所有消息,最好也能记录一下每个消息的处理时长,哈哈。注:本文的完整代码,已经上传到:Github代码通过分析springframework.amqp代码,发现RabbitListener注解的消费者,是通过 SimpleMessageListenerContainer 类在处理监听:org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer而 SimpleMe原创 2020-11-05 11:41:08 · 4534 阅读 · 7 评论 -
全局记录SpringBoot Redis的请求和响应日志
同前文,有时需要跟踪Redis的命令、参数,以及Redis的返回数据情况,如何开启Redis的全局日志呢?首先当然是在网上找了一些资料,发现要么是通过Redis第三方工具监控Redis通信,要么是通过代理RedisTemplate,拦截RedisTemplate类的方法,而RedisTemplate类集成了9个opsForXxx方法,还有expire或delete方法又是独立的,而且相关命令基本都长得跟Redis不太一样,不熟悉的话,需要看一下源码,才知道是哪个Redis命令。调研了一下Redis操作原创 2020-10-24 22:07:31 · 3813 阅读 · 1 评论 -
全局记录SpringBoot MVC的请求和响应日志
目录1、使用logbook组件输出日志2、自定义Filter输出日志在线上出现问题需要排查,需要开启整个服务的请求与响应日志,下面简介一下如何开启MVC日志:注1:本文基于 spring-boot-starter-parent 2.3.4.RELEASE注2:由于站点一般访问量都比较大,影响性能,生产不建议开启,仅在需要问题排查时,通过actuator接口开启,排查完毕要及时关闭。1、使用logbook组件输出日志演示代码参考点这里1.1、添加logbook引用:<!-- https:原创 2020-10-21 10:42:31 · 2485 阅读 · 0 评论 -
全局记录JPA的SQL、参数和执行时长日志
目录1、只开启请求的SQL和具体参数:2、希望记录完整的SQL和执行时长:3、记录返回的结果集或更新行数日志同样为了问题排查,需要开启数据库的访问日志,了解请求的SQL及具体参数,最好还记录一下时长,以便排查慢查询,最好还能有返回结果情况,下面简介一下如何开启JPA的日志:注:本文基于spring-boot-starter-parent 2.3.4.RELEASE1、只开启请求的SQL和具体参数:如果有sql和参数就够了,那么在application.yml里添加如下配置就好了:loggin原创 2020-10-14 20:44:38 · 4404 阅读 · 3 评论 -
全局记录Feign的请求和响应日志
这里写目录标题1、项目里定义FeignClient接口:2、单个FeignClient接口开启日志:3、所有FeignClient接口 开启日志4、使用Aspect切面输出日志项目里使用了Feign进行远程调用,有时为了问题排查,需要开启请求和响应日志,下面简介一下如何开启Feign日志:1、项目里定义FeignClient接口:package com.example.demo.feign;import org.springframework.cloud.openfeign.FeignClient原创 2020-10-13 12:14:03 · 21979 阅读 · 14 评论 -
MySQL写入emoji表情,并读取emoji表情的操作。
先放结论,读写emoji表情都正常的操作方式是:1、数据库的表定义,必须是 utf8mb4;2、SpringBoot配置文件里的连接串必须加 characterEncoding=utf83、配置文件里同时要添加初始化SQL语句: initSQL: “SET NAMES utf8mb4”保证以上3步,就可以正确写入,也能正确读取出emoji表情字符。-------------------------------------------------我是分隔符----------------------原创 2020-07-30 20:06:39 · 1795 阅读 · 2 评论 -
JPA-JpaRepository方法命名语法小记
梳理了一遍JPA的方法命名语法,记录一下,以便后续备查。注:本文不介绍JPL语法,版本为spring-data-jpa-2.3.0.RELEASE。假设实体类名为 aaa,且定义如下:import lombok.Data;import javax.persistence.Entity;import javax.persistence.Id;@Entity@Datapublic class aaa { @Id private long id; private long原创 2020-05-21 20:27:34 · 4313 阅读 · 0 评论 -
SpringBoot加62进制,自增序列,实现短网址服务
看了一个短网址项目,需要提前批量生成大量短网址,并转为二维码,然后打印出来,线下运营去客户那边贴码,同时在后台绑定跳转地址。这个项目的实现是生成随机的6位字符串,再判断数据库不存在时,才插入数据库,伪代码就是:string code;do{ code = Random.Get(6);// 6位随机串短码}while(DB.Exist(code));DB.Add(code);r...原创 2020-03-27 23:55:20 · 1032 阅读 · 0 评论 -
Java学习-03:Maven项目创建/安装与引用
Java学习-01:环境配置与编译第一个程序Java学习-02:项目打包与发布本文介绍,如何在IDEA里,创建一个maven项目,并安装到本地的maven仓库时,然后在SpringBoot项目里引用它。1、新建一个Maven项目,操作如图,从maven-archetype-quickstart模板创建:2、在下一步窗口里,输入这个项目的:Group 项目所属的组织,如beinet公司...原创 2019-05-15 20:00:37 · 486 阅读 · 0 评论 -
Java学习-02:项目打包与发布
IDEA安装参考前文:Java环境配置IDEA项目开发完成后,怎么进行打包和发布?有2种方案,第一种是用IDEA直接打包,第二种是用maven打包。我们的项目都是通过Jenkins调用maven命令行进行打包和推送线上服务器。这里不介绍IDEA本身的打包,只讨论maven打包的2种方式:0、pom配置:在打包前,要先对项目的pom文件增加一些配置:0.1、在下添加 jar,表示打j...原创 2019-05-07 20:33:37 · 591 阅读 · 0 评论