熊喵君的博客

Thinking will not overcome fear but action will.

DiDi 开源 API 网关 gatekeeper (v1.0)项目分析

一个微服务网关的设计与实现

0x00 前言 Didi-gatekeeper 是一个 Golang 的不依赖分布式数据库的 API 网关(基于 gin),使用它可以高效进行服务代理,支持在线化热更新服务配置以及纯文件方式服务配置,支持主动探测方式自动剔除故障节点以及手动方式关闭下游节点流量,还可以通过自定义中间件方式灵活拓展其他功能。 本文主要分析下其实现中可以借鉴的思路及细节: 插件式中间件引入 部署架...

Golang 的分布式任务队列:Machinery (v1)分析(二)

Machinery 应用场景梳理&&使用说明

0x00 前言 通常,在设计业务模型中,Machinery 的 Worker 通常用于处理复杂 / 耗时的任务,即通过异步任务的方式来增加系统的吞吐量,减少同步请求的耗时。 0x01 应用场景 1:异步处理大量耗时任务 如业务场景中对涉及到大文件的用户数据导入及下载,数据删除等耗时场景,就比较适合用 Machinery 来做异步化处理: 用户数据导入:客户端上传数据集压缩包后,...

在 Golang 中实现 Openssl 的 AES-CBC-256 算法(With Salt)

0x00 前言 今天在使用 openssl 工具中遇到如下的 case: plaintext="I'm password" password="abcdefghijklmn" echo $plaintext | openssl enc -salt -aes-256-cbc -e -a -k $password encrypted=`echo $plaintext | openssl en...

开源熔断组件分析(一):gobreaker

分析 Sony 的 gobreaker 熔断器实现(Circuit Breaker 的一种实现)

0x00 前言 gobreaker 实现了 Circuit Breaker pattern 模式的熔断机制。本篇文章简单分析下其实现。 Circuit Breaker 回顾 回顾下 Circuit Breaker 的状态机模型:即 3 种状态,4 种状态(变化)迁移,如下图: Circuit Breaker 状态如下 熔断器关闭状态(StateClosed), 服务正常...

安全:SSO 认证协议的那些事

0x00 前言 最近工作用到了较多的 SSO(单点登录)知识,本文简单梳理下。主要涉及的到的有如下几块: OAuth2 SAML2 OpenID JWT OpenSSH Login with SSO:如何将 SSO 的认证理念嵌入到 OpenSSH 的登录身份认证中去 授权 && 认证 授权 认证 0x01 通讯主体 浏览器...

Hot Reload:Golang 如何实现配置文件优雅的热更新

配置文件的优雅热加载实现以及 viper 库的机制分析

0x00 前言 Nginx 中有个 reload 指令,提供了不重启服务下针对配置文件的热加载能力,本文讨论下在 golang 下的文件热加载实现。 通过 signal 手动触发 通过文件监听 notify 自动触发 0x01 golang 中的实现 手动触发 要点有如下几点: 配置文件指针化,并且加锁保护(配置的单例模式) 捕获信号,重新读配置 在代码逻辑引用...

项目开发:网关(Gateway)与反向代理(ReverseProxy)的那些事

0x00 前言 本文是网关及代理开发过程中的一些总结。代理(常见正向代理及反向代理)可以视为网关的核心组件之一。常见的网关有: 安全网关(Secure Gateway) 开放认证网关(Open IDP Gateway) 微服务网关(MicroService Gateway) 对网关的特性主要关注下面几点: 功能 && 部署架构 高性能 高...

Nginx 容器动态流量管理方案:Upsync

一种更为优雅的 Nginx 代理动态切换方案

0x00 前言 前一篇文章,介绍过 Nginx 的负载均衡算法。upstream 机制使得 Nginx 通常用于反向代理服务器,Nginx 接收来自下游客户端的 Http 请求,并处理该请求,同时根据该请求向上游服务器发送 Tcp 请求报文,上游服务器会根据该请求返回相应地响应报文,Nginx 根据上游服务器的响应报文,决定是否向下游客户端转发响应报文。另外 upstream 机制提供...

Confd 使用 && 源码分析

Confd 源码分析:强大的动态配置更新(基于 etcdv3/redis 存储)

0x00 前言 现网有类似下面的 Nginx 配置,如何对 upstream 指向的后端服务节点做修改,手动的方式: 修改 upstream 配置,增加 / 删除某些后端 使用 nginx -s reload 指令,重启服务 那么,如何对 nginx 配置做动态的上下线切换(即时剔除无效节点)呢?一个可行的解决方案就是使用 Confd+Etcd。 upstream back...

Kubernetes 应用改造(七):存储那些事

Kubernetes 中的存储方案

0x00 前言 Pod 是 Kubernetes 中创建和部署的最小单位,Pod 中封装着应用的容器,存储、独立的网络 IP,以及管理容器如何运行的策略选项。由于容器本身是非持久化的,因此需要解决在容器中运行应用程序遇到的一些问题。首先,当容器崩溃时,Kubelet 将重新启动容器,但是写入容器的文件将会丢失,容器将会以镜像的初始状态重新开始;第二,在通过多个 Pod 中一起运行的容器,通...