环境:Windows11 64位
go安装consul包: go get -u github.com/hashicorp/consul
1.下载安装consul
consul下载地址:https://www.consul.io/downloads.html
1)下载后,解压缩到目录中,例如:D:\GoCode\consul\consul.exe
2)开启cmd, cd D:\GoCode\consul进入目录(也可以设置环境变量 path,就无需进入consul目录下)
3)用开发者模式启动consul: consul agent -dev
4)网页输入:http://127.0.0.1:8500/回车,如下图,则consul启动成功
2.json脚本方式注册consul服务(了解即可)
1)在consul目录下,新建文件 myconsul.json,写入注册文本,如下例子
{
"service": {
"name": "Say", //服务名
"id": "ID1", //ID随意
"address": "127.0.0.1", //服务地址
"port": 8800, //服务端口号
"tags": ["primary"], //服务别名
"check":{ //健康检查
"id":"api",
"name":"SerSay check",
"http":"http://localhost:8800",
"interval": "10s", //间隔10秒进行健康检查
"timeout" : "1s" //服务应答时间 1秒如果不应答 即为不健康
}
}
}
2)在consul目录下,新建目录config
3)用以下命令,启动或重新启动consul服务,启动后,可见Say服务
consul agent -server -bootstrap-expect 1 -data-dir D:/GoCode/consul/config -node=n1 -bind=127.0.0.1 -ui -rejoin -config-dir=D:/GoCode/consul/ -client 0.0.0.0
命令说明:
-server 以服务方式开启server,允许其他的consul连接到开启的consul上,如无则以客户端方式开启
-bootstrap-expect 在一个集群中期望提供的server节点数目
-data-dir=path 指定服务数据文件存储位置
-node=hostname 服务发现的名字
-bind=0.0.0.0 指定consul所在机器的ip地址
-ui 可以谁用web页面来查看服务发现的详情
-rejoin consul启动的时候,加入到的consul集群
-config-dir 配置文件地址, 如果是文件夹会将所有文件合并
-client 指定哪些机器可以访问consul, 0.0.0.0表示所有机器
3.go注册consul服务,需加载包:"github.com/hashicorp/consul/api",源码如下
//定义类 type StuClass1 struct { __.UnimplementedSayServer } //绑定类方法 func (this *StuClass1) SayHello(ctx context.Context, in *__.HelloRequest) (*__.HelloReply, error) { return &__.HelloReply{Message: "你好!" + in.Name}, nil }
//注册启动服务 func grpcServer() { //初始化consul配置 consulConfig := api.DefaultConfig() //创建consul对象 consulClient, err := api.NewClient(consulConfig) if err != nil { fmt.Println("api.NewClient err:", err) return } //注册服务 服务的常规配置 各参数含义,见2.中说明 reg := api.AgentServiceRegistration{ ID: "ID1", Name: "Say and Consul", Tags: []string{"grpc", "consul"}, Port: 1111, Address: "127.0.0.1", Check: &api.AgentServiceCheck{ CheckID: "api", TCP: "127.0.0.1:1111", Timeout: "1s", Interval: "5s", }, } //注册服务到consul上 consulClient.Agent().ServiceRegister(®) //启动服务 g := grpc.NewServer() __.RegisterSayServer(g, &StuClass1{}) listens, err := net.Listen("tcp", "127.0.0.1:1111") if err != nil { return } defer listens.Close() fmt.Println("服务启动...") g.Serve(listens) }
4.开发者模式启动consul服务 consul agent -dev
运行go编写的Server源码,即可将服务Say and Consul注册到consul
打开localhost:8500可见如下图
5.编制go客户端访问
func grpcClient() { //初始化consul配置 consulConfig := api.DefaultConfig() //创建consul对象 consulClient, err := api.NewClient(consulConfig) if err != nil { fmt.Println("api.NewClient err:", err) return } //服务发现 从consul上 获取健康服务 services, _, err := consulClient.Health().Service("Say And Consul", "consul", true, nil) /* //参数 service: 服务名 注册服务死 指定该string[api.agentserviceregistration.name] tag: 别名 如果有多个 任选一个 passingonly:是否通过健康检查 true q:查询参数 通常传nil //返回值 serviceentry: 存储服务的切片 当服务是一个集群时 可任选一个服务 querymeta: 额外查询返回值 通常是nil error:错误信息 */ if err != nil { fmt.Println(err) return } ipaddr := services[0].Service.Address + ":" + strconv.Itoa(services[0].Service.Port) //连接服务 //conn, err := grpc.Dial("127.0.0.1:1111", grpc.WithTransportCredentials(insecure.NewCredentials())) conn, err := grpc.Dial(ipaddr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { return } defer conn.Close() client := __.NewSayClient(conn) r, _ := client.SayHello(context.TODO(), &__.HelloRequest{Name: "consul"}) fmt.Println(r.Message) }
运行后,结果如下: