// TODO(user): Add simple overview of use/purpose
用于 xds 服务的示例服务端。
// TODO(user): Add quick start
注意 scripts/genproto.sh
以来的 proto 文件。
protoc \
-I ./ \
-I /Users/coding/go/src/github.com/cncf/xds \
-I /Users/coding/go/src/github.com/envoyproxy/envoy/api \
-I /Users/coding/go/src/github.com/bufbuild/protoc-gen-validate \
- 通过 rest http api
- 通过 grpc 继承 go-control
- 通过 grpc 自定义
pkg.go.dev/github.com/envoyproxy/go-control-plane/pkg/server/v3#NewServer
在 handler/register.go
新增以下内容:
// Register 用于服务启动前环境准备
func (m *Microservice) Register(ctx context.Context) error {
......
snapshotCache := cache.NewSnapshotCache(false, cache.IDHash{}, nil)
server := xds.NewServer(context.Background(), snapshotCache, nil)
endpointservice.RegisterEndpointDiscoveryServiceServer(m.server.Server(), server)
// 具体服务发现逻辑
go testSnapshot(snapshotCache)
......
}
在 api/mingqing/xdserver/v1/microservice.proto
新增以下内容:
// 该微服务支持的 RPC 方法定义
service MingqingXdserver {
......
// eds rest 接口定义
rpc FetchEndpoints(envoy.service.discovery.v3.DiscoveryRequest) returns (envoy.service.discovery.v3.DiscoveryResponse) {}
......
}
定义 http rest 接口,在 api/mingqing/xdserver/v1/microservice.gateway.yaml
:
type: google.api.Service
config_version: 3
http:
rules:
......
- selector: default.api.mingqing.xdserver.v1.MingqingXdserver.FetchEndpoints
post: "/api/v3/discovery:endpoints"
body: "*"
......
实现具体服务发现逻辑,在 handler/rpc_eds.go
:
// FetchEndpoints xx
func (m *Microservice) FetchEndpoints(ctx context.Context, req *discoveryv3.DiscoveryRequest) (*discoveryv3.DiscoveryResponse, error) {
result := &discoveryv3.DiscoveryResponse{
Resources: make([]*any.Any, 0),
}
......
return result, nil
}
在 handler/register.go
新增以下内容:
// Register 用于服务启动前环境准备
func (m *Microservice) Register(ctx context.Context) error {
......
endpointservice.RegisterEndpointDiscoveryServiceServer(m.server.Server(), m)
......
}
注意代码不要与方案一重复。
在 handler/rpc_eds.go
添加以下代码,以实现 eds 服务定义:
func (m *Microservice) StreamEndpoints(stream srvendpointv3.EndpointDiscoveryService_StreamEndpointsServer) error {
......
return nil
}
func (m *Microservice) DeltaEndpoints(stream srvendpointv3.EndpointDiscoveryService_DeltaEndpointsServer) error {
......
return nil
}