美文网首页
consul入门

consul入门

作者: 突击手平头哥 | 来源:发表于2021-04-18 12:56 被阅读0次

    consul入门

    consul是用于服务发现的一个框架,在实际的RPC调用中起到一个服务管理的作用;服务器提供者启动时告知consul自己的IP、Port以及服务信息,服务调用者从consul查询自己需要使用的服务的IP、Port;consul并不参与到业务当中


    consul安装

    这里使用docker安装

    docker pull consul
    docker run -d --name consul -p 8500:8500 consul agent -dev -client=0.0.0.0
    

    启动之后可以从浏览器直接访问8080端口,即可查看consul状态信息;

    consul服务注册

    这里使用grpc作为样例演示,grpc入门见Go语言proto使用入门

    package main
    
    import (
        context "context"
        "fmt"
        "net"
    
        "github.com/hashicorp/consul/api"
        grpc "google.golang.org/grpc"
    )
    
    type RPCService struct {
    }
    
    func (srv *RPCService) SayHello(ctx context.Context, req *Request) (*Response, error) {
    
        name := req.Name
    
        return &Response{Error: 0, Ans: "Hello" + name}, nil
    }
    
    func main() {
        //1, 初始化consul配置, 默认即可
        consulConf := api.DefaultConfig()
        consulConf.Address = "192.168.56.103:8500"              //consul服务器地址
    
        //2, 创建consul对象
        consulClient, _ := api.NewClient(consulConf)
    
        //3, 注册的服务信息
        regService := api.AgentServiceRegistration{
            ID:      "ii18",                  //服务ID
            Tags:    []string{"consul_ii18"}, //服务别名
            Name:    "Consul Service ii18",   //服务名
            Address: "192.168.56.1",          //服务地址
            Port:    8080,                    //服务端口
            Check: &api.AgentServiceCheck{      //服务健康检查
                CheckID:  "Consul Service ii18 check",
                TCP:      "192.168.56.1:8080",
                Timeout:  "1s",
                Interval: "5s",
            },
        }
    
        //注册服务到consul上
        consulClient.Agent().ServiceRegister(&regService)
    
        grpcSrv := grpc.NewServer()
    
        RegisterIi14Server(grpcSrv, new(RPCService))
    
        listener, err := net.Listen("tcp", ":8080")
        if err != nil {
            fmt.Println("net Listen error", err)
        }
    
        grpcSrv.Serve(listener)
    }
    
    
        相比于普通的RPC服务而言,只是多了一步将服务信息告知consul的部分
    

    consul服务发现

    package main
    
    import (
        context "context"
        "fmt"
        "strconv"
    
        "github.com/hashicorp/consul/api"
        grpc "google.golang.org/grpc"
    )
    
    func main() {
        //初始化consul配置
        consulConf := api.DefaultConfig()
        consulConf.Address = "192.168.56.103:8500"
    
        //创建consul对象
        consuleClient, _ := api.NewClient(consulConf)
    
        /*
            服务发现:第一个参数是服务名,第二个参数是服务tag(别名),第三个参数是否通过健康检查,第四个参数默认nil即可
            返回第一个参数是服务切片(因为集群会有多个服务地址,取其一使用即可)
            第二个参数是额外查询信息,第三个参数是error错误信息
        */
        serviceEntry, _, err := consuleClient.Health().Service("Consul Service ii18", "consul_ii18", true, nil)
    
        fmt.Println("serviceEntry[0]: ", serviceEntry[0].Service.Address, serviceEntry[0].Service.Port)
        if err != nil || len(serviceEntry) == 0 {
            return
        }
        //使用上述查询出来的地址进行连接
        conn, err := grpc.Dial(serviceEntry[0].Service.Address+":"+strconv.Itoa(serviceEntry[0].Service.Port), grpc.WithInsecure())
        if err != nil {
            fmt.Println("grpc Dial error", err)
            return
        }
    
        client := NewIi14Client(conn)
    
        rep, err := client.SayHello(context.TODO(), &Request{Name: "zy"})
        if err == nil {
            fmt.Println("execute succ", rep.Ans)
        }
    }
    
    
        相比于普通的RPC调用而言,只是多了一步从consul中获取服务器地址的部分而已;consul更大的意义在于集群控制。
    

    consul注销

    consulClient.Agent().ServiceDeregister("ii18")
    

    相关文章

      网友评论

          本文标题:consul入门

          本文链接:https://www.haomeiwen.com/subject/yezmlltx.html