在Go语言微服务架构中,服务发现与注册通常涉及使用一些外部服务来实现,例如Consul、Etcd、Zookeeper或者Kubernetes等。以下是一些开源解决方案的简要介绍和示例代码。
Consul
Consul是一个分布式服务网络平台,具有服务发现、健康检查和KV存储等功能。
import "github.com/hashicorp/consul/api"
// 创建Consul客户端
client, err := api.NewClient(api.DefaultConfig())
if err != nil {
panic(err)
}
// 注册服务
err = client.Agent().ServiceRegister(&api.AgentServiceRegistration{
Name: "my-service",
Tags: []string{"master"},
Address: "127.0.0.1",
Port: 8500,
Check: &api.AgentServiceCheck{
HTTP: "http://127.0.0.1:8500/health",
Timeout: "5s",
Interval: "10s",
DeregisterCriticalServiceAfter: "15s",
},
})
if err != nil {
panic(err)
}
Etcd
Etcd是一个分布式键值存储系统,可以被用来实现服务注册与发现。
import (
"go.etcd.io/etcd/client/v3"
"go.etcd.io/etcd/client/v3/naming/etcdv3"
)
// 连接到Etcd
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"localhost:2379"},
})
if err != nil {
panic(err)
}
defer cli.Close()
// 创建注册器
r, err := etcdv3.NewResolutionver(cli, "my-service")
if err != nil {
panic(err)
}
// 注册服务
sr := &naming.Service{
Key: "my-service",
Addr: "127.0.0.1",
Metadata: &naming.Inst{
Addr: "127.0.0.1",
Metadata: map[string]string{"protocol": "http"},
},
}
_, err = r.BIndService(sr)
if err != nil {
panic(err)
}
Zookeeper
Zookeeper是一个分布式协调服务,可以用来实现微服务的服务发现。
import (
"github.com/samuel/go-zookeeper/zk"
"github.com/go-zookeeper/zk"
)
// 连接到Zookeeper
conn, _, err := zk.Connect([]string{"localhost:2181"}, time.Second)
if err != nil {
panic(err)
}
defer conn.Close()
// 注册服务
service := "my-service"
path := "/services/" + service
data := `{"name": "my-service", "address": "127.0.0.1", "port": 8080}`
acl := zk.WorldACL(zk.PermAll)
_, err = conn.Create(path, []byte(data), int32(0), acl)
if err != nil {
if err != zk.ErrNodeExists {
panic(err)
}
}
Kubernetes
如果你的微服务运行在Kubernetes集群上,你可以利用Kubernetes的服务发现机制。
import (
"net/http"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
// 创建