zoukankan      html  css  js  c++  java
  • 17.熔断器使用(3):初步整合hystrix到go-micro中

    使用go-micro的装饰器整合熔断器

    package Wrappers
    
    import (
        "context"
        "github.com/afex/hystrix-go/hystrix"
        "github.com/micro/go-micro/client"
        "go-micro/Services"
        "strconv"
    )
    
    type ProdsWrapper struct { //官方提供的例子,创建自己的struct,嵌套go-micro的client
        client.Client
    }
    
    func defaultProds(rsp interface{}) { //将rsp中传入响应值,这里响应值是我们proto定义好的返回值
        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(i int32, s string) *Services.ProdModel {
        return &Services.ProdModel{ProdID: i, ProdName: s}
    }
    
    //重写Call方法
    func (this *ProdsWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
        cmdName := req.Service() + "." + req.Endpoint() //req.Service()是服务名.Endpoint是方法,这里是ProdService.GetProdsList,这个名字并不会对结果有影响,只是这里规范定义而已,其实定义hello world也可以运行
        /*
            service ProdService{
                rpc GetProdsList (ProdsRequest) returns (ProdListResponse);
            }
        */
        configA := hystrix.CommandConfig{
            Timeout: 5000,
        }
        hystrix.ConfigureCommand(cmdName, configA)
        return hystrix.Do(cmdName, func() error {
            return this.Client.Call(ctx, req, rsp) //调用rpc api接口
        }, func(e error) error { //降级函数
            defaultProds(rsp)
            return nil
        })
    }
    
    func NewProdsWrapper(c client.Client) client.Client {
        return &ProdsWrapper{c}
    }
    

    调用中间件

    package main
    
    import (
        "context"
        "fmt"
        "github.com/micro/go-micro"
        "github.com/micro/go-micro/client"
        "github.com/micro/go-micro/registry"
        "github.com/micro/go-micro/web"
        "github.com/micro/go-plugins/registry/consul"
        "go-micro/Services"
        "go-micro/Weblib"
        "go-micro/Wrappers"
    )
    
    type logWrapper struct {
        client.Client
    }
    
    func (this *logWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
        fmt.Println("调用接口") //这样每一次调用调用接口时都会
        return this.Client.Call(ctx, req, rsp)
    }
    func NewLogWrapper(c client.Client) client.Client {
        return &logWrapper{c}
    }
    func main() {
        consulReg := consul.NewRegistry( //新建一个consul注册的地址,也就是我们consul服务启动的机器ip+端口
            registry.Addrs("localhost:8500"),
        )
        //下面两局代码是注册rpcserver调用客户端
        myService := micro.NewService(
            micro.Name("prodservice.client"),
            micro.WrapClient(NewLogWrapper),            //在注册时只需要传入方法名即可,底层会自动给这个方法传入client
            micro.WrapClient(Wrappers.NewProdsWrapper), //在注册时只需要传入方法名即可,底层会自动给这个方法传入client
        )
        prodService := Services.NewProdService("prodservice", myService.Client()) //生成的这个客户端绑定consul中存储的prodservice服务,只要调用了prodservice接口就会调用我们上面注册的中间件
    
    
    
        //其实下面这段代码的作用就是启动webserver的同事的时候把服务注册进去
        httpserver := web.NewService( //go-micro很灵性的实现了注册和反注册,我们启动后直接ctrl+c退出这个server,它会自动帮我们实现反注册
            web.Name("httpprodservice"),                   //注册进consul服务中的service名字
            web.Address(":8001"),                          //注册进consul服务中的端口,也是这里我们gin的server地址
            web.Handler(Weblib.NewGinRouter(prodService)), //web.Handler()返回一个Option,我们直接把ginRouter穿进去,就可以和gin完美的结合
            web.Registry(consulReg),                       //注册到哪个服务器上的consul中
        )
        httpserver.Init() //加了这句就可以使用命令行的形式去设置我们一些启动的配置
        httpserver.Run()
    }
    




  • 相关阅读:
    Oracle使用序列创建自增字段(主键自动增长)
    Oracle 增加修改删除字段
    JavaScript trim函数大赏
    js跨域问题
    document.getElementsByClassName的理想实现
    IIS启用Gzip的方法与优缺点分析
    浅释跳转漏洞
    js跨域及解决方法
    C#编写COM组件
    50种方法巧妙优化你的SQL Server数据库
  • 原文地址:https://www.cnblogs.com/hualou/p/12132508.html
Copyright © 2011-2022 走看看