embed: support user defined grpc services.

Fixes #7200
This commit is contained in:
disksing 2017-01-22 18:21:19 +08:00
parent 89f7cc51fa
commit 4374d944d4
3 changed files with 12 additions and 1 deletions

View File

@ -29,6 +29,7 @@ import (
"github.com/coreos/etcd/pkg/transport"
"github.com/coreos/etcd/pkg/types"
"github.com/ghodss/yaml"
"google.golang.org/grpc"
)
const (
@ -126,6 +127,8 @@ type Config struct {
// The map key is the route path for the handler, and
// you must ensure it can't be conflicted with etcd's.
UserHandlers map[string]http.Handler `json:"-"`
// ServiceRegister is for registering users' gRPC services.
ServiceRegister func(*grpc.Server) `json:"-"`
}
// configYAML holds the config suitable for yaml parsing

View File

@ -289,6 +289,7 @@ func startClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err error) {
for k := range cfg.UserHandlers {
sctx.userHandlers[k] = cfg.UserHandlers[k]
}
sctx.serviceRegister = cfg.ServiceRegister
if cfg.EnablePprof {
sctx.registerPprof()
}

View File

@ -46,7 +46,8 @@ type serveCtx struct {
ctx context.Context
cancel context.CancelFunc
userHandlers map[string]http.Handler
userHandlers map[string]http.Handler
serviceRegister func(*grpc.Server)
}
func newServeCtx() *serveCtx {
@ -66,6 +67,9 @@ func (sctx *serveCtx) serve(s *etcdserver.EtcdServer, tlscfg *tls.Config, handle
if sctx.insecure {
gs := v3rpc.Server(s, nil)
if sctx.serviceRegister != nil {
sctx.serviceRegister(gs)
}
grpcl := m.Match(cmux.HTTP2())
go func() { errc <- gs.Serve(grpcl) }()
@ -90,6 +94,9 @@ func (sctx *serveCtx) serve(s *etcdserver.EtcdServer, tlscfg *tls.Config, handle
if sctx.secure {
gs := v3rpc.Server(s, tlscfg)
if sctx.serviceRegister != nil {
sctx.serviceRegister(gs)
}
handler = grpcHandlerFunc(gs, handler)
dtls := transport.ShallowCopyTLSConfig(tlscfg)