文章目录

  • Day01~微服务架构入门
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课堂练习
    • 课后作业
  • Day02~Nacos注册中心入门
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课堂小技巧
    • 课后作业
  • Day03~基于Nacos实现服务发现与调用
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课堂练习
    • 课后作业
  • Day04~基于Feign方式的服务调用实践
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课上技巧
    • 课上练习
    • 课后作业
  • Day05~Nacos配置中心应用实践
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课后作业
  • Day06-Sentinel 限流应用实践
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课上练习
    • 课后作业
  • Day07-Gateway 入门应用实践
    • 核心知识点
    • 常见问题分析
    • 常见BUG分析
    • 课后作业
  • Day08 Gateway 进阶应用实践
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课堂练习
    • 课后作业
  • Day09~单点登录系统初步设计及实现
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课后作业
  • Day10~SSO系统中的登录逻辑基本实现
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课上小技巧
    • 课后作业
  • Day11~SSO系统颁发令牌及资源服务实践
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课后作业
  • Day12~SSO网关,UI工程以及操作日志实践
    • 核心知识点
    • 常见问题分析
    • 常见Bug分析
    • 课后作业
    • 小阶段总结

Day01~微服务架构入门

核心知识点

  • 微服务架构诞生的背景(软件即服务,将一个大型软件,拆成若干个小系统;分而治之~北京一个火车站到多个火车站)
  • 微服务架构解决方案(大厂基本自研~自己研发各种组件,Spring Cloud ~Netflix,Alibaba,…)
  • 微服务架构下Maven聚合项目的创建方式?(Maven聚合项目~资源复用:extends,import,简化编译,打包,部署方式)
  • 微服务架构入门聚合项目创建?(01-sca,sca-consumer,sca-provider,sca-gateway,sca-common)
  • 微服务中聚合工程之间的引用设计?(将一个工程作为依赖添加到其它工程~重点是坐标)

常见问题分析

  • 为什么需要微服务?(对系统分而治,解决因并发访问过大带来的系统复杂性(例如:业务,开发,测试,升级,可靠性等)
  • 微服务设计的特点?(单一职责,独立进程,开发测试效率高,可靠性高,升级难度小,但会带来一定的维护成本)
  • 微服务解决方案有哪些?(大厂自研,中小企业采用开源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)

常见Bug分析

  • 依赖无法下载或加载?(本地库冲突,网络不好,maven镜像配置,指定版本在远程服务器不存在,清idea缓存后重启)

  • 项目的pom.xml文件有删除线?(idea/setting/build,Execution,Deployment/build Tools/maven/ignore Files)

  • 项目单元测试失败,提示找不到@SpringBootConfiguration,例如:

  • 当项目中出现了多个启动类时,在项目启动或单元测试时会出现如下问题,例如:

  • 单元测试依赖添加的有问题或者单元测试类写错了位置,例如:

  • 方法调用错误,例如:

  • 空指针异常,例如:

课堂练习

练习一:公共工程设计及实现

第一步:创建01-sca工程的子工程,工程模块名sca-common,例如:

第二步:在sca-common模块工程中创建一个工具类com.jt.common.util.StringUtils,并在类中添加一个判断字符串是否为空的静态方法。

package com.jt.common.util;public class StringUtils {/*** 通过此方法判定传入的字符串是否为空* @param str* @return*/public static boolean isEmpty(String str){return str==null||"".equals(str);}
}

第三步:将sca-common工程以依赖的方式添加到sca-provider工程中?

<dependencies><!--添加springboot web依赖(此依赖中包含了springboot工程需要的很多基础依赖)--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--添加sca-common依赖--><dependency><groupId>com.jt</groupId><artifactId>sca-common</artifactId><version>1.0-SNAPSHOT</version></dependency>
</dependencies>

第四步:在sca-provider工程中添加一个springboot启动类,类名为com.jt.ProviderApplication

package com.jt;
import com.jt.common.cache.DefaultCache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class ProviderApplication{public static void main(String[] args) {SpringApplication.run(ProviderApplication.class,args);}
}

第五步:在sca-provider工程中写一个单元测试类,类全名为com.jt.util.StringTests,并添加单元测试方法,在这个单元测试方法中使用sca-common工程中写的StringUtils类,测试一个字符串是否为空.

package com.jt.util;
import com.jt.common.util.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class StringTests {@Test //org.junit.jupiter.api.Testvoid testStringEmpty(){String str="";boolean empty = StringUtils.isEmpty(str);System.out.println(empty);}
}

练习二:熟悉工程中对象的管理以及测试

第一步:在sca-common工程中定义一个com.jt.common.cache.DefaultCache类型.

package com.jt.common.cache;
public class DefaultCache {}

第二步:在sca-provider工程将DefaultCache类型的对象交给spring管理,写到启动类即可。

package com.jt;
import com.jt.common.cache.DefaultCache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class ProviderApplication{@Beanpublic DefaultCache defaultCache(){//将DefaultCache对象交给spring管理return new DefaultCache();}public static void main(String[] args) {SpringApplication.run(ProviderApplication.class,args);}
}

第三步:在sca-provider工程中定义个单元测试类DefaultCache,并且在类中定义一个
单元测试方法,输出DefaultCache对象的toString方法的返回值。

package com.jt.util;import com.jt.common.cache.DefaultCache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class DefaultCacheTests {@Autowired //DIprivate DefaultCache defaultCache;@Testvoid testDefaultCache(){System.out.println(defaultCache.toString());}
}

课后作业

  • 总结课上知识点(养成好习惯)
  • 完成自己电脑中JAVA_HOME环境变量的配置。(JDK必须是8并且64Bit的)
  • 确保自己电脑中的mysql为5.7以上或者mariadb10.5以上版本并基于这个版本执行课前资料中的nacos-mysql.sql
  • 预习04-Nacos注册服务注册中心应用实践。

Day02~Nacos注册中心入门

核心知识点

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

常见问题分析

  • 如何理解服务注册中心?(存储服务信息的一个服务)
  • 服务注册中心诞生的背景? (服务多了,需要对服务进行更好管理)
  • 市场上常用的注册中心?(Zookeeper,Eureka,Nacos,Consul)
  • 如何对注册中心进行选型?(社区活跃度,稳定性,功能,性能,学习成本)
  • Nacos 是什么?(是Alibaba公司基于SpringBoo技术实现的一个注册中心,本质上也是一个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管理)

常见Bug分析

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

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

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

  • sql文件不存在,例如

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

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

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

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

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

  • 客户端500异常,例如

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

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

课堂小技巧

  • 基于idea启动nacos,例如:
  • 基于idea链接database数据库,例如:
    第一步:打开DataSource,找到mysql,例如:

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

课后作业

  • 总结课堂知识点
  • 完成基于nacos的服务注册
  • 完成基于RestTemplate对象实现服务调用。
  • 预习负载均衡方式的服务发现及调用。

Day03~基于Nacos实现服务发现与调用

核心知识点

  • 负载均衡诞生背景.(网络中有一组可以提供相同服务的计算机~类似银行的各个营业点)
  • 客户端负载均衡&服务端负载均衡的不同?(browser->nginx->…;sca-consumer->sca-provider)
  • 基于LoadBalancerClient 对象从注册中心获取服务列表(服务发现)
  • 基于Ribbon(一个负载均衡组件,这个组件中提供一套负载均衡算法)实现负载均衡
  • @Loadbalanced注解的应用(描述RestTemplate对象,为此对象的远程调用进行赋能)

常见问题分析

  • 为什么负载均衡?(通过多个服务实例均衡处理客户端的请求,生活中有一种说法叫不患寡而患不均)
  • 如何理解服务发现?(服务发现就是从注册中心获取服务信息,例如从nacos获取服务实例信息)
  • LoadBalancerClient的作用?(从nacos注册中心获取服务实例列表,然后本地基于负载均衡算法获取具体服务实例)
  • @Loadbalanced注解作用?(描述RestTemplate对象,让系统底层为RestTemplate对象赋能,对请求过程进行拦截)
  • 你了解哪些负载均衡策略?(基于IRule接口去查看,快捷键ctrl+h)
  • 我们如何修改负载均衡策略?(配置文件->例如application.yml,配置类->例如启功类)

常见Bug分析

  • NullPointerException,例如:
  • 端口被占用,例如
  • UnknownHostException,例如

课堂练习

  • 修改sca-consumer端默认的负载均衡策略?(自己查资料实现)
    方案1:修改sca-consumer配置文件(application.yml),添加如下语句,例如:
sca-provider: #这个是要进行远程调用的服务id(服务名)ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡算法

对于方案1写法,在写的过程没有提示,缩写编写苦难,但是将来的可运维性会比较好,我们这部分配置写到配置中心,不需要重启服务即可实现配置的动态发布,动态更新。

方案2:修改sca-consumer的启动类,在启动类中添加如下方法,例如:

@Bean
public IRule ribbonRule() {return new RandomRule();
}

对于方案2的写法,编写相对简单,编写过程都有提示,但是将来的可运维性比较差,项目打包以后,我们无法再修改
负载均衡算法。

课后作业

  • 总结课上知识点(重点总结核心知识点,遇到了什么问题,如何解决的)。
  • 同学之间相互挖些坑,提高分析问题和解决问题的能力。(404,500,…)
  • 预习并尝试实现一个基于feign方式的服务调用(一定要去做)。

Day04~基于Feign方式的服务调用实践

核心知识点

  • Feign 诞生的背景
  • Feign 方式远程服务调用实践
  • Feign 接口对应的Bean对象命名
  • Feign 方式远程服务调用时熔断处理方案
  • Feign 方式调用原理分析

常见问题分析

  • 为什么使用Feign方式的服务调用?(优化结构,简化服务调用过程代码的编写、)
  • 如何基于feign方式实现远程服务调用?(依赖,配置,feign接口定义)
  • @EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类)
  • @FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
  • 如何理解基于Feign方式的远程服务调用?声明式远程服务调用,底层封装了服务调用过程。
  • Feign方式如何实现负载均衡?(底层基于ribbon组件实现)
  • Feign接口指向的对象是谁?
  • 常用服务发现、服务调用方式有哪些?

常见Bug分析

  • Fien接口对象依赖注入异常,例如:

  • 服务访问时的404异常,例如:

  • Feign接口方法中@PathVariable注解参数定义问题,例如:

  • 读数据超时,例如:

  • 依赖注入异常,例如:

课上技巧

  • Idea中Http Client 工具的应用?(基于此工具进行restful风格的请求测试)

课上练习

  • Feign方式远程调用超时配置,例如
feign:hystrix:enabled: false #false,true表示启动超时熔断机制client:config:default: #表示所有服务均采用此配置,也可以指定具体服务名(remoteProviderService)。connectTimeout: 20000 #连接超时readTimeout: 20000 #读取数据超时
  • 简易tomcat应用实践,了解服务创建,服务通讯过程,例如:

第一步:构建一个简易tomcat对象(了解)

package com.jt.common.net;import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** 通过java代码实现一个简易Tomcat对象*/
public class Tomcat {public static void main(String[] args) throws IOException {//1.构建一个ServerSocket对象(java网络编程中的服务对象),并在指定端口进行监听ServerSocket server=new ServerSocket(9000);System.out.println("server start ...");//2.等待客户端连接(可以循环处理多个客户端的请求)while(true){Socket client = server.accept();//阻塞式方法OutputStream out = client.getOutputStream();//基于http协议格式构建响应数据byte[] data=("HTTP/1.1 200 OK \n\r" +"Content-Type: text/html;charset=utf-8 \n\r" +"\n\r" +"hello client").getBytes();out.write(data);out.flush();}//http}
}

第二步:构建一个简易Browser对象,例如

package com.jt.common.net;import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;/*** 模拟浏览器*/
public class Browser {public static void main(String[] args) throws IOException {//1.构建网络客户端对象Socket,并通过此对象对远端服务进行连接Socket socket=new Socket("127.0.0.1", 9000);//2.获取流对象InputStream in = socket.getInputStream();byte[] buf=new byte[1024];int len=in.read(buf);System.out.println("server say:"+new String(buf,0,len));//3.释放资源socket.close();}
}

第三步:启动tomcat服务,Browser服务进行访问测试分析。

课后作业

  • 总结课上知识点
  • 强化Feign方式的服务调用
  • 尝试基于Feign方式实现Post方式的服务调用
  • 阅读ruoyi项目中的Feign方式应用
  • 预习Nacos配置中心应用实践。

Day05~Nacos配置中心应用实践

核心知识点

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

常见问题分析

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

常见Bug分析

  • mysql中没有配置中心数据,例如:
  • 包导入错误,例如:
  • 配置中心配置格式不正确,例如:
  • 程序中服务读取配置时,找不到配置,例如:

课后作业

  • 总结课上知识点
  • 尝试完成一个简易本地cache的应用。
  • 预习sentinel组件如何实现服务限流操作。

Day06-Sentinel 限流应用实践

核心知识点

  • 服务限流、降级的背景(服务的治理)
  • Sentinel限流入门实践(控制台8180-定义规则,客户端服务应用规则:依赖,配置)
  • Sentinel常用限流模式(直接,关联->保证核心业务,链路->红绿灯)
  • Sentinel降级(熔断)入门实现(出现不稳当的系统服务时,暂停对此服务的访问)
  • Sentinel实现热点参数限流(热点视频,文章,…),系统规则配置(例如cpu使用率),授权配置(黑白名单)

常见问题分析

  • 为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行)
  • 你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)
  • Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)
  • @SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点)
  • Sentinel常用限流效果有哪些?(快速失败,预热,排队)
  • Sentinel中限流、降级操作被触发时出现的异常类型是什么?(都是BlockException类型的子类)
  • 如何对限流结果进行处理?(有默认处理方案,我们也可以自己定义处理规则-实现BlockExceptionHandler接口)
  • Sentinel限流的基本原理?(底层对服务请求进行拦截,然后通过流控规则限定对资源访问)

常见Bug分析

  • sentinel 服务启动不起来?(要配置jdk环境变量path,要使用JDK8版本)
  • sentinel 面板不显示我们的服务?(依赖,配置>一定要注意缩进,先访问,放大招-清idea缓存重启)
  • 配置完sentinel后,业务服务启动不启动来?(大部分都是配置错了)

课上练习

  • 基于spring mvc 拦截器对系统中指定资源进行时间访问限制?
    第一步:拦截器原理分析,例如:

    第二步:定义拦截器,例如:
package com.jt.provider.interceptor;
public class TimeInterceptor implements HandlerInterceptor {@Overridepublic 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~8System.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*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TimeInterceptor()).addPathPatterns("/provider/sentinel01");}
}

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

课后作业

  • 总结课上知识点.
  • 了解常用限流算法.
  • 自己完成Sentinel热点规则设计,系统规则设置,授权规则设置(必须完成).
  • 预习spring cloud gateway网关。

Day07-Gateway 入门应用实践

核心知识点

  • API 网关(Gateway)诞生背景
  • 市场主流微服务网关(Spring Cloud Gateway,zuul,…)
  • API Gateway实现服务的保护和转发(重点)
  • API Gateway层面的负载均衡实现(重点,lb://sca-provider)
  • API Gateway请求处理原理分析(重点:官方图,了解关键代码,执行过程)

常见问题分析

  • 为什么要使用api网关?(服务保护,统一url访问,统一身份认证,统一跨域设计,。。。)
  • 网关入门实践的步骤? (依赖,配置,启动,服务访问)
  • 网关项目中的负载均衡是如何实现?(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点分析)
  • 说说SpringCloud gateway处理请求的基本流程?(官方,断点)

常见BUG分析

  • 配置文件格式不正确,例如
  • 服务访问被拒绝,例如
  • 服务注册失败(nacos没启动),例如:
  • 503 异常(找不到可用的服务)

课后作业

  • 总结课上知识点
  • 练习基于Gateway实现负载均衡方式的配置。
  • 预习常用谓词,过滤器以及sentinel限流设计。
  • 将路由配置写到配置中心进行实践?(自己动手丰衣足食)

第一步:添加依赖(spring-cloud-starter-alibaba-nacos-config)

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

第二步:修改配置文件名(修改bootstrap.yml)并添加注册中心配置

spring:cloud:nacos:config:server-addr: localhost:8848file-extension: yml

第三步:在nacos中创建配置,并将路由部分内容添加到配置中心

第四步:启动服务(nacos,两个provider,一个gateway)读取配置并进行访问测试。
在浏览器中输入http://localhost:9000/nacos/provider/echo/9000

  • 在网关层面配置负载均衡策略(可以直接将配置写到配置中心),例如:
sca-provider: #这个是要进行远程调用的服务id(服务名)ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡算法

Day08 Gateway 进阶应用实践

核心知识点

  • 网关中常用谓词(predicate)对象及实践。
  • 网关中过滤器(Filter)的类型及实践。
  • 网关中基于sentinel实现服务限流(API,路由id)。
  • 网关中基于自定义限流结果的处理(GatewayCallbackManager)。
  • 网关中实现统一跨域配置(推荐配置文件,参考官网)。

常见问题分析

  • 网关中的谓词对象类型?(GatewayPredicate)
  • 网关中的谓词对象是如何创建的?(谓词工厂)
  • 你在网关中配置过哪些常用谓词?(Path,Method,Before,Query,Header,…)
  • 网关中的过滤器是如何分类的?(GlobalFilter,GatewayFilter:需要手动配置)
  • 我们是否可以自定义谓词,过滤器对象?(可以,参考官方默认的定义)
  • 网关层面如何基于sentinel实现限流?(有关sentinel的两个依赖,配置,JVM参数)
  • 网关层面的限流类型有哪些?(路由id,API分组)
  • 我们是否可以对限流结果进行自定义处理?(可以,了解)
  • 网关中做跨域如何设计?(Java代码方式配置,配置文件方式-推荐)
  • 如何将路由,跨域,负载等配置写到配置中心?(注意层级关系)

常见Bug分析

  • 配置文件的格式?(一定要注意缩进关系)
  • 配置中心数据读取不到?(依赖,bootstrap.yml,内容的格式,配置管理模型)
  • 跨域配置问题?(服务于客户端的ajax请求)

课堂练习

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

    第二步:创建sca-ui工程,例如:

    第二步:在sca-ui工程中添加spring-boot-starter-web依赖。
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

第三步:在sca-ui工程中启动类,例如:

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工程创建static目录,在此目录下添加js文件,html文件,例如:

其中,index.html内容如下:


<!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 src="/js/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,执行thenconsole.log(response.data);//2.将响应结果更新到页面上span.innerHTML = response.data}).catch(function (error) {debugger //设置断点//console.log(error);if(error.response.status==429){span.innerHTML = error.response.statusText;}});}</script>
</body>
</html>

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

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

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

http://localhost:8080/index.html

课后作业

  • 总结课上知识点
  • 完成课上微服务架构下请求响应练习。
  • 预习单点登录系统的设计及实现

Day09~单点登录系统初步设计及实现

核心知识点

  • 单点登录系统诞生的背景。
  • Java中单点登录系统解决方案。
  • 单点登录系统(SSO)中的服务划分及关系设计。
  • 单点登录系统中父工程的创建及初始化。
  • 系统基础服务(sso-system)工程的创建及基本业务实现。

常见问题分析

  • 为什么要做单点登录设计?(业务简化,代码复用,不需要每个服务都登录一次)

  • 你知道哪些SSO系统解决方案?(基于用户登录状态信息的存储进行方案设计)

  • 单点登录系统中你的服务是如何设计的,工程结构是怎样的?

  • 用户登录时,需要从数据库查询哪些信息?(用户信息以及用户的权限信息)

  • 如何基于用户id查询用户权限,你有什么方案?(3种)

  • 基于idea的为类自动生成序列化id?

  • 基于idea中的httpclient进行服务访问测试?
  • 如何将链接数据库的信息写到配置中心?
  • @Autowired注解描述的Mapper对象有红色波浪线,但运行没有错误,如何去除红色波浪线。
  • idea中如何在Database窗口打开要访问的数据库,例如

常见Bug分析

  • MySql指令不可用,例如:

  • 项目启用异常,提示有多个@SpringBootConfiguration注解描述的类,例如:

  • 连接数据库的url中时区定义有问题,例如:

  • NullPointerExeption 异常分析?

  • 数据库依赖问题,例如:

  • MyBatis 绑定异常(BindException)

课后作业

  • 总结课上内容
  • 完成单点登录系统中的基础服务的设计和实现
  • 尝试完成单点登录系统中的认证服务的具体落地实现(必须完成)

Day10~SSO系统中的登录逻辑基本实现

核心知识点

  • 定义封装用户信息的User对象(一定主要包结构)
  • 定义用户信息远程调用Feign接口(RemoteUserService~基于此接口调用sso-system服务中的用户信息)
  • 基于Security规范定义用户业务逻辑服务对象(UserDetailsServiceImpl~调用RemoteUserService获取和封装用户信息)
  • 定义用户认证基本配置类(SecurityConfig~配置密码加密对象,认证规则,以及登录成功或失败的处理方案)
  • 实现自定义登录逻辑测试(校验登录正确账号和错误账户下服务端的响应结果)
  • 熟悉SpringSecurity的认证流程?(Client->Filters->AuthenticationManager–>UserDetailService->…)

常见问题分析

  • 为什么定义RemoteUserService 接口(Feign)?(基于此接口调用远程sso-system服务)
  • sso-auth服务中用户业务数据的获取在哪里?(客户端提交的用户名,sso-system服务提供的数据库数据)
  • 为什么要构建SecurityConfig对象?(配置加密算法,认证规则)
  • 为什么要让SecurityConfig类要继承WebSecurityConfigurerAdapter类型?(重写默认的认证规则)
  • 认证过程中使用的密码加密对象是谁?(BCryptPasswordEncoder,不可逆加密对象)
  • 单体架构中的用户的状态的存储是如何实现的?(了解,默认是存储到了tomcat的session对象中)

常见Bug分析

  • 没有PasswordEncoder对象,例如:

  • 远程调用服务404异常,例如:

  • 远程调用服务没启动或服务名不正确,例如

  • 基于postman登录测试时404异常,例如:

  • 服务名的定义和使用不规范,例如:

  • Feign接口依赖注入异常,例如:

  • NullPointerException,例如

课上小技巧

  • Maven Helper 插件安装及应用,例如

  • 基于idea的http client工具测试登录,例如

  • 基于Postman工具测试登录,例如:

课后作业

  • 总结课上知识点
  • 预习并尝试完成统一认证服务中TokenConfig,Oauth2Config类的定义(一定要写完,哪怕是复制的)
  • 预习并尝试完成资源服务工程(sso-resource)设计?(尽量做完)

Day11~SSO系统颁发令牌及资源服务实践

核心知识点

  • 认证服务器(sso-auth)中Token设计(UUID令牌,JWT令牌)
  • 认证服务器(sso-auth)中Oauth2规范基本配置(认证入口,为谁认证,由谁认证,认证后颁发什么令牌)
  • 基于Postman进行认证测试?(请求方式,请求url,认证参数)
  • 资源服务器(sso-resource)核心业务分析及认证,授权规则设计及实现(匿名,认证,授权)

常见问题分析

  • JWT是什么?(是JSON WEB TOKEN这几个单词的缩写,描述的是web应用的一种令牌格式)
  • JWT有几部分构成?(头:令牌类型,签名算法,负载:允许包含用户登录状态 ,签名:防止令牌被篡改)
  • 为什么要采用JWT令牌?(可以存储用户登录状态信息,避免访问资源时从数据库查询认证信息)
  • 基于Oauth2协议的认证服务器默认的令牌生成策略是什么?(UUID.randomUUID())
  • 认证服务器中常见令牌相关设计存储方案有哪些?(Mysql,Redis,Jwt)
  • 认证服务器对用户进行认证时,客户端提交了哪些关键信息?(username,password,client_id,grant_type,client_secret)
  • 认证服务器完成认证操作后,服务端返回哪些信息?(访问令牌,刷新令牌,令牌类型,作用域,编号)
  • 认证服务器中完成认证业务的关键对象有哪些?(Filter,AutenticationManager,UserDetailService,.)
  • 资源服务器如何设计的认证,授权规则?(三个维度:匿名,登录,授权)
  • 访问令牌与刷新令牌有什么不一样?(客户端是要携带访问令牌访问资源的,刷新令牌是为了再次生成访问令牌)
  • 访问令牌,刷新令牌有有效时长吗?(刷新令牌有效时长一般要大于访问令牌有效时长)

常见Bug分析

  • 客户端传参不匹配,例如:

  • AuthenticationManager对象没有配置(SecurityConfig),例如:

  • 响应的令牌不正确,例如:

  • 400异常,例如

  • 请求方式不正确,例如
  • 访问地址错误,例如:

课后作业

  • 总结课上知识点及常见问题
  • 完成单点登录系统的认证服务器以及资源服务器的设计和实现

Day12~SSO网关,UI工程以及操作日志实践

核心知识点

  • SSO系统中网关服务器(sso-gateway)实现路由转发,跨域设计,负载均衡,限流。
  • SSO系统中UI工程中页面设计(Bootstrap+VUE+axios)及请求响应代码分析(200,401,403)。
  • SSO系统中访问资源时进行用户行为日志的获取和记录。(AOP,Feign,Async)

常见问题分析

  • 网关服务器在哪里做了负载均衡(lb://)?
  • 为什么网关层面要做跨域设计?(Ajax技术不支持跨域请求,将所有服务的跨域共性提取到网关层面)
  • UI工程中用户端如何提交ajax请求的?(axios,底层ajax对象为XMLHttpRequest)
  • 为什么在资源访问时要记录用户行为日志?(便于用户行为进行分析)
  • 你基于什么技术获取的用户行为日志?(采用了AOP的设计)
  • 你记录日志时采用的是同步还是异步方式?(异步方式)
  • 项目切面中如何获取请求对象?(RequestContextHolder)
  • 项目切面中获取获取登陆用户信息?(SecurityContextHolder)
  • 你项目中哪里用到了反射技术呢?(Spring Bean对象的创建,依赖注入,方法对象的获取,方法上注解的获取,。。)
  • @PreAuthorize注解的作用是什么?(描述资源方法,告诉系统底层,访问此方法需要授权)

常见Bug分析

  • 400异常,请求参数不合法(参数个数,类型,格式)。

  • 401异常,认证失败?(提交的数据不正确)

  • 403异常,没有资源访问权限?(说明用户为已认证用户,但是没有资源的访问权限)

  • 415异常,数据协议有问题?(比方说,你要json数据,但是数据格式定义的是text)

  • 调用的服务没有启动,例如:

  • 503异常,例如

课后作业

  • 总结课上知识点
  • 完成用户访问资源时用户行为日志的获取及记录。

小阶段总结

  • 一种微服务架构设计思想(分而治之~服务治理)
  • 一套微服务解决方案(Spring Cloud Alibba)
  • 一种项目创建方式(Maven聚合项目)
  • 五大微服务核心组件(Nacos,Feign,Ribbon,Sentinel,Gateway)
  • 一套单点登录(SSO)系统,三个核心业务(微服务架构+5个核心组件+3个认证和授权技术)
  • 常用的几种设计模式(策略模式,门面模式,代理模式,工厂模式,建造模式,责任链模式,桥接模式,装饰模式,适配器模式,单例设计,模板方法模式,。。。)

2108-微服务课上问题分析及总结相关推荐

  1. 2109-微服务课上问题分析及总结

    文章目录 Day01~微服务架构入门 核心知识点 常见问题分析 常见Bug分析 课堂练习 课后作业 Day02~Nacos注册中心入门 核心知识点 常见问题分析 常见Bug分析 课堂小技巧 课后作业 ...

  2. 微服务架构学习与思考(05):微服务架构适用场景分析

    一.简述 在实际开发中,需要考虑多种因素,来决定采取哪种架构模式才适合当前业务发展情况. 毕竟微服务也不能"包治百病",不要把它当做万能药.企业研发哪里得病了,觉得只要把" ...

  3. 常见微服务框架和对比分析

    常见的微服务框架 第一代微服务框架  SpringCloud Spring Boot:快速开发微服务的框架(可以快速开发出一个单体微服务项目) SpringCloud 为开发者提供了快速构建分布式系统 ...

  4. 微服务优雅上下线的实践方法

    导语 本文介绍了微服务优雅上下线的实践方法及原理,包括适用于 Spring 应用的优雅上下线逻辑和服务预热,以及使用 Docker 实现无损下线的 Demo.同时,本文还总结了优雅上下线的价值和挑战. ...

  5. 分布式秒杀电商-微服务架构图 上帝视角分析

    整个项目采用前后端分离开发,外网部署前台项目.内网部署后台项目.本文以客户使用客户端访问网站,向后台发送请求这一条线索对上图进行分析. 文章目录 一.Nginx集群→API网关 二.API网关→服务模 ...

  6. 现阶段Java高可用集群架构与微服务架构的简单分析

    一.如何选择 1.高可用集群 适用于中小型创业公司项目架构,小型技术团队快速迭代版本发布部署需求,前期低成本运行,爆发时可通过投入适量成本横向扩容服务器抗压. 特点: 前期技术开发成本低 一定的服务器 ...

  7. 当微服务遇上 Serverless | 微服务容器化最短路径,微服务 on Serverless 最佳实践

    简介: 阿里云Serverless应用引擎(SAE)初衷是让客户不改任何代码,不改变应用部署方式,就可以享受到微服务+K8s+Serverless的完整体验,开箱即用免运维. 前言 微服务作为一种更灵 ...

  8. 微服务调用事项;分析Java微服务优点

    微服务调用事项 微服务=配置+流程+组件 微服务调用: 1.不要用api去调用api,比如report的实体类去继承collect实体类,容易导致有些接口情况出现report->collect, ...

  9. 《高楼的性能工程实战课》微服务电商项目技术全解析

    文章目录 一.项目介绍 二.整体结构 三.预备知识 1.什么是 SpringCloud ? 2.Spring .SpringBoot 和 Spring Cloud 的关系 3.Spring Cloud ...

最新文章

  1. 远程办公项目团队如何进行团队协作?
  2. S2-045漏洞利用工具解决方案
  3. MySQL 5.7 中TIMESTAMP with implicit DEFAULT value is deprecated错误
  4. 任何网站优化都离不开的四个方向是什么?
  5. c++ template(5)模板实战
  6. Django(part29)--Q对象
  7. 构建可扩展的有状态服务
  8. Qt之QThread用法
  9. 样本不均衡、长尾分布问题的方法整理(文献+代码)
  10. Visual Studio 2008 每日提示(六)
  11. 基于typescript的rtsp客户端实现
  12. python微信库wxpy无法登录_使用wxpy这个基于python实现的微信工具库的一些常见问题...
  13. Html5——WebSocket
  14. putty-gns3
  15. MVC 下拉列表三级联动
  16. Java web项目的解耦合
  17. 通过python获取浏览器cookie
  18. 图文并茂教你如何用PLC控制伺服电机!
  19. Layered Windows分层窗口
  20. Toad oracle

热门文章

  1. VB.net学习笔记(九)委托
  2. node 使用 --use_strict
  3. 一个java类只能有一个public类,但可以定义多个非public类
  4. 寻找两个有序数组的中位数——python实现
  5. vscode新建工程
  6. De-snowing LiDAR Point Clouds With Intensity and Spatial-Temporal Features
  7. 单调队列用法 deque
  8. 《CCNP安全Secure 642-637认证考试指南》——2.2节安全漏洞
  9. pip安装的python库Pycharm用不了
  10. linux查看mysql是否可以远程登陆_Linux中开启mysql远程访问功能