0%

OkHttp作为一个HTTP客户端,拦截器是其强大的功能之一,它允许用户在请求和响应的声明周期中拦截并修改它们,利用拦截器,我们可以很方便的实现如日志记录、请求加密/签名、响应解密、异常重试等功能。本文将详细介绍一下拦截器的使用方法及其原理

阅读全文 »

现在对于调用外部http接口的包已经有很多了,比如 Java 原生的 HttpURLConnection,Apache的 HttpClient,Spring的 RestTemplate 以及 WebClient ,Square 的 OkHttp 以及Netflix 的 Feign,从简单到高级功能可以说是应有尽有

不过对于内部都是RPC进行交互的服务,只有一些简单的场景需要调用 HTTP 接口,考虑项目如果为为spring的项目,可以考虑直接使用 RestTemplate

阅读全文 »

在spring项目中我们可以通过@Value注解使用配置文件中的值,但是有时候我们想注入外部系统(如配置中心)中配置的值,这时候可以通过读取配置中心的值并作为PropertySource注入到Spring的 Environment中来实现

阅读全文 »

正则表达式是一种强大的文本匹配工具,通过特定的语法规则,可以实现对字符串的灵活匹配。在本文中,我们将介绍一系列常用的正则表达式,覆盖了匹配任意字符、多个字符包含匹配、排除字符包含匹配、重复匹配、单词边界匹配、字符串边界、子表达式(分组)、回溯引用以及前后查找等内容

阅读全文 »

虽然maven的目标是使项目构建是可移植的,尽量使在任何机器下都可以构建且结果相同,但是仍然会有一些情况需要我们根据环境等信息来构建不同的内容,这时候就需要用到 maven profiles

阅读全文 »

在使用Spring框架时,我们应该已经非常熟悉依赖注入这一概念,它可以帮我们节省构建类及设置相应依赖类的成本,只需要声明自己需要哪些类/接口即可使用,同时还可以更好的支持单元测试

这次我们看一下另一款依赖注入的框架guice,下面介绍的内容也都是来自官方文档

阅读全文 »

假设你在做一个电商后台,商品表 products 有 100 万行。产品经理说:「用户搜『无线鼠标』,要把名字、描述里包含这些词的商品都找出来,按相关性排序。」

你写下 MySQL:

1
2
3
4
-- 慢,而且语义粗糙
SELECT * FROM products
WHERE name LIKE '%无线%' OR name LIKE '%鼠标%'
OR description LIKE '%无线%' OR description LIKE '%鼠标%';

三个问题立刻冒出来:

  • LIKE '%...%' 走不了 B+Tree 索引,100 万行全表扫描。
  • 不准:「无线鼠标垫」也会被匹配——它并不真的是鼠标。
  • 排不出相关性:哪个排前面?MySQL 给不了你打分。

这就是 Elasticsearch(下称 ES)诞生的场景。它是一个分布式的全文搜索与分析引擎,核心能力是把文档按「词」组织起来(倒排索引),让「找出包含某些词的文档、并按相关性排序」这件事变得快且智能。

本文面向有 SQL 基础、但没接触过 ES 的后端开发者,用一个贯穿全文的电商商品表 products,带你从心智模型一路跑到进阶查询。

阅读全文 »

一般我们在 Java 项目中做并发编程,基本都是通过创建线程的方式来执行(JDK21支持了虚拟线程),但是线程有如下问题

  • 线程是不能无限创建的,而是受到操作系统的限制
  • 线程切换的时候有较高的上下文切换的成本

而协程可以理解为轻量级的线程,可以在一个线程中执行多个任务,而不需要线程切换的开销,同时也避免了线程数量的限制

这里看一下kotlin中的协程,首先需要引入单独的依赖包

1
2
3
4
// gradle.kts
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0-RC2")
}
阅读全文 »

我们都知道设计原则,追求开放封闭原则,封装变化

比如我们有一个统一的流程,运转良好且自认为设计的不错,这时来了个需求,说需要针对不同的来源要有一些特殊的处理,这时候我们如何支持呢?

一种简单的解决方案是加一个 if 判断,做一点特殊逻辑,但是这不是一个好的实践

这时候我们想到可以将这部分差异功能抽象为一个接口,然后有一种特殊的实现类还有一个默认的实现类。但是这时候另一个问题出现了,在执行到这部分逻辑的时候,如何确认使用哪个实现类呢(需要一个定位逻辑)

后面可能对于这个来源,还有一个地方需要处理,这时候又要有一套接口和定位逻辑

这时候我们可以考虑一下使用扩展点的方案,我们看下 COLA 提供的扩展点(示例来自源码)

阅读全文 »

《代码精进之路》中看到的拦截器实现,方式比较巧妙,在此记录一下

一般我们在代码中实现业务拦截器的功能,是通过Spring提供的AOP来实现的,底层也就是基于动态代理及反射,这里看一下使用另一种不同的实现方式

阅读全文 »