Overview
Service discovery in Kratos includes:- Service registration on startup
- Automatic deregistration on shutdown
- Health checks and heartbeats
- Client-side load balancing
- Multiple discovery backends
Registry Interface
Kratos defines standard interfaces for service registration and discovery:Using Consul
package server
import (
"github.com/go-kratos/kratos/contrib/registry/consul/v2"
"github.com/go-kratos/kratos/v2/registry"
consulAPI "github.com/hashicorp/consul/api"
)
func NewRegistrar(conf *conf.Registry) registry.Registrar {
// Create Consul client
c := consulAPI.DefaultConfig()
c.Address = conf.Consul.Address
c.Scheme = conf.Consul.Scheme
cli, err := consulAPI.NewClient(c)
if err != nil {
panic(err)
}
// Create Consul registry
r := consul.New(cli)
return r
}
package main
import (
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/registry"
"github.com/go-kratos/kratos/v2/transport/http"
"github.com/go-kratos/kratos/v2/transport/grpc"
)
func newApp(logger log.Logger, hs *http.Server, gs *grpc.Server, r registry.Registrar) *kratos.App {
return kratos.New(
kratos.Name("user.service"),
kratos.Version("v1.0.0"),
kratos.Metadata(map[string]string{
"region": "us-west",
"zone": "zone-a",
}),
kratos.Logger(logger),
kratos.Server(hs, gs),
kratos.Registrar(r),
)
}
package data
import (
"context"
"time"
"github.com/go-kratos/kratos/contrib/registry/consul/v2"
"github.com/go-kratos/kratos/v2/transport/grpc"
consulAPI "github.com/hashicorp/consul/api"
)
func NewOrderServiceClient(conf *conf.Data) (orderv1.OrderClient, error) {
// Create Consul client
c := consulAPI.DefaultConfig()
c.Address = conf.Consul.Address
cli, err := consulAPI.NewClient(c)
if err != nil {
return nil, err
}
// Create service discovery
r := consul.New(cli)
// Connect with service discovery
conn, err := grpc.DialInsecure(
context.Background(),
grpc.WithEndpoint("discovery:///order.service"),
grpc.WithDiscovery(r),
grpc.WithTimeout(5*time.Second),
)
if err != nil {
return nil, err
}
return orderv1.NewOrderClient(conn), nil
}
Using Etcd
Install Etcd Client
Configure Etcd Registry
Using Nacos
Install Nacos Client
Configure Nacos Registry
Kubernetes Service Discovery
Using Kubernetes DNS
Leverage Kubernetes built-in service discovery:Using Kubernetes API
Load Balancing
Built-in Load Balancing Strategies
Kratos supports multiple load balancing algorithms:Custom Load Balancing
Implement custom load balancing logic:Service Metadata
Adding Metadata
Include metadata with service registration:Filtering by Metadata
Filter service instances by metadata:Health Checks
HTTP Health Endpoint
Implement health check endpoints:internal/server/http.go
Consul Health Checks
Configure Consul health checks:Best Practices
Service Names
Use consistent, descriptive service names across your infrastructure
Health Checks
Always implement proper health check endpoints
Graceful Shutdown
Deregister services gracefully on shutdown
Metadata
Use metadata for routing, versioning, and feature flags
Complete Example
internal/server/registrar.go
Next Steps
Configuration
Configure your registry settings
Deployment
Deploy with service discovery enabled