熊喵君的博客

Thinking will not overcome fear but action will.

HTTP(s) 代理中间件库:Oxy

分析基于 Golang 的 HTTP(s) 代理中间件库 Oxy:Part One

0x00 前言 Oxy:Go middlewares for HTTP servers & proxies 是一个 HTTP(s) 代理开发(中间件)库,另一个负载均衡网关项目 vulcand 也基于此库来实现反向代理(Reverse Proxy Engine)功能。它的 主要组件如下,框架还是围绕着原生 net/http 库实现的: Buffer retries and ...

Kubernetes 零信任实战:Teleport

如何实现对 kubectl exec 的劫持?

0x00 前言 在 kubernetes 中,常用如下指令进入一个 Pod(在 Pod 运行命令),或者说 获取正在运行容器的 Shell: kubectl exec ${pod_name} -- date kubectl exec -it ${pod_name} -- /bin/bash 既然是 Shell 操作,基于零信任的理念,如何实现对这个过程的审计与管控呢,具体来说需要完...

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

如何使用 Golang 实现通用的任务调度作业模型

0x00 前言 Machinery 是一个基于分布式消息分发的异步任务队列框架,有点类似于 Celery。异步任务的主要作用是解耦,即将需要长时间执行的逻辑单独处理,避免响应延时带来的问题;此外借助于 Machinery,可以完成各种复杂类型任务的调度、编排、结果记录等功能,完美的支持了日常业务场景。考虑如下几个问题: Machinery 的架构 / 模块划分的实现 Machin...

使用 Golang 实现 SSH 和 SSHD(二)

golang-ssh 库使用 && gliderlabs/ssh 分析(实战篇)

0x00 前言 先记录一下自己实现 sshd(proxy)相关系统中需要搞懂的几个重要的 ssh 数据结构 0x01 重要结构(golang-ssh 库) 1、Channel A Channel is an ordered, reliable, flow-controlled, duplex stream that is multiplexed over an SSH connectio...

Kubernetes 应用改造(六):使用原生 API 实现 gRPC 负载均衡

基于 kubernetes-API 实现 gRPC-LB:kuberesolver

0x00 前言 上一篇文章聊到了 Kubernetes 中的负载均衡实现:Kubernetes 应用改造(三):负载均衡,其中提到了一款开源项目:kuberesolver,这篇文章就来分析下它的实现。 0x01 Kubernetes 相关概念 了解 Kubernetes 的朋友应该知道,可以通过 Kubernetes APIserver 提供的 REST API 直接操作 Kubern...

Consul 服务治理的那些事(二)

Consul 的细节梳理

0x00 前言 上一篇文章 Consul 服务治理的那些事 介绍了 Consul 的基础原理和使用,本文对 Consul 构建项目中的一些细节再做下梳理。consul 是完整的解决方案,与 etcd,zooKeeper 等 k/v 存储相比,无需额外的二次开发就能通过 HTTP 快速实现服务发现和注册。基于 consul agent,原生支持包括 script,http,tcp,TTL...

Kubernetes 应用改造(五):使用 NFS + Statefulsets 搭建 Etcd 集群

Statefulsets 应用 && PV/PVC 介绍

0x00 前言 本篇文章总结下,项目背景是需要在 Kubernetes 集群中使用 Etcd 的分布式锁,所以需要将 Etcd 集群部署在 Kubernetes 上。涉及到如下知识点: Statefulsets:有状态服务 PV、PVC NFS:网络(共享)文件系统 Pod 共享数据(持久化)存储 0x01 Kubernetes 的 StatefulSets Stat...

Kratos 源码分析:Tracing (二)

分析 Kratos 的 opentracing 实现:应用

0x00 前言 前一篇文章 Kratos 源码分析:Tracing (一) 大致介绍了 Kratos 的 Opentracing 的实现,这篇文章看下如何在项目中使用 Tracing。 0x01 使用 zipkin 上报 上一节提到,如果需要使用 zipkin 方式上报 tracing 数据,则需要初始化时,执行 GlobalTracer 为 zipkin 方式,代码在 zipkin...

Kratos 源码分析:Tracing (一)

分析 Kratos 的 opentracing 实现:概念与数据结构抽象

0x00 前言 前一篇文章 微服务基础之 链路追踪(OpenTracing) 大致介绍了 Opentracing 的概念,这篇文章分析下 Kratos 库提供的 OpenTracing 实现,源码目录。Kratos 内置的组件大都接入了 Tracing,其特性如下: Kratos 内部的 trace 基于 opentracing 语义 使用 protobuf 协议描述 tr...

Gin 开发实践:如何实现限流中间件

在 Golang-Gin 框架中集成 Ratelimiter 限流中间件

0x00 前言 本篇文章介绍下如何在 gin 中实现限速的中间件。限速通常是限定服务的 QPS 或者限制并发请求量、连接数或业务支撑的关键指标。 0x01 Channel 方式实现 这里有个使用 channel 实现的 gin-limiter 中间件,通过 sem := make(chan struct{}, n) 的操作来实现并发控制,核心逻辑如下: func MaxAllo...