视频讲解: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
}

参考