微服务存在的问题及解决方案

微服务存在的问题及解决方案

1. 存在问题

1.1 接口拖慢

因为一个接口在并发时,正好执行时长又比较长,那么当前这个接口占用过多的 Tomcat 连接,导致其他接口无法即时获取到 Tomcat 连接来完成请求,导致接口拖慢,甚至失败。

假如商品服务业务并发较高,占用过多 Tomcat 连接。可能会导致商品服务的所有接口响应时间增加,延迟变高,甚至是长时间阻塞直至查询失败。

1.2 服务器雪崩问题

什么是服务器雪崩?

举例:假如此时有一个 “商品服务”,其它几乎所有的服务基本都会直接或间接的使用它,但是如果此时 “商品服务” 崩溃了,就会导致整个服务全盘崩溃(红色表示出现问题),这个现象就是所谓的服务器雪崩

2. 服务器保护方案

由于服务器雪崩现象的出现,因此,就需要对引入可能出现问题服务的服务进行保护,即服务器保护:

  1. 降级:断路器会统计访问某个服务的请求数量,统计服务提供方的异常比例,当比例过高表明该接口会影响到其它服务,应该拒绝调用该接口,而是直接走降级逻辑。

  2. 熔断:熔断机制用于在服务出现问题时快速失败,避免调用链路中的服务相互等待,导致整体系统响应变慢甚至不可用。

  3. 超时:设置合理的超时时间可以避免长时间等待响应导致的问题。当请求超时时,可以选择快速失败并返回错误信息,或者重试等策略。

  4. 线程隔离:线程隔离是指为每个服务分配独立的线程池,这样即使某个服务出现问题也不会影响到其他服务。

  5. 限流:限流是最常见的服务保护措施之一,其目的是为了防止服务因为过大的流量而崩溃。

    对于某些关键资源或者参数的访问,可以采取特殊的限流措施来防止这些热点成为瓶颈

2.1 熔断降级

2.1.1 说明

熔断降级是解决雪崩问题的重要手段,包括熔断和降级两个方案。

熔断是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。熔断发生在服务调用方即客户端。

降级是当遇到访问失败可以快速返回一些默认数据或者友好提示,用户体验会更好。熔断降级结合后是当线路断开后直接走降级线路避免再次去请求失败线路。降级方法需要在服务调用方即客户端实现。

2.1.2 Sentinel 安装与集成

一、安装

实现服务保护的工具有很多,Spring Cloud Alibaba 技术栈中 Sentinel 是实现服务保护的中间件。

Sentinel 是阿里巴巴开源的一款服务保护框架,目前已经加入 Spring Cloud Alibaba 中。

使用:

  1. 下载 jar 包:Releases · alibaba/Sentinel · GitHub

    本地资源:sentinel 本地服务

  2. 运行

    将 jar 包拷贝到 虚拟机/data/soft/sentinel 目录下重命名为sentinel-dashboard.jar

    创建 Dockerfile 文件

    FROM openjdk:11-jdkENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezo
    ARG SENTINEL_VERSION=1.8.6# copy sentinel jar
    ADD ./sentinel-dashboard.jar /home/sentinel-dashboard.jar
    RUN chmod -R +x /home/sentinel-dashboard.jarENTRYPOINT ["sh","-c","java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar $JAVA_OPTS /home/sentinel-dashboard.jar"]
  3. 执行命令创建镜像

    docker build -t sentinel-dashboard .
    
  4. 创建并启动容器

    docker run  --name sentinel-dashboard -d -p 9090:8090 sentinel-dashboard:latest
    

    启动 sentinel

    docker start sentinel-dashboard
    
  5. 登录 sentinel 容器并设置时区

    docker exec -it sentinel-dashboard /bin/bashln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezon
    
  6. 访问 http://微服务IP:9090

  7. 账户、密码:admin

二、集成

举例:现在有两个服务 A、B,其中 A 服务需要使用到 B 服务,而此时,就需要对 A 服务进行保护,防止 B 服务崩溃导致 A 服务无法运行。

在需要保护的架构中导入依赖:

<!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

修改配置文件

spring:cloud:sentinel:transport:# 服务器配置dashboard: 192.168.101.68:9090client-ip: 192.168.101.1# 本地配置# dashboard: localhost:8090http-method-specify: true # 开启请求方式前缀可根据http请求方法区分簇点链路
2.1.3 降级

调用了目标服务接口,发现有问题,走降级逻辑(要自己写)

修改配置项

feign:sentinel:enabled: true # 开启feign对sentinel的支持

在 OpenFeign 处配置降级逻辑

@Slf4j
@Component
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Collection<Long> ids) {log.warn("远程调用ItemClient queryItemByIds方法出现降级,参数:{}", ids);return List.of();}@Overridepublic void deductStock(List<OrderDetailDTO> items) {log.warn("远程调用ItemClient deductStock方法出现降级,参数:{}", items);}};}
}

在接口处进行配置,指定要使用的降级逻辑

@FeignClient(name = "item-service", path = "/items", fallbackFactory = ItemClientFallbackFactory.class)
public interface ItemClient { ... }
api/item/│├── ItemClient.java│└── ItemClientFallbackFactory.java

在需要保护的服务启动类上配置要扫描的包

// 扫描
@SpringBootApplication(scanBasePackages = {"com.hmall.cart", "com.hmall.api"})
@MapperScan("com.hmall.cart.mapper")
@EnableFeignClients(basePackages = "com.hmall.api")
public class CartServiceApplication { ... }
2.1.4 熔断

降级逻辑达到了阈值,则直接熔断,不调用目标服务接口。

工作原理:

  1. 默认情况下,熔断器是关闭的。那么所有请求都正常执行的;
  2. 如果有服务出现了问题,并且失败比例达到了设置的阈值,那么熔断器会打开,所有的请求直接走降级逻辑,返回托底数据;
  3. 到达熔断时间后,熔断器会处于半开状态,会允许一个请求过来,如果这个请求成功,则关闭熔断器,如果这个请求失败,继续打开熔断器。周而复始。

配置熔断策略:

通过 Sentinel 面板进行配置

  1. 异常数配置

    说明:2 秒内最小请求数为 2,异常数达到 1 发生熔断,熔断时长为 20 秒。

  2. 慢调用比例配置

    说明:

    1. RT(接口响应时间)超过 200 毫秒的请求调用就是慢调用
    2. 统计最近 3000ms 内的最少 2 次请求,如果慢调用比例大于等于 50%,则触发熔断
    3. 熔断持续时长 20s
  3. 异常比例配置

    说明:

    1. 统计最近 3000ms 内的最少 2 次请求,如果异常比例不低于 0.5,则触发熔断
    2. 熔断持续时长 20s

2.2 请求限流

什么是 QPS

QPS 是 “Queries Per Second” 的缩写,中文通常称为 “每秒查询率” 或 “每秒请求数”。它是一个衡量系统性能的重要指标,特别是在评估 Web 服务器、数据库系统、API 接口等的负载能力时经常使用。

QPS 表示系统在一秒钟内能够处理的查询或请求的数量。这个指标可以帮助开发者和运维人员了解系统的处理能力和性能瓶颈。例如,如果一个 Web 服务的 QPS 为 100,则意味着该服务在一秒钟内最多可以处理 100 个请求。

2.3 线程隔离

为指定接口分配固定数量的线程,即使当前接口出现不可用的情况。也只会消耗给你分配的线程数。不影响其他线程。

线程隔离有两种方式实现:

  1. 线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果
  2. 信号量隔离:不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求

Sentinel 的线程隔离就是基于信号量隔离实现的,而 Hystix 两种都支持,但默认是基于线程池隔离。

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

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

相关文章

centos 安装pip时报错 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

centos 安装pip时报错 [rootindex-es app-ai]# yum update Loaded plugins: fastestmirror Repository centos-sclo-rh is listed more than once in the configuration Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org?archx86_64…

解决图片转 ICO 图标难题,支持批量处理

还在为图片转 ICO 图标发愁吗&#xff1f;别担心&#xff0c;今天为大家带来一款超实用的工具 ——Any to Icon。它功能强大&#xff0c;可实现批量图片转 ICO 图标&#xff0c;轻松解决格式转换难题。更棒的是&#xff0c;这款工具极为小巧&#xff0c;无需安装&#xff0c;即…

MultiPost--多平台博客发布工具

网站介绍 一键发布内容到多个社交平台的浏览器插件&#xff0c;支持知乎、微博、小红书、抖音等主流平台&#xff0c;支持文字、图片、视频等内容形式. 地址 GitHub &#xff1a; https://github.com/leaper-one/MultiPost-Extension Chorme: https://chromewebstore.google.…

Linux进程状态详解:僵尸进程与孤儿进程的深度探索与实践

文章目录 前言一、进程状态概述1.1 运行状态1.2 阻塞状态1.3 挂起状态 二、具体的Linux操作系统中的进程状态2.1 Linux内核源代码2.2 查看进程状态2.3 D磁盘休眠状态(Disk sleep)D状态的定义&#xff1a; 2.4 T停止状态(stopped)停止状态的概述&#xff1a;停止状态的触发条件&…

【Linux】深入理解进程和文件及内存管理

个人主页~ 深入理解进程和文件及内存管理 一、重谈Linux下一切皆文件二、操作系统对物理内存的管理1、物理内存与磁盘的数据交互2、操作系统对物理内存的管理 三、文件页缓冲区向文件写入数据的过程 四、动态库是如何被加载的关于动态库中的全局变量 五、深入理解地址1、程序地…

★9.4.2 context2D 绘图

返回目录&#xff1a; Qt QML专栏目录结构_qml 项目 目录-CSDN博客 ★9.4.2 context2D 绘图 Object <- context 属性 canvas : QtQuick::Canvas fillRule : enumeration fillStyle : variant fillStyle: 设置或获取当前填充颜色或样式。 font : string g…

汇编基础知识

CPU&#xff1a;一种可以执行机器指令进行运算的芯片&#xff08;微处理器&#xff09;。 存储器&#xff08;内存&#xff09;&#xff1a;存放CPU可以工作的指令和数据&#xff08;指令和数据都是二进制信息&#xff09;。 磁盘不同于内存&#xff0c;磁盘中的数据要读到内…

1536数字三角形

1536数字三角形 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;动态规划 &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {public static void main(…

基于VMware的虚拟机集群搭建

本文作者&#xff1a; slience_me 文章目录 基于VMware的虚拟机集群搭建1. 安装Vmware2. 构建虚拟机3. 安装Linux4. 网络配置5. 开始克隆6. 初始化系统6.1 开放root账户6.2 SSH服务6.3 设置静态IP6.4 镜像源 host 主机名 基于VMware的虚拟机集群搭建 该集群采用镜像ubuntu-20.0…

windows平台搭建python环境

python语言 Python 是一种高级、解释型、跨平台的编程语言&#xff0c;由Guido van Rossum于1991年设计&#xff0c;并发展成为全球最受欢迎的编程语言之一。它以简单易读的语法、灵活的特性和丰富的标准库闻名&#xff0c;适合初学者和经验丰富的开发者。 Python 支持多种编…

【系统架构设计师】操作系统 - 文件管理 ② ( 位示图 | 空闲区域 管理 | 位号 | 字号 )

文章目录 一、空闲区域 管理1、空闲区域分配2、空闲区域 管理方式 简介 二、位示图 简介1、位示图 表示2、位示图 字号3、位示图 位号4、位示图 中 比特位 分组管理 三、位示图 考点1、计算磁盘 位示图 的大小2、位示图 位置计算 一、空闲区域 管理 1、空闲区域分配 在 索引文件…

SpringData Redis:RedisTemplate配置与数据操作

文章目录 引言一、Redis概述与环境准备二、RedisTemplate基础配置三、连接属性配置四、操作String类型数据五、操作Hash类型数据六、操作List类型数据七、操作Set类型数据八、操作ZSet类型数据九、事务与管道操作总结 引言 Redis作为高性能的NoSQL数据库&#xff0c;在分布式系…

串口烧录出现频繁回复乱码 频繁回复一个数字且烧录失败 字节混乱

这是因为你的芯片没有处于系统存储区启动一直未进入bootloader 解决办法是检查boot引脚接正确没&#xff0c;要在系统存储器启动

共享经济再中介化进程中的技术创新与模式重构研究——以“开源AI智能名片链动2+1模式S2B2C商城小程序“为例

摘要 本文基于共享经济中介化演进的双重逻辑&#xff0c;通过案例研究与技术解构&#xff0c;探讨"开源AI智能名片链动21分销机制S2B2C商城小程序"集成系统如何重构数字经济时代的价值网络。研究发现&#xff0c;该技术生态通过三维需求匹配、动态价值分配与智能风险…

【linux】虚拟机执行sudo yum isntall perl报错 could not retrieve mirrorlist htt:

项目场景&#xff1a; 提示&#xff1a;虚拟机安装拓展包&#xff0c;sudo yum install perl Virtualbox 在不安装增强功能扩展的情况下, 无法自适应分辨率和共享剪切板等操作 问题描述 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; 出现这个错误是因…

网络编程知识预备阶段

1. OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能&#xff0c;从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时&#xff0c;更好地理解和…

我的Gitee

算法与数据结构: 浙海大小趴菜的一些记录 后续也会更新一些项目&#xff0c;小趴菜以后也会变得很厉害

Collection合集(单列集合)

Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。Collection实际上是一个泛型接口 Collection集合常用API&#xff1a; 代码实现&#xff1a; Collection集合遍历 遍历方式一&#xff1a;迭代器 迭代器是用来遍历集合的专用方式&#…

旅游类小程序界面设计

产品概述 艾啦游是一款互联网旅游类小程序&#xff0c;致力于国内精品旅游&#xff0c;以及拥有自由行、专属热榜单、出行攻略等诸多功能&#xff0c;汇聚了许多国内的人气景点&#xff0c;与诸多城市的酒店也保持合作&#xff0c;打造一体式旅行服务&#xff0c;更有不断上新…

移动端开发基础与常见布局

一、移动端基础 1.浏览器现状 ⑴.PC端常见浏览器 360浏览器、谷歌浏览器、火狐浏览器、QQ浏览 器、百度浏览器、搜狗浏览器、IE浏览器。 ⑵.移动端常见浏览器 UC浏览器&#xff0c;QQ浏览器&#xff0c;欧朋浏览器&#xff0c; 百度手机浏览器&#xff0c;360安全浏览器&am…