2021

周末的时候,收到好几个云服务器临近过期的通知短信,准备续个费,居然都要大几千!因为这几个都是以前低价抢购的,掐指一算,如果都续费的话,要蚕食好多利润!作为一名自己养活自己的独立开发者,节省成本是必备技能,不然哪来可观的利润?于是,我就开始琢磨着做一些架构上的调整,看看能否在这次服务器资源减少的情况下,继续低成本的运行目前还在跑的业务。 因为业务产品是最重要的,所以这块基本不能动。那么能动的就是一些周边设施了,比如:做任务管理、文档管理或持续交付的工具。在调研了诸多SaaS产品和云服务之后,最后选择了阿里云的云效全家桶。为什么最终选择了云效全家桶呢?核心原因还是“全家桶”三个字,基本上我想要的研发管理功能都能否覆盖了。那么这个全家桶具体能做什么呢?下面给大家分享下我改造前和改造后的平台结构,给大家一个直观的认识。 老架构:散装集成老架构的建立基本上借鉴了以前在公司里搭建基础平台时候所用...

一年一度的SpringOne大会在9月1日至2日因为疫情原因在线上举行。Pivotal公司(Spring项目拥有者)每年都会举办一次这样的大会,与全球数千位开发人员、客户和合作伙伴相聚在一起,交流技术实践经验,探讨技术的发展趋势。同时每次大会也会披露Spring项目下一步的大动作。今年的大会的亮点无疑是Spring Framework 6.0。跟随胖哥来看看在未来一段时间内Spring的大动作。 Spring Framework 5.3.x先来看看Spring Framework 5.3.x的一些规划。 不用翻译的了吧,强调一下Spring Boot 2.6和2.7都会基于该版本。 Spring Framework 6.0备受瞩目的就是Spring Framework 6.0了。它将基于 Java 17 和 Jakarta EE 9 。它现在的情况是这样的: Spring 6.0...

这个swagger的starter已经存在四年了,记得当时做这个的时候主要是由于swagger官方并没有提供类似spring boot官方其他starter模块一样的封装。当我们要用swagger的时候,还是要写很多Java配置来启动,所以就做了这个,尽可能的把原来要写在Java中的配置都转移到配置文件中来。 一个小小的封装,也获得了2k+的Star,使用也超过了3.1k。 之前由于springfox 3.0推出了starter(之前我也写了篇博客介绍使用SpringFox 3生成Swagger文档),想着既然有了这个,那就没有花太多精力去继续更新了。 但是,一直有收到用过springfox starter的小伙伴反应还是希望可以用纯配置的方式来使用swagger,希望这个swagger可以继续升级到最新的版本。所以,下面会继续跟进这个starter,这里要特别感谢andi.lin...

美国时间8月19日Spring Boot 2.5.4版本发布,此版本包括35个错误修复、文档改进和依赖项升级。 错误修复 spring-boot-configuration-metadata强制性的泄露依赖约束到消费构建中 #27730 TomcatMetricsBinder.findContext()中潜在的空指正问题 #27616 当Spring Data的repository是一个MeterBinder的依赖项时,出现循环Bean定义 #27591 spring-boot:build-image会因为上传过程中抛出异常而挂起 #27535 当WebClient在类路径上没有一个可以支持的HTTP Client的时候,WebTestClientContextCustomizerFactory会引发IllegalStateException #27527 spring.securi...

8月17日,Spring官方宣布 Spring Authorization Server 已正式脱离实验状态,并进入Spring-Project家族! 此举恰逢本周的 0.2.0 版本发布,这是第一个正式支持的生产就绪版本。 自2020 年 4 月Spring Authorization Server公布以来以来,已经实现了OAuth 2.1 授权协议的绝大部分,并为 OpenID Connect 1.0 提供适度支持。随着该项目进入下一个开发阶段,其重点将转向推进对 OpenID Connect 1.0 的支持。 Spring 官方表示 ❝感谢在这么短的时间内为该项目做出贡献并帮助其发展的所有人。我们对当前构建的项目基石充满信心,并对Spring Authorization Server进入下一个生命周期非常兴奋。我们期待共同继续这项工作,并最终使 Spring Authoriz...

前几天分享了一篇《Spring Boot 2.x基础教程:加密配置中的敏感信息》 ,然后看到群里有小伙伴反应跟着这篇文章出现了这个异常com.ulisesbocchio.jasyptspringboot.exception.DecryptionException: Unable to decrypt。 具体完整的错误信息如下: Caused by: com.ulisesbocchio.jasyptspringboot.exception.DecryptionException: Unable to decrypt: ENC(/AL9nJENCYCh9Pfzdf2xLPsqOZ6HwNgQ3AnMybFAMeOM5GphZlOK6PxzozwtCm+Q). Decryption of Properties failed, make sure encryption/decryption...

在之前的系列教程中,我们已经介绍了非常多关于Spring Boot配置文件中的各种细节用法,比如:参数间的引用、随机数的应用、命令行参数的使用、多环境的配置管理等等。 这些配置相关的知识都是Spring Boot原生就提供的,而今天我们将介绍的功能并非Spring Boot原生就支持,但却非常有用:配置内容的加密。 为什么要加密?可能很多初学者,对于配置信息的加密并不敏感,因为开始主要接触本地的开发,对于很多安全问题并没有太多的考虑。而现实中,我们的配置文件中,其实包含着大量与安全相关的敏感信息,比如:数据库的账号密码、一些服务的密钥等。这些信息一旦泄露,对于企业的重要数据资产,那是相当危险的。 所以,对于这些配置文件中存在的敏感信息进行加密,是每个成熟开发团队都一定会去的事。 如果您是DD的老读者,也许马上会想到Spring Cloud Config就提供配置的加密功能,之前在我的...

“道、法、术、器”,出自老子的《道德经》,是我们老祖宗的智慧结晶。经过了两千多年的历史,细细想来,依然是那么具有深意! 今天我就结合开发者的视角,给大家聊聊开发者眼中的这四个层面! 如果你现在正碰到职业发展的瓶颈,那么可以看看下面的内容,也许会有所感悟和帮助。我们将分别从“道、法、术、器”,聊聊我们在这四个层面上的不同表现,重新审视下目前的你所付出的努力都集中于哪一层,并思考接下来更应该从哪点去进一步提高更有价值? “器”什么是“器”?假设,现在要开发一个电商网站,我们可以用什么去实现?可以用Java、可以用PHP、可以用Go… 我们可以听到很多答案。而这里我们所说的各种编程语言,就是“器”,是一种工具。 “PHP是世界上最好的语言”,这是所有程序员都知道的一个梗,因为这句话就是关于最底层的“器”的争论,由于争论的点很基础,所以就被广为流传。 那么这类问题是否有最优答案呢?纵观所有成...

事情是这样的…… 前天下午天太热,我在家看电视,换台突然就看到了正在播《西游记》,窗外蝉声特别响,我一下就有种穿越回小学暑假的感觉。当时,我就特别想把我那台小霸王翻出来,玩两盘街霸……虐一下春丽 翻了大半天,也没找到我的童年回忆…要么找找看有没有啥开源的可以玩玩吧! 作为一名野生程序员,搜索技能必须牛逼,一顿搜索之后,我发现最近阿里云有一个挺火的体验活动,这个活动是用 Serverless 部署掌上游戏机,完成后还送一台实物游戏掌机。这不跟我想一块去了,开整!整个过程确实简单,我先把链接放下面。 PC端体验好一点:https://developer.aliyun.com/adc/series/activity/serverlessdevs 我的体验过程本来我想撸完游戏机就走,后来我发现这个体验有点意思。这个体验的部署使用了 Serverless 产品阿里云函数计算和开发者工具 Se...

除了最常用的关系数据库和缓存之外,之前我们已经介绍了在Spring Boot中如何配置和使用MongoDB、LDAP这些存储的案例。接下来,我们继续介绍另一种特殊的数据库:时序数据库InfluxDB在Spring Boot中的使用。 InfluxDB简介什么是时序数据库?全称为时间序列数据库。时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。时间序列数据主要由电力行业、化工行业等各类型实时监测、检查与分析设备所采集、产生的数据,这些工业数据的典型特点是:产生频率快(每一个监测点一秒钟内可产生多条数据)、严重依赖于采集时间(每一条数据均要求对应唯一的时间)、测点多信息量大(常规的实时监测系统均有成千上万的监测点,监测点每秒钟都产生数据,每天产生几十GB的数据量)。虽然关系型数据库也可以存储基于时间序列的数据,但由于存储...

昨天,有群友反应根据之前这篇《使用Elastic Job实现定时任务》文章编写测试定时任务的时候,报了类似下面的这个错误: Caused by: org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException: Job conflict with register center. The job 'my-simple-job' in register center's class is 'com.didispace.chapter72.MySimpleJob', your job class is 'com.didispace.chapter74.MySimpleJob' at org.apache.shardingsph...

美国时间7月22日Spring Boot 2.5.3版本发布,此版本包括58个错误修复、文档改进和依赖项升级。 新的功能 将 Java 17 添加到 JavaVersion 枚举#26769 Bug修复 尝试从未知数据源类型派生数据源时,DataSourceBuilder 抛出 UnsupportedDataSourcePropertyException #27453 DatabaseInitializerDetector 和 DependsOnDatabaseInitializationDetector 实现可能会使用错误的 ClassLoader 进行实例化#27422 YamlPropertySourceLoader 可能不会使用正确的 ClassLoader 来检查 SnakeYAML 是否存在#27419 将 Gson 设置为首选映射器会破坏返回 JSON 字符串的控制器...

上一篇,我们介绍了如何使用Elastic Job实现定时任务。解决了使用@Scheduled来实现时候存在的竞争问题,同时也实现了定时任务的高可用执行。 然而,还有一类问题是我们在做定时任务时候容易出现的,就是任务执行速度时间过长;同时,为了实现定时任务的高可用,还启动了很多任务实例,但每个任务执行时候就一个实例在跑,资源利用率不高。 所以,接下来我们就来继续介绍,使用Elastic Job的分片配置,来为任务执行加加速,资源利用抬抬高的目标! 动手试试建议直接下载文末仓库中的chapter7-2工程,然后在这个基础上进行修改。当然,如果你对如何使用Elastic Job还不输入,那么先前往上一篇做个知识铺垫,再继续下面的内容! 第一步:创建一个分片执行的任务 @Slf4j@Servicepublic class MyShardingJob implements SimpleJob ...

上一篇,我们介绍了如何使用Spring Boot自带的@Scheduled注解实现定时任务。文末也提及了这种方式的局限性。当在集群环境下的时候,如果任务的执行或操作依赖一些共享资源的话,就会存在竞争关系。如果不引入分布式锁等机制来做调度的话,就可能出现预料之外的执行结果。所以,@Scheduled注解更偏向于使用在单实例自身维护相关的一些定时任务上会更为合理一些,比如:定时清理服务实例某个目录下的文件、定时上传本实例的一些统计数据等。 那么,在实际实现业务逻辑的时候,没有更好的定时任务方案呢?今天我们就来介绍一个老牌的分布式定时任务框架,在Spring Boot下的使用案例。 Elastic JobElastic Job的前生是当当开源的一款分布式任务调度框架,而目前已经加入到了Apache基金会。 该项目下有两个分支:ElasticJob-Lite和ElasticJob-Cloud...

我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信、邮件之类的操作,也可能会定时地检查和监控一些标志、参数等。 创建定时任务在Spring Boot中编写定时任务是非常简单的事,下面通过实例介绍如何在Spring Boot中创建定时任务,实现每过5秒输出一下当前时间。 在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置 @SpringBootApplication@EnableSchedulingpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 创建定时任务实现类 @...