.NetCore+Envoy+Id4+Dapr+EFCore 构建微服务之Envoy

 

    .NetCore比较流行的微服务应该时是用Ocelot的方式构建微服务,纯配置化,开发量也比较小。但是做过一些项目之后发现这个方式不是很适合,首先它比较笨重,其次不支持gRpc和webSocket通信,最重要是它只适用于.NetCore,如果设计到其他语言如Java和Go就歇菜了。

     终于曙光来了,随着Dapr的诞生,微软在开源的基础上有迈出了重要的一步,有人要问了,什么是Dapr,这个后续章节我会着重介绍,简单来说就是可以跨语言协同开发微服务。今天我们介绍一下一个轻量级的网关服务:Envoy,它是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,体积小,性能高。Envoy 是一个独立进程,设计为伴随每个应用程序服务运行。所有的 Envoy 形成一个透明的通信网格,每个应用程序发送消息到本地主机或从本地主机接收消息,不需要知道网络拓扑,对服务的实现语言也完全无感知,这种模式也被称为 Sidecar。记住它的以下特点:

    L3/L4/L7 架构

    顶级 HTTP/2 支持

    服务发现和动态配置 

    gRPC 支持 

    特殊协议支持

    可观测性

    好了 废话不多说,我们来看下如何构建一个Envoy网关。

 

 如上图所示:大概分了四大块,我也有备注

admin:域,定义网关的本身的地址和端口,日志信息等

static_resources:静态资源,定义监听服务端口,路由,过滤规则等

clusters:集群,服务发现,转发,健康检查,熔断等

rate_limit_service:限流服务,这个是独立的grpc服务,属于外挂服务,目前有go的demo

完整配置如下:

  1. admin:
  2. access_log_path: /tmp/admin_access.log
  3. address:
  4. # 本地配置
  5. socket_address:
  6. protocol: TCP
  7. address: 0.0.0.0
  8. port_value: 4001
  9. static_resources:
  10. listeners:
  11. # 监听端口
  12. - name: listener_0
  13. address:
  14. socket_address:
  15. protocol: TCP
  16. address: 0.0.0.0
  17. port_value: 4050
  18. filter_chains:
  19. #网关过滤规则
  20. - filters:
  21. - name: envoy.filters.network.http_connection_manager
  22. typed_config:
  23. "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
  24. stat_prefix: ingress_http
  25. codec_type: AUTO
  26. route_config:
  27. name: local_route
  28. # 路由配置
  29. virtual_hosts:
  30. - name: local_service
  31. domains: ["*"]
  32. routes:
  33. - name: service_a
  34. match:
  35. # 访问后缀
  36. prefix: "/ap0/"
  37. route:
  38. # 重写后缀
  39. prefix_rewrite: "/speak/"
  40. # 服务映射
  41. cluster: city_service
  42. http_filters:
  43. - name: envoy.filters.http.router
  44. # 服务集群
  45. clusters:
  46. - name: service_a
  47. connect_timeout: 0.25s
  48. type: static
  49. lb_policy: round_robin
  50. # 负载均衡服务集群
  51. hosts:
  52. - socket_address:
  53. address: 127.0.0.1
  54. port_value: 5041
  55. - socket_address:
  56. address: 127.0.0.1
  57. port_value: 5042
  58. # 被动动健康检查
  59. outlier_detection:
  60. consecutive_5xx: 2
  61. base_ejection_time: 40s
  62. max_ejection_percent: 40
  63. interval: 20s
  64. success_rate_minimum_hosts: 3
  65. success_rate_request_volume: 10
  66. # 主动健康检查
  67. health_checks:
  68. - timeout: 1s
  69. interval: 10s
  70. interval_jitter: 1s
  71. unhealthy_threshold: 6
  72. healthy_threshold: 1
  73. http_health_check:
  74. path: "/health"
  75. rate_limit_service:
  76. grpc_service:
  77. envoy_grpc:
  78. cluster_name: rate_limit_cluster
  79. timeout: 0.25s

说明

可以看出来:   1.监听的是4050端口,

                        2.设置了一个路由service_a,访问Url:/ap0/ 重写成 /speak/,

                        3.服务集群配置了两个服务:127.0.0.1:5041,127.0.0.1:5042,从而轻易的实现了负载均衡,默认轮询模式。

                        4.设置被动健康检查:outlier_detection,重现2次5xx访问之后,主动掉线服务,并且主动检查掉线服务,成功 success_rate_minimum_hosts: 3 次之后重新上线服务

                        5.health_checks,主动健康检查,10秒一次主动检查集群服务,连续6次失败之后,主动掉线服务,保证服务高可用。

部署:

Envoy采用的是Docker部署。下一节介绍如何启动Envoy网关服务

posted @ 2021-08-12 17:19  52只鱼  阅读(1308)  评论(1编辑  收藏  举报