视频讲解:Envoy手把手入门视频讲解
go-control-plane 的基本用法
go-control-plane 是一个框架,提供了配置下发接口,在它的基础上根据自己的需要开发其它功能。
这里简单说明下用法,下一节有详细的例子,注意 动态配置与 envoy 的配对 的方法。
准备开发环境
用 go mod 引用 go-control-plane:
mkdir envoydev
cd envoydev
go mod init github.com/introclass/go-code-example/envoydev
go get github.com/envoyproxy/[email protected]
使用示例
go-control-plane 中给出了一个简单的例子,snapshotCache 中存放要下发配置,将通过它创建的 server 与 grpcServer 绑定。envoy 通过 grpc 服务获取配置:
import (
"net"
api "github.com/envoyproxy/go-control-plane/envoy/api/v2"
discovery "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v2"
"github.com/envoyproxy/go-control-plane/pkg/cache"
xds "github.com/envoyproxy/go-control-plane/pkg/server"
)
func main() {
snapshotCache := cache.NewSnapshotCache(false, hash{}, nil)
server := xds.NewServer(snapshotCache, nil)
grpcServer := grpc.NewServer()
lis, _ := net.Listen("tcp", ":8080")
discovery.RegisterAggregatedDiscoveryServiceServer(grpcServer, server)
api.RegisterEndpointDiscoveryServiceServer(grpcServer, server)
api.RegisterClusterDiscoveryServiceServer(grpcServer, server)
api.RegisterRouteDiscoveryServiceServer(grpcServer, server)
api.RegisterListenerDiscoveryServiceServer(grpcServer, server)
go func() {
if err := grpcServer.Serve(lis); err != nil {
// error handling
}
}()
}
动态配置与 envoy 的配对
动态配置是关联到 envoy 的 ,每个 envoy 的动态配置都要单独维护。
在 envoy 的配置文件中有一段 node 配置,标注了当前 envoy 所属的 cluster 和 id,envoy 只接受使用同样的 cluster 和 id 的动态配置:
node:
id: "envoy-64.58"
cluster: "test"
...
使用 go-control-plane 实现的控制平面要为每个 envoy 实例维护一份配置:
node := &core.Node{
Id: "envoy-64.58",
Cluster: "test",
}
node_config := &NodeConfig{
node: node,
endpoints: []cache.Resource{}, //[]*api_v2.ClusterLoadAssignment
clusters: []cache.Resource{}, //[]*api_v2.Cluster
routes: []cache.Resource{}, //[]*api_v2.RouteConfiguration
listeners: []cache.Resource{}, //[]*api_v2.Listener
}