go 使用consul 做服务注册与发现
先去安装consul
docker pull consul
#配置consul集群 可以在consul的ui界面上看见对应的信息
docker run -d -p 8500:8500/tcp --name consul_server_1 consul agent -server -node=1 -ui -bootstrap -client=0.0.0.0
docker run -d --name consul_server_2 consul agent -server -node=2 -join='172.17.0.2' -client=0.0.0.0
docker run -d --name consul_server_3 consul agent -server -node=3 -join='172.17.0.2' -client=0.0.0.0
docker run -d --name consul_server_4 consul agent -client -node=4 -join='172.17.0.2' -client=0.0.0.0
#或者通过配置文件操作
docker run -d -p 8500:8500/tcp -p 53:53/tcp -v C:\Users\readline\Desktop\xutao\golang\rpc\consul.d:/usr/local/consul/consul.d --name consul_server_1 consul agent -server -node=1 -ui -bootstrap -client=0.0.0.0 -dns-port=53 -config-dir /usr/local/consul/consul.d
docker run -d -v C:\Users\readline\Desktop\xutao\golang\rpc\consul.d:/usr/local/consul/consul.d --name consul_server_2 consul agent -server -node=2 -join='172.17.0.3' -client=0.0.0.0 -config-dir /usr/local/consul/consul.d
参考(https://blog.csdn.net/u013536232/article/details/104235282)
一、代码注册
package main import ( "fmt" consulapi "github.com/hashicorp/consul/api" "net/http" ) const ( consulAddress = "127.0.0.1:8500" localIp = "127.0.0.1" localPort = 81 ) func consulRegister() { // 创建连接consul服务配置 config := consulapi.DefaultConfig() config.Address = consulAddress client, err := consulapi.NewClient(config) if err != nil { fmt.Println("consul client error : ", err) } // 创建注册到consul的服务到 registration := new(consulapi.AgentServiceRegistration) registration.ID = "337" registration.Name = "service337" registration.Port = localPort registration.Tags = []string{"testService"} registration.Address = localIp // 增加consul健康检查回调函数 check := new(consulapi.AgentServiceCheck) check.HTTP = fmt.Sprintf("http://%s:%d", registration.Address, registration.Port) check.Timeout = "5s" check.Interval = "5s" check.DeregisterCriticalServiceAfter = "30s" // 故障检查失败30s后 consul自动将注册服务删除 registration.Check = check // 注册服务到consul err = client.Agent().ServiceRegister(registration) } func Handler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("you are visiting health check api")) } func main() { //注册服务 consulRegister() //定义一个http接口 http.HandleFunc("/", Handler) err := http.ListenAndServe("0.0.0.0:81", nil) if err != nil { fmt.Println("error: ", err.Error()) } }
二、配置文件注册(参考 http://www.36nu.com/post/260)
{ "service": { "id": "337", "name": "service337", "address": "192.168.1.112", "tags": [ "webapi" ], "port": 81, "checks": [{ "http": "http://192.168.1.112:81/", "interval": "5s" }] } }
三、发现服务
package main import ( "fmt" consulapi "github.com/hashicorp/consul/api" ) const ( consulAgentAddress = "127.0.0.1:8500" ) // 从consul中发现服务 func ConsulFindServer() { // 创建连接consul服务配置 config := consulapi.DefaultConfig() config.Address = consulAgentAddress client, err := consulapi.NewClient(config) if err != nil { fmt.Println("consul client error : ", err) } // 获取指定service service, _, err := client.Agent().Service("337", nil) if err == nil{ fmt.Println(service.Address) fmt.Println(service.Port) } //只获取健康的service //serviceHealthy, _, err := client.Health().Service("service337", "", true, nil) //if err == nil{ // fmt.Println(serviceHealthy[0].Service.Address) //} } func main() { ConsulFindServer() }