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

news2025/3/18 9:07:22

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

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-jdk
    
    ENV 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.jar
    
    ENTRYPOINT ["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/bash
    
    ln -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:9090
        client-ip: 192.168.101.1
        # 本地配置
        # dashboard: localhost:8090
      http-method-specify: true # 开启请求方式前缀可根据http请求方法区分簇点链路
2.1.3 降级

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

修改配置项

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

在 OpenFeign 处配置降级逻辑

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

      @Override
      public 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.coloradmin.cn/o/2317125.html

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

相关文章

【css酷炫效果】纯CSS实现立体纸张折叠动效

【css酷炫效果】纯CSS实现悬浮阴影扩散交互 缘创作背景html结构css样式完整代码基础版进阶版(3d 悬浮效果) 效果图 通过CSS box-shadow与transition属性实现悬浮阴影扩散交互&#xff0c;为元素添加细腻的悬浮反馈。 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;htt…

案例5_1:单位数码管显示0

文章目录 文章介绍效果图仿真图5_1放置单位数码管 代码5_1.c 文章介绍 效果图 仿真图5_1 复制案例1_2的仿真图&#xff0c;在此基础上修改 注意&#xff1a;栅格大小需要缩小 放置单位数码管 代码5_1.c #include <reg52.h>#define uchar unsigned char #define uint un…

Linux centos7误删/boot拯救方法

1.进入救援模式 插入CentOS 7安装光盘&#xff0c;重启系统。在开机时按BIOS设置对应的按键&#xff08;通常是F2等&#xff09;&#xff0c;将启动顺序调整为CD - ROM优先。 系统从光盘启动后&#xff0c;选择“Troubleshooting”&#xff0c;然后选择“Rescue a CentOS s…

操作系统八股文整理(一)

操作系统八股文整理 一、进程和线程的区别二、进程与线程的切换过程一、进程切换进程切换的步骤&#xff1a; 二、线程切换线程切换的步骤&#xff1a; 三、进程切换与线程切换的对比四、上下文切换的优化 三、系统调用一、系统调用的触发二、从用户空间切换到内核空间三、执行…

20250317笔记本电脑在ubuntu22.04下使用acpi命令查看电池电量

20250317笔记本电脑在ubuntu22.04下使用acpi命令查看电池电量 2025/3/17 18:05 百度&#xff1a;ubuntu查看电池电量 百度为您找到以下结果 ubuntu查看电池电量 在Ubuntu操作系统中&#xff0c;查看电池电量通常可以通过命令行或者图形界面来完成。下面是一些常见的方法&…

蓝桥杯备考----模拟算法 phone number

嗯。这道题可以在两个和三个数字加-&#xff0c;我们只要随便输出一个奏行 那么&#xff01;我们规范一下&#xff0c;我们尽可能的只在两个数字之间加&#xff0c;但是如果一共奇数个的话&#xff0c;我们就让最后三个成一组&#xff0c;也就是说&#xff0c;我们用的是个小贪…

【数据分享】2000—2024年我国省市县三级逐月归一化植被指数(NDVI)数据(Shp/Excel格式)

之前我们分享过2000—2024年逐月归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;该数据来源于NASA定期发布的MOD13A3数据集&#xff01;很多小伙伴拿到数据后反馈栅格数据不太方便使用&#xff0c;问我们能不…

蓝桥杯真题——洛谷 Day10 并查集(枚举)

目录 P8651 [蓝桥杯 2017 省 B] 日期问题 P8635 [蓝桥杯 2016 省 AB] 四平方和 P8651 [蓝桥杯 2017 省 B] 日期问题 思路&#xff1a; 使用scanf读入&#xff0c;枚举从1960到2059&#xff0c;若符合题目形式&#xff0c;加入答案&#xff0c; 从小到大输出&#xff1a;存入结…

Linux应用:程序运行

kill kill命令的这种用法是向指定的进程发送特定信号编号的信号。信号在操作系统中是一种软件中断机制&#xff0c;用于通知进程发生了某种特定事件或要求进程执行特定操作。​ kill - 信号编号 进程 ID 信号编号的含义&#xff1a;不同的信号编号代表不同的事件或操作。例如…

基于SpringBoot+Vue3实现的宠物领养管理平台功能一

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会经济的发展和人们生活水平的提高&#xff0c;越来越多的人开始关注并参与到宠物领养中。宠物已经成为许多家庭的重要成员&#xff0c;人们对于宠物的关爱和照顾也日益增加。然而&#xff0c;传统的宠物领养流程存在诸多不便&a…

SpringCloud 学习笔记2(Nacos)

Nacos Nacos 下载 Nacos Server 下载 | Nacos 官网 下载、解压、打开文件&#xff1a; 更改 Nacos 的启动方式 Nacos 的启动模式默认是集群模式。在学习时需要把他改为单机模式。 把 cluster 改为 standalone&#xff0c;记得保存&#xff01; 启动startup.cmd Ubuntu 启动…

Blender-MCP服务源码4-初始化项目解读

Blender-MCP服务源码4-初始化项目解读 上篇文章针对Blender开发框架完成了一个基础模板的搭建&#xff0c;并在Blender中成功进行了运行&#xff0c;那这个初始化项目中是如何进行页面效果呈现的&#xff0c;尝试手动进行功能精简来拆解项目代码 1-核心知识点 1&#xff09;如…

基于eNSP的IPV4和IPV6企业网络规划

基于eNSP的IPV4和IPV6企业网络规划 前言网络拓扑设计功能设计技术详解一、网络设备基础配置二、虚拟局域网&#xff08;VLAN&#xff09;与广播域划分三、冗余协议与链路故障检测四、IP地址自动分配与DHCP相关配置五、动态路由与安全认证六、广域网互联及VPN实现七、网络地址转…

C#特性和反射

1。特性概念理解&#xff1f; 特性&#xff08;Attribute&#xff09;是用于在【运行时】传递程序中各种元素&#xff08;比如类、属性、方法、结构、枚举、组件等&#xff09;行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所…

mysql5.x和mysql8.x查看和设置隔离级别

MySQL的隔离级别 级别标志值描述读未提交READ-UNCOMMITTED0存在脏读、不可重复读、幻读的问题读已提交READ-COMMITTED1解决脏读的问题&#xff0c;存在不可重复读、幻读的问题可重复读REPEATABLE-READ2mysql 默认级别&#xff0c;解决脏读、不可重复读的问题&#xff0c;存在幻…

3.17学习总结

写了两道题 刚开始用的之前做组合输出的方法&#xff0c;时间超限了&#xff0c;想不出怎么优化&#xff0c;后面看了题解&#xff0c;代码如下 #include <stdio.h> #include <stdlib.h> int n,min2e9; int a[11],b[11]; //搜索 void hly(int s,int x,int y) {//当…

Blender材质 - 层权重

层权重 混合着色器 可以让 面朝向的一面显示一种材质 另一面显示另一种材质 就能实现挺不错的材质效果 移动视角 材质会跟着变化 有点类似虚幻的视差节点BumpOffset

【JavaEE】Spring Boot 日志

目录 一、日志概述二、使用日志2.1 打印日志2.2 日志框架2.2.1 门面 / 外观 模式 2.3 日志级别2.3.1 六大分类2.3.2 使用 2.4 日志级别配置2.5 日志的持久化2.6 日志文件分割2.7 日志文件格式2.8 Slf4j 简单打印日志 一、日志概述 ⽇志主要是为了发现问题, 分析问题, 定位问题…

如何用solidworks画齿轮

齿轮还是很有技术含量的,专业名词太多看不懂, 只会画 (这个东西不能自己想当然画, 齿轮之间不啮合是很有问题的,会积累磨损) 步骤1 打开设计库里的toolbox 选择正齿轮,右键生成零件 需要改的有几个关键的地方,我是只知道内圆外圆所以,对我来说最重要的是标称轴直径 (即正中间…

详解布隆过滤器及其模拟实现

目录 布隆过滤器 引入 概念 工作原理 模拟实现布隆过滤器 哈希函数集 布隆过滤器基本框架 add函数&#xff08;添加到布隆过滤器中&#xff09; contains函数&#xff08;判断是否存在该值&#xff09; 完整代码 布隆过滤器的删除 布隆过滤器的误判率 布隆过滤器的…