go-micro学习日记(四)--熔断
2020-08-06 15:32
1041 查看
一. 创建熔断Wrappers中间键。
package Wrappers import ( "github.com/micro/go-micro/client" "context" "github.com/afex/hystrix-go/hystrix" "go-micro-grpc/Services" "strconv" ) //熔断后默认方法 func defaultProds(rsp interface{}) { models := make([]*Services.ProdModel, 0) var i int32 for i=0;i<5;i++{ models = append(models, newProd(20+i,"prodname"+strconv.Itoa(20+int(i)))) } result := rsp.(*Services.ProdListResponse) result.Data = models } func newProd(id int32,pname string) *Services.ProdModel{ return &Services.ProdModel{ProdID:id, ProdName:pname} } //Wrapper type ProdsWrapper struct { client.Client } //Wrapper方法 func (this *ProdsWrapper)Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error{ //command名称 cmdName := req.Service()+"."+req.Endpoint() //第一步,配置config configA := hystrix.CommandConfig{ Timeout: 1000, } //第二步,配置command hystrix.ConfigureCommand(cmdName, configA) //第三部,执行,使用Do方法 return hystrix.Do(cmdName, func() error{ //如果正常,继续执行 return this.Client.Call(ctx, req, rsp) },func(e error) error{ //如果熔断了,调用默认函数 defaultProds(rsp) return nil }) } //Wrapper实例化 func NewProdsWrapper(c client.Client) client.Client{ return &ProdsWrapper{c} }
二. 使用Wrapper。
package main import ( "github.com/micro/go-plugins/registry/consul" "github.com/micro/go-micro/registry" "github.com/micro/go-micro/web" "github.com/micro/go-micro" "go-micro-grpc/Services" "log" "go-micro-grpc/Weblib" "go-micro-grpc/Wrappers" ) func main(){ //consul注册中心 consulReg := consul.NewRegistry( registry.Addrs("192.168.56.10:8500"), ) myService := micro.NewService( micro.Name("prodservice.client"), micro.WrapClient(Wrappers.NewLogWrapper), //在这里使用熔断Wrapper micro.WrapClient(Wrappers.NewProdsWrapper), ) prodService := Services.NewProdService("prodservice", myService.Client()) //创建web服务器 httpServer := web.NewService( web.Name("httpprodservice"), // 服务名 web.Address(":8001"), //端口号 web.Handler(Weblib.NewGinRouter(prodService)), // 路由 web.Registry(consulReg), // 注册服务 ) //初始化服务器 httpServer.Init() //运行 err := httpServer.Run() if err != nil{ log.Panic(err) } }
三. 测试熔断。
熔断前,正常调用:
我在服务端handler方法里面加入time.Sleep(time.Second*5),运行,结果如下:
相关文章推荐
- Sentinel Go 0.3.0 版本发布,支持熔断降级能力
- Go 复制文件
- 优化 Go 中的 map 并发存取
- 【HDU6146】【2017百度之星复赛-C】Pokémon GO(动态规划)(dp)
- 使用go tool手工编译链接go程序
- vim 实现 go to definition的功能
- go 格式化输出
- Go-MySQL-Driver:一个Go语言的轻量级极速的mysql驱动 Go
- go_并发聊天室
- goAhead上实现文件上传到嵌入式web服务器上
- 【GO之初体验】GO中面向对象的特点
- Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)
- GO语言简介
- Go语言异步服务器框架原理和实现
- go管理多个项目如何书写gopath以及利用脚本控制项目管理路径
- Go实战--golang中使用HTTPS以及TSL(.crt、.key、.pem区别以及crypto/tls包介绍)
- go slice学习笔记
- POJ1047 Round and Round We Go
- 1.go开源groupcache项目——groupcache介绍
- 进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿