consul
Kitex 提供的服务注册与发现 consul 拓展。
安装
go get github.com/kitex-contrib/registry-consul
服务注册
创建 Registry
提供了两个创建 Registry 的函数
NewConsulRegister
NewConsulRegister
使用 consul 创建一个新的服务注册中心,需要传入地址。可自定义服务注册中心配置,配置详情见 Option。
函数签名:
func NewConsulRegister(address string, opts ...Option) (registry.Registry, error)
示例代码:
import (
...
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/server"
consul "github.com/kitex-contrib/registry-consul"
consulapi "github.com/hashicorp/consul/api"
)
func main() {
r, err := consul.NewConsulRegister("127.0.0.1:8500")
if err != nil {
log.Fatal(err)
}
server := hello.NewServer(new(HelloImpl), server.WithRegistry(r), server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{
ServiceName: "greet.server",
}))
err = server.Run()
if err != nil {
log.Fatal(err)
}
}
NewConsulRegisterWithConfig
NewConsulRegisterWithConfig
使用 consul 创建一个可配置客户端的服务注册中心,需要传入客户端,客户端需用户自行使用 consul 官方 Go 客户端创建。可自定义服务注册中心配置,配置详情见 Option。
函数签名:
func NewConsulRegisterWithConfig(config *api.Config, opts ...Option) (*consulRegistry, error)
示例代码:
import (
...
consul "github.com/kitex-contrib/registry-consul"
consulapi "github.com/hashicorp/consul/api"
)
func main() {
...
consulConfig := consulapi.Config{
Address: "127.0.0.1:8500",
Scheme: "https"
Token: "TEST-MY-TOKEN",
}
r, err := consul.NewConsulRegisterWithConfig(&consulConfig)
}
Option
Consul 拓展在服务注册部分中提供了 option 配置。
WithCheck
Consul 扩展提供了 WithCheck
用于帮助用户配置 Consul 中的 AgentServiceCheck
选项。若不使用,则默认设置 check.Timeout
为 5 秒,check.Internal
为 5 秒,check.DeregisterCriticalServiceAfter
为 1 分钟。
函数签名:
func WithCheck(check *api.AgentServiceCheck) Option
示例代码:
import (
...
consul "github.com/kitex-contrib/registry-consul"
consulapi "github.com/hashicorp/consul/api"
)
func main() {
...
r, err := consul.NewConsulRegister("127.0.0.1:8500", consul.WithCheck(&consulapi.AgentServiceCheck{
Interval: "7s",
Timeout: "5s",
DeregisterCriticalServiceAfter: "1m",
}))
}
服务发现
创建 Resolver
提供了两个创建 Resolver 的函数。
NewConsulResolver
NewConsulResolver
使用 consul 创建一个新的服务发现中心,需要传入地址。
函数签名:
func NewConsulResolver(address string) (discovery.Resolver, error)
示例代码:
import (
...
"github.com/cloudwego/kitex/client"
consul "github.com/kitex-contrib/registry-consul"
...
)
func main() {
...
r, err := consul.NewConsulResolver("127.0.0.1:8500")
if err != nil {
log.Fatal(err)
}
client, err := echo.NewClient("greet.server", client.WithResolver(r))
if err != nil {
log.Fatal(err)
}
...
}
NewConsulResolverWithConfig
NewConsulResolverWithConfig
使用 consul 创建一个新的服务发现中心,需要传入客户端,客户端需用户自行使用 consul 官方 Go 客户端创建。
函数签名:
func NewConsulResolver(consulClient *api.Client) discovery.Resolver
示例代码:
import (
...
consul "github.com/kitex-contrib/registry-consul"
consulapi "github.com/hashicorp/consul/api"
)
func main() {
...
consulConfig := consulapi.Config{
Address: "127.0.0.1:8500",
Scheme: "https"
Token: "TEST-MY-TOKEN",
}
r, err := consul.NewConsulResolverWithConfig(&consulConfig)
}
使用示例
服务端
package main
import (
"context"
"log"
"github.com/cloudwego/kitex/pkg/registry"
"github.com/cloudwego/kitex/server"
consul "github.com/kitex-contrib/registry-consul"
"github.com/kitex-contrib/registry-consul/example/hello/kitex_gen/api"
"github.com/kitex-contrib/registry-consul/example/hello/kitex_gen/api/hello"
)
type HelloImpl struct{}
func (h *HelloImpl) Echo(_ context.Context, req *api.Request) (resp *api.Response, err error) {
resp = &api.Response{
Message: req.Message,
}
return
}
func main() {
r, err := consul.NewConsulRegister("127.0.0.1:8500")
if err != nil {
log.Fatal(err)
}
svc := hello.NewServer(
new(HelloImpl),
server.WithRegistry(r),
server.WithRegistryInfo(®istry.Info{
ServiceName: "hello",
Weight: 1, // weights must be greater than 0 in consul,else received error and exit.
}),
)
err = svc.Run()
if err != nil {
log.Fatal(err)
}
}
客户端
package main
import (
"context"
"log"
"time"
"github.com/cloudwego/kitex/client"
consul "github.com/kitex-contrib/registry-consul"
"github.com/kitex-contrib/registry-consul/example/hello/kitex_gen/api"
"github.com/kitex-contrib/registry-consul/example/hello/kitex_gen/api/hello"
)
func main() {
r, err := consul.NewConsulResolver("127.0.0.1:8500")
if err != nil {
log.Fatal(err)
}
c := hello.MustNewClient("hello", client.WithResolver(r), client.WithRPCTimeout(time.Second*3))
ctx := context.Background()
for {
resp, err := c.Echo(ctx, &api.Request{Message: "Hello"})
if err != nil {
log.Fatal(err)
}
log.Println(resp)
time.Sleep(time.Second)
}
}
配置
可自定义 Consul 客户端以及服务端的配置,参考 consul 配置。
完整示例
完整用法示例详见 example 。
最后修改
January 18, 2024
: Upload volo blog (#936) (1fc8abb)