在线教育-谷粒学院学习笔记(八)

news2024/11/15 21:34:33

文章目录

    • 1 内容介绍
    • 2 微服务
    • 3 微服务实现删除nacos
    • 4 删除课程-删除视频
    • 5 Hystrix

1 内容介绍

  • Spring Colud
    • 删除小节-删除视频
    • 删除课程-删除视频

2 微服务

  • service 三个服务
    • service_edu 8001
    • service_oss 8002
    • service_vod 8003
  • 微服务
    • 微服务是架构风格
    • 把一个项目拆分成多个独立的服务,多个服务独立运行,每个服务占用独立的进程
  • 框架
    • Spring Cloud
    • Dubbo
  • Spring Cloud
    • 并不是一种技术,而是很多框架的集合
    • 包含很多框架,能够使用这些框架实现微服务操作
    • 需要依赖Spring Boot技术
  • Spring Cloud相关基础服务组件
    • 服务发现——Netflix Eureka (Nacos)
    • 服务调用——Netflix Feign
    • 熔断器——Netflix Hystrix
    • 服务网关——Spring Cloud GateWay
    • 分布式配置——Spring Cloud Config (Nacos)
    • 消息总线 —— Spring Cloud Bus (Nacos)
  • 版本
    • Boot:2.2.1
    • Cloud:Hoxton

3 微服务实现删除nacos

  • 删除小节 同时删除阿里云视频

    service_edu --------->  service_vod
      删除小节 		调用		  删除视频
    
  • 注册中心Nacos

    实现不同的微服务模块之间的调用,需要将模块在注册中心进行注册,模块间互相调用

在这里插入图片描述

下载安装nacos

版本:1.1.4;端口:8848;登录:nacos、nacos

  • 在nacos中注入service_edu

    • 1 引入依赖service/pom.xml

      <!--服务注册-->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
       </dependency>
      
    • 2 在要注册的服务的配置文件中进行配置nacos地址

      spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
      
    • 3 在启动类上添加注解

      @EnableDiscoveryClient // nacos注册
      
  • feign调用

    • 1 引入依赖 service pom.xml

      <!--服务调用-->
      <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-openfeign</artifactId>
       </dependency>
      
    • 2 在调用端service_edu服务的启动类添加注解

      @EnableFeignClients
      public class EduApplication {
      
    • 3 在调用端创建interface,使用注解指定调用服务名称,定义调用的方法路径

      com.mys.eduservice.client

      @FeignClient("service-vod")
      public interface VodClient {
          // 定义调用的方法路径
          
          // 根据视频id删除阿里云的视频
          @DeleteMapping("/eduvod/video/removeAlyVideo/{id}")
          public R removeAlyVideo(@PathVariable("id") String id); 
          // 注:@PathVariable一定要写参数名称,否则会出错
      }
      
    • 4 实现代码删除小节-删除阿里云视频

      // 删除小节,并删除对应阿里云的视频
      @DeleteMapping("{id}")
      public R deleteVideo(@PathVariable String id) {
          // 先根据小节id获取视频id,再调用方法删除视频
          EduVideo video = videoService.getById(id);
          String videoSourceId = video.getVideoSourceId();
          // 判断小节里面是否有视频
          if (!StringUtils.isEmpty(videoSourceId)) {
              // 根据视频id,远程调用实现删除视频
              vodClient.removeAlyVideo(videoSourceId);
          }
          // 删除小节
          videoService.removeById(id);
          return R.ok();
      }
      

4 删除课程-删除视频

一个课程有很多章节,一个章节有很多小节,每个小节有视频

删除课程时,需要删除多个视频

1 在service-vod创建接口,删除多个视频

// 删除多个阿里云视频
// 参数:多个视频id
@DeleteMapping("delete-batch")
public R deleteBatch(@RequestParam("videoIdList") List<String> videoIdList) {
    vodService.removeMoreAlyVideo(videoIdList);
    return R.ok();
}
@Override
public void removeMoreAlyVideo(List<String> videoIdList) {
    try {
        // 1 创建初始化对象
        DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
        // 2 创建request对象
        DeleteVideoRequest request = new DeleteVideoRequest();

        // videoList值转换成:1,2,3
        String videoIds = StringUtils.join(videoIdList, ",");
        // 3 设置视频id
        request.setVideoIds(videoIds);
        // 4 调用删除视频
        client.getAcsResponse(request);
    } catch (Exception e) {
        e.printStackTrace();
        throw new GuliException(20001, "删除视频失败");
    }
}

2 在service-edu调用service-vod接口,实现删除多个视频

com.mys.eduservice.service.impl.EduVideoServiceImpl

public void removeVideoByCourseId(String courseId) {
    // 根据课程id查询所有视频id
    QueryWrapper<EduVideo> wrapperVideo = new QueryWrapper<>();
    // wrapper.select重要,记住!
    wrapperVideo.select("video_source_id");
    List<EduVideo> eduVideoList = baseMapper.selectList(wrapperVideo);
    // List<Video> => List<String>
    List<String> videoIds = new ArrayList<>();
    for (EduVideo eduVideo : eduVideoList) {
        String videoSourceId = eduVideo.getVideoSourceId();
        if (!StringUtils.isEmpty(videoSourceId)) {
            videoIds.add(videoSourceId);
        }
    }
    // 根据多个视频id,删除多个视频
    if (videoIds.size() > 0) {
        vodClient.deleteBatch(videoIds);
    }

    // 根据课程id删除小节
    QueryWrapper<EduVideo> wrapper = new QueryWrapper<>();
    wrapper.eq("course_id", courseId);
    baseMapper.delete(wrapper);
}

5 Hystrix

Spring Cloud接口调用过程:

Feign —>Hystrix —>Ribbon —>Http Client
在这里插入图片描述

1 添加熔断器相关依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

<!--hystrix依赖,主要是用  @HystrixCommand -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2 调用配置文件中开启熔断器

# 开启熔断机制
feign.hystrix.enabled=true
# 设置hystrix超时时间。默认1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000

3 在创建interface之后,还需要创建其对应实现类,实现方法,出错了输出内容

@Component
public class VodFileDegradeFeignClient implements VodClient {
    // 出错之后执行
    @Override
    public R removeAlyVideo(String id) {
        return R.error().message("删除视频出错");
    }
    @Override
    public R deleteBatch(List<String> videoIdList) {
        return R.error().message("删除多个视频出错");
    }
}

4 在interface上面添加注解和属性

@FeignClient(name = "service-vod", fallback = VodFileDegradeFeignClient.class)
public interface VodClient {

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

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

相关文章

NUMA介绍

早期CPU访问内存结构 UMA1&#xff08;Uniform Memory Access, 一致性内存访问 &#xff09; 早期的计算机&#xff0c;内存控制器还没有整合进 CPU&#xff0c;所有的内存访问都需要经过北桥芯片来完成。 在 UMA 架构下&#xff0c;CPU 和内存之间的通信全部都要通过前端总线…

【Java|golang】2293. 极大极小游戏

给你一个下标从 0 开始的整数数组 nums &#xff0c;其长度是 2 的幂。 对 nums 执行下述算法&#xff1a; 设 n 等于 nums 的长度&#xff0c;如果 n 1 &#xff0c;终止 算法过程。否则&#xff0c;创建 一个新的整数数组 newNums &#xff0c;新数组长度为 n / 2 &#x…

go语言初识——数据类型

目录 go go与C语言区别 helloworld 数据类型 变量 定义 类型推导 简短声明 : 匿名变量 常量 iota 基本类型 指针 数组 结构体 go Go是2009年开源的编程语言&#xff0c;Go语言具有以下特性&#xff1a;语法简洁、并发编程、编译迅速、数组安全、丰富的内置类型…

如何在 Antd Pro 框架上实现样式自定义?

文章目录一、前言二、实操过程一、前言 Ant Design Pro 是一个企业级中后台前端/设计解决方案&#xff0c;已经有完善的 UI 组件及设计风格&#xff0c;在一些特定项目中&#xff0c;往往涉及到对其调整&#xff0c;来实现独特的 UI 设计&#xff0c;如不同的主题色、布局、卡…

帮助台技术员协助的自助服务

对于帮助台技术员例行电话带来成本高居不下的企业来说&#xff0c;最终用户自助服务是一个伟大的解决方案&#xff0c;允许用户解决自己的IT问题。然而&#xff0c;一些企业仍未部署自助服务。例如&#xff0c;即使在Active Directory中维护每个员工的最新个人资料信息是一件乏…

1. Python3的安装与环境搭建

1. 开发环境&#xff1a;Win10 Python3.10.5 PyCharm 2. 安装Python3 下载地址&#xff1a;https://www.python.org/ 运行刚下载的python-3.10.5-amd64.exe&#xff0c;并做以下操作&#xff1a; 然后Next&#xff0c;并进行以下操作&#xff1a; 最后点击Install&#…

会话跟踪技术:Cookie、Session和Token

会话跟踪技术背景&#xff1a;1. Cookie &#xff08;客户端的会话跟踪技术&#xff09;1.1 原理1.2 基本使用1.2.1 服务器发送Cookie1.2.2 服务器获取Cookie1.3 使用细节1.3.1 存活时间1.3.2 存储中文2. Session&#xff08;服务端的会话跟踪技术&#xff09;2.1 原理2.2 基本…

采用高通Qualcomm处理器的手机进EDL 9008模式的办法

由于我们有很多基于 Qualcomm 的设备&#xff0c;其中一些设备可能会古怪地猜测如何进入 EDL 模式&#xff0c;或者如何正确进入。 例如&#xff0c;对于 Alcatel&#xff0c;您必须先按住两个音量键&#xff0c;然后再按住其中一个&#xff0c;对于 CAT B35&#xff0c;您必须…

Python基础(二十六):模块和包简单介绍

文章目录 模块和包简单介绍 一、模块 1、导入模块 2、制作模块

基于Servlet+jsp+mysql开发javaWeb校园图书管理系统

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;或者没有积分想获取项目&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录一、开发背景二、 需求分析三、开发环境四、运行效果五、开发流程工程目…

【Android安全】Google Hardware-backed Keystore | SafetyNet | 远程证明Remote Attestation

Google Hardware-backed KeyStore Attestation 原理及流程 SafetyNet Hardware-backed Attestation SafetyNet Hardware-backed Attestation&#xff1a;使用了Hardware-backed Keystore SafetyNet 支持Software Attestation 和 Hardware-backed Attestation&#xff0c;根据…

五、Web应用开发模式

web应用开发模式 web应用的开发主要有两种模式&#xff1a; 前后端不分离前后端分离 前后端不分离 在互联网早期&#xff0c;web应用开发采用前后端不分离的方式。 它是以后端直接渲染模板完成响应的一种开发模式。 以前后端不分离的方式开发的web应用的架构图如下&#x…

每天15分钟JMeter进阶篇(1):JAVA 取样器的基本使用

每天15分钟JMeter进阶篇&#xff08;1&#xff09;&#xff1a;JAVA 取样器的基本使用前言准备工作创建开发工程POM文件创建根工程创建module开发JAVA取样器构建、部署运行构建JAR包部署和运行写在最后前言 JMETER官方提供了丰富的取样器&#xff0c;可以支持80%的常见测试场景…

传输层协议:UDP协议

简介 用户数据报协议&#xff08;英语&#xff1a;User Datagram Protocol&#xff0c;缩写&#xff1a;UDP&#xff1b;又称用户数据包协议&#xff09;是一个简单的面向数据包的通信协议&#xff0c;位于OSI模型的传输层。该协议由David P. Reed在1980年设计且在RFC 768中被…

CrimeFragment的UI fragment进行管理

用户界面将由一个名为CrimeFragment的UI fragment进行管理。CrimeFragment的 实例将通过一个名为CrimeActivity的activity来托管。CrimeActivity视图由FrameLayout组件组成&#xff0c;FrameLayout组件为CrimeFragment要显示 的视图安排了存放位置。 CrimeFragment 的视图由一个…

Thinkphp QVD-2022-46174 多语言rce

文章目录漏洞介绍vulhub漏洞搭建漏洞利用利用一&#xff1a;写入文件利用二&#xff1a;文件包含漏洞分析参考文章漏洞介绍 Thinkphp&#xff0c;v6.0.1~v6.0.13&#xff0c;v5.0.x&#xff0c;v5.1.x 如果 Thinkphp 程序开启了多语言功能&#xff0c;那就可以通过 get、head…

[从零开始]用python制作识图翻译器·三

AlsoEasy-RecognitionTranslator具体实现开发环境准备和验证下载conda创建开发环境文字识别模块在线模块离线模块机器翻译模块在线模块离线模块GUIGUI-定位模块GUI-截图模块具体实现 开发环境准备和验证 前期测试项目文件已上传到我的仓库。 下载conda conda是python的版本管…

Day863.协程 -Java 并发编程实战

协程 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于协程的内容。 Java 语言里解决并发问题靠的是多线程&#xff0c;但线程是个重量级的对象&#xff0c;不能频繁创建、销毁&#xff0c;而且线程切换的成本也很高&#xff0c;为了解决这些问题&#xff0c;Java SD…

C++设计模式(4)——策略模式

策略模式 亦称&#xff1a; Strategy 意图 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 问题 一天&#xff0c; 你打算为游客们创建一款导游程序。 该程序的核心…

什么是CNCF云原生

一、CNCF简介 CNCF&#xff1a;全称Cloud Native Computing Foundation&#xff08;云原生计算基金会&#xff09;&#xff0c;成立于2015年12月11日&#xff0c;是一个开源软件基金会&#xff0c;它致力于云原生&#xff08;Cloud Native&#xff09;技术的普及和可持续发展。…