etcd watch 实现原理 在 etcd 中,watch 是一个非常重要的特性,它可以让客户端监控 etcd 中的 key 或者一组 key,当 key 发生变化时,etcd 会通知客户端。本文将介绍 etcd watch 的实现原理。# 当 /test 的值发生变化时,会输出如下信息PUT/testaPUT/testbDELETE/test。
golang sqlx 在项目中我们通常可能会使用连接MySQL数据库。sqlx可以认为是Go语言内置的超集,它在优秀的内置基础上提供了一组扩展。这些扩展中除了大家常用来查询的和外还有很多其他强大的功能。
boltdb 原理 介绍及简单使用:https://www.cnblogs.com/daemon365/p/17690167.html源码地址:https://github.com/etcd-io/bbolt。
kratos v2版本命令行工具使用 因为默认远程仓库地址是 github上的,在国内很容易创建失败,所以要需要设置终端或者git代理(什么是终端代理和git代理可以百度或者google一下)。使用这个命令需要下载 protobuf 工具 protoc,可以在官网下载对应版本。下import 进来 需要第三方的proto文件 可以放在这里。kratos new 命令为创建一个kratos项目。为指定proto文件生成简单的service代码。为创建一个proto模板。为生成 Proto 代码。repo地址 默认为。下可以看到生成的文件。
kratos http 原理 代码在https://github.com/go-kratos/kratos/blob/main/transport/http/client.go#L192。代码在https://github.com/go-kratos/kratos/blob/main/transport/http/router.go#L76。为了使http协议的逻辑代码和grpc的逻辑代码使用同一份,选择了基于protobuf的IDL文件使用proto插件生成辅助代码的方式。在上传的代码中http client的部分为。
Kratos漫游指南 1 - 概览 Kratos使用Protobuf进行API定义。Protobuf是由Google开发的一种语言中立的数据序列化协议。它有结构定义清晰、可扩展性好、体积小、性能优秀等特点,在众多公司和项目被广泛使用。在使用Kratos的项目中,您将使用如下的IDL进行您的接口定义,并且通过protoc工具生成相应的.pb.go文件,其中包含根据定义生成的的服务端和客户端代码。随后您就可以在自己的项目内部注册服务端代码使用,或引用客户端代码进行远程调用。
基于 OpenTelemetry 的链路追踪 随着业务的增加越来越多的服务之间的调用,如果没有一个工具去记录调用链,解决问题的时候就会像下面图片里小猫咪玩的毛线球一样,毫无头绪,无从下手。分布式跟踪(也称为分布式请求跟踪)是一种用于分析和监控应用程序的方法,尤其是使用微服务架构构建的应用程序。谷歌和微软下定决心结束江湖之乱,首要的问题是如何整合两个两个社区已有的项目,OpenTelemetry 主要的理念就是,兼容。中,这篇论文对于实现链路追踪,对于后来出现的 Jaeger、Zipkin 等开源分布式追踪项目设计理念仍有很深的影响。
Go工程化 - 依赖注入 让我们从金拱门回来,重新总结一下用 wire 做依赖注入的过程。创建wire.go文件,定义下你最终想用的实例初始化函数例如initApp(即 Injector),定好它返回的东西*App,在方法里用罗列出它依赖哪些实例的初始化方法(即 Provider)/或者哪些组初始化方法(ProviderSet)ProviderSet 就是一组初始化函数,是为了少写一些代码,能够更清晰的组织各个模块的依赖才出现的。也可以不用,但 Injector 里面的东西就需要写一堆。像这样。
通过 layout 探索 kratos 运行原理 执行命令后,会在当前目录下生成一个 service 工程,工程骨架如下,具体的工程骨架说明可以访问。Kratos 实例在启动时,监听了系统的进程退出信号,当收到退出信号时,kratos 会调用。通过上面的图例👆,我们可以直观观察到应用的调用链,简化来说如下图流程所示👇。项目在 main 方法中调用了。看到如下输出则证明项目启动正常。项目 main.go 的。
kratos 日志库的使用姿势 所谓日志(Log)是指系统所指定对象的某些操作和其操作结果按时间有序的集合。log文件就是日志文件,log文件记录了系统和系统的用户之间交互的信息,是自动捕获人与系统终端之间交互的类型、内容或时间的数据收集方法。日志是用来记录,用户操作,系统状态,错误信息等等内容的文件,是一个软件系统的重要组成部分。一个良好的日志规范,对于系统运行状态的分析,以及线上问题的解决具有重大的意义。
限流 限流是指在一段时间内,定义某个客户或应用可以接收或处理多少个请求的技术。例如,通过限流,你可以过滤掉产生流量峰值的客户和微服务,或者可以确保你的应用程序在自动扩展(Auto Scaling)失效前都不会出现过载的情况。令牌桶、漏桶 针对单个节点,无法分布式限流。QPS 限流不同的请求可能需要数量迥异的资源来处理。某种静态 QPS 限流不是特别准。给每个用户设置限制全局过载发生时候,针对某些“异常”进行控制。一定程度的“超卖”配额。按照优先级丢弃。拒绝请求也需要成本。
grpc 服务发现与负载均衡 在后台服务开发中,高可用性是构建中核心且重要的一环。服务发现(Service discovery)和负载均衡(Load Balance)一直都是我关注的话题。今天来谈一下我在实际中是如何理解及落地的。
超时控制 超时控制,使我们的服务之间调用可以快速抛错。比如API接口设置1s超时API调用A服务用了500ms,服务A调用和服务B用了600ms,n那么现在已经超时,还要调用服务C等等,再返回超时错误吗?这回事使服务C后面的链路做了无用功,浪费服务器资源。
分布式ID生成器及redis,etcd分布式锁 这种场景我们没有办法依赖具体的时间来判断先后,因为不管是用户设备的时间,还是分布式场景下的各台机器的时间,都是没有办法在合并后保证正确的时序的。用41位来表示收到请求时的时间戳,单位为毫秒,然后五位来表示数据中心的id,然后再五位来表示机器的实例id,最后是12位的循环自增id(到达1111,1111,1111后会归0)。需要我们在部署阶段就能够获取得到,并且一旦程序启动之后,就是不可更改的了(想想,如果可以随意更改,可能被不慎修改,造成最终生成的id有冲突)。依赖越多,我们的服务的可运维性就越差。
thrift 介绍及其使用 Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,并提供多种服务器工作模式;用户通过Thrift的IDL(接口定义语言)来描述接口函数及数据类型,然后通过Thrift的编译环境生成各种语言类型的接口文件,用户可以根据自己的需要采用不同的语言开发客户端代码和服务器端代码。例如,我想开发一个快速计算的RPC服务,它主要通过接口函数getInt对外提供服务,这个RPC服务的getInt函数使用用户传入的参数,经过复杂的计算,计算出一个整形值返回给用户;
微服务架构及raft协议 Raft 协议在集群初始状态下是没有 Leader 的, 集群中所有成员均是 Follower,在选举开始期间所有 Follower 均可参与选举,这时所有 Follower 的角色均转变为 Condidate, Leader 由集群中所有的 Condidate 投票选出,最后获得投票最多的 Condidate 获胜,其角色转变为 Leader 并开始其任期,其余落败的 Condidate 角色转变为 Follower 开始服从 Leader 领导。所以说,保证日志复制一致就是Raf等一致性算法的工作了。
grpc 基础 使用gRPC, 我们可以一次性的在一个.proto文件中定义服务并使用任何支持它的语言去实现客户端和服务端,反过来,它们可以应用在各种场景中,从Google的服务器到你自己的平板电脑—— gRPC帮你解决了不同语言及环境间通信的复杂性。HTTP2 规范当使用 TLS 时强制使用 TLS 1.2 及以上的版本,并且在部署上对允许的密码施加一些额外的限制以避免已知的比如需要 SNI 支持的问题。gRPC 有一个标准的健康检测协议,在 gRPC 的所有语言实现中基本都提供了生成代码和用于设置运行状态的功能。
proto buffer Protobuf是Protocol Buffer的简称,它是Google公司于2008年开源的一种高效的平台无关、语言无关、可扩展的数据格式,目前Protobuf作为接口规范的描述语言,可以作为Go语言RPC接口的基础工具。