ServiceComb
Install
go get github.com/kitex-contrib/registry-servicecomb
Service Registry
Create Registry
Kitex provides two functions to create service registry.
NewDefaultSCRegistry
NewDefaultSCRegistry uses service-comb to create a default service registry, which needs to pass in the endpoint value. The service registry configuration can be customized.
Function signature:
func NewDefaultSCRegistry(opts ...Option) (registry.Registry, error)
Example:
import (
    // ...
    "github.com/cloudwego/kitex/pkg/rpcinfo"
    "github.com/cloudwego/kitex/server"
    "github.com/kitex-contrib/registry-servicecomb/registry"
)
// ...
func main() {
    r, err := registry.NewDefaultSCRegistry()
    if err != nil {
        panic(err)
    }
    svr := hello.NewServer(
        new(HelloImpl),
        server.WithRegistry(r),
        server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "Hello"}),
        server.WithServiceAddr(&net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 8080}),
    )
    if err := svr.Run(); err != nil {
        log.Println("server stopped with error:", err)
    } else {
        log.Println("server stopped")
    }
    // ...
}
NewSCRegistry
NewSCRegistry uses service-comb to create a new service registry. It needs to pass in a custom client. Customizable service registry configuration.
Function signature:
func NewSCRegistry(client *sc.Client, opts ...Option) registry.Registry
Example:
import (
    // ...
    "github.com/cloudwego/kitex/pkg/rpcinfo"
    "github.com/cloudwego/kitex/server"
  	"github.com/go-chassis/sc-client"
    "github.com/kitex-contrib/registry-servicecomb/registry"
)
// ...
func main() {
  	client := &sc.Client{
        // ...
    }
    // ...
    r, err := registry.NewSCRegistry(client)
    if err != nil {
        panic(err)
    }
    svr := hello.NewServer(
        new(HelloImpl),
        server.WithRegistry(r),
        server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "Hello"}),
        server.WithServiceAddr(&net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 8080}),
    )
    if err := svr.Run(); err != nil {
        log.Println("server stopped with error:", err)
    } else {
        log.Println("server stopped")
    }
    // ...
}
Option
Servicecomb extension provides option configuration in the service registry section.
WithAppId
Servicecomb extension provides WithAppId to help users configure the AppId of Servicecomb. Defaults to “DEFAULT” .
Function signature:
func WithAppId(appId string) RegistryOption
WithRegistryVersionRule
Servicecomb extension provides WithRegistryVersionRule to help users configure the version requirements of Servicecomb. Defaults to 1.0.0 .
Function signature:
func WithRegistryVersionRule(versionRule string) RegistryOption
WithRegistryHostName
Servicecomb extension provides WithRegistryHostName to help users configure Servicecomb’s hostname. Defaults to “DEFAULT” .
Function signature:
func WithRegistryHostName(hostName string) RegistryOption
WithRegistryHeartbeatInterval
Servicecomb extension provides WithRegistryHeartbeatInterval to help users configure the interval for sending heartbeat packets. Default is 5.
Function signature:
func WithRegistryHeartbeatInterval(second int32) RegistryOption
Service Discovery
Create Resolver
Kitex provides two functions to create service resolver.
NewDefaultSCResolver
NewDefaultSCResolver uses service-comb to create a default service discovery center, which needs to pass in the endpoint value. Service discovery center configuration can be customized.
Function signature:
func NewDefaultSCResolver(opts ...Option) (discovery.Resolver, error)
Example:
import (
    // ...
    "github.com/cloudwego/kitex/client"
    "github.com/kitex-contrib/registry-servicecomb/resolver"
)
func main() {
    r, err := resolver.NewDefaultSCResolver()
    if err != nil {
        panic(err)
    }
    newClient := hello.MustNewClient("Hello", client.WithResolver(r))
    // ...
}
NewSCResolver
NewSCResolver uses service-comb to create a new service discovery center. It needs to pass in a custom client. The configuration of the service discovery center can be customized.
Function signature:
func NewSCResolver(cli *sc.Client, opts ...Option) discovery.Resolver
Example:
import (
    // ...
    "github.com/cloudwego/kitex/client"
  	"github.com/go-chassis/sc-client"
    "github.com/kitex-contrib/registry-servicecomb/resolver"
)
func main() {
  	client := &sc.Client{
        // ...
    }
    // ...
    r, err := resolver.NewSCResolver(client)
    if err != nil {
        panic(err)
    }
    newClient := hello.MustNewClient("Hello", client.WithResolver(r))
    // ...
}
Option
Servicecomb extension provides option configuration in the service discovery section.
WithAppId
Servicecomb extension provides WithAppId to help users configure the AppId of Servicecomb. Defaults to “DEFAULT” .
Function signature:
func WithResolverAppId(appId string) ResolverOption
WithResolverVersionRule
Servicecomb extension provides WithResolverVersionRule to help users configure Servicecomb’s version requirements. Defaults to latest .
Function signature:
func WithResolverVersionRule(versionRule string) ResolverOption
WithResolverConsumerId
Servicecomb extension provides WithResolverConsumerId to help users configure Servicecomb’s ConsumerId . Default is empty .
Function signature:
func WithResolverConsumerId(consumerId string) ResolverOption
How To Use
Server
package main
import (
	"context"
	"log"
	"net"
	"github.com/cloudwego/kitex-examples/hello/kitex_gen/api"
	"github.com/cloudwego/kitex-examples/hello/kitex_gen/api/hello"
	"github.com/cloudwego/kitex/pkg/rpcinfo"
	"github.com/cloudwego/kitex/server"
	"github.com/kitex-contrib/registry-servicecomb/registry"
)
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 := registry.NewDefaultSCRegistry()
	if err != nil {
		panic(err)
	}
	svr := hello.NewServer(
		new(HelloImpl),
		server.WithRegistry(r),
		server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: "Hello"}),
		server.WithServiceAddr(&net.TCPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 8080}),
	)
	if err := svr.Run(); err != nil {
		log.Println("server stopped with error:", err)
	} else {
		log.Println("server stopped")
	}
}
Client
package main
import (
	"context"
	"log"
	"time"
	"github.com/cloudwego/kitex-examples/hello/kitex_gen/api"
	"github.com/cloudwego/kitex-examples/hello/kitex_gen/api/hello"
	"github.com/cloudwego/kitex/client"
	"github.com/kitex-contrib/registry-servicecomb/resolver"
)
func main() {
	r, err := resolver.NewDefaultSCResolver()
	if err != nil {
		panic(err)
	}
	newClient := hello.MustNewClient(
		"Hello",
		client.WithResolver(r),
		client.WithRPCTimeout(time.Second*3),
	)
	for {
		resp, err := newClient.Echo(context.Background(), &api.Request{Message: "Hello"})
		if err != nil {
			log.Fatal(err)
		}
		log.Println(resp)
		time.Sleep(time.Second)
	}
}
Configuration
The configuration of Servicecomb client and server can be customized, refer to the configuration of go-chassis/sc-client.
Complete Example
For more, see example.