陈日志 发布的文章

为什么要优雅上下线?

在微服务架构中,应用实例的频繁部署、扩缩容、重启都是常态。
如果不进行优雅上下线(Graceful Startup & Shutdown),就可能导致:

  • 正在处理的请求被强制中断,造成接口异常或数据异常;
  • 服务注册中心(如 Nacos)仍然认为节点可用,导致请求被路由到已关闭的实例;
  • 新实例还没充分启动完成,请求就进来了,导致接口异常。

为了解决这些问题,我们需要让服务在启动和关闭阶段都更有序、更“温柔”、更可控。

Spring Boot 内置的优雅关闭机制

从 Spring Boot 2.3+ 开始,官方就支持优雅关闭(Graceful Shutdown):

server:
  shutdown: graceful

或通过启动参数启用:

-Dserver.shutdown=graceful

这表示当 Spring Boot 接收到关闭信号(如 SIGTERM)时,不会立刻中断请求,而是:

  1. 停止接收新请求;
  2. 等待当前正在处理的请求完成;
  3. 超过等待时间后强制关闭。

- 阅读剩余部分 -

我们有一个 docker compose 部署的 harbor,随着时间的推移,存储的镜像越来越多,磁盘空间已经捉襟见肘。急需迁移到更大的存储空间去。harbor 支持众多的后端存储,所支持的后端存储类型和配置方法点击 Configuring a registry | CNCF DistributionHarbor docs | Configure the Harbor YML File 查看。

我这里使用的是minio(兼容s3)作为后端存储。

假设我的 harbor 的访问地址是:https://hub.kops.cc

配置方法

修改 harbor.yml 文件:

storage_service:
  s3:
    accesskey: minioadmin
    secretkey: minioadmin
    regionendpoint: http://127.0.0.1:9000
    bucket: harbor
    multipartcopythresholdsize: "5368709120"

执行 ./prepare 脚本使配置生效

./prepare

docker-compose down

docker-compose up -d

- 阅读剩余部分 -

在网络通信中,端口是用于区分不同服务的重要资源。通常,每个服务会绑定到一个特定端口上,但有时我们需要通过同一个端口来代理不同的服务。这种技术被称为端口复用。本文将介绍端口复用的场景、用途、协议特性,并分别使用 Nginx 和 HAProxy 进行端口复用配置。

端口复用的场景与用途

端口复用在以下场景中非常有用:

  1. 资源限制:在IP地址和端口资源有限的环境中,通过同一端口提供多个服务可以最大化利用现有资源。
  2. 简化配置:简化客户端配置,使其无需关心不同服务使用不同端口的问题。
  3. 负载均衡与高可用性:在负载均衡器或反向代理服务器上,通过同一端口代理不同的后端服务,提高服务的可用性和可靠性。

协议特性

端口复用的实现依赖于协议特性。通过分析协议的特定字段或数据包的前几个字节,可以判断请求的类型并将其转发到相应的后端服务。

- 阅读剩余部分 -

可重现构建(reproducible builds)是一组软件开发实践,如果给定相同的源代码、构建环境和构建指令,任何一方都可以bit-by-bit重新构建出相同副本,则构建是可重现的。本文将探讨可重现构建的重要性,以及在maven项目中如何实现这一目标。

为什么需要可重现构建?

不知道你有没有发现,你的java工程在没有修改代码的情况下,两次构建出来的jar/war包md5值是不一样的。为什么会出现这种情况呢?jar包其实是一个zip压缩包,当你解包两次构建查看其中的差异时,你会发现最明显的区别就是文件夹的时间不一样了:

截屏2024-05-30 19.58.28.png

除了时间不一样以外,还有元数据等等,具体要解决的问题,在apache官网有个提案,记录了可重现构建需要解决的问题。

- 阅读剩余部分 -

KT-Connect 是一个用于 Kubernetes 环境下的网络代理工具,旨在简化开发和测试过程中对 Kubernetes 集群内服务的访问。它通过创建一个或多个代理,使得本地开发环境可以直接与 Kubernetes 集群内的服务进行通信,而无需复杂的端口映射或修改服务配置。这种方式有助于开发者在本地开发、调试容器化应用时,如同直接操作本地服务一样便捷。

KT-Connect 的主要功能和特点包括:

  1. 零配置代理:用户无需手动配置端口映射或修改服务定义,就能将集群内服务的流量透明地转发到本地开发环境。
  2. 双向通信:不仅支持从本地到集群的服务请求,也支持集群内服务调用本地服务,实现了真正的双向通信。
  3. 环境隔离:通过为每个开发者创建独立的命名空间或环境,保持开发环境的隔离性,避免开发间互相干扰。
  4. 服务模拟:允许开发者模拟集群内的服务,便于在没有依赖服务就绪的情况下进行开发和测试。
  5. 一键式操作:提供命令行工具,使得启动、停止代理、查看状态等操作变得简单快捷。
  6. 安全接入:通过 TLS 加密和其他安全机制确保通信的安全性,保护集群资源不被非法访问。

使用 KT-Connect 可以显著提升 Kubernetes 应用的开发效率,尤其是对于需要频繁调试、集成测试的场景,它提供了一个灵活且高效的本地开发解决方案。

KT-Connect实践

要想运行KT-Connect,需要确保两个镜像能在你的Kubernetes集群中正常拉取:

  • registry.cn-hangzhou.aliyuncs.com/rdc-incubator/kt-connect-router:v0.3.7
  • registry.cn-hangzhou.aliyuncs.com/rdc-incubator/kt-connect-shadow:v0.3.7

如果你的网络受限,不能拉取以上镜像,需要你提前将镜像导入到每个Kubernetes节点。

- 阅读剩余部分 -