Consul
Install
go get github.com/kitex-contrib/registry-consul
Service Registry
Create Registry
Kitex provides two functions to create service registry.
NewConsulRegister
NewConsulRegister uses consul to create a new service registry. It requires passing in an address. Customizable service registry configuration, see Option for configuration details.
Function signature:
func NewConsulRegister(address string, opts ...Option) (registry.Registry, error)
Example:
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 uses consul to create a new service registry. It requires passing in a client, and the client needs to be created by the user using the official Consul Go client. Customizable service registry configuration, see Option for configuration details.
Function signature:
func NewConsulRegisterWithConfig(config *api.Config, opts ...Option) (*consulRegistry, error)
Example:
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 extension provides option configuration in the service registry section.
WithCheck
Consul extension provides WithCheck to help users configure the AgentServiceCheck option in Consul. defaultCheck() is called by default. If not use, set check.Timeout to 5 seconds, check.Internal to 5 seconds, and check.DeregisterCriticalServiceAfter to 1 minute.
Function signature:
func WithCheck(check *api.AgentServiceCheck) Option
Example:
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",
}))
}
Service Discovery
Create Resolver
Kitex provides two functions to create Resolver.
NewConsulResolver
NewConsulResolver uses consul to create a new service discovery center. It requires passing in an address.
Function signature:
func NewConsulResolver(address string) (discovery.Resolver, error)
Example:
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 uses consul to create a new service discovery center. It requires passing in a client, and the client needs to be created by the user using the official Consul Go client.
Function signature:
func NewConsulResolver(consulClient *api.Client) discovery.Resolver
Example:
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)
}
How To Use
Server
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)
}
}
Client
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)
}
}
Configuration
The configuration of Consul client and server can be customized, refer to the configuration of consul.
Complete Example
For more, see example .