Istio实践(4)- 故障注入、熔断及ServiceEntry
前言:接上一篇istio多服务应用部署及调用,本文介绍通过流量管理(故障注入、请求超时等)以及ServiceEntry外部服务部署应用
1.设置服务延迟
修改springbootapp-vs-v1.yaml文件,设置springbootapp服务应用100延迟,延迟时间为3s,percent指定超时比例100%

通过ingressgateway对外开放端口,访问springbootapp服务,发现响应时间为3s

2.设置服务超时
修改springbootapp-vs-v1.yaml文件,设置netcoreapp服务超时时间为2s

通过netcoreapp服务,调用springbootapp服务,由于springbootapp服务100%有3s延迟,那么netcoreapp服务反馈超时错误

3.故障注入(注入 HTTP abort 故障)
修改springbootapp-vs-v1.yaml文件,设置springbootapp服务abort

通过netcoreapp服务,调用springbootapp服务


4.配置熔断器(DestinationRule)
概念:
1.熔断的基本逻辑就是隔离故障。在微服务架构盛行的今天,服务之间的调用链路相比单体应用时代变得更长了,服务化拆分带来系统整体能力提升的同时,也增加了服务级联故障出现的概率。例如调用链路“A->B->C->D”,如果服务D出现问题,那么链路上的A、B、C都可能会出现问题,这一点也很好理解,因为出现故障的服务D,必然会在某个时间段内阻塞C->D的调用请求,并最终蔓延至整个链路。而服务连接资源又是有限的,这种增加的调用耗时,会逐步消耗掉整个链路中所有服务的可用线程资源,从而成为压垮整个微服务体系的幕后黑手。
2.限流。熔断的主要目的是隔离故障,而引起故障的原因除了系统本身的问题外,还有一种可能就是请求量达到了系统处理能力的极限,后续新进入的请求会持续加重服务负载,最终导致资源耗尽,从而引起系统级联故障、导致雪崩。而限流的目的就是拒绝多余流量、保证服务整体负载始终处于合理水平。
从限流范围上看,微服务体系中的每个服务都可以根据自身情况设置合理的限流规则,例如调用链路“A->B->C->D”,B服务的承受力是1000QPS,如果超过该阀值,那么超出的请求就会被拒绝,但这也容易引起A对B的熔断,所以对于微服务设置限流规则的设置最好还是根据压测结果确定。
修改springbootapp-dr.yaml文件

说明:
1.maxConnections(最大连接数为1)、http1MaxPendingRequests(最大等待请求数为1),如果连接和并发请求数超过1个,那么该服务就会触发限流规则
2.http1MaxPendingRequests: http 请求挂起状态的最大请求数
3.outlierDetection.consecutiveErrors: 拒绝连接的最大失败次数
4.outlierDetection.interval: 触发熔断的时间间隔,在 interval 时间间隔内,达到 consecutiveErrors 即触发熔断
5.outlierDetection.baseEjectionTime: 熔断时长
6.maxEjectionPercent: 熔断连接最大百分比
使用压测工具Fortio负载测试客户端调用服务,我们这里使用apifox工具(JMeter也可),进行压测


发现25%的请求成功,75%的请求失败,限流成功,重复请求还是可以成功的加大并发次数和循环次数,触发熔断


此时重复请求,发现总是失败,没有成功的情形,触发了熔断,由于我们设置熔断时间3分钟,我们等3分钟后,再重试,就有成功的情形,测试成功

5.服务条目(Service Entries)
使用服务条目资源(Service Entries)可以将条目添加到 Istio 内部维护的服务注册表中。添加服务条目后,Envoy 代理可以将流量发送到该服务,就好像该服务条目是网格中的服务一样。通过配置服务条目,可以管理在网格外部运行的服务的流量。
新建服务条目资源service-entry-baidu.yaml,指向百度
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: baidu-entry
spec:
hosts:
- "www.baidu.com"
ports:
- number: 80
name: http
protocol: HTTP
location: MESH_EXTERNAL
resolution: DNS
执行命令,把服务条目放到netistiodemo的命名空间下
sudo kubectl apply -f service-entry-baidu.yaml -n netistiodemo
sudo kubectl get se -n netistiodemo
使用busybox,访问baidu

修改serviceentry文件,设置了静态域名解析的方式,并随意给了一个IP来标识 baidu,这样访问baidu就失败了;说明我们的serviceentry生效了


service entry 使用场景
如果你需要调用外部合作方服务,该服务跟你的集群毫无关系。这时通过服务条目,你可以将对方服务纳入到自己的Istio网格之内,就像它本身存在你的集群之内一样,结合虚拟服务(virtual service)、目的地规则(destination rule)做更加精细的流量控制、失败注入、重试等功能。
个人感觉也可以把以前的老项目,整体暴露给Istio网格;比如spring cloud、dubbo、netcore等等已运行部署的服务,通过service entry的方式,纳入到Istio中管理
能力有限,如有不妥之处,望见谅
Istio实践(4)- 故障注入、熔断及ServiceEntry的更多相关文章
- Istio 网络弹性 实践 之 故障注入 和 调用超时
网络弹性介绍 网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力.灾难事件的范畴很广泛,比如长时间停电.网络设备故障.恶意入侵等. 超时时间 工作中常常会碰到这样的开发.测试场景 ...
- Istio 网络弹性 实践 之 故障注入 和 调用重试
网络弹性介绍 网络弹性也称为运维弹性,是指网络在遇到灾难事件时快速恢复和继续运行的能力.灾难事件的范畴很广泛,比如长时间停电.网络设备故障.恶意入侵等. 重试(attempts) Istio 重试机制 ...
- Istio 实践 之 Circuit breakers 断路器 (请求熔断)
参考: https://blog.51cto.com/14625168/2499406 https://istio.io/latest/zh/docs/tasks/traffic-management ...
- Istio实践(3)- 路由控制及多应用部署(netcore&springboot)
前言:接上一篇istio应用部署及服务间调用,本文介绍通过构建.netcore与springboot简单服务应用,实现服务间调用及相关路由控制等 1..netcore代码介绍及应用部署 新建.netc ...
- Sentinel Slot扩展实践-流控熔断预警实现
前言 前几天公司生产环境一个服务由于流量上升触发了 Sentinel 的流控机制,然后用户反馈访问慢,定位发现是 task 定时任务导致,后面 task 优化之后发布,流量恢复正常. 这是一个再正常不 ...
- Istio实践(1)-环境搭建及应用部署
1. Istio简介 Istio是最初由IBM,Google和Lyft开发的服务网格的开源实现.它可以透明地分层到分布式应用程序上,并提供服务网格的所有优点,例如流量管理,安全性和可观察性. 它旨在与 ...
- Istio实践(2)-流量控制及服务间调用
前言:接上一篇istio应用部署,本文介绍通过virtualservice实现流量控制,并通过部署client端进行服务调用实例 1. 修改virtualservice组件,实现权重占比访问不同版本服 ...
- 转-阿里云Kubernetes容器Istio实践之集成日志
http://cloud.it168.com/a2018/0801/3216/000003216642.shtml#articlecomment https://mbd.baidu.com/newsp ...
- idou老师教你学Istio11 : 如何用Istio实现流量熔断
在之前的最佳实践中,已经带大家通过一系列的实践任务领略了Istio的无穷魅力.今天,将向大家介绍如何用Istio实现流量熔断. 熔断机制是创建弹性微服务应用程序的重要模式.熔断可以帮助您自由控制故障影 ...
随机推荐
- windows配置jdk环境变量、mysql环境变量、tomcat环境变量、maven环境变量、git环境变量、node环境变量
一.windows配置各种环境变量后 path 路径下的目录: 二.windows 配置各种环境变量的目的: 为windows系统添加上各种环境对应的命令 举例,为什么要添加jdk的bin目录,是因为 ...
- Oracle 数据库应用开发 30 忌
原创 LaoYuanPython CSDN 今天 作者 | LaoYuanPython 责编 | 欧阳姝黎出品 | CSDN原力计划 引言 笔者及所在团队从 2000 年开始的 CRM 等 ...
- 使用过滤器获取系统目录或文件名(java.io)
import java.io.File;import java.io.FilenameFilter; File[] file = new File("D:\\"); //使用Fil ...
- Kafka 的设计架构你知道吗?
Producer :消息生产者,就是向 kafka broker 发消息的客户端. Consumer :消息消费者,向 kafka broker 取消息的客户端. Topic :可以理解为一个队列,一 ...
- Redis的Jedis操作(五)
需要把jedis依赖的jar包添加到工程中.Maven工程中需要把jedis的坐标添加到依赖. 推荐添加到服务层. 1.连接单机版 第一步:创建一个Jedis对象.需要指定服务端的ip及端口. 第二步 ...
- 解释 MySQL 外连接、内连接与自连接的区别 ?
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一 个表的所有记录和另一个表中的所有记录一一匹配. 内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合 条 ...
- tcp粘包问题原因及解决办法
1.粘包概念及产生原因 1.1粘包概念: TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾. 粘包可能由发送方造成,也可能由接收方造成. ...
- Effective Java —— try-with-resources 优先于 try-finally
本文参考 本篇文章参考自<Effective Java>第三版第九条"Prefer try-with-resources to try-finally" The cod ...
- Leetcode26——删除有序数组中的重复项(双指针法)
Leetcode26--删除有序数组中的重复项(双指针法) 1. 题目简述 给你一个升序排列的数组 nums ,请你原地 删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度.元素的相对 ...
- cpu内部组成
计算机系统的硬件结构主要由四部分组成:控制器.运算器.内存和输入输出设备 其中,控制器和运算器统称为中央处理器.简称CPU.它是计算机硬件系统的指挥中心. 它包括控制器.运算器.寄存器三个部分,其中, ...