资料下载
链接: https://pan.baidu.com/s/169gjHIZIlhTP0KXTPp0_oA 提取码: tm76
第一章 单机应⽤用到分布式架构演进核⼼知识
第1集 传统单机-分布式架构演进历史
简介:讲解单机到微服务架构的演进
- 单机架构
- 优点: 易易于测试 便便于集成 ⼩小型项⽬目友好
- 缺点: 开发速度慢 启动时间⻓长 依赖庞⼤大
- 分布式架构
- SOA :Service Oriented Architecture ⾯面向服务的架构
其中包含多个服务, 服务之间通过相互依赖最终提供⼀一
系列列的功能, ⼀一个服务 通常以独⽴立的形式存在与操作系
统进程中, 各个服务之间 通过⽹网络调⽤用。 - 微服务:将⼀一个⼤大的单体应⽤用进⾏行行细粒度的服务化拆
分,每个拆分出来的服务各⾃自独⽴立打包部署,各个服务
之间 通过⽹网络调⽤用。 - 优点
- 易易开发、理理解和维护
- 独⽴立的部署和启动
- 缺点
- 分布式系统-》分布式事务问题
- 需要管理理多个服务-》服务治理理
- SOA :Service Oriented Architecture ⾯面向服务的架构
第2集 微服务架构常⻅见的核⼼心组件
简介:微服务架构常⻅见的核⼼心组件
- 常⻅见组件
- ⽹网关
- 路路由转发 + 过滤器器
- /api/v1/video/ 视频服务
- /api/v1/order/ 订单服务
- /api/v1/user/ ⽤用户服务
- 路路由转发 + 过滤器器
- 服务发现注册
- 调⽤用和被调⽤用⽅方的信息维护
- 配置中⼼
- 管理理配置,动态更更新 application.properties
- 链路路追踪
- 分析调⽤用链路路耗时 例例⼦子:下单-》查询商品服务获取
商品价格-》查询⽤用户信息-》保存数据库
- 分析调⽤用链路路耗时 例例⼦子:下单-》查询商品服务获取
- 负载均衡器器
- 分发流量量到多个节点,降低压⼒力力
- 熔断
- 保护⾃自⼰己和被调⽤用⽅方
- ⽹网关
第3集 讲解业务微服务架构常见解决方案
简介:讲解业务微服务架构常见解决方案
- ServiceComb
- 华为内部的CSE(Cloud Service Engine)框架开源, ⼀一个 微服务的开源解决⽅方案,社区相对于下⾯面⼏几个⽐比较⼩小
- ⽂文档不不多,通信领域⽐比较强
- dubbo
- zookeeper + dubbo + springmvc/springboot
- 官⽅方地址:http://dubbo.apache.org/#!/?lang=zh-cn
- 配套
- 通信⽅方式:rpc
- 注册中⼼心:zookeper/redis/nacos
- 配置中⼼心:diamond、nacos
- SpringCloud
- 全家桶+轻松嵌⼊入第三⽅方组件(Netflix 奈奈⻜飞)
- 官⽹网:https://spring.io/projects/spring-cloud
- 配套
- 通信⽅方式:http restful
- 注册中⼼心:eruka
- 配置中⼼心:config
- 断路路器器:hystrix
- ⽹网关:zuul/gateway
- 分布式追踪系统:sleuth+zipkin
- Spring Alibaba Cloud
- 全家桶+阿⾥里里⽣生态多个组件组合+SpringCloud⽀支持
- 官⽹网 https://spring.io/projects/spring-cloud-alibaba
- 配套
- 通信⽅方式:http restful
- 注册中⼼心:nacos
- 配置中⼼心:nacos
- 断路路器器:sentinel
- ⽹网关:gateway
- 分布式追踪系统:sleuth+zipkin
第二章 新⼀代微服务AlibabaCloud介绍 和架构环境准备
第1集 新⼀代微服务架构AlibabaCloud全家桶 介绍
简介:讲解AlibabaCloud核⼼心组件介绍
-
官⽹网介绍
- https://spring.io/projects/spring-cloud-alibaba#overview
- 为什什么要选择AlibabaCloud , 和SpringCloud的区别
- SpringCloud和AlibabaCloud组件存在很⼤大交集,互相配
合 - SpringCloud很多组件是基于第三⽅方整合,⽬目前多个已
经不不更更新了了,⽐比如zuul、eureka、hystrix等 - AlibabaCloud 提供⼀一站式微服务解决⽅方法,已经和
SpringCloud进⾏行行了了整合,组件互相⽀支持
-
AlibabaCloud全家桶介绍
- https://github.com/alibaba/spring-cloud-alibaba
- 服务注册发现:Nacos
- 服务限流降级:Sentinel
- 分布配置中⼼心:Nacos
- 服务⽹网关:SpringCloud Gateway
- 服务之间调⽤用:Feign、Ribbon
- 链路路追踪:Sleuth+Zipkin
-
版本说明
- 【注意⽂文档:】官⽅方经常改地址,如果本课程的地址失
效后重新搜索下找⼊入⼝口 - Spring5以上
- SpringBoot2.x以上
- AlibabaCloud 版本 2.2.x https://spring.io/projects/spring-cloud-alibaba#learn
- SpirngCloud版本 Hoxton https://spring.io/projects/s pring-cloud
- 【注意⽂文档:】官⽅方经常改地址,如果本课程的地址失
第2集 在线教育微服务模块设计和环境 准备
简介:在线教育环微服务模块划分和环境准备
- 在线教育模块划分
- 视频服务
- 订单服务
- 用户服务
- 必备基础环境:JDK8以上版本+Maven3.5(采⽤用默 认)+IDEA旗舰版+Mysql5.7以上版本
- 操作系统:Linux Centos7 64位(虚拟机) 或者 Mac苹果系 统
- 虚拟机可以搜索博⽂文
- Windows有些软件会不不兼容,且坑难排查
- 课程围绕这个基础项⽬目进⾏行行学习 ⼩小⽽而精的⽅方式学习微服务
第3集 在线教育微服务数据库介绍和数 据导⼊入
简介:讲解在线教育数据库表介绍和导⼊入
(mysql8.0导入)
- 采⽤用3个数据库,每个服务单独⼀一个库(资料中有sql文件)
- 视频服务数据库cloud_video
- ⽤用户服务数据库 cloud_user
- 订单服务数据库cloud_order表
第4集 Maven聚合⼯工程创建微服务项⽬目实战
简介:使⽤用Maven聚合⼯工程创建微服务架构
使用jdk11创建 classcloud
- maven聚合⼯工程
- class-common(公共包)
- class-video-service
- class-user-service
- class-order-service
- 创建聚合⼯工程(记得删除聚合⼯工程src⽬目录)
<properties>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<spring.boot.version>2.3.3.RELEASE</spring.boot.version>
</properties>
<!--锁定版本-->
<dependencyManagement>
<dependencies>
<!--springboot版本下面是spring-boot最新版本的地址-->
<!--https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/2.3.3.RELEASE-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud版本下面是spring-cloud最新版本的地址-->
<!--https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies/Hoxton.SR8-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud-alibaba版本下面是spring-cloud-alibaba最新版本的地址-->
<!--https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies/2.2.1.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 添加子项目依赖(除common都需要添加)
<dependencies>
<!--springboot启动包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.class</groupId>
<artifactId>class-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
第5集 AlibabaCloud微服务Mybatis连接 Mysql数据库
简介:微服务打通Mybatis连接Mysql数据库
- 创建common包实体类(org.classes.domain)
- pom依赖引入lombok
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
@Data
public class User {
private Integer id;
private String name;
private String pwd;
private String headImg;
private String phone;
private Date createTime;
private String wechat;
}
@Data
public class Video {
private Integer id;
private String title;
private String summary;
private String coverImg;
private Integer price;
private Date createTime;
private Double point;
}
@Data
public class VideoOrder {
private Integer id;
private String outTradeNo;
private Integer state;
private Date createTime;
private Integer totalFee;
private Integer videoId;
private String videoTitle;
private String videoImg;
private Integer userId;
}
- Mybatis依赖导⼊入+数据库配置
- class-video-service
- class-user-service
- class-order-service
- 聚合⼯工程pom.xml修改【注意】
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-
starter</artifactId>
<version>2.1.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 3个模块添加mybatis依赖和数据库驱动
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- 3个模块配置数据库连接(记得修改 端⼝口、应⽤用名称、数 据库名称)
server:
port: 9000
spring:
application:
name: class-order-service
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/cloud_order??useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
# 控制台输出sql、下划线转驼峰
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
写一个控制层测试video
- controller->service->mapper 开发
- application配置
@SpringBootApplication
@MapperScan("org.classes.mapper")
mapper层
@Repository
//@Repository注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean
public interface VideoMapper {
/**
* 根据id查询
*
* @param videoid
* @return
*/
@Select("select * from video where id=#{videoid}")
Video findById(@Param("videoid") int videoid);
}
第6集 初探微服务之间的调⽤用-下单购买视频
简介:初探微服务直接的调⽤用-下单购买视频
-
服务直接怎么调用:
-
RPC: 远程过程调⽤用,像调⽤用本地服务(⽅方法)⼀一样调⽤用服务器器的
- 服务
- ⽀支持同步、异步调⽤用
- 客户端和服务器器之间建⽴立TCP连接,可以⼀一次建⽴立⼀一个,也可以多个调⽤用复⽤用⼀一次链接
- RPC数据包⼩小
- protobuf
thrift rpc:编解码,序列列化,链接,丢包,协议
- 服务
-
Rest(Http):
http请求,⽀支持多种协议和功能 开发⽅方便便成本低
http数据包⼤大 java开发:resttemplate或者httpclient -
用户下单
- 订单服务->视频服务(查询价格和冗余信息)
- 在order启动类添(resttemplate springboot默认就有)
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
- order下单控制层
@RequestMapping("/api/order/v1/")
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("save")
public Object save(@RequestParam String videoId) {
Video video = restTemplate.getForObject("http://localhost:9002/api/video/v1/find_by_id?videoId=" + videoId, Video.class);
VideoOrder videoOrder = new VideoOrder();
BeanUtils.copyProperties(video,videoOrder);
return videoOrder;
}
}
- postman⼯工具测试(安装包在资料料⾥里里⾯面)
- 存在的问题:
- 服务之间的IP信息写死
- 服务之间⽆无法提供负载均衡
- 多个服务直接关系调⽤用维护复杂
第三章 AlibabaCloud核⼼心组件服务治理理 Nacos实战
第1集 什么是微服务的注册中⼼心
简介:什么是注册中⼼心和常⻅见的注册中⼼有哪些
- 什什么是注册中⼼心(服务治理理)
- 服务注册:服务提供者provider,启动的时候向注册中 ⼼心上报⾃自⼰己的⽹网络信息
- 服务发现:服务消费者consumer,启动的时候向注 册中⼼心上报⾃自⼰己的⽹网络信息,拉取provider的相关 ⽹网络信息
- 核⼼心:服务管理理,是有个服务注册表,⼼心跳机制动态维 护,服务实例例在启动时注册到服务注册表,并在关闭时 注销。
- 服务注册:服务提供者provider,启动的时候向注册中 ⼼心上报⾃自⼰己的⽹网络信息
- 为什什么要⽤用
- 微服务应⽤用和机器器越来越多,调⽤用⽅方需要知道接⼝口的⽹网络地址,如果靠配置⽂文件的⽅方式去控制⽹网络地址,对于动态新增机器器,维护带来很⼤大问题
- 主流的注册中⼼心:zookeeper、Eureka、consul、etcd、 Nacos
- AlibabaCloud搭配最好的是Nacos,且服务的注册发现 之外,还⽀支持动态配置服务
- 参考图⽚片(nacos官⽹网)
第2集 AlibabaCloud注册中⼼心Nacos实战
简介:介绍什么是Nacos和搭建实战
- 注册中⼼心Nacos介绍
- 官网:https://nacos.io/zh-cn/
- Linux/Mac安装Nacos
- 解压安装包
- 进⼊入bin⽬目录
- 启动 sh startup.sh -m standalone
- 访问 localhost:8848/nacos
- 默认账号密码 nacos/nacos
第3集 基于Nacos实现订单-视频服务之间的调⽤用
简介:项⽬目集成Nacos实现服务直接的调⽤用
- 视频服务集成Nacos
- 添加依赖
<!--添加nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置Nacos地址
server:
port: 9000
spring:
application:
name: class-video-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 启动类增加注解
@EnableDiscoveryClient
- 订单服务集成Nacos
- ⽤用户服务集成Nacos
- 服务之间的调⽤用
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("save")
public Object save(@RequestParam String videoId) {
// Video video = restTemplate.getForObject("http://localhost:9002/api/video/v1/find_by_id?videoId=" + videoId, Video.class);
List<ServiceInstance> instances = discoveryClient.getInstances("class-video-service");
ServiceInstance serviceInstance = instances.get(0);
Video video = restTemplate.getForObject("http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/api/video/v1/find_by_id?videoId=" + videoId, Video.class);
VideoOrder videoOrder = new VideoOrder();
BeanUtils.copyProperties(video, videoOrder);
return videoOrder;
}
第4集 大话常⻅见的负载均衡策略略和解决⽅方案
简介:讲解什么负载均衡和常⻅见的解决⽅方案
-
什什么是负载均衡(Load Balance)
分布式系统中⼀一个⾮非常重要的概念,当访问的服务具有多个实 例例时,需要根据某种“均衡”的策略略决定请求发往哪个节点, 这就是所谓的负载均衡, 原理理是将数据流量量分摊到多个服务器器执⾏行行,减轻每台服务器器的 压⼒力力,从⽽而提⾼高了了数据的吞吐量量
-
软硬件⻆角度负载均衡的种类
- 通过硬件来进⾏行行解决,常⻅见的硬件有NetScaler、F5、 Radware和Array等商⽤用的负载均衡器器,但⽐比较昂贵的
- 通过软件来进⾏行行解决,常⻅见的软件有LVS、Nginx等,它 们是基于Linux系统并且开源的负载均衡策略略
-
从端的⻆角度负载均衡有两种
- 服务端负载均衡
- 客户端负载均衡
-
常⻅见的负载均衡策略略(看组件的⽀支持情况)
- 节点轮询
- 简介:每个请求按顺序分配到不不同的后端服务器器
- weight 权重配置
- 简介:weight和访问⽐比率成正⽐比,数字越⼤大,分配得到的流量量越⾼高
- 固定分发
- 简介:根据请求按访问ip的hash结果分配,这样每 个⽤用户就可以固定访问⼀一个后端服务器器
- 随机选择、最短响应时间等等
- 节点轮询
第5集 AlibabaCloud集成Ribbon实现负载均衡
简介:AlibabaCloud集成Ribbon实现负载均衡
- 什什么是Ribbon Ribbon是⼀一个客户端负载均衡⼯工具,通过 Spring Cloud封装,可以轻松和AlibabaCloud整合
- 订单服务增加@LoadBalanced 注解(就启用了负载均衡策略)
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
- 修改视频服务
@Data
public class Video {
private Integer id;
private String title;
private String summary;
private String coverImg;
private Integer price;
private Date createTime;
private Double point;
private String serverInfo;
}
@RequestMapping("find_by_id")
public Object findById(@RequestParam("videoId") int videoId, HttpServletRequest request) {
Video byId = videoService.findById(videoId);
byId.setServerInfo(request.getServerName() + ":" + request.getServerPort());
return byId;
}
- 修改订单服务
@Data
public class VideoOrder {
private Integer id;
private String outTradeNo;
private Integer state;
private Date createTime;
private Integer totalFee;
private Integer videoId;
private String videoTitle;
private String videoImg;
private Integer userId;
private String serverInfo;
}
- 调⽤用实战
@GetMapping("save")
public Object save(@RequestParam String videoId) {
// Video video = restTemplate.getForObject("http://localhost:9002/api/video/v1/find_by_id?videoId=" + videoId, Video.class);
// List<ServiceInstance> instances = discoveryClient.getInstances("class-video-service");
// ServiceInstance serviceInstance = instances.get(0);
Video video = restTemplate.getForObject("http://class-video-service/api/video/v1/find_by_id?videoId=" + videoId, Video.class);
VideoOrder videoOrder = new VideoOrder();
BeanUtils.copyProperties(video, videoOrder);
return videoOrder;
}
查看效果
第四章 【⾼高级篇幅】负载均衡进阶之 Ribbon和Feign实战+源码分析
第1集 【源码剖析】⼿手把⼿手教学-Ribbon负载均 衡源码实战
简介: 讲解ribbon服务间调⽤用负载均衡源码分析
-
源码分析思路路
- LoadBalancerClient
- 进入实现类(LoadBalancerClient) RibbonLoadBalancerClient
- 114 行核心方法/入口 execute
- 点击 117行的getServer
- 点击189 行的 chooseServer
- 进入到(ILoadBalancer)的DynamicServerListLoadBalancer
- 但是你会发现没有chooseServer的方法,查看父类BaseLoadBalancer
- 746行chooseServer默认不会走null
- 走的elserule.choose点击rule(755)
-
protected IRule rule = DEFAULT_RULE;
- 就是
-
点击 LoadBalanced
第2集 高级篇之AlibabaCloud负载均衡策略略调 整实战
简介:⾃自定义Ribbon负载均衡策略略实战
- 源码分析知道ribbon⽀支持多种负载均衡策略略
- Ribbon⽀支持的负载均衡策略略介绍
- 负载均衡策略略调整实战
订单服务增加配置-使用随机(搜索IRule,找自己想用的策略)
class-video-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- 策略略选择: 1、如果每个机器器配置⼀一样,则建议不不修改策 略略 (推荐) 2、如果部分机器器配置强,则可以改为 WeightedResponseTimeRule
第3集 微服务新⼀一代负载均衡组件Open-Feign 介绍
简介:讲解新⼀一代负载均衡组件feign介绍
-
原先ribbon代码存在的问题:不不规范,⻛风格不不统⼀一,维护
性⽐比较差 -
什什么是Feign:
SpringCloud提供的伪http客户端(本质还是⽤用http),封 装了了Http调⽤用流程,更更适合⾯面向接⼝口化 让⽤用Java接⼝口注解的⽅方式调⽤用Http请求.
不用像Ribbon中通过封装HTTP请求报⽂文的⽅方式调⽤用 Feign 默认集成了了Ribbon -
官⽅文档
-
Nacos⽀支持Feign,可以直接集成实现负载均衡的效果
第4集 改造微服务 集成Open-Feign实现远程⽅方 法调⽤用
简介:改造微服务 集成Feign实现远程⽅方法调⽤用
- Feign让⽅方法调⽤用更更加解耦
- 使⽤用feign步骤讲解
- 加⼊入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 配置注解
启动类增加@EnableFeignClients
- 增加一个接⼝口
订单服务增加接⼝口,服务名称记得和nacos保持⼀一样 @FeignClient(name="class-video-service")
- 编写代码
@FeignClient(name = "class-video-service")
public interface VideoFeignService {
@GetMapping(value = "/api/v1/video/find_by_id")
Video findById(@RequestParam("videoId") int videoId);
}
- 测试
@GetMapping("save")
public Object save(@RequestParam String videoId) {
// Video video = restTemplate.getForObject("http://localhost:9002/api/video/v1/find_by_id?videoId=" + videoId, Video.class);
// List<ServiceInstance> instances = discoveryClient.getInstances("class-video-service");
// ServiceInstance serviceInstance = instances.get(0);
// Video video = restTemplate.getForObject("http://class-video-service/api/video/v1/find_by_id?videoId=" + videoId, Video.class);
Video video = videoFeignService.findById(videoId);
VideoOrder videoOrder = new VideoOrder();
BeanUtils.copyProperties(video, videoOrder);
return videoOrder;
}
第5集 post方式对象传输 Open-Feign 实现远程 方法调⽤
简介:改造微服务 集成Feign实现远程⽅方法调⽤用
- GET⽅方式查询简单
- POST⽅方式提交怎么做
- 注意:
- 路路径 核对
- Http⽅方法必须对应
- 使⽤用服务提供⽅方⽤用@RequestBody,要使⽤用
@PostMapping
- Ribbon和feign两个的区别和选择
选择feign
默认集成了了ribbon 写起来更更加思路路清晰和⽅方便便 采⽤用注解⽅方式进⾏行行配置,配置熔断等⽅方式⽅方便便
第五章 【⾯面试题】想成为架构师的你不不 可不不知道的分布式架构理理论
第1集 【⾯面试题】掌握微服务你必须知道的CAP 理理论
简介:讲解分布式应⽤用核⼼心CAP知识
-
CAP定理理: 指的是在⼀一个分布式系统中,Consistency(⼀一 致性)、 Availability(可⽤用性)、Partition tolerance(分区容错性),三者不不可同时获得
- 一致性©:所有节点都可以访问到最新的数据
- 可⽤用性(A):每个请求都是可以得到响应的,不不管请 求是成功还是失败
- 分区容错性§:除了了全部整体⽹网络故障,其他故障 都不不能导致整个系统不不可⽤用
-
CAP理理论就是说在分布式存储系统中,最多只能实现上⾯面 的两点。⽽而由于当前的⽹网络硬件肯定会出现延迟丢包等问 题,所以分区容忍性是我们必须需要实现的。所以我们只 能在⼀一致性和可⽤用性之间进⾏行行权衡
CA: 如果不不要求P(不不允许分区),则C(强⼀一致性)和A(可 ⽤用性)是可以保证的。但放弃P的同时也就意味着放弃了了系统的 扩展性,也就是分布式节点受限,没办法部署⼦子节点,这是违背 分布式系统设计的初衷的
CP: 如果不不要求A(可⽤用),每个请求都需要在服务器器之间保持 强⼀一致,⽽而P(分区)会导致同步时间⽆无限延⻓长(也就是等待数据 同步完才能正常访问服务),⼀一旦发⽣生⽹网络故障或者消息丢失等 情况,就要牺牲⽤用户的体验,等待所有数据全部⼀一致了了之后再让 ⽤用户访问系统
AP:要⾼高可⽤用并允许分区,则需放弃⼀一致性。⼀一旦分区发⽣生,节 点之间可能会失去联系,为了了⾼高可⽤用,每个节点只能⽤用本地数据 提供服务,⽽而这样会导致全局数据的不不⼀一致性。
第2集 【⾯面试题】CAP⾥里里⾯面下的注册中⼼心选择思 考
简介:讲解常⻅见的分布式核⼼心CAP理理论介绍
- 常⻅见注册中⼼心:zk、eureka、nacos
- 那你应该怎么选择
- Zookeeper:CP设计,保证了了⼀一致性,集群搭建的时候,
某个节点失效,则会进⾏行行选举⾏行行的leader,或者半数以上
节点不不可⽤用,则⽆无法提供服务,因此可⽤用性没法满⾜足 - Eureka:AP原则,⽆无主从节点,⼀一个节点挂了了,⾃自动切换其他节点可以使⽤用,去中⼼心化
- 结论:
- 分布式系统中P,肯定要满⾜足,所以只能在CA中⼆二选⼀一
- 没有最好的选择,最好的选择是根据业务场景来进⾏行行架
构设计 - 如果要求⼀一致性,则选择zookeeper/Nacos,如⾦金金融⾏行业 CP
- 如果要求可⽤用性,则Eureka/Nacos,如电商系统 AP
- CP : 适合⽀支付、交易易类,要求数据强⼀一致性,宁可业
务不不可⽤用,也不不能出现脏数据 - AP: 互联⽹网业务,⽐比如信息流架构,不不要求数据强⼀一
致,更更想要服务可⽤用
第3集 【⾯面试题】⼀一致性和可⽤用性的权衡结果BASE理理论
简介:讲解分布式CAP的权衡结果 BASE理理论
- 什什么是Base理理论
CAP 中的⼀一致性和可⽤用性进⾏行行⼀一个权衡的结果,
核⼼心思想是:
我们⽆无法做到强⼀一致,但每个应⽤用都可以根据⾃自身的业务特点,
采⽤用适当的⽅方式来使系统达到最终⼀一致性, 来⾃自 ebay 的架构
师提出 - Basically Available(基本可⽤用)
- 假设系统,出现了了不不可预知的故障,但还是能⽤用, 可能
会有性能或者功能上的影响 - Soft state(软状态)
- 允许系统中的数据存在中间状态,并认为该状态不不影响
系统的整体可⽤用性,即允许系统在多个不不同节点的数据
副本存在数据延时
- 允许系统中的数据存在中间状态,并认为该状态不不影响
- Eventually consistent(最终⼀一致性)
- 系统能够保证在没有其他新的更更新操作的情况下,数据
最终⼀一定能够达到⼀一致的状态,因此所有客户端对系统
的数据访问最终都能够获取到最新的值
- 系统能够保证在没有其他新的更更新操作的情况下,数据
- 假设系统,出现了了不不可预知的故障,但还是能⽤用, 可能
第六章 高并发下的微服务架构存在的问题和解决⽅方案
第1集 海量量请求下的微服务架构存在的问题
简介:⾼高并发下的微服务存在的问题
-
⾼高并发下存在的问题
- 微服务拆分多个系统,服务之间互相依赖,可能会由于
系统负载过⾼高,突发流量或者网络等各种异常情况 导致
服务不可用。
- 微服务拆分多个系统,服务之间互相依赖,可能会由于
-
核⼼心思想-⾯面向失败编程
- 不要外界影响
- 不被请求拖垮
第2集 面向失败编程-微服务架构容错⽅方案介绍
简介:⾼高并发下的微服务容错⽅方案
-
限流
-
漏斗,不管流量量多⼤大,均匀的流⼊入容器器,令牌桶算法,漏桶算法
-
熔断:
- 保险丝,熔断服务,为了了防⽌止整个系统故障,包含当前
和下游服务 下单服务 -》商品服务-》⽤用户服务 -》(出
现异常-》熔断⻛风控服务
- 保险丝,熔断服务,为了了防⽌止整个系统故障,包含当前
-
降级:
- 抛弃⼀一些⾮非核⼼心的接⼝口和数据,返回兜底数据 旅行箱的例子:只带核⼼心的物品,抛弃⾮非核⼼心的,等有条件的时候再去携带这些物品
-
隔离:服务和资源互相隔离,⽐比如⽹网络资源,机器器资源,线程
资源等,不会因为某个服务的资源不足⽽而抢占其他服务的资源- 熔断和降级互相交集
- 相同点:
- 从可⽤用性和可靠性触发,为了了防⽌止系统崩溃
- 最终让⽤用户体验到的是某些功能暂时不不能⽤用
- 不同点
- 服务熔断一般是下游服务故障导致的,而服务降级
一般是从整体系统负荷考虑,由调用⽅控制
- 服务熔断一般是下游服务故障导致的,而服务降级
- 相同点:
- 熔断和降级互相交集
-
想进行微服务的容错,业界⽬目前有Sentinel、Hystrix,相
对于AlibabaCloud⽽而⾔言,Sentinel是最好的搭配
第3集 新版分布式系统的流量量防卫兵-Sentinel介绍
简介:介绍什么是分布式系统的流量量防卫兵Sentinel
- 什么是Sentinel
- 阿里巴巴开源的分布式系统流控⼯工具
- 以流量为切入点,从流量控制、熔断降级、系统负载保
护等多个维度保护服务的稳定性 - 丰富的应用场景:消息削峰填谷、集群流量控制、实时
熔断下游不可用应⽤用等 - 完备的实时监控:Sentinel 同时提供实时的监控功能
- 提供开箱即⽤用的与其它开源框架/库的整合模块,例如
与 Spring Cloud、Dubbo、gRPC 的整合
- 官⽹网:https://github.com/alibaba/Sentinel/wiki/介绍
Sentinel版本:2.2.1 - 核⼼心概念:
- 资源:是 Sentinel 中的核心概念之一,可以是java程序
中任何内容,可以是服务或者方法甚至代码,总结起来就是我们要保护的东西 - 规则:定义怎样的方式保护资源,主要包括流控规则、
熔断降级规则等
- 资源:是 Sentinel 中的核心概念之一,可以是java程序
第4集 流量防卫兵-Sentinel依赖引入和控制台搭建
简介:微服务引⼊入Sentinel和控制台搭建
- Sentinel 分为两个部分
- 核⼼心库(Java 客户端)不不依赖任何框架/库,能够运⾏行行
于所有 Java 运⾏行行时环境,同时对 Dubbo、Spring
Cloud 等框架也有较好的⽀支持。 - 控制台(Dashboard)基于 Spring Boot 开发,打包后
可以直接运⾏行行,不不需要额外的 Tomcat 等应⽤用容器器。
- 核⼼心库(Java 客户端)不不依赖任何框架/库,能够运⾏行行
- 微服务引⼊入Sentinel依赖
<!--引入sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- Sentinel控制台搭建
- 文档:https://sentinelguard.io/zh-cn/docs/dashboard.html
- 控制台包含如下功能:
- 查看机器器列列表以及健康情况:收集 Sentinel 客户端发
送的心跳包,⽤于判断机器器是否在线。 - 监控 (单机和集群聚合)通过 Sentinel 客户端暴暴露露的监控
API,定期拉取并且聚合应⽤用监控信息,最终可以实现秒级的实时控。 - 规则管理理和推送:统⼀一管理理推送规则。
- 鉴权:生产环境中鉴权⾮非常重要。这里每个开发者需要
根据自己的实际情况进行定制。
- 查看机器器列列表以及健康情况:收集 Sentinel 客户端发
//启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版
本,
//-Dserver.port=8080 ⽤用于指定 Sentinel 控制台端⼝口
为 8080
//默认⽤用户名和密码都是 sentinel
nohup java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar &
第5集 AliababCloud微服务整合Sentinel限流配置实战
简介:讲解AliababCloud微服务整合Sentinel限流配置实操
- 多个微服务接⼊入Sentinel配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
sentinel:
transport:
##控制台ip+端口
dashboard: 127.0.0.1:8080
#这个微服务和sentinel通信的端口
port: 9999
- 微服务注册上去后,由于Sentinel是懒加载模式,所以需
要访问微服务后才会在控制台出现 - 限流配置实操
- 控制台配置
- 浏览器器刷新
第七章 【进阶篇幅】玩转Sentinel多种流空规则和实战
第1集 玩转Sentinel流量量控制功能
简介:讲Sentinel流量量控制详细操作
- 流量量控制(flow control)
- 原理理是监控应⽤用流量量的 QPS 或并发线程数等指标,当
达到指定的阈值时对流量量进⾏行行控制,以避免被瞬时的流量高峰冲垮,从⽽而保障应⽤用的⾼高可⽤用性。
- 原理理是监控应⽤用流量量的 QPS 或并发线程数等指标,当
- 两种规则
- 基于统计并发线程数的流量量控制
并发数控制⽤用于保护业务线程池不不被慢调⽤用耗尽
Sentinel 并发控制不不负责创建和管理理线程池,⽽而是简单统
计当前请求上下⽂文的线程数⽬目(正在执⾏行行的调⽤用数⽬目)
如果超出阈值,新的请求会被⽴立即拒绝,效果类似于信号量量隔
离
- 基于统计QPS的流量量控制
- 当 QPS 超过某个阈值的时候,则采取措施进⾏行行流量量控制
- 控制⾯面板介绍
- 资源名:默认是请求路路径,可⾃自定义
- 针对来源:对哪个微服务进⾏行行限流,默认是不不区分来源,全部限流,这个是针对 区分上游服务进⾏行行限流, ⽐比
如 视频服务 被 订单服务、⽤用户服务调⽤用,就可以针对
来源进行限流
第2集 基于并发线程数进⾏行行限流配置实操
简介:基于并发线程进⾏行行限流配置实操
- 开发临时接⼝口,⽅方便便测试
@RequestMapping("list")
public Object list() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
Map<String, String> map = new HashMap<>();
map.put("title1", "ALibabaCloud微服务专题");
map.put("title2", "fdsfd");
return map;
}
- 基于统计并发线程数的流量量控制
并发数控制⽤用于保护业务线程池不不被慢调⽤用耗尽
Sentinel 并发控制不不负责创建和管理理线程池,⽽而是简单统计当
前请求上下⽂文的线程数⽬目(正在执⾏行行的调⽤用数⽬目)
如果超出阈值,新的请求会被⽴立即拒绝,效果类似于信号量量隔
离。并发数控制通常在调⽤用端进⾏行行配置
- 流控规则会下发到微服务,微服务如果重启,则流控规则
会消失可以持久化配置 - 选择阈值类型 ”线程数“ ,配置是1
- 刷新浏览器器
第3集 流控规则效果-直接拒绝-冷启动预热-匀速排队讲解
简介:基于并发线程进⾏行行限流配置实操
- 流量量控制的效果包括以下⼏几种:
- 直接拒绝:默认的流量量控制⽅方式,当QPS超过任意规则
的阈值后,新的请求就会被⽴立即拒绝 - Warm Up:冷启动/预热,如果系统在此之前⻓长期处于
空闲的状态,我们希望处理理请求的数量量是缓步的增多,
经过预期的时间以后,到达系统处理理请求个数的最⼤大值 - 匀速排队:严格控制请求通过的间隔时间,也即是让请
求以均匀的速度通过,对应的是漏漏桶算法,主要⽤用于处理间隔性突发的流量量,如消息队列列,想象⼀一下这样的场
景,在某⼀一秒有⼤大量量的请求到来,⽽而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第⼀一秒直接拒绝多余的请求
- 直接拒绝:默认的流量量控制⽅方式,当QPS超过任意规则
- 注意:
- 匀速排队等待策略略是 Leaky Bucket 算法结合虚
拟队列列等待机制实现的。 - 匀速排队模式暂时不不⽀支持 QPS > 1000 的场景
- 匀速排队等待策略略是 Leaky Bucket 算法结合虚
- 流控⽂文档
第4集 新版Sentinel-微服务高可⽤利利器器-熔断降级规则讲解
简介:讲解 微服务高可⽤利器Sentinel熔断降级规则
- 备注:如果 簇点链路路 没数据,刷多几次接⼝
- 熔断降级(虽然是两个概念,基本都是互相配合)
- 对调用链路中不不稳定的资源进⾏行行熔断降级也是保障⾼高可
⽤用的重要措施之⼀一 - 对不不稳定的弱依赖服务调⽤用进⾏行行熔断降级,暂时切断不不稳定调用,避免局部不不稳定因素导致整体的雪崩
- 熔断降级作为保护自身的手段,通常在客户端(调⽤
端)进行配置
- 对调用链路中不不稳定的资源进⾏行行熔断降级也是保障⾼高可
- 什是Sentinel降级规则
- 文档:https://github.com/alibaba/Sentinel/wiki/熔断降级
- 就是配置一定规则,然后满⾜足之后就对服务进行熔断降
级
- Sentinel 熔断策略略
- 慢调⽤用⽐比例例(响应时间): 选择以慢调⽤用⽐比例例作为阈值,需要设置允许的慢调⽤用 RT(即最⼤大的响应时间),请求的响应时间⼤大于该值则统计为慢调⽤
- ⽐例阈值:修改后不生效-目前已经反馈给官⽅方那边的bug
- 熔断时⻓:超过时间后会尝试恢复
- 最小请求数:熔断触发的最⼩小请求数,请求数小于
该值时即使异常比率超出阈值也不会熔断
- 异常比例:当单位统计时⻓长内请求数目⼤大于设置的最小
请求数⽬目,并且异常的比例大于阈值,则接下来的熔断时长内请求会⾃自动被熔断- 比例阈值
- 熔断时长:超过时间后会尝试恢复
- 最小请求数:熔断触发的最小请求数,请求数小于
该值时,即使异常比率超出阈值也不会熔断 - 异常数:当单位统计时⻓长内的异常数⽬目超过阈值之后会
自动进行熔断 - 异常数:
- 熔断时⻓长:超过时间后会尝试恢复
- 最⼩请求数:熔断触发的最小请求数,请求数小于
该值时即使异常⽐比率超出阈值也不会熔断
第5集 新版Sentinel的熔断状态和恢复讲解
简介:讲解服务调用常见的熔断状态和恢复
- 服务熔断一般有三种状态(画图)
- 熔断关闭(Closed)
- 服务没有故障时,熔断器所处的状态,对调用方的
调用不做任何限制
- 服务没有故障时,熔断器所处的状态,对调用方的
- 熔断开启(Open)
- 后续对该服务接⼝口的调⽤用不不再经过⽹网络,直接执⾏行本地的fallback⽅方法
- 半熔断(Half-Open)
- 所谓半熔断就是尝试恢复服务调⽤用,允许有限的流
量量调用该服务,并监控调⽤用成功率
- 所谓半熔断就是尝试恢复服务调⽤用,允许有限的流
- 熔断关闭(Closed)
- 熔断恢复:
- 经过熔断时长后熔断器会进入探测恢复状态(HALFOPEN
状态)尝试恢复服务调⽤用,允许有限的流量量调⽤用
该服务,并监控调⽤用成功率。 - 如果成功率达到预期,则说明服务已恢复,进⼊入熔断关
闭状态;如果成功率仍旧很低,则重新进⼊入熔断状态
- 经过熔断时长后熔断器会进入探测恢复状态(HALFOPEN
第6集 新版Sentinel整合AlibabaCloud微服务熔断实操
简介:讲解服务调⽤用熔断例⼦
- 修改代码
int temp = 0;
@RequestMapping("list")
public Object list() {
// try {
// TimeUnit.SECONDS.sleep(3);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
temp++;
if (temp % 3 == 0) {
throw new RuntimeException();
}
Map<String, String> map = new HashMap<>();
map.put("title1", "ALibabaCloud微服务专题");
map.put("title2", "fdsfd");
return map;
}
- 熔断测试
第八章 【高级篇幅】玩转Sentinel⾃自定义异常-整合Open-Feign
第1集 AlibabaCloud版本升级-⾃自定义降级异常不向下兼容的坑
简介:讲解Sentinel⾃自定义异常降级-新旧版本差异
- 默认降级返回数据问题
- 限流和熔断返回的数据有问题
- 微服务交互基本都是json格式,如果让⾃自定义异常信息
- AlibabCloud版本升级,不不兼容问题
- v2.1.0到v2.2.0后,Sentinel⾥里里⾯面依赖进⾏行行了了改动,且不不向下兼容
- ⾃自定义降级返回数据
- 【旧版】实现UrlBlockHandler并且重写blocked⽅方法
- 【新版】实现BlockExceptionHandler并且重写handle
⽅方法
第2集 新版Sentinel⾃自定义降级异常数据开发实战
简介:讲解新版Sentinel⾃自定义异常数据开发实战
- 异常种类
- FlowException //限流异常
- DegradeException //降级异常
- ParamFlowException //参数限流异常
- SystemBlockException //系统负载异常
- AuthorityException //授权异常
- 【新版】实现BlockExceptionHandler并且重写handle⽅方
法
@Component
public class ClassBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
HashMap<Object, Object> info = new HashMap<>();
//流量异常
if (e instanceof FlowException) {
info.put("code", "-1");
info.put("msg", "限流异常");
}
//流量异常
if (e instanceof DegradeException) {
info.put("code", "-1");
info.put("msg", "降级异常");
}
//热点参数异常
if (e instanceof ParamFlowException) {
info.put("code", "-1");
info.put("msg", "热点参数异常");
}
//热点参数异常
if (e instanceof SystemBlockException) {
info.put("code", "-1");
info.put("msg", "系统负载异常");
}
//热点参数异常
if (e instanceof AuthorityException) {
info.put("code", "-1");
info.put("msg", "热点参数异常");
}
//设置json返回
httpServletResponse.setStatus(200);
httpServletResponse.setHeader("content-Type","application/json;charset=UTF-8");
httpServletResponse.getWriter().write(JSON.toJSONString(info));
}
}
第3集 新版Sentinel整合OpenFeign配置实战
简介:使⽤用Feign整合Sentinel配置实战
- 依赖
<!--引入sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 开启Feign对Sentinel的⽀支持
#开启Feign对Sentinel的⽀支持
feign:
sentinel:
enabled: true
- 修改feign接口
@FeignClient(name = "class-video-service", fallback = VideoFeignServiceFallback.class)
- 创建feign接口兜底数据
@Service
public class VideoFeignServiceFallback implements VideoFeignService {
@Override
public Video findById(String videoId) {
Video video = new Video();
video.setId(123123);
video.setCoverImg("失败了");
video.setSummary("失败了");
video.setTitle("失败了");
return video;
}
}
第九章 JDK11 LTS⻓长期⽀支持版本
第1集 简介:讲解JDK⼀一些基础知识科普
简介:讲解JDK⼀一些基础知识科普
-
OpenJDK和OracleJDK版本区别
- OpenJDK是JDK的开放源码版本,以GPL协议的形式发
布(General Public License) - Oracle JDK采⽤用了了商业实现
- OpenJDK是JDK的开放源码版本,以GPL协议的形式发
-
LTS 是啥意思?
- Long Term Support ⻓长期⽀支持的版本,如JDK8、JDK11
都是属于LTS - JDK9 和 JDK10 这两个被称为“功能性的版本”不不同, 两者
均只提供半年年的技术⽀支持 - 甲⻣骨⽂文释出Java的政策,每6个⽉月会有⼀一个版本的释
出,长期支持版本每三年年发布⼀一次,根据 后续的发布计
划,下一个⻓长期⽀支持版 Java 17 将于2021年年发布 - 8u20、11u20是啥意思?
- 就是Java的补丁,⽐比如JDK8的 8u20版本、8u60版本;
java11的 11u20、11u40版本
- Long Term Support ⻓长期⽀支持的版本,如JDK8、JDK11
第十章 微服务核心组件之⽹网关讲解
第1集 什么是微服务的网关和应用场景
简介:介绍什么是微服务的网关和应用场景
- 什么是⽹网关
- API Gateway,是系统的唯一对外的⼊入⼝口,介于客户端
和服务器端之间的中间层,处理⾮业务功能 提供路路由请求、鉴权、监控、缓存、限流等功能 - 统⼀接⼊入
- 智能路路由
- AB测试、灰度测试
- 负载均衡、容灾处理理
- ⽇日志埋点(类似Nignx⽇日志)
- 流量量监控
- 限流处理理
- 服务降级
- 安全防护
- 鉴权处理理
- 监控
- 机器器⽹网络隔离
- API Gateway,是系统的唯一对外的⼊入⼝口,介于客户端
- 主流的⽹网关
- zuul:是Netflix开源的微服务⽹网关,和Eureka,Ribbon,Hystrix等组件配合使⽤用,依赖组件⽐较多,性能教差
- kong: 由Mashape公司开源的,基于Nginx的API gateway
- nginx+lua:是一个⾼高性能的HTTP和反向代理理服务器器,lua
是脚本语⾔言,让Nginx执行Lua脚本,并且高并发、非阻塞
的处理各种请求 - springcloud gateway: Spring公司专⻔门开发的⽹网关,替代
zuul - 注意:AlibabaCloud全家桶还没对应的网关,我们就⽤用
SpringCloud官⽅方推荐的Gateway
第2集 微服务的网关SpringCloud Gateway介绍
简介:介绍网关SpringCloud Gateway
- 什么是 SpringCloud Gateway
- Spring官⽅方出品,基于Spring5+Reactor技术开发的⽹网
关 - 性能强劲基于Reactor+WebFlux、功能多样
- 基于springboot2.x, 直接可以jar包方式运⾏
- Spring官⽅方出品,基于Spring5+Reactor技术开发的⽹网
- 官⽅方⽂文档
- https://spring.io/projects/spring-cloud-gateway
第3集 SpringCloud Gateway项目创建和依赖添加
简介:创建SpringCloud⽹网关项⽬目和依赖添加
- 创建Gateway项⽬目
class-api-gateway - 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- 配置实战
server:
port: 8888
spring:
application:
name: api-gateway
# zipkin:
# base-url: http://127.0.0.1:9411/ #zipkin地址
# discovery-client-enabled: false #不用开启服务发现
# sleuth:
# sampler:
# probability: 1.0 #采样百分比
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes: #数组形式
- id: order-service #路由唯一标识
uri: http://127.0.0.1:8000 #想要转发到的地址
# uri: lb://class-order-service #从nocas进行转发
order: 1 #优先级,数字越小优先级越高
predicates: #断言 配置哪个路径才转发
- Path=/order-service/**
#- Before=2020-09-11T01:01:01.000+08:00 # 在这个时间点之后不能访问
#- Query=source #一定携带这个参数
filters: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #去掉第一层前缀
discovery:
locator:
enabled: true #开启网关拉取nacos的服务
-
配置项怎么看?
- 点击routes进去
第4集 SpringCloud Gateway⽹网关整合Nacos开发实战
简介:讲解Gateway配置Nocas和实战
-
原先存在的问题
- 微服务地址写死
- 负载均衡没做到
-
添加Nacos服务治理理配置
<!--添加nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- ⽹网关添加naocs依赖
- 启动类开启⽀支持
- @EnableDiscoveryClient
- 修改配置⽂文件
第十一章 【进阶篇】⽹网关Gateway架构+断言+过滤器进阶实战
第1集 进阶掌握 SpringCloud Gateway配置和交互流程
简介:讲解SpringCloud Gateway架构流程
- ⽹网关的配置项回顾
- 路路由:是⽹网关的基本单元,由ID、URI、一组Predicate、⼀一组Filter组成,根据Predicate进⾏行行匹配转发
- route组成部分
- id:路路由的ID
- uri:匹配路路由的转发地址
- predicates:配置该路路由的断⾔言,通过
- PredicateDefinition类进⾏行行接收配置。
- order:路路由的优先级,数字越⼩小,优先级越⾼高。
- 交互流程
- 客户端向Spring Cloud Gateway发出请求
- 如果⽹网关处理理程序映射确定请求与路路由匹配
- 则将其发送到⽹网关Web处理理程序
- 通过特定过滤器器链运⾏行行,前置处理理-后置处理理
第2集 微服务SpringCloud Gateway内置路由断⾔言讲解
简介:讲解Gateway内置的路由断⾔
- 什么是Gateway路路由断⾔言
- Predicate 来源于Java8,接受输⼊入参数,返回一个布尔值结果
- Spring Cloud Gateway 中 Spring 利利⽤用 Predicate 的特性实现了了各种路路由匹配规则
- 转发的判断条件,SpringCloud Gateway支持多种方式,常⻅见如:Path、Query、Method、Header等
- ⽀持多个Predicate请求的转发是必须满足所有的Predicate后才可以进行路由转发
- 内置路由断言介绍 RoutePredicateFactory 接口实现类
- 参数编写则 XXXRoutePredicateFactory,使用XXX作为
参数配置, 例如下⾯
predicates: #断言 配置哪个路径才转发
- Path=/order-service/**
- Before=2020-09-11T01:01:01.000+08:00 # 在这个时间点之后不能访问
- Query=source #一定携带这个参数
- Cookie=
第3集 Gateway内置断⾔言实现接⼝口定时下线实战
简介:Gateway内置的路路由接⼝口定时下线实战
- 需求:接⼝口需要在指定时间进行下线,过后不不可以在被访问
- 使⽤用Before ,只要当前时间小于设定时间,路由才会匹配请求
- 东8区的2020-09-11T01:01:01.000+08:00后,请求不可访问
- 为了了方便测试,修改时间即可
第4集 玩转SpringCloud Gateway过滤器器
简介:讲解Gateway过滤器器
-
什么是网关的过滤器器
-
过滤器⽣生命周期
- PRE: 这种过滤器器在请求被路路由之前调⽤用,一般⽤用于鉴权、限流等
- POST:这种过滤器器在路路由到微服务以后执⾏行行,一般用于修改响应结果,⽐比如增加header信息、打点结果⽇志
-
⽹关过滤器器分类
- 局部过滤器器GatewayFilter:应⽤用在某个路路由上,每个过滤器器⼯工⼚厂都对应一个实现类,并且这些类的名称必须以GatewayFilterFactory 结尾
- 全局过滤器器:作⽤用全部路路由上,
- 内置很多局部过滤器,顶级接口 GatewayFilterFactory
- 内置很多全局过滤器器,顶级接⼝口 GlobalFilter
第5集 案例实战之网关Gateway全局过滤器实现⽤用户鉴权
简介:讲解Gateway全局过滤器实现用户鉴权
-
业务流程
-
⾃定义全局过滤器实现鉴权
-
注意:网关不不要加太多业务逻辑,否则会影响性能,务必记住
@Component
public class UserGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//写业务逻辑
String token = exchange.getRequest().getHeaders().getFirst("token");
//TODO 根据业务开发对应的鉴权规则, JWT
if(StringUtils.isBlank(token)){
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
//继续往下执行
return chain.filter(exchange);
}
//数字越小,优先级越高
@Override
public int getOrder() {
return 0;
}
}
第十二章 AlibabaCloud微服务下的链路追踪系统实战
第1集 微服务架构下的排查问题复杂性概述
简介:讲解微服务链路路追踪系统的作⽤
-
抛两个常⻅见的问题
- 微服务调用链路出现了了问题怎么快速排查?
-
微服务调⽤用链路路耗时长怎么定位是哪个服务?
-
链路追踪系统
- 分布式应⽤用架构虽然满⾜足了了应⽤用横向扩展的需求,但是
运维和诊断的过程变得越来越复杂,例例如会遇到接口诊
断困难、应⽤用性能诊断复杂、架构分析复杂等难题,传
统的监控工具并⽆无法满⾜足,分布式链路路系统由此诞⽣
- 分布式应⽤用架构虽然满⾜足了了应⽤用横向扩展的需求,但是
-
核心:将一次请求分布式调⽤用,使⽤用GPS定位串串起来,记
录每个调⽤用的耗时、性能等⽇日志,并通过可视化工具展示
出来 -
注意:AlibabaCloud全家桶还没对应的链路路追踪系统,我
们使⽤用Sleuth和zipking(内部使⽤用的鹰眼)
第2集 SpringCloud的链路路追踪组件Sleuth实战
简介:讲解什么Sleuth链路追踪系统
- 什么是Sleuth
- 一个组件,专⻔门⽤用于记录链路路数据的开源组件
- 文档:https://spring.io/projects/spring-cloud-sleuth
- 各个微服务添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
[api-gateway,45e25ae25c4b592e,45e25ae25c4b592e,true]
第⼀个值,spring.application.name的值
第⼆个值,45e25ae25c4b592e ,sleuth⽣生成的⼀一个
ID,叫Trace ID,⽤用来标识一条请求链路路,⼀条请求链路路中包
含一个Trace ID,多个Span ID
第三个值,45e25ae25c4b592e、spanid 基本的⼯工作单
元,获取元数据,如发送⼀一个http
第四个值:false,是否要将该信息输出到zipkin服务中
来收集和展示。
第3集 微服务下的可视化链路路追踪系统Zipkin实战
简介:讲解zipkin介绍和部署实战
- 什么是zipkin
-
官⽹
-
⼤大规模分布式系统的APM⼯工具(Application
Performance Management),基于Google Dapper的
基础实现,和sleuth结合可以提供可视化web界⾯面分析
调⽤用链路路耗时情况
-
- 同类产品
- 鹰眼(EagleEye)
- CAT
- twitter开源zipkin,结合sleuth
- Pinpoint,运⽤用JavaAgent字节码增强技术
- StackDriver Trace (Google)
- 开始使⽤
java -jar zipkin-server-2.12.9-exec.jar
第4集 【高级篇幅】链路追踪组件Zipkin+Sleuth整合实战
简介:使用Zipkin+Sleuth业务分析调⽤链路分析实战
- sleuth收集跟踪信息通过http请求发送给zipkin server
- zipkin server进行跟踪信息的存储以及提供Rest API即可
- Zipkin UI调⽤用其API接口进行数据展示默认存储是内存,可
也用mysql 或者elasticsearch等存储 - 微服务加⼊入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
- 配置地址和采样百分比配置
spring:
application:
name: api-gateway
zipkin:
base-url: http://127.0.0.1:9411/ #zipkin地址
discovery-client-enabled: false #不用开启服务发现
sleuth:
sampler:
probability: 1.0 #采样百分比
默认为0.1,即10%,这⾥里里配置1,是记录全部的sleuth信息,
是为了了收集到更更多的数据(仅供测试⽤用)。
在分布式系统中,过于频繁的采样会影响系统性能,所以这⾥里里配
置需要采⽤用⼀一个合适的值。
第5集 微服务链路路追踪系统Zipkin持久化配置
简介:实战zipkin+sleuth链路追踪⽇志持久化
- 现存在的问题
- 服务重启会导致链路路追踪系统数据丢失
- 持久化配置:mysql或者elasticsearch
- 创建数据库表SQL脚本
- 启动命令
这里有个坑,使用mysql8.0默认的zipkin连接不上
java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin_log --MYSQL_USER=root --MYSQL_PASS=123456
第十三章 AlibabaCloud微服务下的分布式配置中心实战
第1集 微服务下的分布式配置中⼼心
简介:讲解什么是配置中⼼心及使用前后的好处
- 现在微服务存在的问题
- 配置文件增多,不不好维护
- 修改配置文件需要重新发布
- 什么是配置中⼼:
- ⼀句句话:统⼀管理理配置, 快速切换各个环境的配置
- 相关产品
- 百度的disconf 地址:https://github.com/knightliao/disconf
- 阿⾥里里的diamand 地址:https://github.com/takeseem/diamond
- springcloud的configs-server: 地址:http://cloud.spring.io/spring-cloud-config/
- 阿⾥里里的Nacos:既可以当服务治理理,⼜又可以当配置中心,Nacos = Eureka + Config
第2集 AlibabaCloud配置中⼼心Nacos⾯面板介绍
简介:讲解Nacos作为配置中心面板介绍
- Nacos配置中⼼面板介绍
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
第3集 新版AlibabaCloud配置中心Nacos实战和注意的坑
简介:讲解Nacos作为配置中心实战
- 配置文件优先级讲解
- 不能使⽤用原先的application.yml, 需要使用bootstrap.yml作为配置⽂文件
- 配置读取优先级 bootstrap.yml > application.yml
- 配置实操
浏览器器访问
http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=class-order-service-dev.yaml&group=DEFAULT_GROUP
dataId组成,在 Nacos Spring Cloud 中,dataId 的完整
格式如下
${prefix}-${spring.profiles.active}.${fileextension}
prefix 默认为 spring.application.name 的值
spring.profiles.active 即为当前环境对应的 profile
当 spring.profiles.active 为空时,对应的连接符 - 也
将不不存在,dataId 的拼接格式变成 ${prefix}.${fileextension}
file-exetension 为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension 来配
置。⽬目前只⽀支持 properties 和 yaml 类型。
第4集 AlibabaCloud配置中⼼Nacos动态配置下发实战
简介:讲解Nacos动态刷新配置
- 什么是动态刷新配置
- 我们修改了了配置,程序不能自动更更新
- 动态刷新就可以解决这个问题
- 配置实战
- 增加Nacos增加测试配置
- 编写代码
@RefreshScope
public class OrderController {
@Value("${video.title}")
private String videoTitle;
}
第十四章 微服务容器器化部署Docker专题
第1集 分布式架构-微服务下的Docker介绍和使用场景
简介:Docker介绍和使⽤用场景
- 官网:https://www.docker.com/get-started
- 什么是Dokcer
- 百科:一个开源的应⽤用容器器引擎,让开发者可以打包他们
的应⽤用以及依赖包到⼀一个可移植的容器器中,然后发布到
任何流行的 Linux 机器器上,也可以实现虚拟化。 - 容器器是完全使⽤用沙箱机制,相互之间不不会有任何接⼝口,
使用go语⾔言编写,在LCX(linux容器器)基础上进行的封装 - 简单来说:就是可以快速部署启动应用
- 实现虚拟化,完整资源隔离
- 一次编写,四处运⾏
一句句话:开箱即⽤用,快速部署,可移植性强,环境隔离
第2集 阿里云Linux云服务器器Centos 64位安装Docker实战
简介:讲解阿⾥云ECS服务安装Docker实战
- 远程连接ECS实例例
- 依次运行以下命令添加yum源。
yum update
yum install epel-release -y
yum clean all
yum list
- 安装并运行Docker。
yum install docker-io -y
systemctl start docker
- 检查安装结果。
docker info
- 启动使用Docker
systemctl start docker #运行Docker守护进程
systemctl stop docker #停止Docker守护进程
systemctl restart docker #重启Docker守护进程
- 更多文档
https://help.aliyun.com/document_detail/51
853.html?spm=a2c4g.11186623.6.820.RaToNY
第3集 ⾯试对象的方式快速掌握 Docker仓库、镜像、容器器核⼼概念
简介:快速掌握Dokcer基础知识
- 概念:
- Docker 镜像 - Docker images:容器器运⾏行行的只读模板,操作系统+软件运行环境+⽤用户程序
class User{
private String userName;
private int age;
}
- Docker 容器器 - Docker containers:容器器包含了某个应
⽤运行所需要的全部环境
User user = new User()
- Docker 仓库 - Docker registeries: ⽤用来保存镜像,有
公有和私有仓库,好⽐比Maven的中央仓库和本地私服 - 总结 对⽐面向对象的⽅方式
Dokcer ⾥面的镜像 : Java⾥面的类 Class
Docker ⾥面的容器器 : Java⾥面的对象 Object
通过类创建对象,通过镜像创建容器器
第4集 玩转Docker容器器常⻅见命令实战
简介:掌握Docker容器器常⻅命令
-
常⽤命令(安装部署好Docker后,执行的命令是docker开
头),xxx是镜像名称 -
搜索镜像:docker search xxx
-
列出当前系统存在的镜像:docker images
-
拉取镜像:docker pull xxx
- xxx是具体某个镜像名称(格式 REPOSITORY:TAG)
- REPOSITORY:表示镜像的仓库源,TAG:镜像的标签
-
运行⼀一个容器器:
docker run --name nginx-gtf -p 8080:80 -d nginx
docker run - 运⾏行行⼀一个容器器
-d 后台运⾏行行
-p 端⼝口映射
--name "xxx" 容器器名称
- 列举当前运行的容器器:docker ps
- 检查容器内部信息:docker inspect 容器器名称
- 删除镜像:docker rmi IMAGE_NAMEgtf
- 强制移除镜像不不管是否有容器器使⽤用该镜像 增加 -f 参数
- 停止某个容器器:docker stop 容器器名称
- 启动某个容器器:docker start 容器器名称
- 移除某个容器器: docker rm 容器器名称 (容器器必须是停⽌止状态)
- 列举全部 容器 : docker ps -a
第5集 容器器化部署必备Docker公有+阿里云私有镜像仓库
简介:掌握Docker仓库的知识
- 为啥要⽤用镜像仓库
- 官方公共镜像仓库和私有镜像仓库
- 公共镜像仓库:
- 官⽅方:https://hub.docker.com/,基于各个软件开发或者有软件提供商开发的
- 非官⽅方:其他组织或者公司开发的镜像,供⼤大家免费试⽤用
- 私有镜像仓库:
- ⽤于存放公司内部的镜像,不提供给外部试用;
- 公共镜像仓库:
- 官方公共镜像仓库和私有镜像仓库
- 开通阿里云私有镜像仓库
- 登录阿⾥里里云账号访问地址:
云账号访问地址:
https://cr.console.aliyun.com/
https://cr.console.aliyun.com/cn-shenzhen/insta
nces/credentials
第6集 不同系统Docker安装常见问题讲解和解决思路
简介:常⻅系统安装Docker和一些坑
-
本地需要安装Docker,才可以进⾏打包,搭建
- Win7~Win10
- Mac
- Linux
- CentOS
- ubuntu
- 官⽅方地址
-
问题
- 镜像下载慢
- 搜索修改镜像仓库地址:阿里云、网易云等都有镜像仓库地址(不熟悉不建议乱修改)
- 镜像下载慢
第十五章 【高级篇】新版JDK11+AlibabaCloud+Docker整合打包镜像推送
第1集 新版AlibabaCloud微服务本地镜像打包配置讲解
简介:微服务Docker镜像打包讲解
- 官方文档:https://spring.io/guides/gs/spring-boot-docker/
- ⽗项目添加springboot版本依赖
<properties>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<spring.boot.version>2.3.3.RELEASE</spring.boot.version>
</properties>
- 每个子模块项目添加依赖
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<docker.image.prefix>class-cloud</docker.image.prefix>
</properties>
<build>
<finalName>alibaba-cloud-gateway</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
- Spotify 的 docker-maven-plugin 插件是⽤用maven插件⽅方
式构建docker镜像的。
第2集 镜像打包脚本Dockerfile介绍和【新版JDK11】整合
简介:微服务Docker镜像打包整合JDK11
- 创建Dockerfile,默认是根⽬目录,(可以修改为src/main/docker/Dockerfile,如果修则需要制定路路径)
FROM adoptopenjdk/openjdk11:ubi
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- 什么是Dockerfile
- 由一系列命令和参数构成的脚本,这些命令应用于基础镜像, 最终创建一个新的镜像
- 构建镜像( 去到子模块pom文件下)
- 打包网关镜像
第3集 AlibabaCloud-视频服务-订单服务Docker镜像打包
简介:微服务Docker镜像打包视频服务和订单服务
-
视频服务打包
-
订单服务打包
FROM adoptopenjdk/openjdk11:ubi
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
第4集 本地镜像推送阿⾥里云私有镜像仓库
简介:本地多个镜像推送阿里云私有镜像仓库
- 阿里云私有镜像仓库创建
https://cr.console.aliyun.com/repository/cn-hangzhou/api-gateway-gtf/class-cloud/details
第十六章 【高级篇】微服务公共组件在阿里云ECS容器化部署
第1集 部署实战-阿里云服务器器Docker部署Nacos镜像加速
简介:阿里云ECS服务器Docker部署Nacos
- 拉取特别慢
⽂文档:https://cr.console.aliyun.com/cnhangzhou/
instances/mirrors
路径/etc/docker/daemon.json 增加下⾯面的配置
{
"registry-mirrors":
["https://cr.console.aliyun.com/cnhangzhou/
instances/mirrors"]
}
//重启
sudo systemctl daemon-reload
sudo systemctl restart docker
- docker拉取镜像
docker pull nacos/nacos-server
- 查看镜像
docker images
- 启动Nacos
docker run --env MODE=standalone --name class-nacos -d -p 8848:8848 ef8e53226440 (镜像
id)
- 访问Nacos(记得开放阿里云的网络安全组)
http://公⽹网ip:8848/nacos
# 登录密码默认nacos/nacos
第2集 部署实战-阿⾥云ECS服务器器Docker部署Sentinel
简介:阿⾥云ECS+Docker部署Sentinel实战
- docker拉取镜像
docker pull bladex/sentinel-dashboard:latest
- 查看镜像
docker images
- 启动Sentinel
docker run --name sentinel -d -p 8858:8858 镜像
id
- 访问Sentinel(记得开放阿⾥里里云的⽹网络安全组)
http://公⽹网ip:8858
# 登录密码默认sentinel/sentinel
第3集 部署实战-阿里云ECS服务器器Docker部署Zipkin实战
简介:阿⾥云ECS+Docker部署Zipkin实战
- docker拉取镜像
docker pull openzipkin/zipkin:latest
- 查看镜像
docker images
- 启动Zipkin
docker run --name class-zipkin -d -p
9411:9411 镜像id
- 访问zipkin(记得开放阿⾥里里云的⽹网络安全组)
http://公⽹网ip:9411/zipkin/
第十七章 【⾼级篇】AlibabaCloud微服务阿里云ECS容器器化部署
第1集 配置文件Bug修复-⽹关重新打包推送
简介:脚本bug修复和服务重新打包推送
- 缺少主⽂文件,本地验证 进⼊入target⽬目录 java -jar xxx.jar 执⾏
- 注册中心的ip 改为阿里云局域网ip
- 上述步骤同步更新到网关服务、视频服务、订单服务
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
第2集 ⽹关配置迁移阿⾥里云Nacos配置中心和服务启动
简介:⽹关配置迁移和服务启动
- 阿里云Nacos新建配置 dataId = api-gateway-dev.yaml
-
阿里云⽹关镜像拉取
-
⽹关容器器启动
第3集 视频和订单服务迁移阿⾥里里云Nacos配置中心和镜像打包
简介:视频服务和订单服务前移配置中心和镜像打包
- 配置中心新增配置
- 本地镜像打包推送阿里云镜像仓库
- 阿里云ecs服务器器拉取镜像
- 视频服务配置
- 订单服务配置
第4集 阿里云ECS服务器器快速安装Mysql数据库
简介:阿⾥云ECS服务器器快速安装Mysql数据库
#下载mysql的Yum仓库
wget -i -c http://dev.mysql.com/get/mysql57-
community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
#安装 mysql服务
yum -y install mysql-community-server
#启动数据库服务, systemctl 该命令可⽤用于查看系统状态和
管理理系统及服务,centos7上开始使⽤用
systemctl start mysqld.service
#查看状态
systemctl status mysqld.service
#在⽇日志⽂文件中查看初始密码
grep "password" /var/log/mysqld.log
#进⼊入修改Mysql密码
mysql -uroot -p
#新密码设置必须由⼤大⼩小写字⺟母、数字和特殊符号组成
ALTER USER 'root'@'localhost' IDENTIFIED BY
'class.net168';
#开启mysql的远程访问, %是指全部
grant all privileges on *.* to 'root'@'%'
identified by 'gtfclass.net168' with grant
option;
#刷新权限
flush privileges;
第5集 AlibabaCloud视频和订单服务阿里云启动
简介:视频服务和订单服务容器启动
- 订单服务新增配置 video.title(配置动态刷新)
- 视频服务和订单服务启动
docker run --name class-video -d -p
9000:9000 53f5604dcd76
docker run --name class-order -d -p
8001:8001 16e0740b7525
- 开放网关服务的网络安全组 8888端⼝
第6集 微服务阿里云部署全链路路验证和线上测试
全链路验证
http://公网ip:8888/orderserver/api/v1/video_order/save?videoId=41
限流验证
配置中⼼心动态刷新验证
链路路追踪验证
内外⽹网隔离