我寄愁心与爪哇

如果能一步登天,
那别人的坚持又算什么呢?

0%

谷粒学院-day07

个人笔记,仅供参考

  • 前置:修改依赖版本

父项目guli_parent的pom.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/>
</parent>
<!--Spring Cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring Cloud Alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
  • 微服务基础设施

guli_3

一、注册中心-Nacos

1.下载

1.1下载nacos1.1.4版本:https://github.com/alibaba/nacos/releases/tag/1.1.4

1.2解压到guli_parent目录下(随意)

2.运行

2.1双击执行nacos/bin/startup.cmd

2.2浏览器访问

2.3登录

  • 账号:nacos
  • 密码:nacos

点击服务管理->服务列表 即可查看已注册服务(暂时没注册,没有数据)

3.注册

3.1依赖

service模块的pom.xml

1
2
3
4
5
<!--nacos服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3.2配置

需要进行注册的微服务的application.yml

1
2
3
4
5
#spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址

3.3主启动

主启动类添加注解:@EnableDiscoveryClient

4.测试

  • 启动微服务
  • 浏览器查看(服务管理->服务列表)

guli_4

二、服务调用-OpenFeign

1.依赖

消费者端(为了方便直接加入service模块中):

1
2
3
4
5
<!--OpenFeign服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.主启动

  • 消费者端主启动类添加**@EnableFeignClients注解**

  • 消费者(edu模块) -调用-> 生产者(oss模块)

    • 在edu模块删除讲师的同时,调用oss模块删除讲师头像

3.测试(略)

附:

1
@FeignClient("service-oss")

三、负载均衡-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
2
3
service-oss: # 调用的提供者的名称 
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 策略
  • 测试(略)

    附:IDLE配置多实例方式

    1
    -DServer.port=8121

    guli_5

3.超时控制

消费者端(edu微服务)配置:

1
2
3
4
5
ribbon:
MaxAutoRetries: 0 # 同一实例最大重试次数,不包括首次调用,默认0
MaxAutoRetriesNextServer: 1 # 重试其他实例的最大重试次数,不包括首次所选的server,默认1
ConnectTimeout: 10000 #连接建立的超时时长,默认1秒
ReadTimeout: 10000 #处理请求的超时时间,默认为1秒

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
2
3
4
5
// 创建axios实例
const service = axios.create({
baseURL: process.env.BASE_API, // api 的 base_url
timeout: 12000 // 请求超时时间
})

四、删除讲师头像

1.流程

1
2
3
4
5
6
7
TeacherController.removeById()
-调用->TeacherService
-实现类->TeacherServiceImpl.removeAvatarById()(根据id获取讲师,然后从讲师中获取url)
-调用->Edu模块 OssFileService
-OpenFeign调用->Oss模块 FileController
-调用->FileService
-实现类->FileServiceImpl(根据url删除阿里云图片)

2.代码

2.1 Oss模块

  • FileService.java

    1
    2
    3
    4
    5
    6
    /**
    * 删除讲师头像
    * @param url 讲师头像的url地址
    * @return 删除结果。true成功,false失败。
    */
    boolean removeFile(String url);
  • FileServiceImpl.java

参考:https://help.aliyun.com/document_detail/84842.htm?spm=a2c4g.11186623.0.0.14c21cd5LdABTL#concept-84842-zh

1
2
// 删除文件或目录。如果要删除目录,目录必须为空。
ossClient.deleteObject(bucketName, objectName);

FileServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
public boolean removeFile(String url) {
String endpoint = ossProperties.getEndpoint();
String keyid = ossProperties.getKeyid();
String keysecret = ossProperties.getKeysecret();
String bucketname = ossProperties.getBucketname();

// 从url中截取objectName
// objectName = url - host;
String host = "https://" + bucketname + "." + endpoint + "/";
String objectName = url.substring(host.length());

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, keyid, keysecret);

// 删除文件或目录。如果要删除目录,目录必须为空。
ossClient.deleteObject(bucketname, objectName);

// 关闭
ossClient.shutdown();

return false;
}
  • FileController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@ApiOperation("文件删除")
@DeleteMapping("/remove")
public R removeFile(
@ApiParam(value = "文件的url", required = true)
@RequestBody String url){
try {
fileService.removeFile(url);
} catch (Exception e) {
log.error(ExceptionUtils.getMessage(e));
throw new GuliException(ResultCodeEnum.FILE_DELETE_ERROR);
}

return R.ok().data("url",url);
}

2.2 Edu模块

  • TeacherController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 根据id删除讲师
*/
@ApiOperation(value = "根据id删除讲师",notes = "详细说明:根据id删除讲师,逻辑删除")
@DeleteMapping("/remove/{id}")
public R removeById(@ApiParam("讲师id") @PathVariable String id){
// 删除讲师头像
teacherService.removeAvatarById(id);
// 删除讲师
boolean result = teacherService.removeById(id);
if (result){
return R.ok().message("删除成功");
}else{
return R.error().message("数据不存在");
}
}
  • TeacherService
1
R removeAvatarById(String id);
  • TeacherServiceImpl
1
2
@Autowired
private OssFileService ossFileService;
1
2
3
4
5
6
7
8
9
10
@Override
public R removeAvatarById(String id) {

// 获取讲师头像url地址
Teacher teacher = baseMapper.selectById(id);
String avatarUrl = teacher.getAvatar();

// 删除讲师头像
return ossFileService.removeFile(avatarUrl);
}
  • OssFileService
1
2
@DeleteMapping("/admin/oss/file/remove")
R removeFile(@RequestBody String url);

五、服务容错-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浏览器访问

地址:http://localhost:8080

用户名:sentinel

密码:sentinel

3.3客户端

消费者微服务集成Sentinel客户端

3.3.1依赖

service模块的pom.xml

1
2
3
4
5
<!--服务容错-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

3.3.2配置

service_edu模块的application.yml

  • 连接控制台
1
2
3
4
5
6
#spring:
# cloud:
sentinel:
transport:
port: 8081 # 指定微服务与控制台交互的端口
dashboard: localhost:8080 # 指定控制台服务的地址

3.4核心功能

  • 上游微服务 –限流–> 核心微服务 –熔断降级–> 下游微服务

<1>浏览控制

保证自己不被上游服务压垮

<2>熔断降级

保证自己不被下游服务拖垮

<3>系统负载保护

保证外界环境良好(CPU、内存)

3.5熔断降级

OpenFeign整合Sentinel

3.5.1依赖

同上

3.5.2配置

service_edu模块的application.yml

1
2
3
feign:
sentinel:
enabled: true

3.5.3业务类

创建容错类(备选方案),指定容错类(OpenFeign远程调用接口添加fallback属性)

  • 创建容错类
    • 添加@Service注解
    • 实现远程调用接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.atguigu.guli.service.edu.feign.fallback;

import com.atguigu.guli.common.base.result.R;
import com.atguigu.guli.service.edu.feign.OssFileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
* @author cysheng
* @create 2022-04-20 20:19
*/
@Service
@Slf4j
public class OssFileServiceFallBack implements OssFileService {
@Override
public R test() {
return null;
}

@Override
public R removeFile(String url) {
log.info("熔断保护");
return R.error();
}
}

  • 指定容错类
    • fallback = OssFileServiceFallBack.class
1
2
3
4
5
@Service
@FeignClient(value = "service-oss",fallback = OssFileServiceFallBack.class)
public interface OssFileService{
// ...
}
  • 本文主题: 谷粒学院-day07
  • 本文作者: 我寄愁心与爪哇
  • 本文链接: https://cysheng.gitee.io/90fca88e.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道