2110-微服务核心知识点及问题分析
Posted 雨田说码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2110-微服务核心知识点及问题分析相关的知识,希望对你有一定的参考价值。
文章目录
- Day01~微服务架构入门
- Day02~Nacos注册中心入门
- Day03~远程服务调用实践
- Day04~Nacos配置中心应用实践
- Day05-Sentinel 限流应用实践
- Day06-Sentinel 进阶应用实践
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配置是正确,都正确就清idea缓存重启)
课堂练习
- 删除聚合工程中的子工程模块.
第一步:在项目结构中删除,例如
第二步:将项目从idea工作区中删除,例如
第三步:将项目从父工程的pom文件中删除,例如
- 移除重建项目module中的pom文件删除线,例如:
- 构建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页面
第四步:启动sca-ui工程,在浏览器中输入http://localhost:8080/index.html进行测试.
课后作业
- 总结课上知识点(养成好习惯)
- 检查并设置JDK环境变量JAVA_HOME.
- 升级mysql的版本为5.7或以上版本(Mariadb 10.3或以上版本)
- 预习04-nacos服务注册中心应用实践.
Day02~Nacos注册中心入门
核心知识点
- 服务注册中心诞生背景? (服务多了,需要统一管理,例如所有公司需要在工商局进行备案)
- 服务注册中心的选型?(社区活跃度,稳定性,功能,性能,学习成本)
- Nacos下载,安装(解压),配置(application.properties),启动(startup.cmd),访问(http://ip:port/nacos)
- 基于Nacos实现服务的注册?(添加依赖,服务配置,启动服务并检查)
- 基于RestTemplate实现服务的简易调用?(服务消费方调用服务提供方)
常见问题分析
- 如何理解服务注册中心?(存储服务信息的一个服务)
- 服务注册中心诞生的背景? (服务多了,需要对服务进行更好管理)
- 市场上常用的注册中心?(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管理)
- 服务调用过程是怎样的?
常见Bug分析
-
JAVA_HOME环境变量定义错误,例如:
说明,这里一定要注意JAVA_HOME单词的拼写,JAVA_HOME中定义的JDK是存在的,还有后面的路径不能有分号“;”. -
MySQL版本比较低(建议mysql5.7或mariadb10.5及以上版本),例如:
当执行nacos-mysql.sql文件时,出现如下错误:
-
sql文件不存在,例如
-
SQL文件应用错误,例如:
-
Nacos的application.properties配置文件中,连接数据库的配置错误.
-
数据库的名字配置错误,例如:
-
nacos配置文件application.properties配置错误,例如:
-
服务启动时,端口被占用了。例如:
-
服务注册时,服务名不正确,格式不正确,配置文件名字不正确,或者没有配置文件,例如:
-
磁盘写权限问题(nacos服务启动时会在当前磁盘目录写日志),例如:
-
基于Nacos实现服务注册失败,例如
-
客户端500异常,例如
-
服务调用时,连接异常,例如:
-
客户端404异常,例如:
-
服务调用时底层404问题,例如:
-
服务访问问题,例如:
-
依赖注入异常,例如:
-
客户端请求方式与服务端不匹配,例如:
-
依赖版本问题,例如:
-
服务配置读取问题,例如:
课后作业
- 总结课堂知识点
- 完成基于nacos的服务注册
- 完成基于RestTemplate对象实现服务调用。
- 预习04-nacos中的负载均衡设计及实现.
- 尝试实现基于idea启动nacos,自己查询然后进行实践.
- 尝试实现基于idea连接指定数据库,例如:
第一步:打开DataSource,找到mysql,例如:
第二步:配置连接的数据库,例如:
Day03~远程服务调用实践
核心知识点
- 远程过程调用背景分析?(RPC,多个服务协同作战)
- 负载均衡背景分析及解决方案?(提高系统的并发处理能力)
- LoadBalancerClient对象的作用以及应用。
- @Loadbalanced注解的作用以及应用。
- Feign 诞生的背景,应用方式,常见问题以及原理。
常见问题分析
- 为什么要负载均衡?(提高系统的并发处理能力,双管齐下,类似银行的各个营业点)
- LoadBalancerClient对象的作用是什么?(基于负载均衡算法从注册中心获取服务实例)
- @LoadBalanced注解作用?(描述RestTemplate对象,让系统底层为RestTemplate对象赋能,对请求过程进行拦截)
- Ribbon是什么,基于Ribbon可以解决什么问题?(一个负载均衡组件,这个组件中提供一套负载均衡算法)
- 你了解哪些负载均衡策略?(基于IRule接口去查看,快捷键ctrl+h)
- 我们如何修改负载均衡策略?(配置文件->例如application.yml,配置类->例如启功类)
- 为什么使用Feign方式的服务调用?(声明式远程调用,优化结构,简化服务调用过程代码的编写)
- 如何基于feign方式实现远程服务调用?(依赖-openfeign,配置,feign接口定义)
- @EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类,告诉底层启动feign starter组件)
- @FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
- 如何理解基于Feign方式的远程服务调用?(底层封装了服务调用过程,明修栈道暗度陈仓)
- Feign方式如何实现负载均衡?(底层基于ribbon组件实现)
- Feign接口指向的对象是谁?(代理对象-feign接口的实现类对象)
- 常用服务发现、服务调用方式有哪些?
* 这部分内容中你接触到了哪些设计模式呢?(单例,享元,代理,工厂,模板方法,策略,观察者,…)
常见Bug分析
-
SocketTimeoutException,例如:
-
NullPointerException,例如:
-
负载均衡类的配置问题,例如:
-
端口被占用,例如
-
UnknownHostException,例如
-
Fien接口对象依赖注入异常,例如:
-
数据读取超时,例如:
-
服务访问时的404异常,例如:
-
Feign接口方法中@PathVariable注解参数定义问题,例如:
-
读数据超时,例如:
-
依赖注入异常,例如:
课后作业
- 完成课上知识点总结。
- 实践基于RestTemplate和Feign方式的服务调用。
- 预习05-Nacos配置中心应用实践。
- 尝试完成Idea中Http Client 工具的应用?(基于此工具进行restful风格的请求测试)
- 修改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的写法,编写相对简单,编写过程都有提示,但是将来的可运维性比较差,项目打包以后,我们无法再修改负载均衡算法。
Day04~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中没有配置中心数据,例如:
- 包导入错误,例如:
- 配置中心配置格式不正确,例如:
- 程序中服务读取配置时,找不到配置,例如:
课后作业
- 总结课上知识点
- 完成文档中的共享配置应用.
- 预习06-sentinel限流熔断操作实践。
- 尝试设计并完成一个本地cache的应用(拓展-CopyOnWriteArrayList)。
在ProviderCacheController,进行本地缓存设计应用,例如:
private CopyOnWriteArrayList<String> cache=new CopyOnWriteArrayList<>();
@GetMapping("/provider/cache02")
public List<String> doUseLocalCache02()
if(!useLocalCache)//假如useLocalCache的值为false,表示不开启本地cache.
log.info("select data from database");
return Arrays.asList("A","B","C");//假设这些数据来自数据库
if(cache.isEmpty())
synchronized (this)
if (cache.isEmpty())
//模拟从数据库获取数据
log.info("select data from database");
List<String> data = Arrays.asList("A", "B", "C");
//将数据放入cache中
cache.addAll(data);
log.info("select data from cache");
return cache;
Day05-Sentinel 限流应用实践
核心知识点
- 服务限流、降级的背景(服务的治理)
- Sentinel限流入门实践(控制台8180-定义规则,客户端服务应用规则:依赖,配置)
- Sentinel常用限流模式(直接->当前url,关联->保证核心业务,链路->红绿灯)
- @SentinelResource注解作用及限流异常处理(AOP设计)
- Sentinel默认异常限流处理类(DefaultBlockExceptionHandler)
常见问题分析
- 为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行,以退为进)
- 你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)
- Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)
- @SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点,切入点方法)
- Sentinel常用限流效果有哪些?(快速失败,预热,排队)
- Sentinel中限流被触发时出现的异常类型是什么?(都是BlockException类型的子类)
- 如何对限流结果进行处理?(有默认处理方案-DefaultBlockExceptionHandler,也可以自定义.)
- Sentinel限流的基本原理?(底层对服务请求进行拦截,然后通过流控规则限定对资源访问)
常见Bug分析
- sentinel 服务启动不起来?(要配置jdk环境变量path,要使用JDK8版本)
- sentinel 面板不显示我们的服务?(依赖,配置>一定要注意缩进,先访问,放大招-清idea缓存重启)
- 配置完sentinel后,业务服务启动不了了?(大部分都是配置错了)
课后作业
- 总结课上知识点.
- 了解常用限流算法.
- 预习并尝试完成Sentinel服务降级,热点规则设计,系统规则设置,授权规则设置.
- 预习07~spring cloud gateway网关。
- 基于spring mvc 拦截器对系统中指定资源进行时间访问限制?
第一步:拦截器原理分析(回顾spring mvc中的拦截器),例如:
第二步:自定义拦截器,例如:
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系统规则配置(例如cpu使用率,QPS,…),
- Sentinel授权规则配置(黑白名单,黑白设计由业务决定)
常见问题分析
- 如何理解熔断?(可以理解为暂时关闭不稳定的服务,要学会舍得)
- 如何自定义熔断异常处理规则?(实现BlockExceptionHandler接口)
- 如何理解热点参数?(频繁访问的数据,系统底层如何判定哪些数据是频繁访问-lru)
- 系统规则是全局规则吗,常见规则有哪些? (是,响应时间-RT,QPS,CPU,线程数)
- 授权规则需要我们自己写请求解析类吗?(需要,实现RequestOriginParser接口)
常见Bug分析
- 请求参数单词错误。
- …
课后作业
- 总结课上知识点。
- 了解Lru算法解决了什么问题?
- 总结几个Sentinel中用到设计模式?
- 预习API网关Gateway限流实现(07-网关应用实践)。
以上是关于2110-微服务核心知识点及问题分析的主要内容,如果未能解决你的问题,请参考以下文章