Latest

Web 后端应用程序的可观测性改进

Web 后端应用程序的可观测性改进

相信日志,即 Logging,对于大多数开发人员是不陌生的。 日志是一种记录应用程序运行状态的重要手段,它可以帮助我们了解应用程序的运行情况,排查问题,甚至是监控应用程序的性能。在 Web 后端应用程序中,日志是不可或缺的一部分,它可以记录用户请求、应用程序的错误、警告等信息,帮助我们更好地了解应用程序的运行情况。 但它真的不可或缺吗?读完这篇文章后我想我给你的答案是:不是。日志的形式很单一,只是文本,这注定了它很冗杂的特点,我们很难从中提取我们需要的信息。即使你使用 AI 如 ChatGPT,也并不一定可以得到一个有建设性的答案。对于自己构建的应用程序,ChatGPT 既不了解也不可能去真的全部了解你的代码,这就带来了问题。 为什么日志不是不可或缺的 日志的形式单一,以纯文本呈现,信息常常显得冗余且难以提取。即便是使用 AI 进行分析,也不一定能提供清晰的洞见。日志的主要问题在于: * 冗余性和庞大的数据量:日志往往包含大量无用信息,查找特定问题的关键信息耗时。 * 缺乏上下文关联:单条日志难以呈现多个服务之间的调用关系和上下文,尤其是在微服务架构中

By AHdark
我如何从零开始学习一门编程语言

我如何从零开始学习一门编程语言

作为一门全栈开发,我理应掌握多门语言。截止 2024 年 9 月,我掌握了超过 30 门编程语言,可以使用它们构建简单的应用程序、为开源社区提交代码、为公司开发产品。我们不讨论对于“掌握”的定义,让我梳理思路,详细阐述我是怎么一步步掌握如 此多的编程语言的。如果你也想学习一门新的编程语言,希望这篇文章能够帮助到你。

By AHdark

通过控制反转降低代码耦合

或许你在学习 Spring 的时候曾听过,Spring 提供的容器叫做 IoC 容器。 IoC 是 Inversion of Control 的缩写,中文翻译为控制反转。控制反转是一种设计原则,早在 2004 年 Martin Fowler 便提出依赖反转,即依赖对象的获得被反转了。 非控制反转的问题 大多数应用程序都是由两个或是更多的类或组件通过彼此的合作来实现业务逻辑,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。 如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。 直接实例化与紧耦合 比如 A 组件需要调用 B,一般情况下你可能会在 A 的 constructor 或 init 块中显式建立 B 组件然后调用。 class A { private val b = new B(

By AHdark

程序中的素性测试

由于近期忙于公司事务和新系统的架构设计工作,博客的文章已经停更了数月。近几个月对我个人来说产生了很大的变化,我很难讲清其中的具体,但这大概会在后续的博客文章更新中体现。 但我认为,停更并非好事,而是应当避免的,因此我也在有片刻闲暇的今日在已经停止更新五个月的博客的第一篇文章。 序言 数学是科学的基础,而素数是数学的基石之一。尽管素数的概念简单直观——只有 1 和自身两个正因数的自然数——但它们在数学和计算科学领域却扮演着重要角色。 素数并非我们独立发现的,它们在自然界中以复杂的规律存在。通过对素数的理解和应用,我们得以解决各种问题,从密码学的加密算法,到搜索引擎的数据结构,甚至到量子计算的未来发展。因此,有效地检测一个数字是否为素数,对于编程来说是至关重要的技能。 在本篇博客文章中,我们将深入探讨素数校验在程序设计中的实现。我们将先从基础的数学理论开始,逐渐深入到各种算法的优化。同时探讨不同的素数检验算法,从最基础的试除法到更复杂高效的算法(如 Miller–Rabin primality test),来感受算法的历史与更迭。 素数的基础知识 在我们深入

By AHdark

使用 GitHub CI 自动推送镜像到 GAR

这篇博客将向您介绍如何使用 GitHub CI 自动将 Docker 镜像推送到 Google Artifact Registry(GAR)的自动构建仓库。 GitHub CI 的功能使得代码推送到 GitHub 仓库时,能够自动构建 Docker 镜像并推送到 GAR。这种自动化流程有助于提高了开发效率,同时还可确保在发布新版本时代码和镜像的一致性和可靠性。 本文将为您提供详细的步骤和指南,帮助您轻松实现自动构建和推送 Docker 镜像的流程。 相关服务介绍 在本章中,我们将简要介绍 Google Artifact Registry 和 IAM 的 Service Account 授权模式的概念和特点,以便读者更好地理解如何使用它们来构建和管理 Docker 镜像。我们还将介绍 Artifact Registry 和 IAM Service Account 之间的关联,并讨论如何创建和配置

By AHdark
Kubernetes 部署 WordPress 的方法

Kubernetes 部署 WordPress 的方法

主要使用工具的介绍 在本节中,我们将介绍 Kubernetes 和 Helm 的基本概念,这些知识是理解如何在 Kubernetes 集群上部署 WordPress 的基础。 Kubernetes 简介 Kubernetes 是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。Kubernetes 提供了一个统一的 API 和工具,使得容器的部署和管理变得更加简单和可靠。它可以管理运行在多台机器上的容器,确保容器应用程序的高可用性、弹性、伸缩性和安全性。 Kubernetes 主要包括以下核心概念: * Pod:Kubernetes 中最小的可部署单元,包含一个或多个紧密关联的容器。 * Deployment:用于管理 Pod 的副本数量和更新。 * Service:用于暴露 Pod 或 Deployment 在集群内部和外部的网络地址。 * Volume:用于将持久化数据挂载到容器中。 * Namespace:用于将 Kubernetes 资源进行逻辑上的隔离和分组。 Helm

By AHdark

浅谈 TypeScript 中的类型变化

TypeScript 是 JavaScript 的超集,其最显著特征是在 JavaScript 原有的语言模式上加入了类型强制,即静态类型系统。以此保证代码中变量处于类型安全状态,即只能赋同类型的值,而对象只能访问其自身所拥有的属性、方法。 类型安全 & 型变 类型安全是指同一段内存在不同的地方,会被强制要求使用相同的办法来解释,使开发者可以及早在编译时期就捕捉到潜藏的错误 let num: number = 1; let bool: boolean = num; // Error: Type 'number' is not assignable to type 'boolean'. 在上述情况中,number 类型与 boolean 类型是完全不同的,它们不构成继承关系,因此他们不能相互赋值。 那么,当我们需要将一个 `number` 存储的数字转换为

By AHdark

Nginx 动态反向代理实现

Source Global CDN 的海外中转链路往往需要对多个域名进行反向代理,之前的方案是给每个域名单独创建 vhost。但在链路增长、服务器增多的现实情况下,这一方案变得越来越难以维护。 我作为 Source Global CDN 的主要运维人员,自然而然地承担起了此任务。 问题 随着服务使用服务器增多,链路增长,我们面临以下问题: 1. 在配置出现更变时,需要为所有服务器进行内容修改,费时费力。 2. 如有服务新增,需要在所有服务器中进行多个操作,且需进行相关测试。 3. SSL 证书、vhost 的 conf 文件管理混乱。 在经过深思熟虑后,我们大致想出以下解决方案: 1. 使用泛域名解析,提高内聚性,使得所有服务器可以自动配合增删改的操作,无需单独配置。 2. 使用私有DNS服务,在一个平台管理链路,无需在服务器中进行修改。 高内聚的泛域名解析方案使得vhost文件数目和SSL数目大幅减小,私有DNS避免服务器内数据不修改的问题。 实施 泛域名解析 经过考虑,

By AHdark

Notes

为什么我使用 Golang 撰写容器化应用程序

在当前互联网架构圈子,容器化、微服务,是被主要讨论的话题。 显然,对于互联网的发展趋势来看,项目正在变得愈加庞大。单一的巨大的项目是不利于维护和开发的,开发者的电脑几乎难以直接承载阿里云、Azure这种巨大的项目,那我们就需要对其进行解耦。也就是说,应用的组件化、容器化、微服务化必将成为趋势。 在容器化应用程序开发这一点,我在之前的开发历程中有些许心得,在本文我将对其具体阐述。 先前的语言选用 在开始学习 Golang 之前,我曾尝试过很多语言。 就如我的个人简介所写的一样,较为经典的PHP、Java,较为复杂的CPP,较为有趣的Express.js、Koa.js、Next.js,我都曾使用过。即使是现在,你也可以在我的GitHub账号找到许多之前的练习品,如 AH-dark/bing-image-api。但这些语言或多或少都有一些不足之处,因而被我放弃。 Java Spring 全家桶在中国大陆被广泛地使用,特别是阿里巴巴,几乎可以算是 Spring 的最主要用户之一。 依靠阿里巴巴,SpringBoot

By AHdark

Notes

使用 Mailgun 用于邮件服务

在近期,我逐步将近乎所有的服务所使用的邮件服务都更换为 Mailgun,本文我将讲述我作出这一决定的原因和具体做法。 在确定使用 Mailgun 以前,我曾对SMTP邮件推送这一部分有过多种尝试。 曾用品 阿里/腾讯 企业邮箱(国内) 在我仍在职圆云的时候,我们依靠阿里云的企业邮箱进行企业事务处理。 企业邮箱同时兼具收发功能,具有较好的稳定性,但价格较高。对于个人服务来说,买五个账号起步,每年600元的企业邮箱,似乎毫无必要。 而腾讯企业邮箱等服务依赖企业微信,过于冗杂,对于个人来说过于麻烦,而且 Exchange 协议支持的不完善。 因此,我放弃这一想法。 阿里/腾讯 邮件推送 * 阿里云邮件推送:https://www.aliyun.com/product/directmail 我曾在圆云时期使用阿里云的邮件推送进行邮件通知。其好处在于,稳定性较高,且支持多域名多用户等情况。 但其只提供了邮件发送服务,完全不对邮件接收做支持,甚至不支持转发,因此在使用一段时间后我放弃了这一方案。 ahdark.com

By AHdark

Notes

Golang 使用 Wire 进行依赖注入

前言 在参与 Star Horizon 的一个项目时,我得到团队内同学的启发,发现了 Wire 这个神奇的东西。Wire 是 Google 研发并开源的一个 Golang 依赖注入解决方案,它通过解释原有文件生成新文件并用 Go Build Injector 实现编译环节的代码区分。 根据 Go Blog 所属,Wire 最先用于 Google 开源的 Go Cloud 项目中。 google/wire 应用 场景 我们通常会在构建 SDK 时在 Client 中嵌套 Services,在这种场景下 Client 依赖于 Services。 但常见的问题是:随着 Services 的增多,代码变得越来越冗杂,

By AHdark

Notes

记录一次自建短链接系统

4月9日,我注册了 ahd.im 域名并打算以此为基础搭建短链接系统。但当我在 GitHub 等平台搜索了一圈,却没有找到令我满意的作品。大多数UI丑陋或是算法效率低下,难以满足我的愿景,因此我决定着手写一套自己的短链接系统。 选择 这是我第一次独立完成一套全栈系统,其摸索的过程自然会为我全栈开发能力积累经验。因此,选择一套高效、高兼容、普适的技术栈自然是极为重要的一步。 后端 对于后端,最重要的是保证代码质量和执行效率。 PHP 效率太低,代码混乱,不被我欣赏。 ExpressJS 不适合写较大的系统应用,其并发也不强,且代码中同步异步容易混乱。 Golang 尽管性能较强,但不符合我的代码习惯。 C++ 应该就没有一个能用的Web开发框架。 最后,我选择了使用 Java Spring Boot 框架撰写后端功能,使用 MyBatis + MySQL 进行数据控制。 前端 前端便没有那么多选择了。 jQuery 我不是很熟悉,且当今时代高级前端框架林立,

By AHdark
如何有效地提高WordPress博客的访问速度

WordPress

如何有效地提高WordPress博客的访问速度

引言 WordPress 作为建站市场占比40%的庞然大物,确实可以称得上是一个时代之作。也正是因此,不少个人站长和企业都选择使用 WordPress 构建自己的站点。在本篇文章中,我便要简要叙述一下如何利用有限的服务器和网络资源提高 WordPress 站点的访问速度。 关于 WordPress 本章节将阐述有关 WordPress 的相关知识。 什么是 WordPress WordPress 是一个以 PHP 和 MySQL 为平台的自由开源的博客软件和内容管理系统。WordPress具有插件架构和模板系统。截至2018年4月,排名前1000万的网站中超过30.6%使用WordPress。WordPress是最受欢迎的网站内容管理系统。全球有大约40%的网站(7亿5000个)都是使用WordPress架设网站的。WordPress是目前Internet上最流行的博客系统。WordPress在最著名的网络发布阶段中脱颖而出。如今,它被使用在超过7000万个站点上。 材料引用自 Wikipedia https://en.wikipedia.org

By AHdark

Softwares

Cloudreve 安装部署详细教程

我编写了这篇关于 Cloudreve 安装和部署的详细教程,起因是我在 Cloudreve 论坛上对一篇教程提出批评后收到了反馈。这促使我反思,并决定贡献一份更全面、高效的指南。文章中,我详细介绍了多种部署方法,每种方法都附有详尽的操作步骤和优劣分析,这些都是基于我个人的实际测试和经验。我希望通过这篇文章,提供一个清晰、易于理解的指南,帮助读者有效地安装和部署 Cloudreve。我的目标是提供高质量、实用的信息,并通过这种方式向社区做出积极的贡献。

By AHdark