envoy重试_具有Envoy代理的微服务模式,第二部分:超时和重试

envoy重试

该博客是系列文章的一部分,该系列文章更深入地介绍了Envoy Proxy和Istio.io ,以及它如何实现一种更优雅的连接和管理微服务的方式。 跟随我@christianposta ,紧跟这些博客文章的发布。

  • 什么是Envoy代理 ,它如何工作?
  • 如何使用Envoy Proxy实现一些基本模式?
  • Istio Mesh如何适合这张照片
  • Istio Mesh的工作方式,以及如何通过Envoy跨集群启用高阶功能
  • Istio Mesh身份验证的工作方式

这是接下来几部分的想法(将在发布时更新链接):

  • 断路器(第一部分)
  • 重试/超时(第二部分)
  • 分布式跟踪(第三部分)
  • 普罗米修斯的度量标准收集(第四部分)
  • 服务发现(第五部分)
  • 接下来的部分将介绍更多的客户端功能(请求阴影,TLS等),只是不确定哪些部分将是:)

第二部分– Envoy代理的超时和重试

第一篇博客文章向您介绍了Envoy Proxy的断路功能实现 。 在第二部分中,我们将仔细研究如何启用额外的弹性功能,例如超时和重试。 这些演示有意简单,因此我可以分别说明模式和用法。 请下载此演示的源代码,然后继续!

该演示由客户端和服务组成。 客户端是一个Java http应用程序,它模拟对“上游”服务进行http调用(请注意,我们在这里使用Envoys术语,并且贯穿此repo )。 客户端打包在名为docker.io/ceposta/http-envoy-client:latest的Docker映像中。 http-client Java应用程序旁边是Envoy Proxy的实例。 在此部署模型中,Envoy与服务(在本例中为http客户端)一起作为边车进行了部署。 当http客户端发出出站呼叫(到“上游”服务)时,所有呼叫都通过Envoy代理端进行。

这些示例的“上游”服务是httpbin.org 。 httpbin.org允许我们轻松模拟HTTP服务行为。 太棒了,所以如果您没有看过,请检查一下。

retriestimeouts演示都有自己的 envoy.json配置文件。 我绝对建议您查看配置文件各部分的参考文档,以帮助您了解完整的配置。 datawire.io的好伙伴还为Envoy及其配置提供了不错的介绍 ,您也应该查看一下。

运行重试演示

对于重试演示,我们将在Envoy中配置路由,如下所示:

"routes": [{"timeout_ms": 0,"prefix": "/","auto_host_rewrite": true,"cluster": "httpbin_service","retry_policy": {"retry_on": "5xx","num_retries": 3}}

在这里,我们说要对5xx的HTTP状态最多重试3次。

如果您已经运行了先前的演示,请确保对此(或任何)演示重新开始。 对于每个演示,我们都有不同的Envoy配置,并希望确保每次都从干净的开始。

首先停止任何现有的演示:

./docker-stop.sh

现在让我们进行retries演示:

./docker-run.sh -d retries

现在,让我们行使客户端通过一个调用,这将创下一个HTTP端点应返回一个HTTP 500错误。 我们将使用curl.sh脚本,该脚本设置为在演示容器内调用curl。

./curl.sh -vvvv localhost:15001/status/500

我们应该看到这样的东西:

* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 15001 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 15001 (#0)
> GET /status/500 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:15001
> Accept: */*
> 
< HTTP/1.1 500 Internal Server Error
* Server envoy is not blacklisted
< server: envoy
< date: Thu, 25 May 2017 05:55:37 GMT
< content-type: text/html; charset=utf-8
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-powered-by: Flask
< x-processed-time: 0.000718116760254
< content-length: 0
< via: 1.1 vegur
< x-envoy-upstream-service-time: 684
< 
* Connection #0 to host localhost left intact

大! 现在,让我们检查Envoy为我们做了什么:

./get-envoy-stats.sh | grep retry
cluster.httpbin_service.retry.upstream_rq_500: 3
cluster.httpbin_service.retry.upstream_rq_5xx: 3
cluster.httpbin_service.upstream_rq_retry: 3
cluster.httpbin_service.upstream_rq_retry_overflow: 0
cluster.httpbin_service.upstream_rq_retry_success: 0

好极了! 我们在这里看到,由于HTTP 500错误,特使已重试了3次。

如果天真的处理,重试会对您的服务体系结构产生有害影响。 它们可以帮助传播故障或对可能陷入困境的内部服务造成DDoS类型的攻击。

重试时要注意以下几点:

  • Envoy会自动进行带抖动的指数重试。 有关更多信息,请参阅文档
  • 您可以设置重试超时(每次重试超时),但是总体路由超时(已为路由表配置;请参见timeouts演示以获取确切配置);仍然可以设置/应用; 这是为了短路任何失控重试/指数补偿
  • 当您可能有大量连接时,应始终设置断路器重试配置以限制重试的配额数量。 请参阅Envoy文档中断路器的有效重试部分

运行超时演示

对于超时演示,我们将在Envoy中配置路由,如下所示:

"routes": [{"timeout_ms": 0,"prefix": "/","auto_host_rewrite": true,"cluster": "httpbin_service","timeout_ms": 3000}

此配置为通过此路由到达httpbin_service集群的所有呼叫设置了全局(即包括所有重试)3s超时。

每当处理超时时,我们都必须了解源自边缘的请求的整体全局超时。 我们会发现自己非常难以调试,因为随着我们对网络调用图的深入了解,超时不会逐渐减少。 换句话说,当您浏览调用图时,在调用图中更深的服务调用的服务超时应小于先前服务的调用:

Envoy可以帮助传播超时信息,而gRPC之类的协议可以传播deadline信息。 在继续阅读本系列文章时,我们将看到如何使用Istio Mesh控制Envoy代理,而控制平面可以帮助我们进行故障注入以发现超时异常。

如果您已经运行了先前的演示,请确保对此(或任何)演示重新开始。 对于每个演示,我们都有不同的Envoy配置,并希望确保每次都从干净的开始。

首先停止任何现有的演示:

./docker-stop.sh

现在让我们进行timeouts演示:

./docker-run.sh -d timeouts

现在,让我们行使客户端通过一个调用,这将创下一个HTTP端点应该推迟了大约5秒的响应。 此延迟应足以触发使节超时。 我们将使用curl.sh脚本,该脚本设置为在演示容器内调用curl。

./curl.sh -vvvv localhost:15001/delay/5

我们应该看到类似以下的输出:

* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 15001 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 15001 (#0)
> GET /delay/5 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:15001
> Accept: */*
> 
< HTTP/1.1 504 Gateway Timeout
< content-length: 24
< content-type: text/plain
< date: Thu, 25 May 2017 06:13:53 GMT
* Server envoy is not blacklisted
< server: envoy
< 
* Connection #0 to host localhost left intact
upstream request timeout

我们看到我们的请求已超时!

让我们检查Envoy的统计信息:

./get-envoy-stats.sh | grep timeout

在这里,我们看到1个请求(我们发送的那个!)被Envoy超时了。

cluster.httpbin_service.upstream_cx_connect_timeout: 0
cluster.httpbin_service.upstream_rq_per_try_timeout: 0
cluster.httpbin_service.upstream_rq_timeout: 1
http.admin.downstream_cx_idle_timeout: 0
http.egress_http.downstream_cx_idle_timeout: 0

如果我们以较小的延迟这次发送请求,则应该看到该呼叫通过:

./curl.sh -vvvv localhost:15001/delay/2
* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 15001 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 15001 (#0)
> GET /delay/2 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:15001
> Accept: */*
> 
< HTTP/1.1 200 OK
* Server envoy is not blacklisted
< server: envoy
< date: Thu, 25 May 2017 06:15:41 GMT
< content-type: application/json
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-powered-by: Flask
< x-processed-time: 2.00246119499
< content-length: 309
< via: 1.1 vegur
< x-envoy-upstream-service-time: 2145
< 
{"args": {}, "data": "", "files": {}, "form": {}, "headers": {"Accept": "*/*", "Connection": "close", "Host": "httpbin.org", "User-Agent": "curl/7.35.0", "X-Envoy-Expected-Rq-Timeout-Ms": "3000"}, "origin": "68.3.84.124", "url": "http://httpbin.org/delay/2"
}
* Connection #0 to host localhost left intact

还要注意,Envoy传播超时头,以便上游服务对预期的情况有所了解。

系列

请继续关注 ! 第三部分跟踪应该很快着陆!

翻译自: https://www.javacodegeeks.com/2017/05/microservices-patterns-envoy-proxy-part-ii-timeouts-retries.html

envoy重试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中字符串格式化的形式_Python中format函数字符串格式化入门

格式化在程序开发中非常常见&#xff0c;大家肯定不陌生&#xff0c;Python中也存在多重格式化方式&#xff0c;format函数就是其中一种。函数原型format(value[, format_spec])参数意义value&#xff1a; 需要被格式化的字符串format_spec&#xff1a; 格式化的格式函数定义与…

Java的超类/基类Object

文章目录简介主要方法equals简介 所有的类都继承了 Object&#xff0c;即 Object 是所有类的父类&#xff0c;所以所有的 Java 类都继承了 Object 的所有方法。 比如你写一个类如下&#xff1a; public class Question { ... }实际上这个类是继承自 Object 的&#xff0c;默…

网络研讨室_即将举行的网络研讨会:调试生产中Java的5种最佳实践

网络研讨室您的团队是否花费超过10&#xff05;的时间在生产中调试Java&#xff1f; 将新代码部署到生产中是一项艰巨的任务。 在您的本地环境中起作用的东西在生产中的作用并不相同&#xff0c;您可以通过用户来了解。 不理想吧&#xff1f; 生产中的调试是一个关键要素&…

window部署python项目_Django在Window下的部署

转载 : codingsoho.com前言本文主要介绍利用apache去部署Django项目&#xff0c;所有步骤均在本机Window7和阿里云验证通过。配置本例的基本配置如下&#xff1a;工作目录&#xff1a; C:/virtualenv/zakkabag项目名称&#xff1a; zakkabag最终的安装版本如下&#xff0c;后面…

chrome gwt1.7_快速提示:使用Chrome开发工具调试GWT应用程序

chrome gwt1.7调试是软件开发的重要方面。 拥有正确的工具可以节省大量时间和头痛。 在GWT Super Dev模式之前&#xff0c;经典的Dev模式允许使用JVM调试。 开发人员可以在其IDE中设置断点&#xff0c;并使用调试模式来跟踪错误和错误。 现在&#xff0c;在超级开发模式下&…

java事件编程_java基础 ---Swing事件编程

java基础 ---Swing事件编程GUI的设计就剩个菜单组建&#xff0c;这个组件也是想当于容器套容器&#xff0c;在设计方面没有什么难度&#xff0c;主要是一些事件的响应。还有另一种事件的监听方式&#xff0c;也就是适配器监听方法。1、菜单要设计一个菜单那么有三大组件是不可或…

python3鄙视python2_Python3 正在毁灭 Python的原因分析

Python 3毫不费力地成为发生在Python社区里最糟糕的事。我还记得第一次使用Python的时候&#xff0c;我还在花大量时间在C这块上&#xff0c;而Python就像是我的一次开光。我可以打开文本编辑器用几秒钟或者几分钟写出一个可以工作的程序&#xff0c;而不是用几小时或几天。我记…

Java如何加载类的呢?

JVM加载类 首先查看内存中是否存在该类&#xff08;内存中所有类都是以Class的实例对象存在&#xff09;&#xff0c;若不存在则会通过环境变量中的路径值在电脑或者其它设备的硬盘中找到该类&#xff08;即.class文件&#xff09;&#xff0c;然后JVM会将其读取到内存中&…

brew卸载jenv_使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK

brew卸载jenv昨天在Java9的Jigsaw HackTheTower事件中&#xff0c;我意识到我需要加强我的游戏并改善我现有的机制&#xff0c;以在我的机器上维护几个不同的JDK。 我曾经手动下载jdk&#xff0c;或使用brew cask来安装它们&#xff0c;我会在我的〜/ bash_profile中设置bash …

java过滤器api_springboot集成过滤器

封装自定义接口filter包含两个方法,第一个过滤的路径数组,第二个为过滤器执行的顺序.spring boot 会按照order值的大小&#xff0c;从小到大的顺序来依次过滤。package com.theeternity.common.baseFilter;import javax.servlet.Filter;/*** program: ApiBoot* description: 封…

Servlet 运行原理

文章目录Servlet 如何运行演示 Servlet 运行原理Servlet 如何运行 用户向浏览器地址栏输入&#xff1a;http://ip:port/helloweb/sayHello?namezs 浏览器使用 ip:port(端口号)连接服务器 浏览器将请求数据按照 http 协议打成一个数据包(请求数据包)发送给服务器 请求数据包…

python dicom 器官分割_python+opencv阈值分割

37 #获取像素点的最大值和最小值38 arr_temp np.reshape(img_arr,(lens,))39 max_val max(arr_temp)40 min_val min(arr_temp)41 #图像归一化42 img_arr (img_arr-min_val)/(max_val-min_val)43 #绘制图像并保存44 #保存图片时去掉周围白边45 plt.axis(off)46 fig plt.gcf()47…

解析浏览器访问服务器 Servlet 应用程序的交互过程(Servlet 容器如何处理请求资源路径)

案例 1&#xff1a; 请求资源路径&#xff1a;http://localhost:8080/web01/greeting?namezs 浏览器通过 localhost:8080 连接服务器&#xff1b;服务器在 webapps 目录下寻找 web01 目录&#xff0c;找到后进入web01 目录内寻找 WEB-INF 目录&#xff0c;在进入 WEB-INF 目…

java github_GitHub Research:超过50%的Java记录语句写错了

java github为什么生产日志无法帮助您找到错误的真正根本原因&#xff1f; 询问您是否使用日志文件监视您的应用程序几乎就像询问…您是否喝水。 我们都使用日志&#xff0c;但是我们如何使用它们则是一个完全不同的问题。 在下面的文章中&#xff0c;我们将对日志进行更深入…

yolov5论文_YOLOv5的妙用:学习手语,帮助听力障碍群体

编辑&#xff1a;魔王、杜伟计算机视觉可以学习美式手语&#xff0c;进而帮助听力障碍群体吗&#xff1f;数据科学家 David Lee 用一个项目给出了答案。如果听不到了&#xff0c;你会怎么办&#xff1f;如果只能用手语交流呢&#xff1f;当对方无法理解你时&#xff0c;即使像订…

python制作系统程序与html交互_python+html语音人物交互_flask后台与前端(html)交互的两种方法...

基于python flask框架搭建webflask后台与前端(html)交互的两种方法&#xff1a;方法1 使用flask-wtf 提供的表单用常见的登录为例&#xff1a;// An highlighted blockfrom flask_wtf import Formclass LoginForm(Form): # 登录表单ROLE SelectField(角色, choices[(s, 管理员…

Java 程序执行过程的内存流程图(结合类加载器 ClassLoader 讲解)

Student s new Student(); s.play(); Student s2 new Student();以上代码的执行流程如下&#xff1a; JVM 作为操作系统的一个迚程在系统中执行&#xff0c;那么系统会为 JVM 分配一块内存空间&#xff0c;这块内存空 间被 JVM 分为 3 大块(栈区、堆区、方法区) 一般而言&a…

java javap_javap的用途不断发展:您的Java类文件中隐藏了什么?

java javap什么是Javap&#xff0c;如何使用它以及何时要反汇编类文件&#xff1f; 作为Java开发工具包&#xff08;JDK&#xff09;的一部分&#xff0c;我们可以使用许多工具&#xff0c;这些工具有助于更好地理解Java代码。 这些工具之一是javap命令&#xff0c;它使我们能…

虚拟内存越大越好吗_手机的运行内存真的是越大越好吗?6GB和8GB到底又该如何选择?...

许多人买手机&#xff0c;除了看处理器、外观以外&#xff0c;关注最多的莫过于手机的运行内存了。选择一个合适的运行内存几乎关系到整个手机使用寿命和命脉。那么我们现在买手机选择多大的运行内存合适呢&#xff1f;真的是越大越好吗&#xff1f;下面我们就来一起看看吧。选…

Adobe PhotoShop(PS) for Windows 快捷键/PS快捷键

文章目录一、工具栏二、文件操作三、选择功能四、视图操作五、编辑操作六、图像调整七、图层操作一、工具栏 功能说明快捷键备注移动工具V矩形、椭圆选框工具M套索、多边形套索、磁性套索L快速选择工具、魔棒工具W裁剪、透视裁剪、切片、切片选择工具C吸管、颜色取样器、标尺、…