Go
文章平均质量分 88
Go
Schuyler_yuan
静听魔筝看花落,
穿着拖鞋抱着黄瓜啃
展开
-
服务熔断——断路器
就像电路中的保险丝熔断一样,微服务架构中,上游服务因为过载或者故障不可用时(这种不可用情况是指长时间不可用且持续性远程调用,非暂时故障),需要及时使用断路器在下游的服务调用方暂时熔断调用方和服务提供方之间的调用链,避免出现服务雪崩进而拖挂整个业务系统,从而保证部分服务与系统整体的稳定性和可用性。服务雪崩,是指调用链的某个环节不可用时,导致下游调用方环节不可用,最终这种影响像雪崩一样扩大到整个系统中,导致整个系统不可用。断路器模式断路器代理了服务调用方对提供方的请求,它监控了最近请求的失败和超原创 2022-05-31 01:02:30 · 646 阅读 · 0 评论 -
常见的线程模型
线程之间的调度永远是一个复杂的话题,但是并发编程必然会涉及到操作系统对线程的调度。根据资源访问权限的不同,操作系统会把内存分为内核空间和用户空间,内核空间的指令代码具备直接调度计算机底层资源的能力,比如说 I/O 资源等;用户空间的代码没有访问计算底层资源的能力,需要通过系统调用等方式切换为内核态来实现对计算机底层资源的申请和调度。线程作为操作系统能够调度的最小单位,也分为用户线程和内核线程:用户线程由用户空间的代码创建、管理和销毁,线程的调度由用户空间的线程库完成(可能是编程语言层次的线程库),无原创 2022-05-30 22:51:05 · 832 阅读 · 0 评论 -
Go context 上下文
Go Context,goroutine 并发的利器,可以取消正在执行的 goroutine,即通过 Context 控制并发使得 goroutine 退出。先来看一个例子eg.实现了一个监控 deamon,会让程序一直运行,每隔1秒就会打印一次package mainimport ( "fmt" "sync" "time")func watcher(strName string) { for { .原创 2022-05-28 22:42:34 · 214 阅读 · 0 评论 -
Go sync 同步原语
Go 中不仅有 channel 这种 CSP同步机制,还有 sync.Mutex、sync.WaitGroup 等比较原始的同步原语。使用它们,可以更灵活的控制数据同步和多协程并发。sync.Mutex sync.RWMutex sync.WaitGroup sync.Once sync.Cond sync.Map在一个 goroutine 中,如果分配的内存没有被其他 goroutine 访问,只在该 goroutine 中被使用,不存在资源竞争的问题。但如果同一块内存被多个 gorou.原创 2022-05-28 19:08:39 · 1772 阅读 · 0 评论 -
Go channel实现顺序无限输出123123123...
分析:顺序:需要同步,无 buffer channel 正好可以实现;无限:主协程阻塞,子协程为 deamon,或者说无限循环;需要开3个线程(协程),一个线程用来输出1,无限输出 一个线程用来输出2,无限输出 一个线程用来输出3,无限输出实现无限输出 123123123...package mainimport ( "fmt" "time")func print(curCh chan struct{}, nextCh chan stru原创 2022-05-28 11:11:44 · 751 阅读 · 0 评论 -
Go channel 通道
go routine 可以使用 channel 来进行通信,使用通信的手段来共享内存。使用形式有下面几种,无缓冲 channel 有缓冲 channel 需要注意 channel 的关闭时机 单向 channel channel + select,实现多路复用基本语法make(chan Type) 等价于 make(chan Type,0)make(chan Type, capacity)ch<- value // 发送 value 到 ch<- ch...原创 2022-05-28 02:48:41 · 352 阅读 · 0 评论 -
GMP 线程调度模型
GMP 是 Go 协程调度的 CSP 并发模型实现。Golang 内部有三个对象,goroutine,machine,processor。研究这块最好结合源码。GMP 调度模型G=Goroutine 协程,P=Processor 处理器, M=Thread 线程全局队列(Global Queue):存放等待运行的 G。 P 的本地队列:同全局队列类似,存放的也是等待运行的 G,存的数量有限,不超过 256 个。新建 G’时,G’优先加入到 P 的本地队列,如果队列满了,则会把.原创 2022-05-26 19:14:02 · 808 阅读 · 0 评论 -
Go 并发模型
Go 语言中实现了两种并发模型,一种是依赖于共享内存实现的线程-锁并发模型,另一种则是CSP(Communicationing Sequential Processes,通信顺序进程)并发模型。大多数编程语言(比如 C++、Java、Python 等)的并发逻辑都是基于操作系统的线程。并发执行单元(线程)之间的通信利用的就是操作系统提供的线程或进程间通信的原语,如共享内存、信号、管道、消息队列、套接字等。在这些通信原语中,使用最广泛的就是共享内存。 而 Go 语言从设计之初,就将解决上面传统并发模型问题原创 2022-05-26 18:54:39 · 634 阅读 · 0 评论 -
Go routine、channel、sync、context和好用的并发模式
Go routine 协程协程和通道,是 Go 语言并发的基础。谈并发,就绕不开线程,操作系统会为 deamon 服务创建进程,进程可以看作一个服务的工作空间,它包含了服务运行所需的所有资源(PCB控制块),比如内存空间、文件句柄等。线程是进程的执行空间,一个进程可以有多个线程,线程被操作系统调度执行,也就是可以实现多线程的并发。Go 中的并发,是通过协程 goroutine 来实现的。相比线程来说,协程更加轻量,一个程序可以随意开启成千上万个 goroutine。协程是被 Go 运行时所调度的,这原创 2022-05-24 11:17:30 · 207 阅读 · 0 评论 -
Golang中的项目管理是对代码包的管理
引言如果想要在项目中使用第三方代码库,C/C++ 中一般会有两种方法,1. 将第三方源码合并到自己的工程文件中直接编译;2. 将第三方代码先编译生成静态链接库(.a、.lib)或动态链接库(.so 、.dll) 放到工程目录下,然后通过条件编译直接使用。目前大多数主流语言都有一套标准的包管理解决方案,比如 Java 有 maven,Python 有 pip,Ruby 有 RubyGems,Rust 有Cargo,Nodejs 有 npm,PHP 有 composer。包管理工具用于自动化构.原创 2022-05-12 23:29:23 · 678 阅读 · 0 评论 -
Golang一角:环境变量(Go开发必需的环境变量、普通环境变量)
“环境变量”这个词,有经验的开发同学对它一定很熟悉了,它提供给软件工程以高灵活性、高扩展性,大到操作系统,小到某个项目,都有它的影子,它的表现方式有很多。微服务应用提倡将配置存储在环境变量中,任何从开发环境切换到生产环境时需要修改的东西都从代码抽取到环境变量里。但是在实际开发中,如果同一台机器运行多个项目,在操作系统中设置环境变量容易冲突,不实用,就会有了从.env文件中读取配置, 然后存储到程序的环境变量中。一个项目对应一个 .env 文件,在代码中读取 .env 文件的方式也非常方便。很多大..原创 2022-05-07 00:23:00 · 3861 阅读 · 0 评论 -
搭建Go开发环境,开发 RPC 服务(MAC、VSCode)
一、配置 Go 1.18 开发环境1. install golang by brew$ brew install go2. set Path for Go# .zshrc# goexport GOROOT=/opt/homebrew/Cellar/go/1.18/libexecexport GOPATH=$HOME/workspace/project/goexport PATH=$PATH:$GOROOT/bin:$GOPATH/binexport GOPROXY=https:原创 2022-04-29 16:48:22 · 3220 阅读 · 2 评论