赞
踩
目录
https://github.com/proxy-wasm/proxy-wasm-cpp-sdk
mkdir work
docker build -t wasmsdk:v2 -f Dockerfile-sdk .
- #include <string>
- #include <string_view>
- #include <unordered_map>
-
- #include "proxy_wasm_intrinsics.h"
-
- class ExampleRootContext : public RootContext {
- public:
- explicit ExampleRootContext(uint32_t id, std::string_view root_id) : RootContext(id, root_id) {}
-
- bool onStart(size_t) override;
- bool onConfigure(size_t) override;
- void onTick() override;
- };
-
- class ExampleContext : public Context {
- public:
- explicit ExampleContext(uint32_t id, RootContext* root) : Context(id, root) {}
-
- void onCreate() override;
- FilterHeadersStatus onRequestHeaders(uint32_t headers, bool end_of_stream) override;
- FilterDataStatus onRequestBody(size_t body_buffer_length, bool end_of_stream) override;
- FilterHeadersStatus onResponseHeaders(uint32_t headers, bool end_of_stream) override;
- FilterDataStatus onResponseBody(size_t body_buffer_length, bool end_of_stream) override;
- void onDone() override;
- void onLog() override;
- void onDelete() override;
- };
- static RegisterContextFactory register_ExampleContext(CONTEXT_FACTORY(ExampleContext),
- ROOT_FACTORY(ExampleRootContext),
- "my_root_id");
-
- bool ExampleRootContext::onStart(size_t) {
- LOG_TRACE("onStart");
- return true;
- }
-
- bool ExampleRootContext::onConfigure(size_t) {
- LOG_TRACE("onConfigure");
- proxy_set_tick_period_milliseconds(1000); // 1 sec
- return true;
- }
-
- void ExampleRootContext::onTick() { LOG_TRACE("onTick"); }
-
- void ExampleContext::onCreate() { LOG_WARN(std::string("onCreate " + std::to_string(id()))); }
-
- FilterHeadersStatus ExampleContext::onRequestHeaders(uint32_t, bool) {
- LOG_DEBUG(std::string("onRequestHeaders ") + std::to_string(id()));
- auto result = getRequestHeaderPairs();
- auto pairs = result->pairs();
- LOG_INFO(std::string("headers: ") + std::to_string(pairs.size()));
- for (auto& p : pairs) {
- LOG_INFO(std::string(p.first) + std::string(" -> ") + std::string(p.second));
- }
- return FilterHeadersStatus::Continue;
- }
-
- FilterHeadersStatus ExampleContext::onResponseHeaders(uint32_t, bool) {
- LOG_DEBUG(std::string("onResponseHeaders ") + std::to_string(id()));
- auto result = getResponseHeaderPairs();
- auto pairs = result->pairs();
- LOG_INFO(std::string("headers: ") + std::to_string(pairs.size()));
- for (auto& p : pairs) {
- LOG_INFO(std::string(p.first) + std::string(" -> ") + std::string(p.second));
- }
- return FilterHeadersStatus::Continue;
- }
-
- FilterDataStatus ExampleContext::onRequestBody(size_t body_buffer_length,
- bool /* end_of_stream */) {
- auto body = getBufferBytes(WasmBufferType::HttpRequestBody, 0, body_buffer_length);
- LOG_ERROR(std::string("onRequestBody ") + std::string(body->view()));
- return FilterDataStatus::Continue;
- }
-
- FilterDataStatus ExampleContext::onResponseBody(size_t /* body_buffer_length */,
- bool /* end_of_stream */) {
- return FilterDataStatus::Continue;
- }
-
- void ExampleContext::onDone() { LOG_WARN(std::string("onDone " + std::to_string(id()))); }
-
- void ExampleContext::onLog() { LOG_WARN(std::string("onLog " + std::to_string(id()))); }
-
- void ExampleContext::onDelete() { LOG_WARN(std::string("onDelete " + std::to_string(id()))); }

通过编译为wasm文件
docker run -v $PWD:/work -w /work wasmsdk:v2 /build_wasm.sh
保存下列文件为envoy.yaml,将上面编译的wasm文件同envoy.yaml放在一起
- # cat /etc/envoy/envoy.yaml
- admin:
- access_log_path: /tmp/admin_access.log
- address:
- socket_address:
- protocol: TCP
- address: 0.0.0.0
- port_value: 9901
- static_resources:
- listeners:
- - name: listener_0
- address:
- socket_address:
- protocol: TCP
- address: 0.0.0.0
- port_value: 10000
- 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
- stat_prefix: ingress_http
- route_config:
- name: local_route
- virtual_hosts:
- - name: local_service
- domains: ["*"]
- routes:
- - match:
- prefix: "/"
- route:
- cluster: my_custom_svc
- http_filters:
- - name: envoy.filters.http.wasm
- typed_config:
- "@type": type.googleapis.com/udpa.type.v1.TypedStruct
- type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
- value:
- config:
- name: "my_plugin"
- root_id: "my_root_id"
- configuration:
- "@type": "type.googleapis.com/google.protobuf.StringValue"
- value: |
- {}
- vm_config:
- runtime: "envoy.wasm.runtime.v8"
- vm_id: "my_vm_id"
- code:
- local:
- filename: "/etc/envoy/optimized.wasm"
- configuration: { }
- - name: envoy.filters.http.router
- typed_config:
- "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
- clusters:
- - name: my_custom_svc
- connect_timeout: 30s
- type: static
- lb_policy: ROUND_ROBIN
- load_assignment:
- cluster_name: service1
- endpoints:
- - lb_endpoints:
- - endpoint:
- address:
- socket_address:
- address: 192.168.20.237
- port_value: 8080

docker run -it --rm -v "$PWD"/envoy.yaml:/etc/envoy/envoy.yaml -v "$PWD"/optimized.wasm:/etc/envoy/optimized.wasm -p 9901:9901 -p 10000:10000 envoyproxy/envoy:v1.20.1
我们在clusters中定义了我们开放端口的服务,请求链路如下
Client->Envoy(10000)>Server(8080)
- clusters:
- - name: my_custom_svc
- connect_timeout: 30s
- type: static
- lb_policy: ROUND_ROBIN
- load_assignment:
- cluster_name: service1
- endpoints:
- - lb_endpoints:
- - endpoint:
- address:
- socket_address:
- address: 192.168.20.237
- port_value: 8080
docker run -it -p 8080:8080 tomcat:8
当我们访问127.0.0.1:10000时,在日志中会看到如下请求,且请求被修改
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。