黑马商城(五)微服务保护和分布式事务

一、雪崩问题

二、雪崩-解决方案(服务保护方案)

请求限流:

线程隔离:

服务熔断:

服务保护组件:

三、Sentinel

引入依赖:

java 复制代码
<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
bash 复制代码
server:
  port: 8082
feign:
  okhttp:
    enabled: true #配置连接池开关
  swagger:
    title: "黑马商城购物车服务接口文档"
    package: "com.hmall.cart.controller"
    description: "购物车服务接口"
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090 #sentinel控制台地址

簇点链路:

Endpoint==Controller里的各种路径

请求限流:

QPS:每秒钟请求的数量

线程隔离:

fallback:

案例-给FeignClient添加Fallback逻辑:
java 复制代码
package com.hmall.api.fallback;

import com.hmall.api.client.ItemClient;
import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import com.hmall.common.utils.CollUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;

import java.util.Collection;
import java.util.List;

@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("查询商品失败!",cause);
                //查询不到返回一个空集合
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                log.error("扣减商品库存失败!",cause);
                throw new RuntimeException(cause);
            }
        };
    }
}
java 复制代码
package com.hmall.api.config;

import com.hmall.api.fallback.ItemClientFallbackFactory;
import com.hmall.common.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;

public class DefaultFeignConfig { //配置类中声明bean对象

    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }

    @Bean
    public RequestInterceptor userInfoRequestInterceptor(){
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                Long userId = UserContext.getUser();
                if(userId!=null) {
                    requestTemplate.header("user-info", userId.toString());
                }
            }
        };
    }

    @Bean
    public ItemClientFallbackFactory itemClientFallbackFactory(){
        return new ItemClientFallbackFactory();
    }
}

服务熔断:

断路器:

四、分布式事务

Seata:

Seata架构:

部署TC服务:

bash 复制代码
docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.50.129 \    #自己的IP地址
-v ./seata:/seata-server/resources \
--privileged=true \
--network hmall \    #确保和nacos mysql在一个网络下
-d \
seataio/seata-server:1.5.2

微服务继承Seata:

通过nacos共享配置:

bash 复制代码
seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    type: nacos # 注册中心类型 nacos
    nacos:
      server-addr: 192.168.50.129:8848 # nacos地址
      namespace: "" # namespace,默认为空
      group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
      application: seata-server # seata服务名称
      username: nacos
      password: nacos
  tx-service-group: hmall # 事务组名称
  service:
    vgroup-mapping: # 事务组与tc集群的映射关系
      hmall: "default"

XA模式:

实现XA模式:

整个事务中其他微服务端的事务因为后续也需要实现事务管理,都需要在对应方法上加上@Transactional

AT模式:

实现AT模式:

AT与XA区别:

追求一致性选XA

追求性能选AT

相关推荐
mCell8 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
记忆停留w9 小时前
从单体到微服务:Redis 协同 MySQL、Milvus、MinIO 搭建企业级RAG/AI Agent脚手架架构
大数据·人工智能·redis·微服务·ai·架构·milvus
财财源源9 小时前
.NET 程序保护实战系列01-流水线架构与保护引擎总览
架构·.net
KaMeidebaby10 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
深圳恒讯11 小时前
菲律宾云服务器与传统VPS的架构差异
运维·服务器·架构
龙亘川11 小时前
开源本地 AI 智能体网关 OpenClaw 深度实践:架构解析、全场景部署与自动化落地指南
人工智能·架构·开源·openclaw
数智化转型推荐官12 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
2603_9547083113 小时前
全维度容错设计,打造微电网安全运行屏障
服务器·网络·数据库·人工智能·分布式·安全
国服第二切图仔14 小时前
HarmonyOS APP《画伴梦工厂》开发第60篇-分布式软总线2.0——多设备协同新范式
分布式·wpf·harmonyos