- 前置:修改依赖版本
父项目guli_parent的pom.xml文件
1 | <!-- Spring Boot --> |
- 微服务基础设施
一、注册中心-Nacos
1.下载
1.1下载nacos1.1.4版本:https://github.com/alibaba/nacos/releases/tag/1.1.4
windows:nacos-server-1.1.4.zip
1.2解压到guli_parent目录下(随意)
2.运行
2.1双击执行nacos/bin/startup.cmd
2.2浏览器访问
2.3登录
- 账号:nacos
- 密码:nacos
点击服务管理->服务列表 即可查看已注册服务(暂时没注册,没有数据)
3.注册
3.1依赖
service模块的pom.xml
1 | <!--nacos服务注册--> |
3.2配置
需要进行注册的微服务的application.yml
1 | #spring: |
3.3主启动
主启动类添加注解:@EnableDiscoveryClient
4.测试
- 启动微服务
- 浏览器查看(服务管理->服务列表)
二、服务调用-OpenFeign
1.依赖
消费者端(为了方便直接加入service模块中):
1 | <!--OpenFeign服务调用--> |
2.主启动
消费者端主启动类添加**
@EnableFeignClients
注解**消费者(edu模块) -调用-> 生产者(oss模块)
- 在edu模块删除讲师的同时,调用oss模块删除讲师头像
3.测试(略)
附:
1 |
三、负载均衡-Ribbon
OpenFeign依赖于Ribbon,Maven在安装OpenFeign时会自动安装Ribbon
1.负载均衡策略
策略名 | 策略描述 |
---|---|
BestAvailableRule | 选择一个最小的并发请求的server |
AvailabilityFilteringRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(activeconnections 超过配置的阈值) |
WeightedResponseTimeRule | 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 |
RetryRule | 对选定的负载均衡策略机上重试机制。 |
RoundRobinRule | 轮询选择server |
RandomRule | 随机选择一个server |
ZoneAvoidanceRule | 综合判断server所在区域的性能和server的可用性选择server |
2.更改策略
服务消费端配置文件更改配置如下,根据需求更改,这里暂时不变
1 | service-oss: # 调用的提供者的名称 |
测试(略)
附:IDLE配置多实例方式
1
-DServer.port=8121
3.超时控制
消费者端(edu微服务)配置:
1 | ribbon: |
3.1重试配置
MaxAutoRetries
同一实例最大重试次数
MaxAutoRetriesNextServer
重试规则:实例A重试次数达到 MaxAutoRetries配置的值 后,会切换实例B,然后再达到 MaxAutoRetries配置的值。
MaxAutoRetriesNextServer配置切换的次数。
3.2超时配置
- A微服务调用B微服务,A与B的tcp连接建立时间为:ConnectTimeout
- B服务处理请求时间为:ReadTimeout
3.3前端超时配置
src/request.js
1 | // 创建axios实例 |
四、删除讲师头像
1.流程
1 | TeacherController.removeById() |
2.代码
2.1 Oss模块
FileService.java
1
2
3
4
5
6/**
* 删除讲师头像
* @param url 讲师头像的url地址
* @return 删除结果。true成功,false失败。
*/
boolean removeFile(String url);FileServiceImpl.java
1 | // 删除文件或目录。如果要删除目录,目录必须为空。 |
FileServiceImpl.java
1 |
|
- FileController.java
1 |
|
2.2 Edu模块
- TeacherController
1 | /** |
- TeacherService
1 | R removeAvatarById(String id); |
- TeacherServiceImpl
1 |
|
1 |
|
- OssFileService
1 |
|
五、服务容错-Sentinel
1.服务雪崩
情景描述:
情景一
- 微服务A –调用-> 微服务B –调用-> 微服务C
- 服务C给服务B响应慢,导致服务B线程阻塞。而服务B线程阻塞,又会导致服务A线程阻塞。
情景二
b2()调用b3()时,若b3()阻塞,会导致b()阻塞。
而b2()阻塞,不但会导致b1()阻塞,还会导致a2()阻塞,进而a1()阻塞。
2.服务容错
防止服务雪崩,要做好服务容错。
2.1容错方案
2.1.1隔离
- 线程池隔离
按功能划分不同线程池,当线程池线程满时不扩散到其他线程,不会影响其他功能。
- 信号量隔离
2.1.2超时
服务A调用服务B,当调用超过一定时间未响应,就断开请求,释放线程。
2.1.3限流
限制系统输入和输出的流量。
2.1.4熔断
对响应时间慢或异常比例高的下游服务快速失败。
2.1.5降级
在本服务提供兜底(备用)方案,如果调用下游服务失败,就执行备用方案。
3.Sentinel
3.1组成
核心库(Java客户端) + 控制台(Dashboard)
微服务整合核心库,然后连接控制台。
3.2控制台
3.2.1下载
下载地址:https://github.com/alibaba/Sentinel/releases
下载版本:sentinel-dashboard-1.7.0.jar
3.2.2启动控制台
- 方式一(默认参数启动)
1 | java -jar sentinel-dashboard-1.7.0.jar |
- 方式二(配置启动参数)
1 | java -Dserver.port=8888 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar |
3.2.3浏览器访问
用户名:sentinel
密码:sentinel
3.3客户端
消费者微服务集成Sentinel客户端
3.3.1依赖
service模块的pom.xml
1 | <!--服务容错--> |
3.3.2配置
service_edu模块的application.yml
- 连接控制台
1 | #spring: |
3.4核心功能
- 上游微服务 –限流–> 核心微服务 –熔断降级–> 下游微服务
<1>浏览控制
保证自己不被上游服务压垮
<2>熔断降级
保证自己不被下游服务拖垮
<3>系统负载保护
保证外界环境良好(CPU、内存)
3.5熔断降级
OpenFeign整合Sentinel
3.5.1依赖
同上
3.5.2配置
service_edu模块的application.yml
1 | feign: |
3.5.3业务类
创建容错类(备选方案),指定容错类(OpenFeign远程调用接口添加fallback属性)
- 创建容错类
- 添加
@Service
注解 - 实现远程调用接口
- 添加
1 | package com.atguigu.guli.service.edu.feign.fallback; |
- 指定容错类
- fallback = OssFileServiceFallBack.class
1 |
|