Service Discovery Extension
kitex-contrib has provided multiple service discovery extensions: DNS, ETCD, ZooKeeper, Eureka, Consul, Nacos, Polaris.
If you want to adopt other service discovery protocol, you can implement the Resolver interface, and clients can inject it by WithResolver Option.
Interface Definition
The interface is defined in pkg/discovery/discovery.go and is defined as follows:
type Resolver interface {
    Target(ctx context.Context, target rpcinfo.EndpointInfo) string
    Resolve(ctx context.Context, key string) (Result, error)
    Diff(key string, prev, next Result) (Change, bool)
    Name() string
}
type Result struct {
    Cacheable bool // if can be cached
    CacheKey  string // the unique key of cached result
    Instances []Instance // the result of service discovery
}
// the diff result
type Change struct {
    Result  Result
    Added   []Instance
    Updated []Instance
    Removed []Instance
}
Resolver interface detail:
- Resolve: as the core method of- Resolver, it obtains the service discovery result from target key
- Target: it resolves the unique target endpoint that from the downstream endpoints provided by- Resolve, and the result will be used as the unique key of the cache
- Diff: it is used to compare the discovery results with the last time. The differences in results are used to notify other components, such as loadbalancer and circuitbreaker, etc
- Name: it is used to specify a unique name for- Resolver, and will use it to cache and reuse- Resolver
Usage Example
You need to implement the the Resolver interface, and using it by Option:
import (
    "xx/kitex/client"
)
func main() {
    opt := client.WithResolver(YOUR_RESOLVER)
    // new client
    xxx.NewClient("destServiceName", opt)
}
Attention
To improve performance, Kitex reusing Resolver, so the Resolver method implementation must be concurrent security.
Last modified
October 28, 2025
: fix(eino_doc): markdown splitter example codeblock \` error (#1450) (3c8bed9)