当前位置:   article > 正文

proxy-wasm-cpp-sdk 编译_wasm proxy sdk

wasm proxy sdk

目录

下载项目

新建work目录

使用Dockerfile构建镜像

用例代码

启动envoy + wasm

启动衔接服务


下载项目

https://github.com/proxy-wasm/proxy-wasm-cpp-sdk

新建work目录

mkdir work

使用Dockerfile构建镜像

docker build -t wasmsdk:v2 -f Dockerfile-sdk .

用例代码

  1. #include <string>
  2. #include <string_view>
  3. #include <unordered_map>
  4. #include "proxy_wasm_intrinsics.h"
  5. class ExampleRootContext : public RootContext {
  6. public:
  7. explicit ExampleRootContext(uint32_t id, std::string_view root_id) : RootContext(id, root_id) {}
  8. bool onStart(size_t) override;
  9. bool onConfigure(size_t) override;
  10. void onTick() override;
  11. };
  12. class ExampleContext : public Context {
  13. public:
  14. explicit ExampleContext(uint32_t id, RootContext* root) : Context(id, root) {}
  15. void onCreate() override;
  16. FilterHeadersStatus onRequestHeaders(uint32_t headers, bool end_of_stream) override;
  17. FilterDataStatus onRequestBody(size_t body_buffer_length, bool end_of_stream) override;
  18. FilterHeadersStatus onResponseHeaders(uint32_t headers, bool end_of_stream) override;
  19. FilterDataStatus onResponseBody(size_t body_buffer_length, bool end_of_stream) override;
  20. void onDone() override;
  21. void onLog() override;
  22. void onDelete() override;
  23. };
  24. static RegisterContextFactory register_ExampleContext(CONTEXT_FACTORY(ExampleContext),
  25. ROOT_FACTORY(ExampleRootContext),
  26. "my_root_id");
  27. bool ExampleRootContext::onStart(size_t) {
  28. LOG_TRACE("onStart");
  29. return true;
  30. }
  31. bool ExampleRootContext::onConfigure(size_t) {
  32. LOG_TRACE("onConfigure");
  33. proxy_set_tick_period_milliseconds(1000); // 1 sec
  34. return true;
  35. }
  36. void ExampleRootContext::onTick() { LOG_TRACE("onTick"); }
  37. void ExampleContext::onCreate() { LOG_WARN(std::string("onCreate " + std::to_string(id()))); }
  38. FilterHeadersStatus ExampleContext::onRequestHeaders(uint32_t, bool) {
  39. LOG_DEBUG(std::string("onRequestHeaders ") + std::to_string(id()));
  40. auto result = getRequestHeaderPairs();
  41. auto pairs = result->pairs();
  42. LOG_INFO(std::string("headers: ") + std::to_string(pairs.size()));
  43. for (auto& p : pairs) {
  44. LOG_INFO(std::string(p.first) + std::string(" -> ") + std::string(p.second));
  45. }
  46. return FilterHeadersStatus::Continue;
  47. }
  48. FilterHeadersStatus ExampleContext::onResponseHeaders(uint32_t, bool) {
  49. LOG_DEBUG(std::string("onResponseHeaders ") + std::to_string(id()));
  50. auto result = getResponseHeaderPairs();
  51. auto pairs = result->pairs();
  52. LOG_INFO(std::string("headers: ") + std::to_string(pairs.size()));
  53. for (auto& p : pairs) {
  54. LOG_INFO(std::string(p.first) + std::string(" -> ") + std::string(p.second));
  55. }
  56. return FilterHeadersStatus::Continue;
  57. }
  58. FilterDataStatus ExampleContext::onRequestBody(size_t body_buffer_length,
  59. bool /* end_of_stream */) {
  60. auto body = getBufferBytes(WasmBufferType::HttpRequestBody, 0, body_buffer_length);
  61. LOG_ERROR(std::string("onRequestBody ") + std::string(body->view()));
  62. return FilterDataStatus::Continue;
  63. }
  64. FilterDataStatus ExampleContext::onResponseBody(size_t /* body_buffer_length */,
  65. bool /* end_of_stream */) {
  66. return FilterDataStatus::Continue;
  67. }
  68. void ExampleContext::onDone() { LOG_WARN(std::string("onDone " + std::to_string(id()))); }
  69. void ExampleContext::onLog() { LOG_WARN(std::string("onLog " + std::to_string(id()))); }
  70. 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放在一起

  1. # cat /etc/envoy/envoy.yaml
  2. admin:
  3. access_log_path: /tmp/admin_access.log
  4. address:
  5. socket_address:
  6. protocol: TCP
  7. address: 0.0.0.0
  8. port_value: 9901
  9. static_resources:
  10. listeners:
  11. - name: listener_0
  12. address:
  13. socket_address:
  14. protocol: TCP
  15. address: 0.0.0.0
  16. port_value: 10000
  17. filter_chains:
  18. - filters:
  19. - name: envoy.filters.network.http_connection_manager
  20. typed_config:
  21. "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
  22. stat_prefix: ingress_http
  23. route_config:
  24. name: local_route
  25. virtual_hosts:
  26. - name: local_service
  27. domains: ["*"]
  28. routes:
  29. - match:
  30. prefix: "/"
  31. route:
  32. cluster: my_custom_svc
  33. http_filters:
  34. - name: envoy.filters.http.wasm
  35. typed_config:
  36. "@type": type.googleapis.com/udpa.type.v1.TypedStruct
  37. type_url: type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
  38. value:
  39. config:
  40. name: "my_plugin"
  41. root_id: "my_root_id"
  42. configuration:
  43. "@type": "type.googleapis.com/google.protobuf.StringValue"
  44. value: |
  45. {}
  46. vm_config:
  47. runtime: "envoy.wasm.runtime.v8"
  48. vm_id: "my_vm_id"
  49. code:
  50. local:
  51. filename: "/etc/envoy/optimized.wasm"
  52. configuration: { }
  53. - name: envoy.filters.http.router
  54. typed_config:
  55. "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  56. clusters:
  57. - name: my_custom_svc
  58. connect_timeout: 30s
  59. type: static
  60. lb_policy: ROUND_ROBIN
  61. load_assignment:
  62. cluster_name: service1
  63. endpoints:
  64. - lb_endpoints:
  65. - endpoint:
  66. address:
  67. socket_address:
  68. address: 192.168.20.237
  69. port_value: 8080

启动envoy + wasm

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)

  1. clusters:
  2. - name: my_custom_svc
  3. connect_timeout: 30s
  4. type: static
  5. lb_policy: ROUND_ROBIN
  6. load_assignment:
  7. cluster_name: service1
  8. endpoints:
  9. - lb_endpoints:
  10. - endpoint:
  11. address:
  12. socket_address:
  13. address: 192.168.20.237
  14. port_value: 8080

启动衔接服务

docker run -it -p 8080:8080 tomcat:8

当我们访问127.0.0.1:10000时,在日志中会看到如下请求,且请求被修改

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/784741
推荐阅读
相关标签
  

闽ICP备14008679号