GO语言
文章平均质量分 75
kuokay
这个作者很懒,什么都没留下…
展开
-
Raft算法、协议原理详解
引言分布式系统除了提升整个体统的性能外还有一个重要特征就是提高系统的可靠性。提供可靠性可以理解为系统中一台或多台的机器故障不会使系统不可用(或者丢失数据)。保证系统可靠性的关键就是多副本(即数据需要有备份),一旦有多副本,那么久面临多副本之间的一致性问题。比如,一台机器上的磁盘损坏,数据丢失,可以从另一台机器上的磁盘恢复(分布式系统会对数据做备份)比如,集群中某些机器宕机,整个集群还可以对外提供服务什么是RAFTRaft is a consensus algorithm for manag原创 2021-07-08 17:41:29 · 778 阅读 · 0 评论 -
常见的幂等性解决方案
背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。get请求一般没有幂等性需求、delete请求一般也没有幂等性需求,post、update视情况而定例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;发送消息,也应该只发一次,同样的短信发给用户,用户会哭的;创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题。等等很多重要的情况,这原创 2021-07-30 22:20:13 · 1440 阅读 · 0 评论 -
一文搞定API网关
简介API是Application Programming Interface缩写,翻译成中文就是应用程序接口。在实际微服务中可以理解一个个功能方法。就比如你一个用户服务的微服务,可以对外提供 API 接口为,查找用户,创建用户等。为什么要使用API网关API 网关并不是微服务场景中必须的组件,如下图,不管有没有 API 网关,后端微服务都可以通过 API 很好地支持客户端的访问。但对于服务数量众多、复杂度比较高、规模比较大的业务来说,引入 API 网关也有一系列的好处:聚合接口使得服务对原创 2021-07-30 22:50:49 · 631 阅读 · 0 评论 -
链路追踪详讲
什么是链路追踪分布式链路追踪(Distributed Tracing),也叫 分布式链路跟踪,分布式跟踪,分布式追踪 等等。本文使用分布式Trace来简称分布式链路追踪。trace就犹如一张大的json表,同一层级的数据代表同一层级的应用,越往下代表是对下层某个应用的依赖。从图中可以很方便的看到每一个应用调用的名称,调用花费的时间,以及是否成功。下面这张图是我们使用微软的application insights生成的tracing图链路追踪技术选型zipkinjaegerskyw原创 2021-07-30 22:33:18 · 840 阅读 · 0 评论 -
jaeger安装和架构
简介Jaeger 是Uber推出的一款开源分布式追踪系统,兼容OpenTracing API。分布式追踪系统用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。是我们排查系统问题和系统性能的利器。分布式追踪系统种类繁多,但是核心步骤有三个:代码埋点,数据存储和查询展示。以上几句描述都是我copy的,所以大家想要对Jaeger有更加深入的了解,可以参阅这篇文章Jaeger 分布式追踪系统模块分析,能让你对Jaeger有一个简单的认识。当然我们还要记得APM的三大模块分别是集中式日志系统,原创 2021-07-30 22:37:08 · 537 阅读 · 0 评论 -
一文搞懂分布式事务
什么是事务事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。本地事务在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。数据库事务的四大特性:ACIDA(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。C(Consistency):原创 2021-07-29 23:06:57 · 316 阅读 · 0 评论 -
tcc分布式事务
简介TCC 是Try、Confirm、Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try、确认Confirm、撤销Cancel。Try操作做业务检查及资源预留,Confirm做业务确认操作,Cancel实现一个与 Try或者 Commit相反的操作即回滚操作。TM首先发起所有的分支事务的 try操作,任何一个分支事务的 try操作执行失败,TM将会发起所有分支事务的 Cancel操作,若 Try操作全部成功,TM将会发起所有分支事务的 Confirm操作,其中 Confirm/C原创 2021-07-29 15:21:42 · 3947 阅读 · 1 评论 -
分布式事务之两/三阶段提交
两阶段提交协议(2PC:Two-Phrase Commit)两阶段提交又称2PC,2PC是一个非常经典的中心化的原子提交协议。这里所说的中心化是指协议中有两类节点:一个是中心化协调者节点(coordinator)和N个参与者节点(partcipant)。两个阶段:第一阶段:投票阶段 和第二阶段:提交/执行阶段。第一阶段:投票阶段该阶段的主要目的在于打探数据库集群中的各个参与者是否能够正常的执行事务,具体步骤如下:1)事务询问协调者 向所有的 参与者 发送事务预处理请求,称之为Prepare原创 2021-07-28 23:34:56 · 720 阅读 · 0 评论 -
基于本地消息表的最终一致性
本地消息表方案本地消息表这个方案最初是eBay提出的,此方案的核心是通过本地事务保证数据业务操作和消息的一致性,然后通过定时任务将消息发送至消息中间件,待确认消息发送给消费方成功再将消息删除。下面以注册送积分为例来说明 :下例共有两个微服务交互,用户服务和积分服务,用户服务负责添加用户,积分服务负责增加积分。交互流程如下 :1、用户注册用户服务在本地事务新增用户和增加“积分消息日志”。(用户表和消息表通过本地事务保证一致)begin transaction; // 1.新增用户原创 2021-07-28 23:55:17 · 777 阅读 · 0 评论 -
go语言tail包使用简介
简介tail包的作用:tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档案内容 ,在日志收集中可以实时的监测日志的变化。使用1.下载tail包go get github.com/hpcloud/tail2.首先初始化配置结构体config3.调用TailFile函数,并传入文件路径和config,返回有个tail的结构体,tail结构体的Lines字段封装原创 2021-07-07 16:42:40 · 819 阅读 · 0 评论 -
设计方法:怎么写出优雅的 Go 项目?
前言Go 语言简单易学,对于大部分开发者来说,编写可运行的代码并不是一件难事,但如果想真正成为 Go 编程高手,你需要花很多精力去研究 Go 的编程哲学。在我的开发生涯中,我见过各种各样的代码问题,例如:代码不规范,难以阅读;函数共享性差,代码重复率高;不是面向接口编程,代码扩展性差,代码不可测;代码质量低下。究其原因,是因为这些代码的开发者很少花时间去认真研究如何开发一个优雅的 Go项目,更多时间是埋头在需求开发中。如果你也遇到过以上问题,那么是时候花点时间来研究下如何开发一个优雅的 Go 项目了.原创 2022-05-08 21:43:43 · 806 阅读 · 0 评论 -
Go1.8 泛型简单上手使用
经过这几年的千呼万唤,简洁的Go语言终于在1.18版本迎来泛型编程。泛型是什么在我看来泛型其实用C++的模板一词来描述就非常的准确。在写代码的时候,我们经常需要写很多重复的逻辑,一般这个时候我们就会使用函数来对其进行封装。但是由于Go是一种强类型语言,所以在定义和书写函数的时候需要在调用前标明类型。当然如果这一重复的逻辑只需要固定的类型,这样就足够了,但是很多时候我们需要不同的类型进行类似的逻辑,譬如我们刚刚看到的GIF。对于普通开发人员来说这种情况可能遇到的比较少,但是在一些库开发人员来说,这种情况变原创 2022-03-24 14:16:43 · 1797 阅读 · 0 评论 -
Golang开发手机应用有两种方式简介
简言使用Go语言开发Android&IOS应用,主要有两种方式,一种是基于原生应用开发,另一种是混合绑定开发。前置条件下载安装Go语言(版本1.5+)https://www.golang.org/下载安装 gomobile 下载 $ go get golang.org/x/mobile/cmd/gomobile 安装(需要等待几分钟) gomobile init原生应用开发方式$ go get -d golang.org/x/mobile/example/basic转载 2022-02-15 14:12:50 · 4966 阅读 · 0 评论 -
基于GO的微服务架构
一、服务端架构的演进1、单体架构在 Web 应用程序发展的早期,大部分工程是将所有的服务端功能模块打包成单个巨石型应用,最终会形成如下图所示的架构。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6teE3vlS-1637825590169)(https://segmentfault.com/img/remote/1460000023287835#pic_center)]...原创 2021-11-27 20:02:20 · 3144 阅读 · 0 评论 -
UI 优先的统一身份认证系统 Casdoor
Casdoor 是什么?Casdoor 是一个基于 OAuth 2.0 / OIDC 的 UI 优先集中认证 / 单点登录 (SSO) 平台,简单点说,就是 Casdoor 可以帮你解决 用户管理 的难题,你无需开发用户登录注册等与用户鉴权相关的一系列功能,只需几个步骤,简单配置,与你的主应用配合,便可完全托管你的用户模块,简单省心,功能强大。仓库地址:https://github.com/casbin/casdoor演示地址:https://door.casbin.com/官网文档:https:/原创 2021-11-19 15:21:33 · 1899 阅读 · 0 评论 -
Golang 逃逸分析
为什么需要了解逃逸分析?因为我们想要提升程序性能,通过逃逸分析我们能够知道变量是分配到堆上还是栈上,如果分配到栈上,内存的分配和释放都是由编译器进行管理,分配和释放的速度非常快,如果分配到堆上,堆不像栈那样可以自动清理,它会引起频繁地进行垃圾回收(GC),而垃圾回收会占用比较大的系统开销。什么是逃逸分析?逃逸分析是一种确定指针动态范围的方法,可以分析在程序的哪些地方可以访问到指针。它涉及到指针分析和形状分析。 当一个变量(或对象)在子程序中被分配时,一个指向变量的指针可能逃逸到其它执行线程中,或者去调原创 2021-11-10 14:17:40 · 662 阅读 · 0 评论 -
一文带你了解优秀的Go 语言开源项目
前言由于Go语言的发展势头越来越猛,最近整理了许多关于GO语言的开源项目,共同学习,共同交流,共同进步。1.文件系统(File System)篇用于大文件版本控制的 Git 扩展–git-lfs用于小文件的简单且高度可扩展的分布式文件系统–SeaweedFS Go 实现的跨平台文件系统监控库–fsnotify Go 实现的高性能,POSIX-ish Amazon S3 文件系统–goofys 基于 Openstack 的虚拟文件系统–svfs2.数据库(Database)篇1.Go 实原创 2021-10-19 17:03:15 · 8749 阅读 · 0 评论 -
使用Go语言开发Qt界面
Go 的 UI 库Go 语言本身是没有 UI 库的,不过有许多第三方的库支持将 Go 语言绑定到其他 UI 库,比如 Qt、GTK。参考地址环境搭建非 windows 或者需要参数说明的可以参考官方的wiki、windows 安装Qt 安装下载你需要的版本,下载地址。therecipe/qt 安装终端执行下面的命令:# Go的环境变量配置,配置过一次就不用在设置了go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn#原创 2021-10-13 10:53:43 · 7871 阅读 · 2 评论 -
Golang配置模块viper
什么是ViperViper是Go应用程序的完整配置解决方案,包括12-Factor应用程序。它旨在在应用程序中工作,并可以处理所有类型的配置需求和格式。它支持:设置默认值从JSON,TOML,YAML,HCL和Java属性配置文件中读取实时观看和重新读取配置文件(可选)从环境变量中读取从远程配置系统(etcd或Consul)读取,并观察变化从命令行标志读取从缓冲区读取设置显式值Viper可以被认为是所有应用程序配置需求的注册表。为什么要使用Viper在构建现代应用程序时,您不必担原创 2021-07-21 15:48:18 · 1888 阅读 · 0 评论 -
golang高性能日志库zap
简介zap是uber开源的Go高性能日志库为什么选择Uber-go zap在介绍Uber-go的zap包之前,让我们先看看Go语言提供的基本日志功能。Go语言提供的默认日志包是Go Logger:https://golang.org/pkg/log/Go Logger的优势和劣势优势:它最大的优点是使用非常简单。我们可以设置任何io.Writer作为日志记录输出并向其发送要写入的日志。劣势仅限基本的日志级别只有一个Print选项。不支持INFO/DEBUG等多个级别。对于错误日志,它有原创 2021-07-21 15:12:07 · 993 阅读 · 3 评论 -
Go语言gopsutil库监控系统性能
引言GO语言本身拥有极强的性能,非常适合做一些后端的数据采集管理以及运维系统。其中会面临对当前系统信息的采集,我在这里使用的是GO的工具包 gopsutilpython 上收集系统信息的著名模块是 psutil使用安装:go get github.com/shirou/gopsutil采集CPU相关信息import "github.com/shirou/gopsutil/cpu"// cpu infofunc getCpuInfo() { cpu原创 2021-07-09 14:19:10 · 1024 阅读 · 0 评论 -
一文搞懂基于Go语言的测试
单元测试单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。testing 提供对 Go 包的自动化测试的支持。通过 go test 命令,能够自动执行如下形式的原创 2021-07-08 18:17:07 · 366 阅读 · 2 评论 -
一文搞懂Go语言Context
Context简介Context 也叫作“上下文”,是一个比较抽象的概念,一般理解为程序单元的一个运行状态、现场、快照。其中上下是指存在上下层的传递,上会把内容传递给下,程序单元则指的是 Goroutine。Context 在 Go1.7 之后就加入到了Go语言标准库中,准确说它是 Goroutine 的上下文,包含 Goroutine 的运行状态、环境、现场等信息。为什么有 context在 Go 的 server 里,通常每来一个请求都会启动若干个 goroutine 同时工作:有些去数据库拿数原创 2021-07-07 15:01:35 · 471 阅读 · 0 评论 -
Gin框架安装的一些坑
1.下载Gin: go get -u github.com/gin-gonic/gin出现:package github.com/gin-gonic/gin: no Go files in E:\GO1\src\github.com\gin-gonic\gin解决办法:在cmd中运行: go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.io,direct设置后,重新运行: go get -u github.co原创 2021-07-02 22:29:45 · 1904 阅读 · 2 评论 -
NSQ入门
简介NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异。NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。它具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征适合小型项目使用,用来学习消息队列实现原理、学习 golang channel知识以及如何用 go 来写分布式,为什么说适合小型小型项目使用因为,nsq 如果没有能力进行二次开发的情况存在的问题还是很多的。Nsq特性 1.原创 2021-06-20 22:32:41 · 384 阅读 · 0 评论 -
服务发现-Consul
简介Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对.命令行超级好用的虚拟机管理软件 vgrant 也是 HashiCorp 公司开发的产品.一致性协议采用 Raft 算法,用来保证服务的高可用. 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL原创 2021-05-28 14:35:25 · 1207 阅读 · 0 评论 -
Grafana使用
简介Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。目前使用grafana的公司有很多,如paypal、ebay、intel等。特点:①可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。②报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。③通知:警报更改状态时,它会发出通知。接收电子邮件通知。④动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板原创 2021-04-27 22:41:18 · 6810 阅读 · 0 评论 -
ETCD实战
简介etcd介绍详情见腾讯文档:https://docs.qq.com/doc/DTndrQXdXYUxUU09O?opendocxfrom=admin:etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。类似项目有zookeeper和consul。etcd具有以下特点:完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免硬件的单点故障或网络问题一致性:每次读取都会返回跨多主机的最新写入简单:包括一个原创 2021-04-27 22:04:04 · 692 阅读 · 0 评论 -
Golang性能分析工具PProf的使用
简介pprof 是一个强大的性能分析工具,可以捕捉到多维度的运行状态的数据,能够非常方便的监控代码运行性能。用法性能分析基础数据的获取有三种方式:runtime/pprof 包net/http/pprof 包go test 时添加收集参数性能调优的两个方向:CPU和内存go tool pprof cpu.pprofgo tool pprof mem.pprofruntime/pprof 包的使用[不推荐使用]针对于应用程序,通过命令行的启动参数来生成prof文件,再使原创 2021-04-27 21:29:09 · 2421 阅读 · 0 评论 -
搞定Go语言之第六天
Go的CSP并发模型Go的CSP并发模型,是通过goroutine和channel来实现的。“不要以共享内存的方式来通信,相反,要通过通信来共享内存。”goroutine 是Go语言中并发的执行单位。有点抽象,其实就是和传统概念上的”线程“类似,可以理解为”线程“。channel是Go语言中各个并发结构体(goroutine)之前的通信机制。 通俗的讲,就是各个goroutine之间通信的”管道“,有点类似于Linux中的管道。goroutine生成一个goroutine的方式非常的简单:Go一原创 2021-04-18 21:38:57 · 143 阅读 · 0 评论 -
搞定Go语言之第五天
包Go语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合,是一种高级的代码复用方案。包可以定义在很深的目录中,包名的定义是不包括目录路径的,但是包在引用时一般使用全路径引用。比如在GOPATH/src/a/b/ 下定义一个包 c。在包 c 的源码中只需声明为package c,而不是声明为package a/b/c,但是在导入 c 包时,需要带上路径,例如import “a/b/c”。包的习惯用法:包名一般是小写的,使用一个简短且有意义的名称。包名一般要和所在的目录同名,也原创 2021-04-18 17:49:15 · 532 阅读 · 2 评论 -
基于GO语言实现书籍管理系统
需求分析// 使用函数实现一个简单的图书管理系统。// 每本书有书名、作者、价格、上架信息,// 用户可以在控制台添加书籍、修改书籍信息、打印所有的书籍列表。// 0. 定义结构体// 1. 打印菜单// 2. 等待用户输入菜单选项// 3. 添加书籍的函数// 4. 修改书籍的函数// 5. 展示书籍的函数// 6. 退出 os.Exit(0)从终端获取用户的输入内容package mainimport "fmt"//从终端获取用户的输入内容func main()原创 2021-04-17 23:53:21 · 945 阅读 · 0 评论 -
搞定Go语言之第四天
指针任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。地址:就是内存地址(用字节来描述的内存地址)指针:指针是带类型的。&和*&:表示取地址*:根据地址取值定义一个变量:var a int取变量a的内存地址:b := &a取地址对应的值:fmt.Println(*b)定义一个修改数组第一个元素为100的函数:func modifyArray(a1 [3]int) { a1[0]原创 2021-04-17 23:44:20 · 150 阅读 · 0 评论 -
搞定Go语言之第三天
数组数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。声明一维数组语法:var variable_name [SIZE] variable_type实例:var balance [10] float32初始化一维数组var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50原创 2021-04-17 22:13:12 · 252 阅读 · 0 评论 -
搞定Go语言之第二天
变量var a intvar b bool var c int8var ( m int n string)var name string = "nazha"func main(){ age := 18//声明变量age同时初始化;编译器会根据右边的初始值推断出age是什么类型}常量const PI = 3.1415926const KB = 1024iotaGo中借助iota来实现枚举const ( n1 = iota //0 n2原创 2021-04-14 22:32:29 · 166 阅读 · 0 评论 -
搞定Go语言之第一天
环境搭建安装1.自选以下任意地址进行安装包下载:下载地址1:https://studygolang.com/dl下载地址2:https://golang.google.cn/2.下载好安装程序包进行安装,一路next下去,即可完成安装。安装完成后,在我们所设置的安装目录下将生成一些目录和文件,如下图所示:设置环境变量开发包安装完成后,我们还需要配置一下GOPATH 环境变量,之后才可以使用Go语言进行开发。GOPATH 是一个路径,用来存放开发中需要用到的代码包。在桌面或者资源管理器原创 2021-04-14 22:08:47 · 169 阅读 · 1 评论