熊喵君的博客

Thinking will not overcome fear but action will.

Kratos 源码分析:Warden 中的 gRPC validator

分析 Kratos 的 gRPC 中的字段验证器

0x00 前言 validator 的意义是什么,简言之,在协议字段定义规则,使得开发者在代码中简化对字段的验证逻辑。 0x01 使用 validator 简单的来说,开启 gRPC 中的协议字段校验需要如下两步: proto 协议中按照指定 validator 包的规则定义字段的校验规则 在 gRPC 的 server 端、client 端中开启 validato...

Kratos 源码分析:Naming 解析(上)

分析 Naming 的多消费者订阅 - Watcher 模式

0x00 前言    分析下 Kratos 框架中的服务注册与发现的代码。准备分为两篇文章,一篇介绍 Naming 的公共接口及基于 Etcd 的 naming 机制实现,另一篇文章介绍 Warden 库是如何使用 Naming 的接口来完成服务注册与发现机制。总体而言,Kratos 的 Naming 逻辑分为如下几块: 公共的 Naming 逻辑与接口封装 ...

Kratos 源码分析:Kratos 中的 Metadata 元数据

一种全局变量的存储方式:Metadata

0x00 前言 看看下面这个例子,将 map[string]interface{} 定义成一个类型,这样直接 newmap:=MD{} 生成的对象就是一个 map(虽然这种语法看起来很奇怪)。理解此用法是分析 Metadata 的基础。 type mdKey struct{} type MD map[string]interface{} func main(){ f...

Kratos 源码分析:Lazy Load Container

分析 Kratos 的懒对象容器及应用场景

0x00 前言    所谓懒加载(Lazy)就是延时加载,延迟加载。至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量及系统资源的消耗,我们让数据在需要的时候才进行加载。这就是懒加载。 在数据、策略等需要 “分组(组中以 Name 区分)” 的情况下,非常适合使用该方式实现存储(取),这里存储的值以 interface{} 表示,可...

分布式锁:使用 Redis 实现

Redis 应用开发:分布式锁构建 && Redlock 实现分析

0x00 前言 在应用环境中,不同的进程需要以互斥的方式使用共享资源时,就必须用到分布式锁。前文中,分析了如何 使用 Etcd 来构建分布式锁。本文,来聊聊如何使用 Redis 构造(可靠 && 高可用)分布式锁。一个高可用的分布式锁 至少需要满足几个条件 : 互斥:在任意时间内,只有一个客户端能够获得一把锁,具有排它性 避免死锁:即使客户端宕机或者从集群中...

Kubernetes 应用改造(三):负载均衡

Kubernetes 中的负载均衡总结

0x00 前言    在前文中,曾经讨论过 “Kubernetes 负载均衡失效” 的问题。即 Kubernetes 的默认负载平衡通常不能与 gRPC 一起使用,在不使用 LoadBalance service 的情况下,因为 HTTP/2 链接复用特性,导致客户端的所有请求都发往同一个 Pod,导致负载不均衡。具体原因可见此文:gRPC Load Balancing on Kube...

gRPC 微服务构建之链路追踪(OpenTracing)

在 gRPC 服务中应用 OpenTracing:使用 Zipkin 和 Jaeger 进行路追踪

0x00 前言 前一篇文章 微服务基础之 链路追踪(OpenTracing),介绍了 OpenTracing 的理论,本文基于 gRPC 与 Zipkin && Jaeger 来实现 Tracing 的应用。 0x01 回顾 OpenTracing 数据模型 一个 Tracer 包含了若干个 Span,Span 是追踪链路中的基本组成元素,一个 Span 表示一...

基于 Golang 实现的定时器分析与实现(二):最小堆 && 时间轮

Timer and Ticker: events in the future

0x00 前言 定时器(Timer)常用于解决 多长时间后触发处理某些事件 的问题。在项目中,通常遇到下面两类问题都可以使用定时器来解决: 延迟消息、事件处理,如订单默认 N 时间跨度后自动评价等 长连接心跳管理,如在 IM 服务器实现中,当客户端与服务端 N 时间跨度内没有 Heartbeat 的话,需要断开此无效连接 各种需要定时调度的实现 0x01 原...

理解 Kratos 的数据统计类型 Metrics(三)-- 未完待续

Metrics 的实战应用

0x00 前言 0x01 再看WRR-LB算法 0x02 再看Sre-Breaker 参考 Kratos-Sre-Breaker

Kratos 源码分析:gRPC-Warden 拦截器(链)及实现

Kratos 框架分析

0x00 前言    在 Warden 框架中,大量使用了拦截器来完成对 RPC 功能的增加及统一接口封装,本文从源码的角度来分析下 Warden 中的拦截器 Interceptor。 0x01 Warden 拦截器总览 logging.go:包含了 UnaryServerInterceptor 及 UnaryClientInterceptor 的实现,通用日志逻辑,其中加入了对 R...