目录
SpringCloud Alibaba-Nacos[作为注册中心]
昨日总结
- 谷粒商城项目(分布式注册中心、配置中心nacos,API网关),了解前端知识(JS,vue)
- cv(停滞中)
- 小林coding--MySQL面试篇(3/7)
- 代码随想录--二叉树的最近公共先祖
今日计划
- 谷粒商城项目ing
- cv(停滞中)
- 小林coding--MySQL面试篇(4/7)
- 代码随想录--
算法——二叉树的最近公共先祖
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 :
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:节点5
和节点1
的最近公共祖先是节点3 。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null) {
return root;
}
if(root == p || root == q) {
return root;
}
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left != null && right != null)
return root;
if(left == null && right != null)
return right;
if(left != null && right == null)
return left;
if(left == null && right == null)
return null;
return null;
}
}
分布式组件
SpringCloud Alibaba-Nacos[作为注册中心]
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。他是使用 java 编写。需要依赖 java 环境
启动nacos服务
用命令行启动 startup.cmd -m standalone
哪个微服务需要在注册中心进行配置,就需要在yml文件中配置注册中心的地址
在启动类上配置@EnableDiscoveryClient注解就可以了。
测试feign进行服务之间的远程调用
Feign 使用三步
1、导包 openfeign
2、引入open-feign, 编写一个接口来进行远程调用服务,生命接口的每一个方法调用的远程服务的请求
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
3、开启@EnableFeignClients 功能
注意:Spring Cloud Nacos 2021 放弃Ribbon后 使用LoadBalancer + Nacos做负载均衡 实现同集群优先调用以及权重算法
java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(Ljava/lang/String;Lorg/springframework/cloud/client/loadbalancer/Request;)Lorg/springframework/cloud/client/ServiceInstance;
at org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient.execute(FeignBlockingLoadBalancerClient.java:97) ~[spring-cloud-openfeign-core-3.1.5.jar:3.1.5]
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:121) ~[feign-core-11.10.jar:na]
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:91) ~[feign-core-11.10.jar:na]
at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-11.10.jar:na]
at com.sun.proxy.$Proxy85.membercoupons(Unknown Source) ~[na:na]
at com.qdd.gulimall.member.controller.MemberController.test(MemberController.java:41) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_281]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_281]
在启用nacos前,要先排除ribbon的依赖,加入loadBalancer的依赖,如下
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Spring Cloud Gateway(API网关)
网关是一个核心的微服务架构模式,它作为所有客户端请求的统一入口,负责请求路由、组合和协议转换等关键功能。
当一个请求到达网关,网关先利用断言 判断是否符合某个路由的规则。如果符合规则,就会路由规则到指定地方,同时过程中要经过一系列过滤器进行过滤。
昨日八股答案
- 执行一条SQL请求的过程
- 客户端发送请求:SQL请求发送到数据库服务器
- 服务器接受请求:服务器在特定的端口监听客户端的链接请求
- 语法解析:解析器对SQL请求进行词法分析
- 语义分析:检查SQL语句设计的数据库对象是否存在,检查当前用户是否可以执行该SQL的权限
- 查询优化:选择成本最低的执行计划
- 执行计划执行:访问存储引擎(存储引擎负责数据的存储和检索,常见的InnoDB)
- 返回结果:数据处理完毕后,封装成结果集返回给用户
- 资源释放:释放锁和资源
- mysql的引擎
InnoDB:是MySQL的默认存储引擎,具有ACID事务支持、行级锁、外检约束等特性。适用于高并发的读写操作,支持较好的数据完整性和并发控制
MyISAM:MySQL之前的默认存储引擎,具有较低的存储空间和内存消耗,适用于大量读操作的场景。但他不支持事务、行级锁和外键约束。
MySQL最终采用InnoDB的原因如下
- 提供了对事务的支持,可以进行ACID属性的操作。
- 采用了行级锁定的机制,提供更好的并发性能。InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。
- InnoDB引擎通过redolog日志实现了崩溃恢复,通过日志文件进行恢复,保证数据的持久性和一致性。
- InnoDB 是聚簇索引,MyISAM 是非聚簇索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。
- 索引的理解
索引可以提高查询的效率:mysql索引的数据结构一般是B+树,可以快读定位到目标数据
- MySQL聚簇索引和非聚簇索引的区别
数据存储:在聚簇索引中,数据行按照索引值的顺序存储,索引的叶子结点包含了实际的数据行。非聚簇索引的叶子结点不包含完整的数据行,而是包含指向数据行的指针或主键值。
索引与数据关系:聚簇索引查找数据时,可以直接从索引中获得数据行;非聚簇索引中找到对应的主键值,根据主键值回表查找实际的数据行
唯一性:聚簇索引通常是基于主键构建的,每个表只能有一个聚簇索引。一个表可以有多个非聚簇索引
效率:对于范围查询和排序查询,聚簇索引效率更高,避免了额外的寻址开销。非聚簇索引在使用覆盖索引进行查询时效率更高,它不需要读取完整的数据行。但是需要进行回表的操作。
今日八股
- MysQL中的索引是怎么实现的
- 自增id和UUID使用情况
- B+树的特性是什么,与B树的区别
- 联合索引的实现原理