consul入门 consul入门

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")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章