Envoy是云本机OpenSource代理服务器。特使代理提供了各种HTTP过滤器来处理传入请求。
External authorisation是一种过滤类型,将传入请求引导到外部服务并等待其授权继续该请求。外部服务能够修改或暂停传入请求,可以是grpc_service或http_service。
工作示例:prakashchokalingam/envoy_ext_auth_grpc_go
让我们看使用Envoy外部验证过滤器连接基于GRPC的Golang服务。
创建基于Golang GRPC的服务器:
main.go
package main
import (
"fmt"
"net"
"google.golang.org/grpc"
)
func main() {
endPoint := fmt.Sprintf("localhost:%d", 3001)
listen, err := net.Listen("tcp", endPoint)
grpcServer := grpc.NewServer()
grpcServer.Serve(listen)
}
用go-Control-Plane Protobuf扩展
上面的服务器应扩展并在EnvoyProxy go-control-Plane Protabuf Server上进行注册,并具有检查函数定义的结构。
main.go
package main
import (
"fmt"
"net"
auth_pb "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3"
"google.golang.org/grpc"
)
func main() {
// struct with check method
type AuthServer struct {}
func (server *AuthServer) Check(
ctx context.Context,
request *auth_pb.CheckRequest,
) (*auth_pb.CheckResponse, error) {
fmt.println("All request goes through me")
// block if path is /private
path = request.Attributes.Request.Http.Path[1:]
if path == 'private' {
return nil, fmt.Errorf('private request not allowed')
}
// allow all other requests
return &auth_pb.CheckResponse{}, nil
}
endPoint := fmt.Sprintf("localhost:%d", 3001)
listen, err := net.Listen("tcp", endPoint)
grpcServer := grpc.NewServer()
// register envoy proto server
server := &AuthServer{}
auth_pb.RegisterAuthorizationServer(grpcServer, server)
grpcServer.Serve(listen)
}
如果在检查方法而不是&auth_pb.checkresponse中返回零,则该请求将使用403错误代码暂停。
注意:如果服务离线或无法实现的话,特使还将返回403。
最后但并非最不重要的一点是,设置您的使节
在您的特使配置中,添加过滤器envoy.filters.http.ext_authz
and将其指向Go Service cluster
Envoy.yml
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 80 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
...
http_filters:
- name: envoy.filters.http.ext_authz
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
transport_api_version: v3
grpc_service:
envoy_grpc:
cluster_name: go_grpc_cluster
include_peer_certificate: true
...
clusters:
- name: go_grpc_cluster
connect_timeout: 0.25s
type: LOGICAL_DNS
typed_extension_protocol_options:
envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
explicit_http_config:
http2_protocol_options: {}
load_assignment:
cluster_name: go_grpc_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 3001
要查看用于自定义标题的示例片段,click here
查看此存储库以获取功能齐全的代码示例
prakashchokalingam / envoy_ext_auth_grpc_go
Engoy外部验证过滤器的工作示例与Go Lang Grpc服务
用Golang GRPC服务演示Envoy外部授权的示例回购
此存储库提供了一个envoy configuration文件,并为端口8080
的所有传入路线激活了外部验证过滤器特使配置了两个簇,
go_grpc_filter
特使中的过滤器envoy.filters.http.ext_authz
指向此GO GRPC群集。所有传入的请求将转发到此集群。
在请求期间将调用Check method;然后,它将自定义标头添加到所有其他请求中,并使用路径'/private'拒绝请求。
请求 | grpc_filter | 状态 | http_response |
---|---|---|---|
/ | x-custom-header =“ Hello world” | 200 | 你好world |
/ private td> | 403 | - | - |
use_simple_http
这是一个直接的golang http服务器,仅发射通过go_grpc_filter cluster添加的自定义标题x-custom-header
。
运行此示例
- 启动Envoy Server
Envoy -C Envoy.yml
- 启动GO_GRPC_FILTER和GO_GRPC_FILTER服务器,通过导航到群集根。
Go Run Main.go