2111-微服务核心知识点及问题分析

发布时间:2022-06-25 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了2111-微服务核心知识点及问题分析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

文章目录

  • Day01~微服务架构入门
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课堂练习
    • 课后作业
  • Day02~Nacos注册中心入门
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课后作业
  • Day03-远程服务调用实践
    • 核心知识点
    • 常见问题分析
    • Bug分析
    • 课堂练习
    • 课后作业
  • Day04- Nacos 配置中心实践
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课堂练习
    • 课后作业
  • Day05-Sentinel 限流应用实践
    • 核心知识点
    • 常见问题分析?
    • 常见Bug分析
    • 课堂练习
    • 课后作业
  • Day06 Sentinel 应用进阶
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课堂练习
    • 课后作业
  • Day07-API 网关(Gateway)入门实践
    • 核心知识点
    • 常见问题分析
    • 常见BUG分析
    • 课堂练习
    • 课后作业
  • Day08-Gateway 应用进阶实践
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课堂练习
    • 课后作业

Day01~微服务架构入门

核心知识点

  • 微服务架构诞生的背景(服务大了太臃肿,要拆成若干个小系统;分而治之~北京一个火车站到多个火车站)
  • 微服务架构解决方案(大厂基本自研~自己研发各种组件,中小公司用Spring Cloud Netflix,Alibaba,…)
  • 微服务架构下Maven聚合项目的创建方式?(Maven聚合项目~资源复用:extends,import,简化编译,打包,部署方式)
  • 微服务架构入门聚合项目结构分析及创建?(01-sca,sca-consumer,sca-provider,sca-gateway)

常见问题分析

  • 为什么需要微服务?(对系统分而治,解决因并发访问过大带来的系统复杂性(例如:业务,开发,测试,升级,可靠性等)
  • 微服务设计的特点?(单一职责,独立进程,开发测试效率高,可靠性高,升级难度小,但会带来一定的维护成本)
  • 微服务解决方案有哪些?(大厂自研,中小企业采用开源Spring Cloud Alibaba,Spring Cloud Netfix等 )
  • 微服务设计中需要哪些关键组件(服务的注册,发现,配置,限流降级,访问入口管理,分布式事务管理等)
  • 创建聚合工程的目的?(实现工程之间资源的的共享,简化工程管理)
  • 如何修改聚合工程中项目的编译和运行版本?(pom.xml:build->plugins->plugin->maven-compiler-plugin)
  • maven工程中build元素的作用?(定义项目的编译,打包方式)
  • maven父工程的packaging元素内的值是什么?(父工程默认打包方式为pom方式)
  • maven父工程中dependencyManagement元素的作用是什么?(项目依赖的版本,当前工程或子工程不需要再指定版本)
  • Maven父工程中如何统一定义JDK编译和运行版本?(配置maven编译插件:maven-compiler-plugin)
  • Maven工程pom.xml文件有删除线怎么解决?(修改idea中maven的配置)

常见Bug分析

  • maven配置错误(检查idea中你指定的maven路径,本地库路径是否正确)
  • maven依赖无法下载(首先要确保你的依赖的是正确,maven配置是正确,都正确就清idea缓存重启)

课堂练习

  • 删除聚合工程中的子工程模块. 第一步:在项目结构中删除,例如

    2111-微服务核心知识点及问题分析

    第二步:将项目从idea工作区中删除,例如

    2111-微服务核心知识点及问题分析

    第三步:将项目从父工程的pom文件中删除,例如

    2111-微服务核心知识点及问题分析

  • 移除重建项目module中的pom文件删除线,例如:

    2111-微服务核心知识点及问题分析

  • 构建01-sca的子工程(maven 模块),模块名为sca-ui,其具体业务实现如下: 第一步:在sca-ui工程的pom.xml文件中添加一个spring-boot-starter-web依赖.
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

第二步:在sca-ui工程中创建一个springboot启动类,类全名为com.jt.DemoUIApplication.

package com.jt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoUIApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoUIApplication.class, args);
    }
}

第三步:在sca-ui工程的resources目录下创建一个static目录,并在此目录中创建一个index.html页面

2111-微服务核心知识点及问题分析

第四步:启动sca-ui工程,在浏览器中输入http://localhost:8080/index.html进行测试.

2111-微服务核心知识点及问题分析

课后作业

  • 总结课上知识点(养成好习惯)
  • 检查并设置JDK环境变量JAVA_HOME.
  • 升级MySQL的版本为5.7或以上版本(Mariadb 10.3或以上版本)
  • 预习04-nacos服务注册中心应用实践.

Day02~Nacos注册中心入门

核心知识点

  • 服务注册中心诞生背景? (服务多了,需要统一管理,例如所有公司需要在工商局进行备案)
  • 服务注册中心的选型?(社区活跃度,稳定性,功能,性能,学习成本)
  • Nacos下载,安装(解压),配置(application.properties),启动(startup.cmd),访问(http://ip:port/nacos)
  • 基于Nacos实现服务的注册?(添加依赖,服务配置,启动服务并检查)
  • 基于RestTemplate实现服务的简易调用?(服务消费方调用服务提供方)
  • 基于LoadBalancerClient实现服务实例的获取?(底层会基于负载均衡算法为我们应用提供实例)

常见问题分析

  • 如何理解服务注册中心?(存储服务信息的一个服务,也可以理解为一个中介)
  • 服务注册中心诞生的背景? (服务多了,需要对服务进行更好管理)
  • 市场上常用的注册中心?(Zookeeper,Eureka,Nacos,Consul)
  • 如何对注册中心进行选型?(社区活跃度,稳定性,功能,性能,学习成本)
  • Nacos 是什么?(Alibaba基于SpringBoot技术实现的一个注册中心,本质上也是一个web服务)
  • Nacos 的基本架构?(Client/Server架构)
  • Nacos 主要提供了什么核心功能?(服务的注册,发现,配置)
  • Nacos 服务启动需要什么前置条件?(配置JDK的JAVA_HOME目录,安装MySQL5.7以上版本,配置连接的数据库)
  • Nacos 服务单机模式,window平台下启动时的指令是什么?(startup.cmd -m standalone)
  • 实现Nacos服务注册需要添加什么依赖?(两个:web,discovery)
  • 实现Nacos服务注册时,必须做哪些配置?(服务名,假如是本机服务注册可以省略服务地址)
  • Nacos如何检查服务状态?(通过心跳包实现,服务启动时会定时向nacos发送心跳包-BeatInfo)
  • 注册中心这里用了什么设计模式?(中介者模式)
  • 服务之间进行服务调用时,使用了什么API?(RestTemplate,用此对象之前要先创建这个对象并交给spring管理)
  • RestTemplate对象使用到了什么设计模式?(模板方法模式)
  • LoadBalancerClient对象的作用是什么?(服务实例的获取)
  • 基于idea如何进行请求响应测试?(基于Idea工具中的Http Client)
  • 基于RestTemplate实现服务调用过程的是怎样的?

    2111-微服务核心知识点及问题分析

常见Bug分析

  • JAVA_HOME环境变量定义错误,例如:

    2111-微服务核心知识点及问题分析

    说明,这里一定要注意JAVA_HOME单词的拼写,JAVA_HOME中定义的JDK是存在的,还有后面的路径不能有分号“;”.

  • MySQL版本比较低(建议mysql5.7或mariadb10.5及以上版本),例如: 当执行nacos-mysql.sql文件时,出现如下错误:

    2111-微服务核心知识点及问题分析

  • sql文件不存在,例如

    2111-微服务核心知识点及问题分析

  • SQL文件应用错误,例如:

    2111-微服务核心知识点及问题分析

  • Nacos的application.properties配置文件中,连接数据库的配置错误.

    2111-微服务核心知识点及问题分析

  • 数据库的名字配置错误,例如:

    2111-微服务核心知识点及问题分析

  • nacos配置文件application.properties配置错误,例如:

    2111-微服务核心知识点及问题分析

  • 服务启动时,端口被占用了。例如:

    2111-微服务核心知识点及问题分析

  • 服务注册时,服务名不正确,格式不正确,配置文件名字不正确,或者没有配置文件,例如:

    2111-微服务核心知识点及问题分析

  • 磁盘写权限问题(nacos服务启动时会在当前磁盘目录写日志),例如:

    2111-微服务核心知识点及问题分析

  • 基于Nacos实现服务注册失败,例如

    2111-微服务核心知识点及问题分析

  • 客户端500异常,例如

    2111-微服务核心知识点及问题分析

  • 服务调用时,连接异常,例如:

    2111-微服务核心知识点及问题分析

  • 客户端404异常,例如:

    2111-微服务核心知识点及问题分析

  • 服务调用时底层404问题,例如:

    2111-微服务核心知识点及问题分析

  • 服务访问问题,例如:

    2111-微服务核心知识点及问题分析

  • 依赖注入异常,例如:

    2111-微服务核心知识点及问题分析

  • 客户端请求方式与服务端不匹配,例如:

    2111-微服务核心知识点及问题分析

  • 依赖版本问题,例如:

    2111-微服务核心知识点及问题分析

  • 服务配置读取问题,例如:

    2111-微服务核心知识点及问题分析

课后作业

  • 总结课堂知识点
  • 完成基于nacos的服务注册
  • 完成基于RestTemplate对象实现服务调用。
  • 预习04-nacos中的负载均衡设计及实现.
  • 尝试实现基于idea启动nacos,自己查询然后进行实践.

    2111-微服务核心知识点及问题分析

  • 尝试实现基于idea连接指定数据库,例如: 第一步:打开DataSource,找到mysql,例如:

    2111-微服务核心知识点及问题分析

    第二步:配置连接的数据库,例如:

    2111-微服务核心知识点及问题分析

2111-微服务核心知识点及问题分析

2111-微服务核心知识点及问题分析

Day03-远程服务调用实践

核心知识点

  • 基于LoadBalancerClient对象获取远程服务实例?
  • @LoadBalanced 注解的应用实践?
  • Feign方式的服务调用实践?
  • 负载均衡策略的配置?

常见问题分析

  • LoadBalancerClient对象的作用?(从nacos获取服务实例,然后在本地负载均衡)
  • LoadBalancerClient对象的具体实现是谁?(RibbonLoadBalancerClient)
  • Ribbon是什么?(一个负载均衡组件,此组件中定义了一些负载均衡算法)
  • @LoadBalanced 注解的作用?(描述RestTemplate对象,让底层为此对象赋能)
  • 你是如何知道 @LoadBalanced 是怎么用的?(从官方案例中学习的)
  • 你知道哪些负载均衡算法?(随机,轮询,hash,重试,…)
  • 如何配置负载均衡算法?(配置类@Bean,配置文件application.yml,…)
  • 你是如何理解Feign的?(远程服务调用对象,基于声明式服务调用的定义即可.)
  • 你是如何使用Feign的呢?(依赖,配置,接口,熔断处理)
  • 能说说基于Feign调用的原理吗?(底层代理)
  • 服务熔断后你是如何记录错误日志的?(Slf4j-日志门面)
  • 在这里接触到了什么设计模式?(门面模式,中介者模式,模板方法,代理模式,策略)

Bug分析

  • 服务未启动就调用问题?

    2111-微服务核心知识点及问题分析

  • 没有找到可用的服务?

    2111-微服务核心知识点及问题分析

  • 依赖注入问题?

    2111-微服务核心知识点及问题分析

  • 404问题?(请求的资源找不到)

    2111-微服务核心知识点及问题分析

  • 500问题?(一定要看后端控制台错误)

课堂练习

  • 在启动类中配置负载均衡策略?
 @Bean
 public IRule rule(){
     return new RandomRule();
 }
  • 在配置文件application.yml中配置负载均衡策略?(配置文件或配置类只能二选一)
sca-provider: #基于服务名指定负载均衡策略
    ribbon:
      NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

课后作业

  • 总结课上知识点(RestTemplate,Feign)
  • 完成Feign的应用实践(必须掌握)
  • 预习05-nacos服务注册中心.

Day04- Nacos 配置中心实践

核心知识点

  • 配置中心诞生背景。
  • 市场上主流的配置中心。
  • Nacos配置中心简介。
  • Nacos配置中心入门实践。
  • Nacos配置中心的配置管理模型。

常见问题分析

  • 什么是配置中心?(存储项目配置信息的一个服务,这个服务可以实现配置的动态发布和更新)
  • 为什么要使用配置中心?(集中管理配置信息,动态发布配置信息,服务自动感知配置,提高服务可用性)
  • 市场上有哪些主流的配置中心?(Apollo,nacos,……)
  • 配置中心一般都会配置什么内容?(可能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则)
  • 什么信息一般不会写到配置中心?(服务端口,服务名,服务的注册地址,配置中心地址)
  • 项目中为什么要定义bootstrap.yml文件?(此文件被读取的优先级比较高,可以在服务启动时读取配置中心的数据)
  • Nacos配置中心宕机了,我们的服务还可以读取到配置信息吗?(可以从服务的本地内存读取)
  • 微服务应用中客户端如何感知配置中心数据变化?(1.4.x版本的nacos客户端会基于长轮询机制从nacos获取配置信息)
  • 服务启动后没有从配置中心获取我们的配置数据是什么原因?(依赖,bootstrap.yml,配置单词,格式,配置模型)
  • 你项目中使用的日志规范是什么?(SLF4J~门面模式)
  • 你了解项目中的日志级别吗?(debug,info,warn,error可以基于日志级别控制日志的输出)
  • RefreshScope注解的作用是什么?(描述从配置中心读取配置信息的类,其目的是配置中心配置发生变化,更新类实例,此时类中的实例属性就会重新初始化)
  • Nacos配置管理模型的背景?(环境不同配置不同)
  • Nacos配置中的管理模型是怎样的?(namespace>group>service/data-id)
  • Nacos客户端(微服务)是否可以读取共享配置?(可以)

常见Bug分析

  • mysql中没有配置中心数据,例如:

    2111-微服务核心知识点及问题分析

  • 包导入错误,例如:

    2111-微服务核心知识点及问题分析

  • 配置中心配置格式不正确,例如:

    2111-微服务核心知识点及问题分析

  • 程序中服务读取配置时,找不到配置,例如:

    2111-微服务核心知识点及问题分析

课堂练习

  • 项目中如何在配置文件中指定profiles(环境)? 第一步: 创建bootstrap-dev.yml,bootstrap-test.yml等配置文件(不同文件代表不同的环境配置),文件中配置自己指定. 第二步: 创建或修改bootstrap.yml文件,并添加如下内容(指定要使用的配置)
spring:
  profiles: # 通过profiles指定不同环境下的配置
    active: dev   #bootstrap-dev.yml
  • 在ProviderCacheController添加如下代码,实现一个本地Cache,你觉得这段代码有什么问题?
  /*构建一个本地cache对象*/
    private CopyOnWriteArrayList<String> localCache=
            new CopyOnWriteArrayList<>();
    /**
     * 通过这个方法,模拟从本地缓存取数据,本地缓存没有则从数据库取数据.
     * @return
     */
    @GetMapping("/provider/cache02")
    public List<String> doUseLocalCache02(){
        //1.检查本地缓存是否开启,假如没有开启
        //则从数据库去取数据并返回
        if(!useLocalCache){
            System.out.println("Get Data from Database");
            return Arrays.asList("A","B","C");//假设这是从DB中取的
        }
        //2.假设本地缓存已开启,则从缓存取数据,缓存没有则从数据库取,
        //并将数据在缓存放一份(暂时先不考虑一致性问题)
        if(localCache.isEmpty()){
            System.out.println("Get Data from Database");
            List<String> dbData = Arrays.asList("A", "B", "C");
            localCache.addAll(dbData);
        }
        return localCache;
    }

课后作业

  • 总结课上知识点
  • 完成文档中的共享配置应用.
  • 预习06-sentinel限流熔断操作实践。

Day05-Sentinel 限流应用实践

核心知识点

  • 服务限流背景?
  • Sentinel限流入门实践。
  • Sentinel限流时请求拦截原理。
  • Sentinel限流时异常类型以及异常处理器。
  • Sentinel中自定义异常处理器。
  • Sentinel流控模式应用实践?

常见问题分析?

  • 为什么要限流? (请求大,资源处理能力不足)
  • 你了解的限流组件有什么? (Sentinel,…)
  • Sentinel如何实现限流的?(对请求进行拦截,然后通过限流算法对请求进行限制)
  • Sentinel这里默认使用的限流拦截器是谁?(AbstractSentinelInterceptor->HandlerInterceptor的子类)
  • 你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)
  • Sentinel中出现限流异常的父类类型是什么?(BlockException)
  • Sentinel中默认的限流异常处理器是谁? (DefaultBlockExceptionHandler)
  • 我们可以自定义限流异常处理器吗?(直接或间接实现BlockExceptionHandler接口并交给spring管理)
  • 你了解Sentinel有哪些阈值类型?(QPS,线程数)
  • Sentinel的流控模式有哪些? (直接模式,关联模式,链路模式)
  • 如何理解Sentinel的关联限流?(霸权方式,当对A的资源的访问量比较大时,限流其它资源的访问)
  • 如何理解Sentinel的链路限流?(对同一个资源的访问,可能会有多条链路,可以对指定链路进行限流)
  • @SentinelResource注解的作用是什么?(定义限流切入点方法,底层可以基于aop方式对请求链路进行限制)
  • Sentinel常见的流控效果有哪些?(快速失败,warm up,排队等待)

常见Bug分析

  • Jdk的环境变量没有配置.(需要确保命令行java -version可以执行)
  • Jdk的版本不正确(现在要选择JDK8)

课堂练习

  • 尝试Idea中启动Sentinel?
  • 自定义限流异常处理器?(参考DefaultBlockExceptionHandler)
package com.jt.provider.controller;
/**
 * 自定义BlockException的异常处理对象
 */
@Component
public class DefaultSentinelExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request,
                       HttpServletResponse response,
                       BlockException e) throws Exception {
        //设置响应内容类型,以及告诉高客户端应该按什么编码显示数据
        response.setContentType("text/html;charset=utf-8");
        //设置响应状态码(将来可以基于这个状态码进行相关处理)
        response.setStatus(429);
        //获取响应输出流对象
        PrintWriter out = response.getWriter();
        out.print("访问太频繁,稍等片刻再访问.");
        out.flush();
        out.close();
    }
}

课后作业

  • 总结课上知识点
  • 完成限流应用实践(直接,关联,链路)
  • 预习06-Sentinel应用实践中的熔断操作
  • 尝试自己写一个TimeInterceptor拦截器(实现HandlerInterceptor)对象,然后对指定请求进行时间访问拦截. 第一步:拦截器原理分析(回顾spring mvc中的拦截器),例如:

    2111-微服务核心知识点及问题分析

    第二步:自定义拦截器,例如:
package com.jt.provider.interceptor;
public class TimeInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
    throws Exception {
        System.out.println("==preHandle==");
        //1.获取当前时间
        LocalTime now = LocalTime.now();//LocalTime为jdk8中的一个获取当前时间的api
        //2.获取当前的小时并进行逻辑判断
        int hour = now.getHour();//8:10~8
        System.out.println("hour="+hour);
        if(hour<9||hour>18){
            throw new RuntimeException("请在9~18时间范围内访问");//return false
        }
        return true;//false请求到此结束,true表示放行,会去执行后续的拦截器或controller对象
    }
}

第三步:配置拦截器,例如:

package com.jt;
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
    /**
     * 注册拦截器(添加到spring容器),并指定拦截规则
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TimeInterceptor())
                .addPathPatterns("/provider/sentinel01");
    }
}

第四步:打开浏览器,对/provider/sentinel01路径进行访问,对访问结果进行访问。

Day06 Sentinel 应用进阶

核心知识点

  • 基于Sentinel实现服务的降级(熔断)。
  • 基于Sentinel实现热点数据的限流。
  • 基于Sentinel实现系统规则的设计。
  • 基于Sentinel实现授权规则的设置。

常见问题分析

  • 如何理解服务的降级?(系统出现大量的慢调用或一些异常,可以对这些服务进行熔断-暂时关闭系统)
  • 如何理解慢调用?(客户端发起一个请求,得到服务端的响应比较慢)
  • 服务出现熔断时,系统底层抛出的异常是什么?(DegradeException)
  • 如何理解热点数据?(频繁访问的数据-例如文章、视频、图片、…)
  • 对热点数据限流时,底层基于什么机制去实现的?(AOP)
  • 假如是你去设计sentinel,你如何判定哪些数据是热点数据?(LRU算法)
  • Java中是否有对象直接封装了对LRU算法的实现?(LinkedHashMap)
  • 如何理解sentinel中的系统规则?(sentinel中的一种全局规则,不局限于某个资源)
  • 你了解Sentinel中的哪些系统全局规则呢?(CPU,RT,QPS,线程数量)
  • 如何理解Sentinel中的授权规则?(对资源的访问限制,不是基于频次进行限制,基于自定义的黑白名单)
  • Sentinel中解析黑白名单数据的规范接口是谁?(RequestOriginParser)
  • Sentinel中授权规则对应的异常对象是谁?(AuthorityException)
  • 请求传到tomcat后,这个Web服务器是如何处理请求的?

    2111-微服务核心知识点及问题分析

常见Bug分析

  • 自定义黑白名单的解析器对象不起做用?(检查是否交给了spring管理)

课堂练习

  • 基于请求头数据判定请求是否为黑白名单,然后进行授权访问。 第一步:修改DefaultRequestOriginParser类,例如:
package com.jt.provider.controller;
@Component
public class DefaultRequestOriginParser
        implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        //对请求头中的数据进行解析,请求头的名字为token,然后基于值进行授权。
        String token=request.getHeader("token");
        return token;
    }
}

第二步:在sentinel中设置授权规则,例如:

2111-微服务核心知识点及问题分析

第三步:打开idea中的http client文件(例如rest-api.http),进行访问测试,例如:

2111-微服务核心知识点及问题分析

课后作业

  • 总结课上知识点
  • 预习07-API Gateway的实现。
  • 基于LinkedHashMap去实现一个简易的LruCache对象。

Day07-API 网关(Gateway)入门实践

核心知识点

  • API 网关诞生背景(服务多了,需要对请求入口进行统一管理)
  • 市场主流微服务网关(Spring Cloud Gateway,zuul,…)
  • 基于API Gateway实现服务的保护和转发(重点)
  • 基于API Gateway层面的负载均衡实现(重点,lb://sca-provider)
  • 基于API Gateway请求处理原理分析(重点:官方图,了解关键代码,执行过程)
  • 基于API Gateway中常用谓词(predicate)对象进行实践分析。
  • 熟悉API网关中的过滤器?(GatewayFilter-局部过滤器,GlobalFilter-全局过滤器)

常见问题分析

  • 为什么要使用api网关?(统一url访问,服务保护,统一身份认证,统一跨域设计,…)
  • 网关入门实践的步骤? (依赖,配置,启动,服务访问)
  • 网关项目中的负载均衡是如何实现?(底层基于Ribbon,可以在RibbonLoadBalancerClient中加断点分析)
  • 说说SpringCloud gateway处理请求的基本流程?(官方,断点)
  • 网关中的谓词对象类型?(GatewayPredicate)
  • 网关中的谓词对象是如何创建的?(谓词工厂)
  • 你在网关中配置过哪些常用谓词?(Path,Method,Before,Query,Header,…)
  • 你了解哪些API 网关过滤器?(GatewayFilter-局部过滤器,GlobalFilter-全局过滤器)

常见BUG分析

  • 配置文件格式不正确,例如

    2111-微服务核心知识点及问题分析

  • 服务访问被拒绝,例如

    2111-微服务核心知识点及问题分析

  • 服务注册失败(nacos没启动),例如:

    2111-微服务核心知识点及问题分析

  • 503 异常(找不到可用的服务)

    2111-微服务核心知识点及问题分析

课堂练习

  • 定义一个 API 网关全局过滤器,用于对请求url进行黑白名单设计。
package com.jt.filter;

import org.apache.http.HttpHeaders;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * 课堂练习:
 * 构建一个全局的请求url过滤器,
 * 对请求url进行校验,合法则放行,不合法则给出反馈。
 */
@Component
public class BlackUrlGlobalFilter implements GlobalFilter,Ordered {
    //定义非法url集合(在此集合中的url不允许访问我们的资源)
    private List<String> blackUrls=new ArrayList<>();
    public BlackUrlGlobalFilter(){
        blackUrls.add("/nacos/provider/echo/9002");
        blackUrls.add("/nacos/provider/echo/9003");
    }
    /**
     * 这是一个对请求进行过滤的方法
     * @param exchange 基于这个对象可以获取请求和响应对象
     * @param chain 这里表示过滤链
     * @return 这里的返回值为一个Mono对象(本质上是一个Publisher)
     * ,这是spring5.0以后,WebFlux框架中的一个对象。
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange,
                             GatewayFilterChain chain) {
        //1.获取请求和响应对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        //2.获取请求路径(不需要ip和端口),例如/nacos/provider/echo/9001
        String requestPath=request.getURI().getPath();
        System.out.println("requestPath="+requestPath);
        //3.判定请求路径是否是不允许的url,假如是则给出反馈
        if(blackUrls.contains(requestPath)){
            //结果处理方案1:抛出异常
           //throw new RuntimeException("这个请求已被列入非法url");
            //结果处理方案2:响应一个error消息(难度系数要高一些)
            //告诉浏览器响应的数据类型以及以什么编码呈现数据
            response.getHeaders()
                    .add(HttpHeaders.CONTENT_TYPE,
                            "text/html;charset=utf-8");
            //封装响应数据
            DataBuffer data=response.bufferFactory()
                    .wrap("当前url不允许访问资源".getBytes(StandardCharsets.UTF_8));
            return response.writeWith(Mono.just(data));
        }
        //继续执行下一步操作
        return chain.filter(exchange);
    }
    /**定义过滤器的优先级,数字越小,优先级越高*/
    @Override
    public int getOrder() {
        return -1;
    }
}

课后作业

  • 总结课上知识点
  • 练习基于Gateway实现负载均衡方式的配置。
  • 练习常用谓词(Predicate)应用。
  • 预习API Gateway中如何使用sentinel进行限流。
  • 将黑名单过滤中的黑名单url,提取到配置文件,如何实现?

第一步:注释BlackUrlGlobalFilter中的构造方法,并添加set方法,例如:

   //这个set方法用于在系统读取到配置信息后,对属性进行初始化。系统底层自动调用。
   public void setBlackUrls(List<String> blackUrls) {
        this.blackUrls = blackUrls;
    }

第二步:在配置文件application.yml中添加如下配置,例如:

web:
 request:
   blackUrls:
     - /nacos/provider/echo/9002
     - /nacos/provider/echo/9003

第三步:在BlackUrlGlobalFilter类上添加如下注解,指定要读取的配置

@ConfigurationProperties("web.request")

第四步:在sca-gateway的pom文件中添加如下依赖,用于支持第三步中注解的应用。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

第五步:启动服务进行访问测试。

Day08-Gateway 应用进阶实践

核心知识点

  • API Gateway中基于sentinel实现服务限流(API,路由id)。
  • API Gateway中基于自定义限流结果的处理(GatewayCallbackManager)。
  • API Gateway中统一跨域设计。
  • UI工程与Gateway之间的交互设计。
  • 单点登录系统的需求分析以及设计。

常见问题分析

  • 网关层面的限流类型有哪些?(路由id,API分组)
  • 我们是否可以对限流结果进行自定义处理?(可以)
  • 网关中如何进行统一跨域设计?

常见Bug分析

  • 跨域问题

    2111-微服务核心知识点及问题分析

课堂练习

  • 微服务架构下ajax请求响应业务处理实践。 第一步:业务描述(通过sca-ui工程向网关工程发送ajax请求,并进行响应处理)

    2111-微服务核心知识点及问题分析

    第二步:创建sca-ui工程的html页面,然后通过触发按钮发送ajax请求,例如

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <div>
    <h2>The Index Page</h2>
    <button onclick="doBuy()">Buy</button>
    <span id="result"></span>
  </div>
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  <script>
     //前端如何排错(日志,debugger,排除法)
     function doBuy(){
         console.log("==doBuy==");
        //1.基于axios框架发送异步ajax请求
         let url="http://localhost:9000/nacos/provider/echo/1"
         let span=document.getElementById("result");
         axios.get(url)
             .then(function (response) {//请求ok,执行then
                 console.log(response.data);
                 //2.将响应结果更新到页面上
                 span.innerHTML = response.data
             })
             .catch(function (error) {
                 console.log(error);
             });
     }
 </script>
</body>
</html>

第三步:在sca-gateway的配置文件或配置中心中添加跨域配置,例如:

spring:
  cloud:
    gateway: 
      globalcors: #跨域配置
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods: "*"

第五步:按项目架构设计启动服务,进行测试。

http://localhost:8080/index.html
  • 网关层面添加限流操作. 第一步:关闭网关中的限流异常处理(网关中出现了限流操作不处理异常) 第二步:在网关中针对于路由id添加限流操作. 第三步:在sca-ui工程的index.html中的catch代码中添加如下语句.
if(error.response.status==429){
 spanObj.innerHTML="访问太频繁了";
}

第四步:对请求进行访问测试.

课后作业

脚本宝典总结

以上是脚本宝典为你收集整理的2111-微服务核心知识点及问题分析全部内容,希望文章能够帮你解决2111-微服务核心知识点及问题分析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。