2109-微服务课上问题分析及总结,spring三级缓存面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

  • 服务访问问题,例如:

在这里插入图片描述

  • 依赖注入异常,例如:

在这里插入图片描述

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

在这里插入图片描述

  • 依赖版本问题,例如:

在这里插入图片描述

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

在这里插入图片描述

课堂小技巧


  • 基于idea启动nacos,例如:

在这里插入图片描述

  • 基于idea链接database数据库,例如:

第一步:打开DataSource,找到mysql,例如:

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

课后作业


  • 总结课堂知识点

  • 完成基于nacos的服务注册

  • 完成基于RestTemplate对象实现服务调用。

  • 完成基于LoadBalancerClient方式的调用。

  • 预习@LoadBalanced注解的应用并尝试进行实践。

Day03~基于远程服务调用实践

==========================================================================

核心知识点


  • @Loadbalanced注解的应用

  • Feign 诞生的背景及应用方式

  • Feign 接口对应的Bean对象命名方式

  • Feign 方式远程服务调用时熔断处理方案

  • Feign 方式调用原理分析。

常见问题分析


  • @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接口的实现类对象)

在这里插入图片描述

  • 常用服务发现、服务调用方式有哪些?

在这里插入图片描述

  • idea 如何打开克隆的项目(相关步骤分析),例如:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

常见Bug分析


  • SocketTimeoutException,例如:

在这里插入图片描述

  • NullPointerException,例如:

在这里插入图片描述

在这里插入图片描述

  • 负载均衡类的配置问题,例如:

在这里插入图片描述

  • 端口被占用,例如

在这里插入图片描述

  • UnknownHostException,例如

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

  • 数据读取超时,例如:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  • 读数据超时,例如:

在这里插入图片描述

  • 依赖注入异常,例如:

在这里插入图片描述

  • idea 配置问题,例如:

在这里插入图片描述

课上技巧


  • 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的写法,编写相对简单,编写过程都有提示,但是将来的可运维性比较差,项目打包以后,我们无法再修改负载均衡算法。

课后作业


  • 完成课上知识点总结。

  • 实践基于RestTemplate和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可以基于日志级别控制日志的输出)

  • Nacos配置管理模型的背景?(环境不同配置不同)

  • Nacos配置中的管理模型是怎样的?(namespace>group>service/data-id)

  • Nacos客户端(微服务)是否可以读取共享配置?(可以)

常见Bug分析


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

在这里插入图片描述

  • 包导入错误,例如:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

课堂练习


  • 基于配置中心的一个缓存开关(useLocalCache),启用或弃用本地缓存?(降低数据库访问压力,提高查询性能)

1)本地缓存数据存储结构:数组(ArrayList),具体实现使用CopyOnWriteArrayList对象。

2)本地缓存线程安全策略:乐观锁(CopyOnWriteArrayList),双重校验悲观锁

3)本地缓存数据一致性策略:暂时不考虑.

4)本地缓存数据淘汰策略:暂时不考虑。

代码演示:在ProviderCacheController中添加如下代码,例如:

private List cache=new CopyOnWriteArrayList<>();

@RequestMapping(“/provider/cache02”)

public List doUseLocalCache02(){

//1.配置中心useLocalCache值为false,则直接从数据库取

if(!useLocalCache) {

System.out.println(“本地缓存开关没有打开,查询数据库”);

return Arrays.asList(“A”, “B”, “C”);//假设这是从数据库取的数据

}

//2.配置中心useLocalCache值为true,则执行如下步骤

//2.1.从cache取数据,假如有则直接返回。

if(cache.isEmpty()){

synchronized (this) {

if(cache.isEmpty()) {

System.out.println(“本地缓存开关打开了,但是缓存没有数据,查数据库”);

//查数据库(模拟)

List list = Arrays.asList(“A”, “B”, “C”);

//将查询到的数据存储缓存中

cache.addAll(list);

}

}

}

//2.2.cache中没有数据则从数据库取数据,并将数据存储到cache中,然后返回数据

return cache;

}

  • 设计一个简易tomcat用于处理客户端请求,并响应一个结果(满足http协议的字符串)给客户端浏览器。

1)服务是谁?(java.net.ServerSocket)

2)客户端谁?(浏览器)

3)服务端向客户端输出数据用谁?(OutputStream)

代码演示:

package com.jt.common.net;

public class Tomcat {

public static void main(String[] args) throws IOException {

//1.构建一个Java中的服务端对象(ServerSocket),并在指定端口上进行监听(例如9999)

ServerSocket server=new ServerSocket(9999);

System.out.println(“server start success”);

//2.等待客户端连接,并处理客户端请求

while(true){

//等待客户端(Socket)的连接(accept方法用于接收客户端请求)

Socket client=server.accept();//阻塞式方法(没有连接请求,线程休眠,让出CPU)

new Thread(){//1

@Override

public void run() {

System.out.println(“client:”+client);

try {

//获取输出流对象,基于此对象向客户端响应hello client

OutputStream out = client.getOutputStream();

String data = “HTTP/1.1 200 OK \n\r” +

“Content-Type: text/html;charset=utf-8 \n\r” +

“\n\r” +

“hello client”;

out.write(data.getBytes());

out.flush();

}catch (Exception e){}

}

}.start();

}

}

}

课后作业


  • 总结课上知识点

  • 尝试完成一个简易本地cache的应用。

  • 预习06-sentinel限流熔断操作实践。

Day05-Sentinel 限流应用实践

===============================================================================

核心知识点


  • 服务限流、降级的背景(服务的治理)

  • Sentinel限流入门实践(控制台8180-定义规则,客户端服务应用规则:依赖,配置)

  • Sentinel常用限流模式(直接,关联->保证核心业务,链路->红绿灯)

  • @SentinelResource注解作用及限流异常处理(AOP设计)

  • 自定义异常限流处理类(SentinelBlockExceptionHandler)

常见问题分析


  • 为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行)

  • 你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)

  • Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)

  • @SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点)

  • Sentinel常用限流效果有哪些?(快速失败,预热,排队)

  • Sentinel中限流被触发时出现的异常类型是什么?(都是BlockException类型的子类)

  • 如何对限流结果进行处理?(有默认处理方案,我们也可以自己定义处理规则-实现BlockExceptionHandler接口)

  • Sentinel限流的基本原理?(底层对服务请求进行拦截,然后通过流控规则限定对资源访问)

在这里插入图片描述

常见Bug分析


  • sentinel 服务启动不起来?(要配置jdk环境变量path,要使用JDK8版本)

  • sentinel 面板不显示我们的服务?(依赖,配置>一定要注意缩进,先访问,放大招-清idea缓存重启)

  • 配置完sentinel后,业务服务启动不了了?(大部分都是配置错了)

课堂练习


基于业务对sentinel限流异常进行自定义处理,例如:

package com.jt.provider.controller;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;

import com.alibaba.csp.sentinel.slots.block.BlockException;

import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.PrintWriter;

/**Sentinel中,默认的限流异常处理接口类型为BlockExceptionHandler,假如我们要自己定义

其异常处理规则,可定义类实现此接口,然后进行异常处理即可。*/

@Component

public class SentinelBlockExceptionHandler implements BlockExceptionHandler {

@Override

public void handle(HttpServletRequest request,HttpServletResponse response, BlockException e) throws Exception {

//设置响应数据编码

response.setCharacterEncoding(“utf-8”);

//告诉浏览器向它响应的内容类型,以及编码方式

response.setContentType(“text/html;charset=utf-8”);

response.setStatus(429);

PrintWriter out = response.getWriter();

out.print(“

请求被限流了

”);

out.flush();

out.close();

}

}

课后作业


  • 总结课上知识点.

  • 了解常用限流算法.

  • 自己完成Sentinel服务降级,热点规则设计,系统规则设置,授权规则设置(必须完成).

  • 预习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)

  • 系统规则是全局规则吗? (是)

  • 授权规则需要我们自己写请求解析类吗?(需要,实现RequestOriginParser接口)

常见Bug分析


  • 请求参数单词错误。

课后作业


  • 总结课上知识点。

  • 了解Lru算法解决了什么问题?

  • 总结几个Sentinel中用到设计模式?

  • 预习API网关Gateway限流实现(07-网关应用实践)。

Day07-Gateway 应用实践

============================================================================

核心知识点


  • API 网关(Gateway)诞生背景

  • 市场主流微服务网关(Spring Cloud Gateway,zuul,…)

  • API Gateway实现服务的保护和转发(重点)

  • API Gateway层面的负载均衡实现(重点,lb://sca-provider)

  • API Gateway请求处理原理分析(重点:官方图,了解关键代码,执行过程)

  • API Gateway中常用谓词(predicate)对象及实践。

  • API Gateway中过滤器(Filter)的类型及实践。

  • API Gateway中基于sentinel实现服务限流(API,路由id)。

  • API Gateway中基于自定义限流结果的处理(GatewayCallbackManager)。

常见问题分析


  • 为什么要使用api网关?(服务保护,统一url访问,统一身份认证,统一跨域设计,。。。)

  • 网关入门实践的步骤? (依赖,配置,启动,服务访问)

  • 网关项目中的负载均衡是如何实现?(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点分析)

  • 说说SpringCloud gateway处理请求的基本流程?(官方,断点)

  • 网关中的谓词对象类型?(GatewayPredicate)

  • 网关中的谓词对象是如何创建的?(谓词工厂)

  • 你在网关中配置过哪些常用谓词?(Path,Method,Before,Query,Header,…)

  • 网关中的过滤器是如何分类的?(GlobalFilter,GatewayFilter:需要手动配置)

  • 我们是否可以自定义谓词,过滤器对象?(可以,参考官方默认的定义)

  • 网关层面如何基于sentinel实现限流?(有关sentinel的两个依赖,配置,JVM参数)

  • 网关层面的限流类型有哪些?(路由id,API分组)

  • 我们是否可以对限流结果进行自定义处理?(可以,了解)

常见BUG分析


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

在这里插入图片描述

  • 服务访问被拒绝,例如

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

课后作业


  • 总结课上知识点

  • 练习基于Gateway实现负载均衡方式的配置。

  • 练习常用谓词,过滤器以及sentinel限流设计。

  • 将路由配置写到配置中心进行实践?(自己动手丰衣足食)

第一步:在sca-gateway项目中添加配置依赖,例如:

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

第二步:修改application.yml配置文件名称为bootstrap.yml,并添加配置中心配置。

spring:

cloud:

nacos:

config:

server-addr: localhost:8848

file-extension: yml

第三步:在nacos的public命名空间中创建sca-gateway.yml配置,内容如下:

在这里插入图片描述

说明,此配置添加后,可以将bootstrap.yml中网关部分的配置注释掉。

第四步:启动nacos,sentinel,provider,gateway服务,然后进行访问测试。

拓展练习


  • 微服务架构下ajax请求响应处理实践。

第一步:业务描述(通过sca-ui工程向网关工程发送ajax请求,并进行响应处理)

在这里插入图片描述

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

在这里插入图片描述

第二步:在sca-ui工程中添加spring-boot-starter-web依赖。

org.springframework.boot

spring-boot-starter-web

第三步:在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内容如下:

Title

The Index Page

Buy

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

spring:

cloud:

gateway:

globalcors: #跨域配置

cors-configurations:

‘[/**]’:

allowedOrigins: “*”

allowedMethods: “*”

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

http://localhost:8080/index.html

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

=============================================================================

核心知识点

最后

笔者已经把面试题和答案整理成了面试专题文档

image

image

image

image

image

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

unction (response) {//请求ok,执行then

console.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;

}

});

}

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

spring:

cloud:

gateway:

globalcors: #跨域配置

cors-configurations:

‘[/**]’:

allowedOrigins: “*”

allowedMethods: “*”

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

http://localhost:8080/index.html

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

=============================================================================

核心知识点

最后

笔者已经把面试题和答案整理成了面试专题文档

[外链图片转存中…(img-o2ttsPu9-1713605311380)]

[外链图片转存中…(img-lMR1Gj0V-1713605311380)]

[外链图片转存中…(img-wJocVLge-1713605311380)]

[外链图片转存中…(img-wPfCIuF2-1713605311381)]

[外链图片转存中…(img-N1UpLsd7-1713605311381)]

[外链图片转存中…(img-LwhabC8U-1713605311381)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-2WVmyYE5-1713605311382)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值