我使用 Krakend 作为 API 网关,我的配置如下所示:
{
"plugin": {
"folder": "/etc/krakend/plugins/authenticator/",
"pattern":".so"
},
"port": 8080,
"extra_config": {
"github_com/devopsfaith/krakend/transport/http/server/handler": {
"name": "authenticator"
}
},
"endpoints": [
{
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"127.0.0.1:8080"
],
"url_pattern": "/api/v1/address/{id}",
"method": "GET"
}
],
"endpoint": "/api/v1/addresses/{id}",
"method": "GET"
}
],
"name": "gateway",
"timeout": "30s",
"version": 2
}
我想为每个端点传递一些元数据并在我的预定义插件中访问它。 在这种情况下
authenticator
插件。
您正在尝试使用http服务器插件,该插件应该位于路由器层中,也就是在它到达krakend enpoints之前。所以它是全局定义的。
由于您尝试对每个端点进行不同的配置,请考虑使用 http-client 插件。
通过这种方式,您可以从每个端点的 extra_config 获取元数据。
endpoints: [
{
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"127.0.0.1:8080"
],
"url_pattern": "/api/v1/address/{id}",
"method": "GET",
"extra_config": {
"plugin/http-client": {
"name": "krakend-client-example",
"krakend-client-example": {
"metadata_example_1": "example"
}
}
}
}
],
"endpoint": "/api/v1/addresses/{id}",
"method": "GET"
},
]
您想要实现的目标是完全可能的,并且是 KrakenD 中所有组件的工作方式。您的插件可以使用您定义的命名空间访问 KrakenD 配置。例如,您可以像这样设置元数据(我假设您的 Go 代码中有一个
pluginName = "slifer2015-authenticator"
):
{
"endpoints": [
{
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"127.0.0.1:8080"
],
"url_pattern": "/api/v1/address/{id}"
}
],
"endpoint": "/api/v1/addresses/{id}",
"extra_config": {
"github_com/devopsfaith/krakend/transport/http/server/handler": {
"name": [
"slifer2015-authenticator",
"some-other-plugin-here"
],
"slifer2015-authenticator": {
"Metadata1": "value1",
"Metadata2": {
"Some": 10,
"Thing": 100,
"Here": "60s"
}
}
}
}
}
]
}
然后,当注册器启动时,您的元数据将在您选择的密钥内的
extra
参数中可用。
func (r registerer) registerHandlers(ctx context.Context, extra map[string]interface{}, h http.Handler) (http.Handler, error) {
``