自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 go redis

【代码】go redis。

2024-06-16 18:24:32 137

原创 etcd watch 实现原理

在 etcd 中,watch 是一个非常重要的特性,它可以让客户端监控 etcd 中的 key 或者一组 key,当 key 发生变化时,etcd 会通知客户端。本文将介绍 etcd watch 的实现原理。# 当 /test 的值发生变化时,会输出如下信息PUT/testaPUT/testbDELETE/test。

2024-06-16 18:23:54 772

原创 golang sqlx

在项目中我们通常可能会使用连接MySQL数据库。sqlx可以认为是Go语言内置的超集,它在优秀的内置基础上提供了一组扩展。这些扩展中除了大家常用来查询的和外还有很多其他强大的功能。

2024-06-15 16:16:21 525

原创 boltdb 原理

介绍及简单使用:https://www.cnblogs.com/daemon365/p/17690167.html源码地址:https://github.com/etcd-io/bbolt。

2024-06-15 16:15:44 1228

原创 kratos v2版本命令行工具使用

因为默认远程仓库地址是 github上的,在国内很容易创建失败,所以要需要设置终端或者git代理(什么是终端代理和git代理可以百度或者google一下)。使用这个命令需要下载 protobuf 工具 protoc,可以在官网下载对应版本。下import 进来 需要第三方的proto文件 可以放在这里。kratos new 命令为创建一个kratos项目。为指定proto文件生成简单的service代码。为创建一个proto模板。为生成 Proto 代码。repo地址 默认为。下可以看到生成的文件。

2024-06-13 10:39:52 458

原创 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的部分为。

2024-06-13 10:39:19 481

原创 Kratos漫游指南 1 - 概览

Kratos使用Protobuf进行API定义。Protobuf是由Google开发的一种语言中立的数据序列化协议。它有结构定义清晰、可扩展性好、体积小、性能优秀等特点,在众多公司和项目被广泛使用。在使用Kratos的项目中,您将使用如下的IDL进行您的接口定义,并且通过protoc工具生成相应的.pb.go文件,其中包含根据定义生成的的服务端和客户端代码。随后您就可以在自己的项目内部注册服务端代码使用,或引用客户端代码进行远程调用。

2024-06-13 10:38:43 444

原创 基于 OpenTelemetry 的链路追踪

随着业务的增加越来越多的服务之间的调用,如果没有一个工具去记录调用链,解决问题的时候就会像下面图片里小猫咪玩的毛线球一样,毫无头绪,无从下手。分布式跟踪(也称为分布式请求跟踪)是一种用于分析和监控应用程序的方法,尤其是使用微服务架构构建的应用程序。谷歌和微软下定决心结束江湖之乱,首要的问题是如何整合两个两个社区已有的项目,OpenTelemetry 主要的理念就是,兼容。中,这篇论文对于实现链路追踪,对于后来出现的 Jaeger、Zipkin 等开源分布式追踪项目设计理念仍有很深的影响。

2024-06-12 14:20:49 913

原创 Go工程化 - 依赖注入

让我们从金拱门回来,重新总结一下用 wire 做依赖注入的过程。创建wire.go文件,定义下你最终想用的实例初始化函数例如initApp(即 Injector),定好它返回的东西*App,在方法里用罗列出它依赖哪些实例的初始化方法(即 Provider)/或者哪些组初始化方法(ProviderSet)ProviderSet 就是一组初始化函数,是为了少写一些代码,能够更清晰的组织各个模块的依赖才出现的。也可以不用,但 Injector 里面的东西就需要写一堆。像这样。

2024-06-12 14:20:01 1037

原创 通过 layout 探索 kratos 运行原理

执行命令后,会在当前目录下生成一个 service 工程,工程骨架如下,具体的工程骨架说明可以访问。Kratos 实例在启动时,监听了系统的进程退出信号,当收到退出信号时,kratos 会调用。通过上面的图例👆,我们可以直观观察到应用的调用链,简化来说如下图流程所示👇。项目在 main 方法中调用了。看到如下输出则证明项目启动正常。项目 main.go 的。

2024-06-11 16:14:24 500

原创 kratos 日志库的使用姿势

所谓日志(Log)是指系统所指定对象的某些操作和其操作结果按时间有序的集合。log文件就是日志文件,log文件记录了系统和系统的用户之间交互的信息,是自动捕获人与系统终端之间交互的类型、内容或时间的数据收集方法。日志是用来记录,用户操作,系统状态,错误信息等等内容的文件,是一个软件系统的重要组成部分。一个良好的日志规范,对于系统运行状态的分析,以及线上问题的解决具有重大的意义。

2024-06-11 16:13:30 1202

原创 限流

限流是指在一段时间内,定义某个客户或应用可以接收或处理多少个请求的技术。例如,通过限流,你可以过滤掉产生流量峰值的客户和微服务,或者可以确保你的应用程序在自动扩展(Auto Scaling)失效前都不会出现过载的情况。令牌桶、漏桶 针对单个节点,无法分布式限流。QPS 限流不同的请求可能需要数量迥异的资源来处理。某种静态 QPS 限流不是特别准。给每个用户设置限制全局过载发生时候,针对某些“异常”进行控制。一定程度的“超卖”配额。按照优先级丢弃。拒绝请求也需要成本。

2024-06-10 12:38:40 1139

原创 grpc 服务发现与负载均衡

在后台服务开发中,高可用性是构建中核心且重要的一环。服务发现(Service discovery)和负载均衡(Load Balance)一直都是我关注的话题。今天来谈一下我在实际中是如何理解及落地的。

2024-06-10 12:37:35 1066

原创 超时控制

超时控制,使我们的服务之间调用可以快速抛错。比如API接口设置1s超时API调用A服务用了500ms,服务A调用和服务B用了600ms,n那么现在已经超时,还要调用服务C等等,再返回超时错误吗?这回事使服务C后面的链路做了无用功,浪费服务器资源。

2024-06-10 12:36:46 477

原创 隔离

隔离,本质上是对系统或资源进行分割,从而实现当系统发生故障时能限定传播范围和影响范围,即发生故障后只有出问题的服务不可用,保证其他服务仍然可用。

2024-06-09 11:47:25 1059

原创 分布式ID生成器及redis,etcd分布式锁

这种场景我们没有办法依赖具体的时间来判断先后,因为不管是用户设备的时间,还是分布式场景下的各台机器的时间,都是没有办法在合并后保证正确的时序的。用41位来表示收到请求时的时间戳,单位为毫秒,然后五位来表示数据中心的id,然后再五位来表示机器的实例id,最后是12位的循环自增id(到达1111,1111,1111后会归0)。需要我们在部署阶段就能够获取得到,并且一旦程序启动之后,就是不可更改的了(想想,如果可以随意更改,可能被不慎修改,造成最终生成的id有冲突)。依赖越多,我们的服务的可运维性就越差。

2024-06-09 11:46:44 891

原创 thrift 介绍及其使用

Thrift是Facebook于2007年开发的跨语言的rpc服框架,提供多语言的编译功能,并提供多种服务器工作模式;用户通过Thrift的IDL(接口定义语言)来描述接口函数及数据类型,然后通过Thrift的编译环境生成各种语言类型的接口文件,用户可以根据自己的需要采用不同的语言开发客户端代码和服务器端代码。例如,我想开发一个快速计算的RPC服务,它主要通过接口函数getInt对外提供服务,这个RPC服务的getInt函数使用用户传入的参数,经过复杂的计算,计算出一个整形值返回给用户;

2024-06-08 11:11:27 777

原创 微服务架构及raft协议

Raft 协议在集群初始状态下是没有 Leader 的, 集群中所有成员均是 Follower,在选举开始期间所有 Follower 均可参与选举,这时所有 Follower 的角色均转变为 Condidate, Leader 由集群中所有的 Condidate 投票选出,最后获得投票最多的 Condidate 获胜,其角色转变为 Leader 并开始其任期,其余落败的 Condidate 角色转变为 Follower 开始服从 Leader 领导。所以说,保证日志复制一致就是Raf等一致性算法的工作了。

2024-06-08 11:10:56 655

原创 grpc 基础

使用gRPC, 我们可以一次性的在一个.proto文件中定义服务并使用任何支持它的语言去实现客户端和服务端,反过来,它们可以应用在各种场景中,从Google的服务器到你自己的平板电脑—— gRPC帮你解决了不同语言及环境间通信的复杂性。HTTP2 规范当使用 TLS 时强制使用 TLS 1.2 及以上的版本,并且在部署上对允许的密码施加一些额外的限制以避免已知的比如需要 SNI 支持的问题。gRPC 有一个标准的健康检测协议,在 gRPC 的所有语言实现中基本都提供了生成代码和用于设置运行状态的功能。

2024-06-07 10:33:11 922

原创 proto buffer

Protobuf是Protocol Buffer的简称,它是Google公司于2008年开源的一种高效的平台无关、语言无关、可扩展的数据格式,目前Protobuf作为接口规范的描述语言,可以作为Go语言RPC接口的基础工具。

2024-06-07 10:32:34 436

原创 行为模式

收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。一个对象的改变会触发其它观察者的相关动作,而此对象无需关心连动对象的具体实现。此处需要注意:因为父类需要调用子类方法,所以子类需要匿名组合父类的同时,父类需要持有子类的引用。它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。中介者模式封装对象之间互交,使依赖变的简单,并且使复杂互交简单化,封装在中介者中。解释器模式的意义在于,它分离多种复杂功能的实现,每个功能只需关注自身的解释。

2024-06-06 10:11:07 734

原创 结构型模式

比如要发消息,可以发很多种方式,微信、qq、email、短信等等,也可以发很多类型,日常、紧急等的。享元模式从对象中剥离出不发生改变且多个实例需要的重复数据,独立出一个享元,使多个对象共享,从而节省内存以及减少对象数量。组合模式常用于树状结构,用于统一叶子节点和树节点的访问,并且可以用于应用某一操作到所有子节点。API 为facade 模块的外观接口,大部分代码使用此接口简化对facade类的访问。组合模式统一对象和对象集,使得使用相同接口使用对象和对象集。策略模式使抽象部分和实现部分分离,可以独立变化。

2024-06-06 10:10:32 351

原创 创建者模式

抽象工厂模式则是针对的多个产品等级结构, 我们可以将一种产品等级想象为一个产品族,所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。原型模式配合原型管理器使用,使得客户端在不知道具体类的情况下,通过接口管理器得到新的实例,并且包含部分预设定配置。原型模式使对象能复制自身,并且暴露到接口中,使客户端面向接口编程时,不知道接口实际对象的情况下生成新的对象。我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。比如一些可以复用一个连接的网络,比如。

2024-06-05 11:06:32 457

原创 网络编程

该模块可以把一个类型,如数字,转成固定长度的bytes。

2024-06-05 11:05:44 999

原创 http 和 https

为了解决上述HTTP存在的问题,就用到了HTTPS。HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。那么SSL又是什么?SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。

2024-06-04 09:55:01 387

原创 go net/http 和 gin 路由

调用实例化server调用server的调用server的Serve方法,开启for循环,在循环中Accept请求对每一个请求实例化一个Conn,并且开启一个goroutine为这个请求进行服务读取每个请求的内容调用的,如果handler为空,就把handler设置为系统默认的路由器调用handler的=>实际上是调用了的在中会调用路由对应处理handler在路由对应处理handler中会执行sayHello()有一个需要注意的点:和路由对应的处理方法handler都实现了ServeHTTP。

2024-06-04 09:53:07 971

原创 go 命令行工具 cobra

它包含一个用于创建功能强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。命令是应用程序的核心。应用程序提供的每一个交互都包含在 Command 中。一个命令可以有子命令和可选的运行一个动作。库提供的,该库是一个标准库的 fork,在维护相同接口的基础上兼容了。Cobra 命令可以定义一直保留到子命令的标志和仅可用于该命令的标志。一个标志是一种修饰命令行为的方式。结构体的字段,用于定义命令行工具的行为和选项。是个结构体,有很多字段,都是做什么用的呢?

2024-06-03 10:45:01 558

原创 go gin 框架介绍及使用

基于httprouter开发的Web框架。中文文档,齐全。简单易用的轻量级框架。

2024-06-03 10:44:17 501

原创 go HTML 标签提取器 soup

类似python中beatifulsoup,用于提取html标签提取,多用于爬虫。它可以很好的处理不规范标记并生成剖析树(parse tree)。它提供简单又常用的导航,搜索以及修改剖析树的操作。利用它我们不在需要编写正则表达式就可以方便的实现网页信息的提取。soup是一个小型的网页提取包,其接口与beauthoulsoup非常相似。

2024-06-02 12:29:22 1144

原创 go zap 高性能日志

日志在整个工程实践中的重要性不言而喻,在选择日志组件的时候也有多方面的考量。详细、正确和及时的反馈是必不可少的,但是整个性能表现是否也是必要考虑的点呢?在长期的实践中发现有的日志组件对于计算资源的消耗十分巨大,这将导致整个服务成本的居高不下。此文从设计原理深度分析了 zap 的设计与实现上的权衡,也希望整个的选择、考量的过程能给其他的技术团队在开发高性能的 Go 组件时带来一定的借鉴意义。日志作为整个代码行为的记录,是程序执行逻辑和异常最直接的反馈。对于整个系统来说,日志是至关重要的组成部分。

2024-06-02 12:28:52 1597

原创 go viper 配置管理

(译注:因为Viper支持从多种配置来源,例如磁盘上的配置文件>命令行标志位>环境变量>远程Key/Value存储>默认值,我们在查找一个配置的时候如果在当前配置源中没找到,就会继续从后续的配置源查找,直到找到为止。如果你希望在Get()调用中使用-或者其他什么符号,但是环境变量里使用_分隔符,那么这个功能是非常有用的。这里用一个demo演示如何在gin框架搭建的web项目中使用viper,使用viper加载配置文件中的信息,并在代码中直接使用viper.GetXXX()方法获取对应的配置值。

2024-06-01 15:33:05 670

原创 go jwt

JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。

2024-06-01 15:32:34 260

原创 go mod

go module是 Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。

2024-05-31 10:10:03 375

原创 go 模板 html/template与text/template

执行模板时,函数从两个函数字典中查找:首先是模板函数字典,然后是全局函数字典。一般不在模板内定义函数,而是使用Funcs方法添加函数到模板里。and函数返回它的第一个empty参数或者最后一个参数;就是说"and x y"等价于"if x then y else x";所有参数都会执行;or返回第一个非empty参数或者最后一个参数;亦即"or x y"等价于"if x then x else y";所有参数都会执行;not返回它的单个参数的布尔值的否定len。

2024-05-31 10:09:31 327

原创 go context 包

比如我们新建了一个基于 context.Background() 的 ctx1,携带了一个 map 的数据,map 中包含了 “k1”: “v1” 的一个键值对,ctx1 被两个 goroutine 同时使用作为函数签名传入,如果我们修改了 这个map,会导致另外进行读 context.Value 的 goroutine 和修改 map 的 goroutine,在 map 对象上产生 data race。在将 context 集成到 API 中时,要记住的最重要的一点是,它的作用域是请求级别 的。

2024-05-30 10:24:19 702

原创 go net/http 包

Client和Transport类型都可以安全的被多个goroutine同时使用。出于效率考虑,应该一次建立、尽量重用。

2024-05-30 10:23:38 846

原创 go fmt 包

fmt.Scanf不同于fmt.Scan简单的以空格作为输入数据的分隔符,fmt.Scanf为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。这几个函数功能分别类似于fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,只不过它们不是从标准输入中读取数据而是从io.Reader中读取数据。Go语言fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入。标准库fmt提供了以下几种输出相关函数。

2024-05-29 11:32:15 929

原创 go time 包

时间类型有一个自带的方法Format进行格式化,需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用Go的诞生时间2006年1月2号15点04分。使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个channel。使用time.Unix()函数可以将时间戳转为时间格式。time.Time类型表示时间。

2024-05-29 11:31:29 201

原创 go map 实现原理

维基百科里这样定义 map:简单说明一下:在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组对组成的抽象数据结构,并且同一个 key 只会出现一次。有两个关键点:map 是由key-value对组成的;key只会出现一次。增加一个 k-v 对 —— Add or insert;删除一个 k-v 对 —— Remove or delete;修改某个 k 对应的 v —— Reassign;查询某个 k 对应的 v —— Lookup;简单说就是最基本的增删查改。

2024-05-28 21:41:47 650

原创 golang net/http 源码解析

这个细节是十分重要的,因为这一步关乎到当路由规则匹配时,相应的响应方法是否会被调用的问题!就可以执行到相应的处理方法了,这个处理方法实际上就是我们刚开始定义的。,也就是底层用TCP协议搭建了一个服务,然后监控我们设置的端口。表示这个路由规则对应的处理方法,并且这个处理方法有两个参数。就可以理解为是我们自定义的路由器),就会使用系统默认的。OK,这部分代码做的事就这么多,第一部分结束。这个方法时,系统就会给我们指派一个路由器,代码挺多,其实主要就做了一件事,向。方法,但是方法要达到的目的不同,在。

2024-05-28 21:40:39 805

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除