黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录Day5 全网最快最全

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客

这是我的 github https://github.com/Qiuner ⭐️

gitee https://gitee.com/Qiuner 🌹

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^)

想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎

  • 这篇有不少bug记录与方便您复制的代码,相信一定能节省学习时间同时达到更好的效果
  • 本博客要与原文档搭配使用 day05 - 飞书云文档 (feishu.cn)
  • 介绍了使用Sentinel进行请求限流、线程隔离、服务熔断等操作和分布式事务一致性处理方案 seata
    背景色是愧花黄绿
  • 解决了多个经常出现的bug,对于余下的作业 笔墨不多 本章作业算是比较简单的
  • 这一章,官方文档弄得很详细了,因此我没有很多可以拓展的地方

2024最新SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等)Day 5 包含作业

image-20240727213603572

雪崩问题描述

  • 刚开始的介绍很好 推荐听一听微服务保护和分布式事务-01.雪崩问题-原因分析_哔哩哔哩_bilibili

image-20240723231953433

image-20240723232033618

微服务单个服务保护思路

一:对请求流量进行限制

image-20240723232212773

二:线程隔离

image-20240723232623074

  • 限制每个服务的线程上线数,但一个服务开始奔溃的时候,不会影响到其他线程

三:服务熔断

image-20240724090825303

  • 添加一个服务失败的处理逻辑

image-20240724091001265

image-20240724091020787

Sentinel

Sentinel的配置

image-20240724102323055

  • 步骤为:1、先在命令行中使用以下命令打开jar包 2、在idea中配置相关依赖 3、在application文件中指定运行的端口
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
  • 在官方文档里有详细的,就不写了

簇点链路

image-20240724105716952

  • 在这里,每个请求都是一个蔟点,每个请求进入服务后就被监控,

image-20240726163004155

spring:cloud:sentinel:transport:dashboard: localhost:8090 # sentinel的控制台http-method-specify: true # 是否 设置请求方式作为资源名称
  • 这样就能实现在sentinel中看到同请求不同请求名

image-20240726170243549

请求限流

image-20240726171400251

image-20240726171642134

线程隔离

image-20240726211111971

  • 给每个业务限定线程数,这样当一个服务用完了属于自己的资源的时候,就无法去侵占别人的线程资源

image-20240726211437597

image-20240726212459007

Fallback

image-20240726213233252

  • Fallback(回退机制)是一种应对服务故障的策略。当某个服务不可用或调用失败时,可以通过回退机制提供一个默认的响应或执行替代逻辑,以避免整个系统的崩溃并提升系统的容错能力。像异常,当请求失败了,不报错,给另外设定好的处理逻辑

使用Fallback

image-20240726213737350

第一步:在依赖中添加相关支持

image-20240726215440701

第二步:创建Fallback类

image-20240726214157004

第三步:声明一个bean

image-20240726214803454

第四步:应用在客户端

image-20240726215505208

服务熔断

image-20240726215618003

image-20240726215650159

image-20240726223809246

  • 这里熔断策略什么的官方文档介绍的很详细了,所以就不写了

分布式事务面对的问题

image-20240726224549667

  • 订单服务在库存服务失败后能够感知到,因此可以进行事务回滚,但是购物车服务做不到。因为它是被调用的

Seata

Seata的三种角色

image-20240726225014833

  • tc是一个总经理,它不管具体服务内容的实现,也不用去落实谁今天上班了,谁今天没上班,底下的人会告诉它。tc要做的就是发现事务失败了,那就进行全部回滚
  • tm是一个小组组长,它知道小组的总体情况,知道小组成员什么时候开始上班,什么时候下班,然后告诉tc
  • rm是组员,组员只要告诉tc自己做没做成功,是的,不是向tm报告做没做成功

seata部署

  • 这里可以看官方文档( https://b11et3un53m.feishu.cn/wiki/QfVrw3sZvihmnPkmALYcUHIDnff),已经很详细了,但是在拉取seata镜像的时候,命令是不太对的,可以使用下面命令

image-20240726230707673

docker load -i /root/seata-1.5.2.tar
  • 然后
docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.200.128 \
-v /root/seata:/seata-server/resources \
--privileged=true \
--network Qiuner-net \
-d \
seataio/seata-server:1.5.2
  • 注意变更网络

seata依赖下载很慢的问题

image-20240726232505689

image-20240727094416688

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘globalTransactionScanner’ defined in class path resource [

image-20240727160203669

  • 这个报错,查看自己配置的

image-20240727160555824

报错 io.seata.common.exception.FrameworkException: can not register RM,err:can not connect to services-server.

  • 你的seata地址错了

image-20240727161652886

docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.150.101 \
-v /root/seata:/seata-server/resources \
--privileged=true \
--network Qiuner-net \
-d \
seataio/seata-server:1.5.2
  • 你在创建seata的时候,这里的ip地址写错了,直接照抄了

网络链接

docker network connect Qiuner-net seata
  • 直接都加一遍就好了,加过了不会再加,不用担心

微服务中引入seata步骤总结:

第一步:引入依赖

image-20240727163601902

<!--统一配置管理-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--读取bootstrap文件-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--seata-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

第二步:再nacos添加seata依赖设置

image-20240727163704195

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

第三步:添加bootstrap配置

spring:application:name: item-service # 服务名称profiles:active: devcloud:nacos:server-addr: 192.168.200.128:8848 # nacos地址config:file-extension: yaml # 文件后缀名shared-configs: # 共享配置- dataId: shared-jdbc.yaml # 共享mybatis配置- dataId: shared-log.yaml # 共享日志配置- dataId: shared-swagger.yaml # 共享日志配置- dataId: shared-seata.yaml # 共享seata配置

第四步:简化原本配置

image-20240727164859001

server:port: 8081
feign:okhttp:enabled: true # 开启OKHttp连接池支持sentinel:enabled: true # 开启Feign对Sentinel的整合
hm:swagger:title: "商品服务接口文档"package: com.hmall.item.controllerdb:database: hm-item

XA模式

image-20240727170716244

  • 实现全局事务的关键就是等待,事务等待不提交,所有事务都执行好了再一起提交

image-20240727171026099

实现XA模式

image-20240727171047354

  • 具体实现可以看官方文档 https://b11et3un53m.feishu.cn/wiki/QfVrw3sZvihmnPkmALYcUHIDnff

AT模式

  • at模式是默认的,使用的多

image-20240727171654570

  • AT和XA模式在这部分前面的逻辑是完全一致的

image-20240727171942815

  • 可能会出现短暂的数据不一致问题。

image-20240727172034820

At模式具体实现

第一步:导入log数据表

image-20240727172137192

第二步:修改配置 改成使用at模式

image-20240727172410786

JDK11使用反射时候报错java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not “opens java.lang.invoke” to unnamed module @4c583ecf [in thread “http-nio-8084-exec-1”]

--add-opens java.base/java.lang.invoke=ALL-UNNAMED 
  • 虚拟机选项中添加以上代码即可

image-20240727220628025

作业

作业一:3.1.编写降级逻辑

解题思路

  • 首先明白题目要让我们做什么?

  • 编写降级逻辑,就是写sentinel中的fallback

  • 明白了要做什么之后,来想怎么做:fallback是Sentinel中的一个东西,因此想要编写fallback,就得想将Sentinel引入进来,在Sentinel中的控制台能够看到要编写fallback逻辑的模块

开始解题

第一步:启动Sentinel

image-20240727215915066

java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
  • 输入以上命令打开sentinel

image-20240727220030194

一开始你可能看不到你之前配置的东西

image-20240727220846056

  • 点开商城,进行几次查询,加购等操作,就可以看到了

image-20240728085215036

第二步:给相应模块添加 Sentinel

添加依赖

image-20240728085352559

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

添加配置

image-20240728085702645

  • 重启服务,发现多了这个

image-20240728085730141

fallback的处理逻辑
第一步:添加fallback逻辑

image-20240728090059332

  • 前面已经对商品做了fallback的处理,这次我们给cart-service进行添加fallback逻辑处理

image-20240728092002202

package com.hmall.api.client.fallback;import com.hmall.api.client.CartClient;
import com.hmall.common.exception.BizIllegalException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;import java.util.Collection;@Slf4j
public class CartClientFallback implements FallbackFactory<CartClient> {@Overridepublic CartClient create(Throwable cause) {return new CartClient(){@Overridepublic void deleteCartItemByIds(Collection<Long> ids) {log.error("远程调用CartClientt#deleteCartItemByIds方法出现异常,参数:{}", ids, cause);// 批量删除失败,进行事务回滚111throw new BizIllegalException(cause);}};}
}
第二步:注册bean

image-20240728091412591

第三步:使用相应bean

image-20240728091543143

  • 现在你就可以打开测试啦,不过因为这是删除,所以建议使用别的进行测试。其他的配置方法也是一样的

作业二:3.2.解决分布式事务

作业描述

除了下单业务以外,用户如果选择余额支付,前端会将请求发送到pay-service模块。而这个模块要做三件事情:

  • 直接从user-service模块调用接口,扣除余额付款
  • 更新本地(pay-service)交易流水表状态
  • 通知交易服务(trade-service)更新其中的业务订单状态
  • 这里其实也很简单,在需要的模块加上相关注解、引入依赖就可以了

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

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

相关文章

hadoop学习(一)

一.hadoop概述 1.1hadoop优势 1&#xff09;高可靠性&#xff1a;Hadoop底层维护多个数据副本&#xff0c;即使Hadoop某个计算元素或存储出现故障&#xff0c;也不会导致数据的丢失。 2&#xff09;高扩展性&#xff1a;在集群间分配任务数据&#xff0c;可方便扩展数以千计…

SPSS个人版是什么软件

SPSS是一款数据统计、分析软件&#xff0c;它由IBM公司出品&#xff0c;这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等&#xff0c;软件易学且功能非常强大&#xff0c;可以使用SPSS制作图表&#xff0c;例如柱状、饼状、折线等图表&…

【Drools】(一)基于业务需求动态生成 DRT 规则模板:事实与动作定义详解

&#xff08;一&#xff09;基于业务需求动态生成 DRT 规则模板&#xff1a;事实与动作定义详解 背景 在业务规则管理中&#xff0c;DRT 文件&#xff08;Drools Rule Template&#xff09;用于定义和重用规则模板&#xff0c;这些模板可以动态地根据实际业务需求进行填充和生…

Android 10.0 Launcher 启动流程

在前面SystemUI启动流程中说到&#xff0c;在SystemServer中会去启动各种系统服务&#xff0c;这里的launcher也是启动的其中一个服务ActivityManagerService去启动的。在android10之前&#xff0c;系统四大组件的启动都是在ActivityManagerService中&#xff0c;在android10中…

前端创建仓库的详细步骤

第一步点击号新建仓库 第二步输入完仓库名称路径会自己出来然后点击创建 第三步在自己创建的文件夹右键点击GIt Bash Here 第四步把我框的这些一个一个的输在Git Bash Here中每输入一个回车一个 第五步全部输入完以后CtrlF5自动刷新下就好了 然后文件夹就会有.git了

机器视觉12-相机

相机 作用: 工业相机 是 机器视觉系统 的重要组成部分 最本质的功能就是通过CCD或CMOS成 像传感器将镜头产生的光信号转变为 有序的电信号&#xff0c;并将这些信息通过相 应接口传送到计算机主机 工业相机分类 目前业内没有对相机进行明确的分类定义&#xff0c; 以下分类是…

Python 学习中的 API,如何调用API ?

1.1 API的定义 API&#xff0c;全称是Application Programming Interface&#xff08;应用程序编程接口&#xff09;。它是一组定义好的协议和工具&#xff0c;用于在软件应用程序之间进行通信。API可以简化软件开发&#xff0c;使不同的应用程序能够相互协作。它是软件开发中…

数字车间与智能工厂:区别、联系与制造业的未来转型

数字车间和智能工厂在制造业中扮演着重要角色&#xff0c;它们之间存在明显的区别和紧密的联系。以下是对两者区别和联系的详细阐述&#xff1a; 一、区别 定义与范围 数字车间&#xff1a;数字车间是指通过信息化技术、智能化装备和数据化管理等手段&#xff0c;实现生产过程全…

【Python系列】Python 程序的优雅退出:使用`sys.exit()`控制程序终止

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

笔记本电脑怎么录屏?5个小技巧(2024最全)

在今天&#xff0c;录屏功能已经不再是专业人士的专属&#xff0c;而是融入了普通人的日常生活与工作之中。想要记录游戏的精彩瞬间、分享软件的操作教程&#xff0c;或是保存屏幕上的重要信息&#xff0c;录屏都能帮你一键搞定。那么&#xff0c;对于我们这些日常使用笔记本电…

初始K8s

K8S 基本概念: K8S 的全称为 Kubernetes (K12345678S)&#xff0c;PS&#xff1a;“嘛&#xff0c;写全称也太累了吧&#xff0c;不如整个缩写”。 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成…

火狐浏览器怎么切换ip:详细步骤与注意事项

随着互联网的飞速发展&#xff0c;网络环境的复杂性和安全性问题日益凸显。对于需要保护个人隐私、突破地域限制或进行网络测试的用户来说&#xff0c;切换IP地址成为了一项重要的技能。火狐浏览器&#xff0c;作为一款备受欢迎的开源浏览器&#xff0c;凭借其强大的自定义功能…

【计算机网络】TCP和UDP的封装以及案例

TCP和UDP的封装以及案例 背景知识TCP实现UDP实现封装Network用NetWork再次实现TCP和UDP小知识点 背景知识 TCP&#xff1a;传输控制协议&#xff08;Transmission Control Protocol&#xff09; UDP&#xff1a;用户数据报协议 &#xff08;User Datagram Protocol&#xff09…

AI的欺骗游戏:揭示多模态大型语言模型的易受骗性

人工智能咨询培训老师叶梓 转载标明出处 多模态大型语言模型&#xff08;MLLMs&#xff09;在处理包含欺骗性信息的提示时容易生成幻觉式响应。尤其是在生成长响应时&#xff0c;仍然是一个未被充分研究的问题。来自 Apple 公司的研究团队提出了MAD-Bench&#xff0c;一个包含8…

网站打不开怎么办,收藏以备不时之需

DNS设置示范教程 部分地区有使用移动网络的小伙伴们吐槽无法访问部分网站的情况&#xff0c;同样的网站&#xff0c;使用电信和联通的用户就能正常访问。 这其实有很大几率是由于运营商的网络问题导致的&#xff0c;容易出现网站打不开的结果。 要解决移动网络无法访问的情况…

(面试必看!)一些和多线程相关的面试考点

文章导读 引言考点1. CAS 指令&#xff08;重点&#xff09;一、什么是CAS二、CAS 的优点三、CAS 的缺点四、ABA问题五、相关面试题 考点2. 信号量&#xff08;semaphore&#xff09;一、基本概念二、信号量的主要操作三、信号量的应用四、相关面试题 考点3、CountDownLatch 类…

DHCP笔记

DHCP---动态主机配置协议 作用&#xff1a;为终端动态提供IP地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;DNS网址等信息 具体流程 报文抓包 在DHCP服务器分配iP地址之间会进行广播发送arp报文&#xff0c;接收IP地址的设备也会发送&#xff0c;防止其他设备已经使用…

卓码软件测评:软件功能测试和非功能测试详情介绍

随着信息技术的不断发展&#xff0c;软件在我们日常生活与工作中扮演着越来越重要的角色。然而&#xff0c;软件质量的好坏直接关系到使用者的体验和企业的声誉。在软件开发过程中&#xff0c;功能测试和非功能测试作为保证软件质量的重要手段&#xff0c;受到了越来越多的关注…

古文:文天祥《正气歌》

原文 正气歌 【作者】文天祥 【朝代】宋 余囚北庭&#xff0c;坐一土室。室广八尺&#xff0c;深可四寻。单扉低小&#xff0c;白间短窄&#xff0c;污下而幽暗。当此夏日&#xff0c;诸气萃然&#xff1a;雨潦四集&#xff0c;浮动床几&#xff0c;时则为水气&#xff1b;涂泥…

YAML 语法规范

文章目录 YAML 语法规范一、简介二、基本语法三、高级语法四、示例解析五、注意事项YAML 语法规范 一、简介 YAML(YAML Ain’t Markup Language)是一种专门用来写配置文件的语言,具有简洁、易读、易解析等特点。YAML的设计理念是为人类和机器之间的沟通提供一种更加直观、…