总结
本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!
MySQL50道高频面试题整理:
org.springframework.boot
spring-boot-starter-web
com.jt
sca-common
1.0-SNAPSHOT
第四步:在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.Test
void 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{
@Bean
public 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 //DI
private DefaultCache defaultCache;
@Test
void testDefaultCache(){
System.out.println(defaultCache.toString());
}
}
-
总结课上知识点(养成好习惯)
-
完成自己电脑中JAVA_HOME环境变量的配置。(JDK必须是8并且64Bit的)
-
确保自己电脑中的mysql为5.7以上或者mariadb10.5以上版本并基于这个版本执行课前资料中的nacos-mysql.sql
-
预习04-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管理)
- 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对象实现服务调用。
-
预习负载均衡方式的服务发现及调用。
================================================================================
-
负载均衡诞生背景.(网络中有一组可以提供相同服务的计算机~类似银行的各个营业点)
-
客户端负载均衡&服务端负载均衡的不同?(browser->nginx->…;sca-consumer->sca-provider)
-
基于LoadBalancerClient 对象从注册中心获取服务列表(服务发现)
-
基于Ribbon(一个负载均衡组件,这个组件中提供一套负载均衡算法)实现负载均衡
-
@Loadbalanced注解的应用(描述RestTemplate对象,为此对象的远程调用进行赋能)
-
为什么负载均衡?(通过多个服务实例均衡处理客户端的请求,生活中有一种说法叫不患寡而患不均)
-
如何理解服务发现?(服务发现就是从注册中心获取服务信息,例如从nacos获取服务实例信息)
-
LoadBalancerClient的作用?(从nacos注册中心获取服务实例列表,然后本地基于负载均衡算法获取具体服务实例)
-
@Loadbalanced注解作用?(描述RestTemplate对象,让系统底层为RestTemplate对象赋能,对请求过程进行拦截)
-
你了解哪些负载均衡策略?(基于IRule接口去查看,快捷键ctrl+h)
-
我们如何修改负载均衡策略?(配置文件->例如application.yml,配置类->例如启功类)
- 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方式的服务调用(一定要去做)。
================================================================================
-
Feign 诞生的背景
-
Feign 方式远程服务调用实践
-
Feign 接口对应的Bean对象命名
-
Feign 方式远程服务调用时熔断处理方案
-
Feign 方式调用原理分析
-
为什么使用Feign方式的服务调用?(优化结构,简化服务调用过程代码的编写、)
-
如何基于feign方式实现远程服务调用?(依赖,配置,feign接口定义)
-
@EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类)
-
@FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
-
如何理解基于Feign方式的远程服务调用?声明式远程服务调用,底层封装了服务调用过程。
-
Feign方式如何实现负载均衡?(底层基于ribbon组件实现)
-
Feign接口指向的对象是谁?
- 常用服务发现、服务调用方式有哪些?
- 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配置中心应用实践。
=============================================================================
-
配置中心诞生背景。
-
市场上主流的配置中心。
-
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客户端(微服务)是否可以读取共享配置?(可以)
- mysql中没有配置中心数据,例如:
- 包导入错误,例如:
- 配置中心配置格式不正确,例如:
- 程序中服务读取配置时,找不到配置,例如:
-
总结课上知识点
-
尝试完成一个简易本地cache的应用。
-
预习sentinel组件如何实现服务限流操作。
===============================================================================
-
服务限流、降级的背景(服务的治理)
-
Sentinel限流入门实践(控制台8180-定义规则,客户端服务应用规则:依赖,配置)
-
Sentinel常用限流模式(直接,关联->保证核心业务,链路->红绿灯)
-
Sentinel降级(熔断)入门实现(出现不稳当的系统服务时,暂停对此服务的访问)
-
Sentinel实现热点参数限流(热点视频,文章,…),系统规则配置(例如cpu使用率),授权配置(黑白名单)
-
为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行)
-
你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)
-
Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)
-
@SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点)
-
Sentinel常用限流效果有哪些?(快速失败,预热,排队)
-
Sentinel中限流、降级操作被触发时出现的异常类型是什么?(都是BlockException类型的子类)
-
如何对限流结果进行处理?(有默认处理方案,我们也可以自己定义处理规则-实现BlockExceptionHandler接口)
-
Sentinel限流的基本原理?(底层对服务请求进行拦截,然后通过流控规则限定对资源访问)
-
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路径进行访问,对访问结果进行访问。
-
总结课上知识点.
-
了解常用限流算法.
-
自己完成Sentinel热点规则设计,系统规则设置,授权规则设置(必须完成).
-
预习spring cloud gateway网关。
==============================================================================
-
API 网关(Gateway)诞生背景
-
市场主流微服务网关(Spring Cloud Gateway,zuul,…)
-
API Gateway实现服务的保护和转发(重点)
-
API Gateway层面的负载均衡实现(重点,lb://sca-provider)
-
API Gateway请求处理原理分析(重点:官方图,了解关键代码,执行过程)
-
为什么要使用api网关?(服务保护,统一url访问,统一身份认证,统一跨域设计,。。。)
-
网关入门实践的步骤? (依赖,配置,启动,服务访问)
-
网关项目中的负载均衡是如何实现?(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点分析)
-
说说SpringCloud gateway处理请求的基本流程?(官方,断点)
- 配置文件格式不正确,例如
- 服务访问被拒绝,例如
- 服务注册失败(nacos没启动),例如:
- 503 异常(找不到可用的服务)
-
总结课上知识点
-
练习基于Gateway实现负载均衡方式的配置。
-
预习常用谓词,过滤器以及sentinel限流设计。
-
将路由配置写到配置中心进行实践?(自己动手丰衣足食)
第一步:添加依赖(spring-cloud-starter-alibaba-nacos-config)
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
第二步:修改配置文件名(修改bootstrap.yml)并添加注册中心配置
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yml
第三步:在nacos中创建配置,并将路由部分内容添加到配置中心
第四步:启动服务(nacos,两个provider,一个gateway)读取配置并进行访问测试。
在浏览器中输入http://localhost:9000/nacos/provider/echo/9000
- 在网关层面配置负载均衡策略(可以直接将配置写到配置中心),例如:
sca-provider: #这个是要进行远程调用的服务id(服务名)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡算法
==============================================================================
-
网关中常用谓词(predicate)对象及实践。
-
网关中过滤器(Filter)的类型及实践。
-
网关中基于sentinel实现服务限流(API,路由id)。
-
网关中基于自定义限流结果的处理(GatewayCallbackManager)。
-
网关中实现统一跨域配置(推荐配置文件,参考官网)。
-
网关中的谓词对象类型?(GatewayPredicate)
-
网关中的谓词对象是如何创建的?(谓词工厂)
-
你在网关中配置过哪些常用谓词?(Path,Method,Before,Query,Header,…)
-
网关中的过滤器是如何分类的?(GlobalFilter,GatewayFilter:需要手动配置)
-
我们是否可以自定义谓词,过滤器对象?(可以,参考官方默认的定义)
-
网关层面如何基于sentinel实现限流?(有关sentinel的两个依赖,配置,JVM参数)
-
网关层面的限流类型有哪些?(路由id,API分组)
-
我们是否可以对限流结果进行自定义处理?(可以,了解)
-
网关中做跨域如何设计?(Java代码方式配置,配置文件方式-推荐)
-
如何将路由,跨域,负载等配置写到配置中心?(注意层级关系)
-
配置文件的格式?(一定要注意缩进关系)
-
配置中心数据读取不到?(依赖,bootstrap.yml,内容的格式,配置管理模型)
-
跨域配置问题?(服务于客户端的ajax请求)
- 微服务架构下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内容如下:
The Index Page
Buy
第四步:在sca-gateway的配置文件中添加跨域配置,例如:
spring:
cloud:
gateway:
globalcors: #跨域配置
cors-configurations:
‘[/**]’:
allowedOrigins: “*”
allowedMethods: “*”
第五步:按项目架构设计启动服务,进行测试。
http://localhost:8080/index.html
-
总结课上知识点
-
完成课上微服务架构下请求响应练习。
-
预习单点登录系统的设计及实现
=============================================================================
-
单点登录系统诞生的背景。
-
Java中单点登录系统解决方案。
-
单点登录系统(SSO)中的服务划分及关系设计。
-
单点登录系统中父工程的创建及初始化。
-
系统基础服务(sso-system)工程的创建及基本业务实现。
-
为什么要做单点登录设计?(业务简化,代码复用,不需要每个服务都登录一次)
-
你知道哪些SSO系统解决方案?(基于用户登录状态信息的存储进行方案设计)
-
单点登录系统中你的服务是如何设计的,工程结构是怎样的?
-
用户登录时,需要从数据库查询哪些信息?(用户信息以及用户的权限信息)
-
如何基于用户id查询用户权限,你有什么方案?(3种)
- 基于idea的为类自动生成序列化id?
- 基于idea中的httpclient进行服务访问测试?
- 如何将链接数据库的信息写到配置中心?
- @Autowired注解描述的Mapper对象有红色波浪线,但运行没有错误,如何去除红色波浪线。
- idea中如何在Database窗口打开要访问的数据库,例如
- MySql指令不可用,例如:
- 项目启用异常,提示有多个@SpringBootConfiguration注解描述的类,例如:
最后
作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料
分析
-
为什么要做单点登录设计?(业务简化,代码复用,不需要每个服务都登录一次)
-
你知道哪些SSO系统解决方案?(基于用户登录状态信息的存储进行方案设计)
-
单点登录系统中你的服务是如何设计的,工程结构是怎样的?
-
用户登录时,需要从数据库查询哪些信息?(用户信息以及用户的权限信息)
-
如何基于用户id查询用户权限,你有什么方案?(3种)
- 基于idea的为类自动生成序列化id?
- 基于idea中的httpclient进行服务访问测试?
- 如何将链接数据库的信息写到配置中心?
- @Autowired注解描述的Mapper对象有红色波浪线,但运行没有错误,如何去除红色波浪线。
- idea中如何在Database窗口打开要访问的数据库,例如
- MySql指令不可用,例如:
- 项目启用异常,提示有多个@SpringBootConfiguration注解描述的类,例如:
最后
作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料
[外链图片转存中…(img-ubuLRTjT-1715786797750)]
[外链图片转存中…(img-eGMIFm9L-1715786797751)]