分类 后端 中的文章

在SpringBoot应用中优雅的使用EhCache缓存

SpringBoot家族提供的spring-boot-starter-cache使用JCache(JSR-107)注解统一了不同的缓存技术的使用,很是方便,本文主要说说集成EhCache的一种较为优雅的方案。 引入依赖 implementation("net.sf.ehcache:ehcache") implementation("org.springframework.boot:spring-boot-starter-cache") 开启缓存自动装配 @EnableCaching // 开启 @SpringBootApplication class MyApplication fun main(args: Array<String>) { runApplication<MyApplication>(*args) } 使用缓存 ehcac……

阅读全文

Dataway::后端接口开发或将迎来新的变革?

概述 你是否厌烦了面向CRUD编程?近期逛Github又发现了一个神奇的开源项目[zycgit/hasor],其中有个模块甚是诱人,这里摘抄一段其官网的描述: Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。 整个接口配置、测试……

阅读全文

微信开发:如何实现AMR->MP3->AMR音频转码

概述 接触微信公众号开发的小伙伴一定对AMR这种音频格式不陌生,在微信公众号发送的语音,基本是这种格式,接收到后台后,还需要手动转换为MP3,这里探讨一下几种实现方式。 使用七牛提供的API 如果你使用七牛作为系统的云储存,那么音频转码将非常简单,先来看几个文档: 1)普通音视频转码(a……

阅读全文

IntelliJ IDEA:@Autowired注解出现Field injection is not recommended警告

在开发的时候,突然发现新版的IDEA在@Autowired注解上出现一个大大的警告(Field injection is not recommended) @RestController public class UserRestController { @Autowired private UserService userService; } 这谁忍得了?以我多年的使用Spring的经验来看,这段代码使用@Autowired来自动装配肯定没有问题,同时也一直是这么干的,虽然有人……

阅读全文

分布式限流::Redis+Lua 在分布式应用中的限流实战

概述 作为分布式应用的三大法宝之一(缓存、降级、限流),限流系统尤其是对外开放系统中,显得尤其重要。限流的目的是通过对并发访问进行限速,一旦达到一定的速率就可以拒绝服务,从而避免业务高峰期因暴增的流量直接将服务器打死。 常见的限流算法 信号量 计数器 漏桶算法 令牌桶算法 在这里,咱们主要研究……

阅读全文

造个轮子::实现一个极简的Goroutine Pool

概述 Go语言的协程(Goroutine)是一种相对线程而言更廉价的方式,虽然是轻量级的,但Goroutine太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。在面临这样的场景时, 限制 Goroutine的数量、重用显然很有价值。 解决方案 要解决这个问题,首先要考虑的是以下……

阅读全文

当synchronized关键字作用在字符串上的一些问题

概述 现有需求如下,每个用户(租户ID:用户ID)执行某个操作时,对其进行计数,在考虑高并发的情况下,不会产生计数错误问题。 实现 看到需求后,脑中迅速想好了一个简单思路: 将用户(租户ID:用户ID)作为 KEY, 在执行查询和更新时,利用关键字synchronized锁之即可,下面是测试代码:……

阅读全文

深入理解 Java 中的 SPI 机制

概述 SPI(Service Provider Interface)是一种比较流行的服务发现机制,其核心原理是通过在扫描classpath:META-INF/services文件夹下定义文件,来实现自动加载某个接口的实现类。 这种机制常为很多框架的扩展提供了便捷,比较常见的,如 Dubbo、JDBC 等。 小案例 下面先通过一个……

阅读全文

Jackson对枚举字段的序列规则

现有个枚举类型,内部定义了一些属性,使用 Jaskson 来进行序列化成 JSON 字符串 enum class Error( var code: Int, var reason: String, var description: String ) { UNKNOWN(-1, "unknown", "发生了未知错误,请联系管理员。"); } 看起来没什么问题,先直接序列化试试吧: ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(Error.UNKNOWN) 然而序列化结果是这样的: "UNKNOWN" 哎,跟预期完全不符啊,查阅了资料,主要有几种解决方法,都比……

阅读全文

浅谈如何设计一个高并发系统

概述 为什么要设计高并发的系统呢?随着日益增长的用户量,一般来说,一个系统起步都是直接是连接数据库的,而数据库支撑到每秒并发两三千的时候,基本就快完了,不断的堆配置,加集群始终不是解决之道。 一个高并发的系统,应该从以下几个方面逐步优化: 系统拆分 缓存中间件 MQ 消息队列 分库分表 数据库读写……

阅读全文