本篇使用到了RPC通讯 可以看这里
搭建consul集群可以使用这个 docker-compose 一键生成
服务端代码
package main
import (
"fmt"
"github.com/hashicorp/consul/api"
"log"
"net"
"net/rpc"
"strconv"
)
// curl http://127.0.0.1:8501/v1/agent/services
const (
ConsulAddr = "127.0.0.1:8501"
ServerPort = "1234"
ServerHost = "127.0.0.1"
ServerName = "arithmetic_server"
ServerNameID = "arithmetic_server"
)
type Arithmetic int
type Args struct {
A, B int
}
func (a *Arithmetic) Add(args *Args, reply *int) error {
fmt.Println("接收到请求信息 :", args)
*reply = args.A + args.B
return nil
}
func main() {
consulRegister()
defer ConsulDeRegister()
l, e := net.Listen("tcp", ":"+ServerPort)
if e != nil {
log.Fatal("listen error:", e)
}
defer l.Close()
_ = rpc.Register(new(Arithmetic))
conn, e := l.Accept()
rpc.ServeConn(conn)
}
// 注册consul
func consulRegister() {
// 创建连接consul服务配置
config := api.DefaultConfig()
config.Address = ConsulAddr
client, err := api.NewClient(config)
if err != nil {
fmt.Println("consul config error : ", err)
}
// 创建注册到consul的服务
registration := new(api.AgentServiceRegistration)
registration.ID = ServerNameID
registration.Name = ServerName
registration.Port, _ = strconv.Atoi(ServerPort)
registration.Address = ServerHost
// 注册服务到consul
err = client.Agent().ServiceRegister(registration)
if err != nil {
fmt.Println("consul register error : ", err)
}
}
// curl -s -X PUT 127.0.0.1:8501/v1/agent/service/deregister/arithmetic_server
func ConsulDeRegister() {
fmt.Println("ConsulDeRegister")
// 创建连接consul服务配置
config := api.DefaultConfig()
config.Address = ConsulAddr
client, err := api.NewClient(config)
if err != nil {
log.Fatal("consul client error : ", err)
}
_ = client.Agent().ServiceDeregister(ServerName)
}
客户端代码
这里有一个坑:发现服务的时候如果使用这个consulClient.Agent().Service
只能再注册的consul机器上面发现而无法再集群其他机器发现。。。
参考:https://segmentfault.com/q/1010000039263921
package main
import (
"fmt"
"github.com/hashicorp/consul/api"
"log"
"net/rpc"
"strconv"
)
const (
ConsulAddr = "127.0.0.1:8504"
ServerNameID = "arithmetic_server"
)
type Args struct {
A, B int
}
func main() {
service := getServer()
client, err := rpc.Dial("tcp", service.ServiceAddress+":"+strconv.Itoa(service.ServicePort))
if err != nil {
log.Fatal("client error:", err)
}
args := Args{4, 2}
var reply int
err = client.Call("Arithmetic.Add", args, &reply)
if err != nil {
log.Fatal("arithmetic error:", err)
}
fmt.Println(reply)
}
func getServer() *api.CatalogService {
config := api.DefaultConfig()
config.Address = ConsulAddr
consulClient, err := api.NewClient(config)
if err != nil {
panic(err)
}
service, _, err := consulClient.Catalog().Service(ServerNameID, "", nil)
// 获取指定service
if err != nil {
panic(err)
}
return service[0]
}