.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
完整配置如下:
- admin:
- access_log_path: /tmp/admin_access.log
- address:
- # 本地配置
- socket_address:
- protocol: TCP
- address: 0.0.0.0
- port_value: 4001
- static_resources:
- listeners:
- # 监听端口
- - name: listener_0
- address:
- socket_address:
- protocol: TCP
- address: 0.0.0.0
- port_value: 4050
- filter_chains:
- #网关过滤规则
- - filters:
- - name: envoy.filters.network.http_connection_manager
- typed_config:
- "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
- stat_prefix: ingress_http
- codec_type: AUTO
- route_config:
- name: local_route
- # 路由配置
- virtual_hosts:
- - name: local_service
- domains: ["*"]
- routes:
- - name: service_a
- match:
- # 访问后缀
- prefix: "/ap0/"
- route:
- # 重写后缀
- prefix_rewrite: "/speak/"
- # 服务映射
- cluster: city_service
- http_filters:
- - name: envoy.filters.http.router
- # 服务集群
- clusters:
- - name: service_a
- connect_timeout: 0.25s
- type: static
- lb_policy: round_robin
- # 负载均衡服务集群
- hosts:
- - socket_address:
- address: 127.0.0.1
- port_value: 5041
- - socket_address:
- address: 127.0.0.1
- port_value: 5042
- # 被动动健康检查
- outlier_detection:
- consecutive_5xx: 2
- base_ejection_time: 40s
- max_ejection_percent: 40
- interval: 20s
- success_rate_minimum_hosts: 3
- success_rate_request_volume: 10
- # 主动健康检查
- health_checks:
- - timeout: 1s
- interval: 10s
- interval_jitter: 1s
- unhealthy_threshold: 6
- healthy_threshold: 1
- http_health_check:
- path: "/health"
- rate_limit_service:
- grpc_service:
- envoy_grpc:
- cluster_name: rate_limit_cluster
- 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网关服务
.NetCore+Envoy+Id4+Dapr+EFCore 构建微服务之Envoy的更多相关文章
- 技术分享:Dapr,让开发人员更轻松地构建微服务应用
最近一直在学习微服务相关的技术.微服务架构已成为构建云原生应用程序的标准,并且可以预见,到2022年,将有90%的新应用程序采用微服务架构.微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合 ...
- 通过silky框架在.net平台构建微服务应用
目录 必要前提 使用Web主机构建微服务应用 使用.NET通用主机构建微服务应用 构建具有websocket服务能力的微服务应用 构建Silky微服务网关 开源地址 在线文档 在线示例 必要前提 (必 ...
- 使用silky脚手架构建微服务应用
目录 模板简介 构建独立应用的模板Silky.App.Template 构建模块化应用的模板Silky.Module.Template 开源地址 在线文档 模板简介 使用 dotnet new 命令可 ...
- [译]Spring构建微服务
此文为译文,原文地址 介绍 本文通过一个使用Spring.Spring Boot和Spring Cloud的小例子来说明如何构建微服务系统. 我们可以通过数个微服务组合成一个大型系统. 我们可以想象下 ...
- 构建微服务:Spring boot
构建微服务:Spring boot 在上篇文章构建微服务:Spring boot 提高篇中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jp ...
- 如何使用 Java 构建微服务?
[编者按]微服务背后的大理念是将大型.复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化.本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊 ...
- 构建微服务-使用OAuth 2.0保护API接口
微服务操作模型 基于Spring Cloud和Netflix OSS 构建微服务-Part 1 基于Spring Cloud和Netflix OSS构建微服务,Part 2 在本文中,我们将使用OAu ...
- 基于Spring Cloud和Netflix OSS构建微服务,Part 2
在上一篇文章中,我们已使用Spring Cloud和Netflix OSS中的核心组件,如Eureka.Ribbon和Zuul,部分实现了操作模型(operations model),允许单独部署的微 ...
- 构建微服务(Building Microservices)-PDF 文档
闲时翻译了几篇基于Spring Cloud.Netflix OSS 构建微服务的英文文章,为方便分享交流,整理为PDF文档. PDF 文档目录: 目录 一.微服务操作模型... 3 1. 前提 ...
随机推荐
- 22、编译安装nginx及性能优化
22.1.编译安装nginx: 1.下载nginx: [root@slave-node1 ~]# mkdir -p /tools/ [root@slave-node1 ~]# cd /tools/ [ ...
- Vue $refs无法操作element-ui组件
比如我要操作这个dom元素↓↓↓ <el-badge :value="1" :max="99" class="message"> ...
- JVM,我就不信学不会你了
JVM 对 Java 有多重要,对程序员面试有多重要,这些不用多说. 如果你还没意识到学 JVM 的必要性,或者不知道怎么学 JVM,那么看完这篇文章,你就能知道答案了. 曾经的我很不屑于学 JVM, ...
- Docker:docker搭建redis一主多从集群(配置哨兵模式)
角色 实例IP 实例端口 宿主机IP 宿主机端口 master 172.19.0.2 6382 192.168.1.200 6382 slave01 172.19.0.3 6383 192.168.1 ...
- XCTF easyGo
拖入ida,发现符号表需要还原一下,载入一个还原符号表的脚本. go这个语言就有点恶心,字符串后面没有反斜杆零,ida识别出来,字符串就会挤在一堆,就很难看,看了某位师傅的wp,觉得这方法不错,就记录 ...
- Pycharm上python运行和unittest运行两种执行方式解析
前言 经常有人在群里反馈,明明代码一样的啊,为什么别人的能出报告,我的出不了报告,为什么别人运行结果跟我的不一样啊... 这种问题先检查代码,确定是一样的,那就是运行姿势不对了,一旦导入unittes ...
- EditPlus运行java时如何从键盘输入数据
在练习Java的Scanner时,EditPlus如何读取从键盘输入的数呢? 例如如下程序,编译通过,运行时却输入不了数据: 1 package myP101; 2 3 import java.uti ...
- 家庭账本开发day07
返回数据问题解决,需要按照规定的json数据进行返回. 利用jsonobejact或者GSON工具将对象ArrayList转化为json 格式.然后response.getWriter().write ...
- YsoSerial 工具常用Payload分析之CC1
前文介绍了最简单的反序列化链URLDNS,虽然URLDNS本身不依赖第三方包且调用简单,但不能做到漏洞利用,仅能做漏洞探测,如何才能实现RCE呢,于是就有Common-collections1-7.C ...
- 【转载】Java学习笔记
转载:博主主页 博主的其他笔记汇总 : 学习数据结构与算法,学习笔记会持续更新: <恋上数据结构与算法> 学习Java虚拟机,学习笔记会持续更新: <Java虚拟机> 学习Ja ...