资料下载

链接: https://pan.baidu.com/s/169gjHIZIlhTP0KXTPp0_oA 提取码: tm76 

第一章 单机应⽤用到分布式架构演进核⼼知识

第1集 传统单机-分布式架构演进历史

简介:讲解单机到微服务架构的演进

  • 单机架构
    • 优点: 易易于测试 便便于集成 ⼩小型项⽬目友好
    • 缺点: 开发速度慢 启动时间⻓长 依赖庞⼤大
  • 分布式架构
    • 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全家桶介绍

  • 版本说明

第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的相关 ⽹网络信息
    • 核⼼心:服务管理理,是有个服务注册表,⼼心跳机制动态维 护,服务实例例在启动时注册到服务注册表,并在关闭时 注销。
  • 为什什么要⽤用
    • 微服务应⽤用和机器器越来越多,调⽤用⽅方需要知道接⼝口的⽹网络地址,如果靠配置⽂文件的⽅方式去控制⽹网络地址,对于动态新增机器器,维护带来很⼤大问题
  • 主流的注册中⼼心: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程序
      中任何内容,可以是服务或者方法甚至代码,总结起来就是我们要保护的东西
    • 规则:定义怎样的方式保护资源,主要包括流控规则、
      熔断降级规则等

第4集 流量防卫兵-Sentinel依赖引入和控制台搭建

简介:微服务引⼊入Sentinel和控制台搭建

  • Sentinel 分为两个部分
    • 核⼼心库(Java 客户端)不不依赖任何框架/库,能够运⾏行行
      于所有 Java 运⾏行行时环境,同时对 Dubbo、Spring
      Cloud 等框架也有较好的⽀支持。
    • 控制台(Dashboard)基于 Spring Boot 开发,打包后
      可以直接运⾏行行,不不需要额外的 Tomcat 等应⽤用容器器。
  • 微服务引⼊入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 控制台需要 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 或并发线程数等指标,当
      达到指定的阈值时对流量量进⾏行行控制,以避免被瞬时的流量高峰冲垮,从⽽而保障应⽤用的⾼高可⽤用性。
  • 两种规则
    • 基于统计并发线程数的流量量控制
    并发数控制⽤用于保护业务线程池不不被慢调⽤用耗尽
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:冷启动/预热,如果系统在此之前⻓长期处于
      空闲的状态,我们希望处理理请求的数量量是缓步的增多,
      经过预期的时间以后,到达系统处理理请求个数的最⼤大值
    • 匀速排队:严格控制请求通过的间隔时间,也即是让请
      求以均匀的速度通过,对应的是漏漏桶算法,主要⽤用于处理间隔性突发的流量量,如消息队列列,想象⼀一下这样的场
      景,在某⼀一秒有⼤大量量的请求到来,⽽而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第⼀一秒直接拒绝多余的请求
  • 注意:
    • 匀速排队等待策略略是 Leaky Bucket 算法结合虚
      拟队列列等待机制实现的。
    • 匀速排队模式暂时不不⽀支持 QPS > 1000 的场景
  • 流控⽂文档

第4集 新版Sentinel-微服务高可⽤利利器器-熔断降级规则讲解

简介:讲解 微服务高可⽤利器Sentinel熔断降级规则

  • 备注:如果 簇点链路路 没数据,刷多几次接⼝
  • 熔断降级(虽然是两个概念,基本都是互相配合)
    • 对调用链路中不不稳定的资源进⾏行行熔断降级也是保障⾼高可
      ⽤用的重要措施之⼀一
    • 对不不稳定的弱依赖服务调⽤用进⾏行行熔断降级,暂时切断不不稳定调用,避免局部不不稳定因素导致整体的雪崩
    • 熔断降级作为保护自身的手段,通常在客户端(调⽤
      端)进行配置
  • 什是Sentinel降级规则
  • Sentinel 熔断策略略
    • 慢调⽤用⽐比例例(响应时间): 选择以慢调⽤用⽐比例例作为阈值,需要设置允许的慢调⽤用 RT(即最⼤大的响应时间),请求的响应时间⼤大于该值则统计为慢调⽤
    • ⽐例阈值:修改后不生效-目前已经反馈给官⽅方那边的bug
    • 熔断时⻓:超过时间后会尝试恢复
    • 最小请求数:熔断触发的最⼩小请求数,请求数小于
      该值时即使异常比率超出阈值也不会熔断
  • 异常比例:当单位统计时⻓长内请求数目⼤大于设置的最小
    请求数⽬目,并且异常的比例大于阈值,则接下来的熔断时长内请求会⾃自动被熔断
    • 比例阈值
    • 熔断时长:超过时间后会尝试恢复
    • 最小请求数:熔断触发的最小请求数,请求数小于
      该值时,即使异常比率超出阈值也不会熔断
    • 异常数:当单位统计时⻓长内的异常数⽬目超过阈值之后会
      自动进行熔断
    • 异常数:
    • 熔断时⻓长:超过时间后会尝试恢复
    • 最⼩请求数:熔断触发的最小请求数,请求数小于
      该值时即使异常⽐比率超出阈值也不会熔断

第5集 新版Sentinel的熔断状态和恢复讲解

简介:讲解服务调用常见的熔断状态和恢复

  • 服务熔断一般有三种状态(画图)
    • 熔断关闭(Closed)
      • 服务没有故障时,熔断器所处的状态,对调用方的
        调用不做任何限制
    • 熔断开启(Open)
      • 后续对该服务接⼝口的调⽤用不不再经过⽹网络,直接执⾏行本地的fallback⽅方法
    • 半熔断(Half-Open)
      • 所谓半熔断就是尝试恢复服务调⽤用,允许有限的流
        量量调用该服务,并监控调⽤用成功率
  • 熔断恢复:
    • 经过熔断时长后熔断器会进入探测恢复状态(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采⽤用了了商业实现
  • LTS 是啥意思?

    • Long Term Support ⻓长期⽀支持的版本,如JDK8、JDK11
      都是属于LTS
    • JDK9 和 JDK10 这两个被称为“功能性的版本”不不同, 两者
      均只提供半年年的技术⽀支持
    • 甲⻣骨⽂文释出Java的政策,每6个⽉月会有⼀一个版本的释
      出,长期支持版本每三年年发布⼀一次,根据 后续的发布计
      划,下一个⻓长期⽀支持版 Java 17 将于2021年年发布
    • 8u20、11u20是啥意思?
    • 就是Java的补丁,⽐比如JDK8的 8u20版本、8u60版本;
      java11的 11u20、11u40版本

第十章 微服务核心组件之⽹网关讲解

第1集 什么是微服务的网关和应用场景

简介:介绍什么是微服务的网关和应用场景

  • 什么是⽹网关
    • API Gateway,是系统的唯一对外的⼊入⼝口,介于客户端
      和服务器端之间的中间层,处理⾮业务功能 提供路路由请求、鉴权、监控、缓存、限流等功能
    • 统⼀接⼊入
      • 智能路路由
      • AB测试、灰度测试
      • 负载均衡、容灾处理理
      • ⽇日志埋点(类似Nignx⽇日志)
    • 流量量监控
      • 限流处理理
      • 服务降级
    • 安全防护
      • 鉴权处理理
      • 监控
      • 机器器⽹网络隔离
  • 主流的⽹网关
    • 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包方式运⾏
  • 官⽅方⽂文档
  • 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链路追踪系统

        <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
  • 同类产品
    • 鹰眼(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集 微服务下的分布式配置中⼼心

简介:讲解什么是配置中⼼心及使用前后的好处

第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://cr.console.aliyun.com/
https://cr.console.aliyun.com/cn-shenzhen/insta
nces/credentials

第6集 不同系统Docker安装常见问题讲解和解决思路

简介:常⻅系统安装Docker和一些坑

第十五章 【高级篇】新版JDK11+AlibabaCloud+Docker整合打包镜像推送

第1集 新版AlibabaCloud微服务本地镜像打包配置讲解

简介:微服务Docker镜像打包讲解

   <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

限流验证
配置中⼼心动态刷新验证
链路路追踪验证
内外⽹网隔离