熊喵君的博客

Thinking will not overcome fear but action will.

使用 Golang 实现 SSH 和 SSHD(二)

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

0x00 前言 先记录一下自己实现 sshd(proxy)相关系统中需要搞懂的几个重要的 ssh 数据结构,先简单回顾下SSH协议中最核心的模块:连接协议 SSH 传输层协议 再回顾下ssh协议的架构分层,详细说明下Channel的作用 传输层协议,定义了 SSH 协议数据包的格式以及 Key 交换算法 认证协议,定义了 SSH 协议支持的用户身份认证算法 SSH连接协...

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...

Golang 并发协程池实现分析(二)

分析 Fasthttp 的 goroutine pool

0x00 前言     FastHTTP 开源项目给出了一个性能极佳协程池的实现。 标准库 net.http 和 fasthttp 最大的不同可能就是 server 在处理连接的时候使用了协程池。在并发量大的时候,goroutine 数量巨大,runtime 层的上下文切换成本对性能有影响。而 fasthttp 用协程池规避了这个问题。fasthttp 并不是 One reque...

Kratos 源码分析:CGI 框架 BM (四)

分析基于 gin 改造的框架 blademaster:路由树构造算法

0x00 前言 本文着重介绍 bm(gin) 框架的路由树构造算法。 从前几篇文章已知,bm(gin) 框架也是使用了压缩的 Trie 树 作为路由 Path 的存储结构,本文分析根据设置的路由请求构建路由压缩 Trie 树的代码实现 细节。 相较于普通的 Trie 树,压缩版本的树能显著减少树的层数,同时因为每个节点上数据存储也比通常的 Trie 树要多。 0x01 HTT...

Golang 并发协程池实现分析(一)

分析一款非常典型的 goroutine pool 实现

0x00 前言 笔者初学 golang 之时,阅读过 Handling 1 Million Requests per Minute with Go 这篇关于协程池实现的文章。这篇文章给出的优化思路及代码实现非常之典型,可以作为一个通用的并发模型参考。本篇文章,简单回顾下其实现。 原文中要解决的问题就是下面这段代码: // Go through each payload and queue...