熊喵君的博客

Thinking will not overcome fear but action will.

gRPC 源码分析之 Balancer 篇

gRPC 客户端平衡器分析

0x00 前言 本篇文章详细分析下 gRPC-Banlancer 的实现。 首先,提几个问题,带着这几个问题,再看源码会收货更多: resolver 获取到的后端列表,在哪里进行初始化连接的? resolver 和 balancer 的交互是怎样的? balancer 提供给用户的接口在哪里生效? picker 如何实现? 0x01 gRPC 的平衡器 Balan...

gRPC 源码分析之 DnsResolver 篇

如何使用内置的 DNS 负载均衡器

0x00 介绍 关于 gRPC Naming 机制,官方有比较详细的 文档 介绍。 Resolver(解析器)在 gRPC 中完成了这样一个过程,它对来自服务注册中心的数据(Push 或者 Pull 两种方式),做出响应,将得到的结果数据通知 gRPC 内置的负载均衡器 Balancer。在实现上通常划分为 Resolver 和 Watcher 两个模块。官方提供了一个基于 DNS 的实...

gRPC 源码分析之 Resolver 篇

gRPC 客户端解析器实现分析

0x00 前言 gRPC 负载均衡是针对每次请求,而不是连接,这样可以保证服务端负载的均衡性,所有 gRPC 负载均衡算法实现都在客户端。本系列文章对 gRPC 的负载均衡框架做深入的分析。 gRPC客户端的全景视图: 0x01 gRPC 的解析器 Resolver Resolver,直观上就联想到域名解析配置 /etc/resolv.conf,配置域名解析规则,和 DNS 服务器交互...

后台开发积累(2019 年)

感觉只是做了一点微小的工作

背景 如何提升后台服务的可靠性,如何提升后台服务的吞吐量(性能),如何避免重复造轮子,工作中需要经常带着这些问题去思考。 本文我想结合自己的遇到的问题,聊聊如何完成后台开发的工作,介绍一些工作中遇到的经验。 基础篇 需求对齐,确定方案,避免无效工作 阶段总结,及时调整 升级和扩容篇 系统如何做到不停机在线扩容?扩容后负载均衡方式会改变吗?如果 LB 算法采用一致性 ha...

一个安全的 Web-Console 的实现思路

使用 xterm.js+Go-Gin 实现 Web-Console 的 SSH 登录

0x00 基础 本文将描述如何实现一个具备安全认证的 WebConsole,基于 Golang-SSH 库 实现。WebConsole 的核心实现是打通了 WebSocket+SSH 的输入输出流,使得用户直接使用浏览器就可以运行 SSH 终端,非常适合于轻便运维的场景。WebSocket 基于 TCP 传输协议,并复用 HTTP 的握手通道,关于 WebSocket 和 Golang...

Etcd 应用开发之分布式锁

Etcd 应用开发(续)

0x00 分布式锁基础 在分布式系统中,为了实现对互斥资源的安全访问(独占),必须要用到分布式锁。另外在工作中,还有一个应用场景是,在分布式的后台服务中,某些服务只允许单个实例(机器或 Docker)运行,其他的备份机器作为 BackUps 备份节点(比如在笔者的项目中,负责数据同步的逻辑同一时刻只能有一台机器进程来执行),当正在运行的单实例机器(进程)故障后,在线的 BackUps 按照排...

Python 性能优化

使用 heapy 统计堆上的对象(内存)

0x00 背景 最近工作中遇到一个场景,使用 python 写的脚本做 kafka 的消费端,使用的是多进程模式,父进程从 kafka 收,通过 multiprocessing.Queue 发给子进程处理,处理的数据是基于会话的,子进程用一个 dict 来存储。KEY 为会话 ID,VALUE 为一个 list(模拟 queue 的方式实现了一个字符数组队列),根据指定的分隔符做 pu...

Kubernetes 应用改造(一):Headless Service

使用 gRPC+Headless-Service 构建后端服务

0x00 背景 本地后台程序容器化,服务上云,Saas 化尝试,现阶段没有比 Kubernetes 更好的选择了。从七月到现在,三个月时间,通过对项目代码改造、后台服务的迁移和现网运行排障,算是对 Kubernetes 的服务部署和微服务化有了比较全面的认知。这篇博客就以 gRPC 服务在 Kubernetes 上的 LoadBalancer 改造来开个头。 0x01 Kubernete...

使用 Golang 实现 SSH 和 SSHD(一)

golang-ssh 库使用(入门篇)

0x00 前言    golang 的 SSH 包 提供了极为丰富的接口。基于此包可以很容易的实现 SSH 客户端、SSHD 服务端以及 SSH 代理等常用工具。 此包给了开发者极大针对 SSH 体系的扩展能力,可以实现 SSH 客户端及服务端的多种工具及安全实践。 通过下面两篇文章可以简单入门: Writing a replacement to OpenSSH using G...

Etcd 最佳实(踩)践(坑)

Etcd 日常踩坑集锦

0x00 Etcd 最佳实践 此篇文章是本人在学习和使用 Etcd 中,遇到的问题和一些使用心得的总结,避免重复踩坑。 最近阅读的一篇文章 三年之久的 etcd 3 数据不一致 bug 分析,非常好,推荐看下。 此外,笔者将常用的 EtcdV3 接口进行了封装: 在此 etcd_tools 0x01 介绍 Etcd 是一个基于 Raft 协议实现的高可用的 KV 存储系统,具备如下几...