Golang王者之路
Golang学习实战笔记
JaysenLeo
挖粪涂墙,星辰大海
展开
-
微服务之Go-Micro(九)服务熔断和降级 hystrix-go 初见
环境准备github.com/afex/hystrix-go/hystrix本工程源码地址在装饰器出构建熔断降级逻辑package wapperimport ( "context" "fmt" "github.com/afex/hystrix-go/hystrix" "github.com/micro/go-micro/v2/client" "github.com/micro/go-micro/v2/metadata" "go-micro-service/service/.原创 2020-11-14 11:06:17 · 624 阅读 · 0 评论 -
微服务之Go-Micro(十)服务熔断和降级 hystrix-go 介绍
介绍使用说明以命令模式执行 Hystrix 代码定义依赖外部系统的业务程序逻辑(即运行外部业务逻辑的入口),将功能传递给hystrix-go系统正常时,就只会运行这个业务程序逻辑hystrix.Go("my_command", func() error { // talk to other services return nil}, nil)定义回退行为如果你想要你的外部业务代码在服务中断期间运行,那你就把第二个函数,也就是运行外部业务逻辑的入口,传给hystrix-go.翻译 2020-11-14 10:59:23 · 766 阅读 · 0 评论 -
微服务之Go-Micro(八)基于Gin框架的Http网关
背景在单体应用时代,客户端向后端服务器发起请求来获取数据。负载均衡器将请求路由给后端的集群服务的某一个,然后后端服务器程序会从DB获取数据返回给客户端。微服务架构下,单体应用被切割成多个微服务,如果将多个微服务直接对外暴露,肯定会出现诸多问题客户端的请求报文和微服务暴露的API不匹配,协议可能都不一样,有的是二进制的rpc,也可能使用某种消息传递协议微服务难以重构,为了满足需求合并或者重构服务势必导致开发成本因此,微服务网关应运而生需求描述客户端向基于Gin框架构建Http网关发起.原创 2020-11-10 23:47:17 · 1637 阅读 · 1 评论 -
微服务之Go-Micro(七)装饰器Wrapper
Clientpackage mainimport ( "context" "fmt" "github.com/micro/go-micro/v2" "github.com/micro/go-micro/v2/client" "github.com/micro/go-micro/v2/metadata" "github.com/micro/go-micro/v2/registry" "github.com/micro/go-micro/v2/registry/etcd" Models.原创 2020-11-09 22:53:55 · 441 阅读 · 0 评论 -
微服务之Go-Micro(一)如何构造一个微服务集群中的Server
环境准备Go语言版本golang 1.14依赖库 go-microgo get -u github.com/micro/micro/v2源码在这里插入代码片package mainimport ( "github.com/micro/go-micro/v2/web" "net/http")func main() { server:=web.NewService(web.Address(":8001")) server.HandleFunc("/", func.原创 2020-11-08 22:21:20 · 373 阅读 · 1 评论 -
微服务之Go-Micro(六)GRPC调用
工具下载protobufhttps://github.com/protocolbuffers/protobuf/releases/download/v3.13.0/protoc-3.13.0-win64.zipWindow 下安装:Linux 安装tar -xvf protobufcd protobuf./configure --prefix=/usr/local/protobufmakemake checkmake install如遇报错,则需升级gcc:e.原创 2020-11-08 22:22:32 · 554 阅读 · 0 评论 -
微服务之Go-Micro(五)指令方式启动多个服务
Server 源码package mainimport ( "fmt" "github.com/gin-gonic/gin" "github.com/micro/go-micro/v2/registry" "github.com/micro/go-micro/v2/registry/etcd" "github.com/micro/go-micro/v2/web")// 全局中间件func GlobalMiddle(c *gin.Context) { fmt.Println(".原创 2020-11-08 22:22:20 · 795 阅读 · 0 评论 -
微服务之Go-Micro(四)如何构造一个微服务集群中的Client
Etcd 注册中心访问http://127.0.0.1:8082/service/user如下源码package mainimport ( "fmt" "github.com/micro/go-micro/v2/client/selector" "github.com/micro/go-micro/v2/registry" "github.com/micro/go-micro/v2/registry/etcd" "log")func main() { reg :.原创 2020-11-08 22:21:59 · 343 阅读 · 0 评论 -
微服务之Go-Micro(三)把服务注册到ETCD中
服务注册由于单体应用演进为微服务集群,那么服务的管理即注册和发现应运而生,由此微服务的角色成了 服务提供者(Server)、服务消费者(Client)和服务注册中心(Registry)微服务(Server)在启动时,将自己的网络地址等信息注册到注册中心,注册中心负责存储和维护这些数据。服务消费者(Client)从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。每个微服务与注册中心使用一定机制通信(例如心跳)。如果注册中心与某微服务长时间无法通信,就会注销该实例。微服务网络地.原创 2020-11-08 22:21:48 · 986 阅读 · 0 评论 -
微服务之Go-Micro(二)Gin管理微服务的API
环境准备Go语言版本golang 1.14依赖库 go-microgo get -u github.com/gin-gonic/gin源码package mainimport ( "github.com/gin-gonic/gin" "github.com/micro/go-micro/v2/web")func main() { router := gin.Default() router.Handle("GET", "/", func(context *gin.原创 2020-11-08 22:21:34 · 774 阅读 · 0 评论 -
Golang 之 面向对象type ,扩张系统已有类型
目录 main包package mainimport ( . "../../queue" . "fmt" )func main() { q := Queue{1,2,3,4} q.Push(5) q.Pop() q.Pop() q.Pop() Println(q.IsEmpty())}-queu...原创 2018-08-01 21:31:26 · 964 阅读 · 0 评论 -
Golang 之 面向对象继承(一)
对于结构体来说,Go中使用一种叫做”组合”的方法来实现继承package maintype Phone struct {}func (p *Phone) Call() { println("...呼叫中")}// 组合type Mi8 struct { Phone}func main() { var p Mi8 p.Call()...原创 2018-08-01 21:29:16 · 343 阅读 · 0 评论 -
Golang 之 面向对象继承(二)
对于结构体来说,一个是 Phone类型,一个是Phone的指针类型,他们都有Call方法,这种情况下,方法也是继承package mainimport "fmt"type Phone struct { OS string Net string}func (p *Phone) Call() { fmt.Printf("...呼叫中 \n")}f...原创 2018-08-01 21:29:37 · 297 阅读 · 0 评论 -
Golang 之 面向对象继承(三)
对于结构体来说,一个是 Phone类型,实现了PhoneFunction接口,这种情况下,无论是Phone还是*Phone都是可以成为接口调用的package mainimport "fmt"type Phone struct { OS string Net string}type PhoneFunction interface { Communi...原创 2018-08-01 21:29:53 · 306 阅读 · 0 评论 -
Golang 之 面向对象继承(四)
并没有为PhonePlus 实现接口,仅仅为Phone实现了接口,不过PhonePlus里面嵌入了Phone的一个内部类型,也是可以通过接口调用函数Call来调用到Communicate method。在main函数,发现PhonePlus的methods set 里面包含了Communicate()package mainimport "fmt"type Phone st...原创 2018-08-01 21:30:04 · 622 阅读 · 0 评论 -
Golang 之 协程 goroutine(一)
Go语言的流行,往往逃避不开 goroutine和channel在并发(并行)处理上的优秀解决方案,goroutine是Go语言并行设计的核心。 - goroutine是一种比线程更轻量的实现,十几个goroutine可能在底层就是几个线程。 - 执行goroutine时候,go语言立即返回,接着执行剩余的代码,goroutine不阻塞主线程。 - channel就像一个管...原创 2018-07-06 01:32:02 · 496 阅读 · 0 评论 -
Golang 之 协程 goroutine(二)
抢占式多任务处理计算机只有一个处理器,宏观上,我们却可以看到数以百计的线程正同时运行在机器上,这就是抢占式多任务处理的效果,通过操作系统内核通过对线程的调度(调度器作为内核的一部分),将时间切片,分成一段段的时间片。这些时间间隔以毫秒为精度且长度并不固定。针对每个处理器,每个时间片仅服务于单独一个线程。线程的迅速执行给我们造成了它们在同时运行的假象。我们在两个时间片的间隔中进行上下文...原创 2018-08-01 21:32:01 · 718 阅读 · 0 评论 -
Golang 之 协程 goroutine(三)
“通道” 是连接多个 Go 协程的管道。 可以从一个 Go 协程, 将值发送到通道,然后在别的 Go 协程中接收。package mainimport "fmt"func main() { // 使用 `make(chan val-type)` 创建一个新的通道。 // 通道类型就 val-type 是他们需要传递值的类型。 // 此处创建名为 mes...原创 2018-08-01 21:32:30 · 687 阅读 · 0 评论 -
Golang 之 协程 goroutine(四)
通道方向 : 当使用通道作为函数的参数时,可以指定这个通道是不是只用来发送或者接收值。这个特性提升了程序的类型安全性。func ping(pings chan<- string, msg string) { pings <- msg // 若尝试运行如下语句,发送通道数据,将会报错 // invalid operation: <-ping...原创 2018-08-01 21:32:49 · 464 阅读 · 0 评论 -
Golang 之 协程 goroutine(五)
Golang 的通道选择器 可以同时等待多个通道操作。 Go 协程和通道以及选择器的结合是 Go 的一个强大特性。// Go 的_通道选择器_ 让你可以同时等待多个通道操作。// Go 协程和通道以及选择器的结合是 Go 的一个强大特性。package mainimport "time"import "fmt"func main() { chan1 := ...原创 2018-08-01 21:32:57 · 387 阅读 · 0 评论 -
Golang 之 指针(一)
golang的指针不能像C中一样进行计算,例如获取数组的头指针,然后顺着头指针往下增加,依次获取数组的各个值。golang的指针不知道其自身的size,也就不能进行加减运算package mainimport "fmt"func main () { var name = "Lee" // 同C语言,用 & 取地址 var p_name ...原创 2018-07-08 10:25:57 · 379 阅读 · 0 评论 -
Golang 之 面向对象struct (一)
golang语言仅支持封装,不支持继承和多态,继承和多态要做的事,可以用面向接口来做,只有struct没有classpackage mainimport "fmt"type treeNode struct { value int left, right * treeNode}func createNode(val int) *treeNode { ...原创 2018-07-08 16:41:27 · 442 阅读 · 0 评论 -
Golang 之 面向对象struct ,定义结构体方法(二)
package mainimport "fmt"type treeNode struct { value int left, right * treeNode}func (node treeNode) print() { fmt.Println(node.value)}// 说明其传值func (node treeNode) setNode(val...原创 2018-07-22 00:41:01 · 2405 阅读 · 0 评论