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)
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管理)
Day03~基于Nacos实现服务发现与调用
核心知识点
- 负载均衡诞生背景.
- 基于LoadBalancerClient 对象实现服务发现及负载均衡(choose)
- @Loadbalanced注解的作用以及应用分析
- 基于Feign方式的远程服务调用实践
常见问题分析
为什么负载均衡?(通过多个服务实例均衡处理客户端的请求)
如何理解服务发现?(服务发现就是从注册中心获取服务信息,例如从nacos获取服务实例信息)
LoadBalancerClient的作用?(从nacos注册中心获取服务实例列表,然后本地基于负载均衡算法获取服务实例)
@Loadbalanced注解作用?(描述RestTemplate对象,让系统底层为RestTemplate对象赋能)
你了解哪些负载均衡策略?(基于IRule接口去查看)
我们如何修改负载均衡策略?(配置文件,配置类)
Feign是什么?(Spring Cloud微服务规范中的一组远程调用API)
为什么使用Feign?(优化服务调用结构)
如何使用Feign实现服务调用?(依赖,@EnableFeignClients,@FeignClient)
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服务进行访问测试分析。
-
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中没有配置中心数据,例如:
包导入错误,例如:
配置中心配置格式不正确,例如:
程序中服务读取配置时,找不到配置,例如:
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 {
@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路径进行访问,对访问结果进行访问。