一、雪崩問題
二、雪崩-解決方案(服務保護方案)
請求限流:
線程隔離:
服務熔斷:
服務保護組件:
三、Sentinel
引入依賴:
<!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
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邏輯:
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> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Collection<Long> ids) {log.error("查詢商品失敗!",cause);//查詢不到返回一個空集合return CollUtils.emptyList();}@Overridepublic void deductStock(List<OrderDetailDTO> items) {log.error("扣減商品庫存失敗!",cause);throw new RuntimeException(cause);}};}
}
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對象@Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}@Beanpublic RequestInterceptor userInfoRequestInterceptor(){return new RequestInterceptor() {@Overridepublic void apply(RequestTemplate requestTemplate) {Long userId = UserContext.getUser();if(userId!=null) {requestTemplate.header("user-info", userId.toString());}}};}@Beanpublic ItemClientFallbackFactory itemClientFallbackFactory(){return new ItemClientFallbackFactory();}
}
?服務熔斷:
斷路器:
四、分布式事務?
Seata:
Seata架構:
部署TC服務:
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共享配置:
seata:registry: # TC服務注冊中心的配置,微服務根據這些信息去注冊中心獲取tc服務地址type: nacos # 注冊中心類型 nacosnacos:server-addr: 192.168.50.129:8848 # nacos地址namespace: "" # namespace,默認為空group: DEFAULT_GROUP # 分組,默認是DEFAULT_GROUPapplication: seata-server # seata服務名稱username: nacospassword: nacostx-service-group: hmall # 事務組名稱service:vgroup-mapping: # 事務組與tc集群的映射關系hmall: "default"
XA模式:?
實現XA模式:
整個事務中其他微服務端的事務因為后續也需要實現事務管理,都需要在對應方法上加上@Transactional
AT模式:
實現AT模式:
AT與XA區別:
追求一致性選XA
追求性能選AT