在线教育-谷粒学院学习笔记(八)
文章目录
- 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 {