缓存机制
MyBatis 提供了两级缓存(Local Cache 和 Second Level Cache)来满足不同的需求。
1、Local Cache(本地缓存、一级缓存):
- Local Cache 是指在 SqlSession 范围内的缓存,它默认开启并且无法关闭。
- 在同一个 SqlSession 中,当执行相同的查询语句(包括参数相同)时,如果之前已经查询过相同的结果,那么会直接从本地缓存中获取数据,而不会再发送 SQL 查询到数据库。
- Local Cache 是基于 HashMap 实现的,它仅在当前 SqlSession 中有效,并且对于不同的 SqlSession 是隔离的。
2、Second Level Cache(二级缓存):
- Second Level Cache 是指在 Mapper 范围内的缓存,它可以跨 SqlSession 共享数据。
- 如果开发者需要使用 Second Level Cache,需要在映射文件中进行配置。
- 当开启了 Second Level Cache 后,同一个 namespace 下的查询结果会被缓存起来,其他 SqlSession 也可以共享这部分数据,从而减少数据库查询次数。
- Second Level Cache 默认是关闭的,需要手动在映射文件中配置开启。
Eureka服务注册流程
- 服务提供者注册
- 服务提供者启动时,会向 Eureka 服务器发送注册请求,包括自身的实例信息(如 IP 地址、端口、服务名称等)。
- Eureka 服务器接收到注册请求后,将服务提供者的实例信息注册到服务注册表中。
- 服务续约
- 服务提供者会定时向 Eureka 服务器发送心跳续约请求,以确认自身仍然存活。
- 如果 Eureka 服务器在一定时间内没有收到服务提供者的续约请求,将会将该实例从服务注册表中剔除。
- 服务发现
- 服务消费者在需要调用服务提供者时,会向 Eureka 服务器发送服务发现请求,获取可用的服务实例列表。
- Eureka 服务器会返回可用的服务实例信息给服务消费者,服务消费者根据负载均衡策略选择合适的实例进行调用。
- 服务下线
- 当服务提供者需要下线时,会向 Eureka 服务器发送取消注册请求。
- Eureka 服务器收到取消注册请求后,将该服务实例从服务注册表中移除,不再向其他服务消费者返回该实例信息。
Nacos与Eureka的区别
Eureka和Nacos的相似点有:
- 都支持服务注册发现功能
- 都有基于心跳的健康监测功能
- 都支持集群,集群间数据同步默认是AP模式,即最全高可用性
Eureka和Nacos的区别有:
- Eureka的心跳是30秒一次,Nacos则是5秒一次
- Eureka如果90秒未收到心跳,则认为服务疑似故障,可能被剔除。Nacos中则是15秒超时,30秒剔除。
- Eureka每隔60秒执行一次服务检测和清理任务;Nacos是每隔5秒执行一次。
- Eureka只能等微服务自己每隔30秒更新一次服务列表;Nacos即有定时更新,也有在服务变更时的广播推送
- Eureka仅有注册中心功能,而Nacos同时支持注册中心、配置管理
- Eureka和Nacos都支持集群,而且默认都是AP模式
常见的Ribbon/Spring LoadBalancer的负载均衡策略
自SpringCloud2020版本开始,已经弃用Ribbon,改用Spring自己开源的Spring Cloud LoadBalancer了。
Ribbon 负载均衡策略:
- RoundRobinRule(轮询策略):按照顺序依次选择可用的服务实例,逐个进行调用。
- RandomRule(随机策略):随机选择一个可用的服务实例进行调用。
- WeightedResponseTimeRule(加权响应时间策略):根据服务实例的响应时间和权重来动态计算一个权重值,从而决定调用哪个服务实例。
- RetryRule(重试策略):在一定的重试次数内,尝试多次调用不同的服务实例,直到找到一个可用的实例。
Spring Cloud LoadBalancer 负载均衡策略:
Spring Cloud LoadBalancer 是基于 Reactor 实现的负载均衡组件,它提供了以下常用的负载均衡策略:
- RoundRobinLoadBalancer:轮询策略,按照顺序依次选择可用的服务实例进行调用。
- RandomLoadBalancer:随机策略,随机选择一个可用的服务实例进行调用。
- NacosLoadBalancer:根据服务的集群名和权重来动态计算选择服务实例。
Hystrix和Sentinel有什么异同
Hystrix 和 Sentinel 都是流行的服务容错和限流组件,用于提高微服务架构的稳定性和可靠性。
相同点:
- 服务保护:Hystrix 和 Sentinel 都可以实现服务熔断、限流等功能,保护系统在面对异常情况下的稳定性。
- 监控:两者都提供了监控和统计功能,可以帮助开发人员实时了解服务的运行状况。
区别:
- 实现方式:Hystrix 主要基于线程池和信号量来实现服务隔离和容错。Sentinel 则基于"流量控制、熔断降级、系统负载保护"来实现服务保护和限流。
- 功能特点:Hystrix 主要提供服务熔断、线程隔离、超时控制等功能。