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(®Service)
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")
网友评论