内容简介:完整代码这里不贴了,可以到
说明
Aggregated Discovery Service 中简单介绍了ADS,简单说就是,CDS/EDS/RDS等动态配置的Managerment Server可以是同一个ADS。 xDS REST and gRPC protocol: Aggregated Discovery Services (ADS) 给出了一个例子:
node:
id: <node identifier>
dynamic_resources:
cds_config: {ads: {}}
lds_config: {ads: {}}
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: ads_cluster
static_resources:
clusters:
- name: ads_cluster
connect_timeout: { seconds: 5 }
type: STATIC
hosts:
- socket_address:
address: <ADS management server IP address>
port_value: <ADS management server port>
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
准备支持ADS的Management Server
go-control-plane 提供了实现ADS功能的API, 一个简单的Management Server实现 中的Management Server用go-control-plane挺的API实现了ADS,如下:
func main() {
snapshotCache := cache.NewSnapshotCache(false, NodeConfig{}, nil)
server := xds.NewServer(snapshotCache, nil)
grpcServer := grpc.NewServer()
lis, _ := net.Listen("tcp", ":5678")
discovery.RegisterAggregatedDiscoveryServiceServer(grpcServer, server)
...
完整代码这里不贴了,可以到 一个简单的Management Server实现 中查看。
配置ADS
ADS在 dynamic_resources
中配置,可以指向 static_resources
中的一个cluster,这也是推荐的做法。
static_resources中配置的cluster(Management Server地址):
static_resources:
clusters:
- name: ads_cluster
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
load_assignment:
cluster_name: ads_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 5678
dynamic_resources
中的配置的ads_config:
dynamic_resources:
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: ads_cluster
然后将dynamic_resources中的cds_config和lds_config指向ads:
dynamic_resources:
cds_config: {ads: {}}
lds_config: {ads: {}}
注意,在1.8.0和1.9.0版本中(更早的版本没有查看),cds_config和lds_config中的ads都是一个 空的结构体
,在 core.ConfigSource
和 core.AggregatedConfigSource
中可以看到:
{
"path": "...",
"api_config_source": "{...}",
"ads": "{...}"
}
Aggregated Discovery Service (ADS) options. This is currently empty, but when set in ConfigSource can be used to specify that ADS is to be used.
另外,Cluster中的EDS和LDS中的RDS,既可以使用其它的Mangement Server,也可以使用ADS(配置成 {ads: {}}
)。将所有的动态配置都设置为ADS,似乎是一个好的做法。
最终相关配置如下:
dynamic_resources:
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: ads_cluster
cds_config: {ads: {}}
lds_config: {ads: {}}
static_resources:
clusters:
- name: ads_cluster
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
load_assignment:
cluster_name: ads_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 5678
使用ADS的EDS
func ADD_Cluster_With_ADS_Endpoint(n *NodeConfig) {
endpoint := &api.ClusterLoadAssignment{
ClusterName: "ads_endpoint",
Endpoints: []endpoint.LocalityLbEndpoints{
endpoint.LocalityLbEndpoints{
LbEndpoints: []endpoint.LbEndpoint{
endpoint.LbEndpoint{
Endpoint: &endpoint.Endpoint{
Address: &core.Address{
Address: &core.Address_SocketAddress{
SocketAddress: &core.SocketAddress{
Protocol: core.TCP,
Address: "192.16.129.26",
PortSpecifier: &core.SocketAddress_PortValue{
PortValue: 80,
},
},
},
},
},
},
},
},
},
Policy: &api.ClusterLoadAssignment_Policy{
DropOverloads: []*api.ClusterLoadAssignment_Policy_DropOverload{
&api.ClusterLoadAssignment_Policy_DropOverload{
Category: "drop_policy1",
DropPercentage: &envoy_type.FractionalPercent{
Numerator: 3,
Denominator: envoy_type.FractionalPercent_HUNDRED,
},
},
},
OverprovisioningFactor: &proto_type.UInt32Value{
Value: 140,
},
},
}
cluster := &api.Cluster{
Name: "cluster_with_ads_endpoint",
ConnectTimeout: 1 * time.Second,
Type: api.Cluster_EDS,
LbPolicy: api.Cluster_ROUND_ROBIN,
EdsClusterConfig: &api.Cluster_EdsClusterConfig{
EdsConfig: &core.ConfigSource{
ConfigSourceSpecifier: &core.ConfigSource_Ads{
Ads: &core.AggregatedConfigSource{}, //使用ADS
},
},
ServiceName: "ads_endpoint", //与endpoint中的ClusterName对应。
},
}
n.endpoints = append(n.endpoints, endpoint)
n.clusters = append(n.clusters, cluster)
}
使用ADS的RDS
func ADD_Listener_With_ADS_Route(n *NodeConfig) {
route := &api.RouteConfiguration{
Name: "ads_route",
VirtualHosts: []route.VirtualHost{
route.VirtualHost{
Name: "local",
Domains: []string{
"ads.webshell.com",
},
Routes: []route.Route{
route.Route{
Match: route.RouteMatch{
PathSpecifier: &route.RouteMatch_Prefix{
Prefix: "/",
},
CaseSensitive: &proto_type.BoolValue{
Value: false,
},
},
Action: &route.Route_Route{
Route: &route.RouteAction{
ClusterSpecifier: &route.RouteAction_Cluster{
Cluster: "cluster_with_ads_endpoint",
},
HostRewriteSpecifier: &route.RouteAction_HostRewrite{
HostRewrite: "webshell.com",
},
},
},
},
},
},
},
}
http_filter_router_ := &http_router.Router{
DynamicStats: &proto_type.BoolValue{
Value: true,
},
}
http_filter_router, err := util.MessageToStruct(http_filter_router_)
if err != nil {
glog.Error(err)
return
}
listen_filter_http_conn_ := &http_conn_manager.HttpConnectionManager{
StatPrefix: "ingress_http",
RouteSpecifier: &http_conn_manager.HttpConnectionManager_Rds{
Rds: &http_conn_manager.Rds{
RouteConfigName: "ads_route",
ConfigSource: core.ConfigSource{
ConfigSourceSpecifier: &core.ConfigSource_Ads{
Ads: &core.AggregatedConfigSource{}, //使用ADS
},
},
},
},
HttpFilters: []*http_conn_manager.HttpFilter{
&http_conn_manager.HttpFilter{
Name: "envoy.router",
ConfigType: &http_conn_manager.HttpFilter_Config{
Config: http_filter_router,
},
},
},
}
listen_filter_http_conn, err := util.MessageToStruct(listen_filter_http_conn_)
if err != nil {
glog.Error(err)
return
}
listener := &api.Listener{
Name: "listener_with_dynamic_route_port_9002",
Address: core.Address{
Address: &core.Address_SocketAddress{
SocketAddress: &core.SocketAddress{
Protocol: core.TCP,
Address: "0.0.0.0",
PortSpecifier: &core.SocketAddress_PortValue{
PortValue: 9002,
},
},
},
},
FilterChains: []listener.FilterChain{
listener.FilterChain{
Filters: []listener.Filter{
listener.Filter{
Name: "envoy.http_connection_manager",
ConfigType: &listener.Filter_Config{
Config: listen_filter_http_conn,
},
},
},
},
},
}
n.listeners = append(n.listeners, listener)
n.routes = append(n.routes, route)
}
这里记录的比较简单,如果对Envoy动态配置不了解,建议参阅 Envoy Proxy使用介绍(七):envoy动态配置xDS的使用方法 。
参考
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The NSHipster Fake Book (Objective-C)
Mattt Thompson / NSHipster Portland, Oregon / 2014 / USD 19.00
Fake Books are an indispensable tool for jazz musicians. They contain the melody, rhythm, and chord changes for hundreds of standards, allowing a player to jump into any session cold, and "fake it" th......一起来看看 《The NSHipster Fake Book (Objective-C)》 这本书的介绍吧!