第八章 Mybatis及MybatisPlus

简介: 本文系统介绍了微服务架构中核心组件的原理与实践,涵盖Nacos与Eureka的服务注册发现机制、OpenFeign远程调用流程、Ribbon与Spring LoadBalancer负载均衡策略、Sentinel与Hystrix限流熔断对比,以及Gateway的路由断言、过滤器实现原理,内容全面,适用于微服务技术体系学习与应用。

1、Nacos相关1.1、Nacos服务注册流程

流程如下:服务启动时就会注册自己的服务信息(服务名、IP、端口)到注册中心调用者可以从注册中心订阅想要的服务,获取服务对应的实例列表(1个服务可能多实例部署)调用者自己对实例列表负载均衡,挑选一个实例调用者向该实例发起远程调用当服务提供者的实例宕机或者启动新实例时,调用者如何得知呢?服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求)当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除当服务有新实例启动时,会发送注册服务请求,其信息会被记录在注册中心的服务实例列表当注册中心服务列表变更时,会主动通知微服务,更新本地服务列表1.2、Nacos的分级存储模型是什么意思在 Nacos 中,分级存储模型指的是对配置数据进行按照环境、集群、命名空间等维度进行分级管理和存储的机制。这种分级存储模型可以帮助开发团队更好地管理和使用配置信息,提高配置管理的灵活性和可维护性。在 Nacos 中,分级存储模型主要包括以下几个概念:命名空间(Namespace)命名空间是 Nacos 中用来隔离配置信息的最小单位,每个命名空间都有独立的配置信息存储空间。通过命名空间,可以实现不同环境(如开发、测试、生产)或不同业务线的配置信息隔离存储。组(Group)在命名空间内部,可以使用组来进一步划分配置信息。同一个命名空间内的不同组可以存储不同业务模块的配置信息,便于管理和维护。配置集(DataId)配置集是 Nacos 中存储配置信息的最小单元,它由命名空间、组和配置键(DataId)唯一确定一条配置信息。通过配置集,可以对每个具体的配置项进行管理。分级存储Nacos 支持在命名空间、组和配置集三个维度上进行配置信息的存储和管理。通过合理地组织命名空间、组和配置集的关系,可以实现灵活的配置信息管理,并且方便不同环境和不同业务需求下的配置隔离和管理。通过 Nacos 的分级存储模型,开发团队可以更加灵活地管理和使用配置信息,支持多环境、多集群的配置管理,同时也为微服务架构下的配置管理提供了良好的支持。1.3、Eureka服务注册流程服务提供者注册服务提供者启动时,会向 Eureka 服务器发送注册请求,包括自身的实例信息(如 IP 地址、端口、服务名称等)。Eureka 服务器接收到注册请求后,将服务提供者的实例信息注册到服务注册表中。服务续约服务提供者会定时向 Eureka 服务器发送心跳续约请求,以确认自身仍然存活。如果 Eureka 服务器在一定时间内没有收到服务提供者的续约请求,将会将该实例从服务注册表中剔除。服务发现服务消费者在需要调用服务提供者时,会向 Eureka 服务器发送服务发现请求,获取可用的服务实例列表。Eureka 服务器会返回可用的服务实例信息给服务消费者,服务消费者根据负载均衡策略选择合适的实例进行调用。服务下线当服务提供者需要下线时,会向 Eureka 服务器发送取消注册请求。Eureka 服务器收到取消注册请求后,将该服务实例从服务注册表中移除,不再向其他服务消费者返回该实例信息。1.4、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模式2、Openfegin相关2.1、OpenFeign的服务调用流程获取请求中的serviceId根据serviceId负载均衡,找出一个可用的服务实例利用服务实例的ip和port信息重构url向真正的url发起请求2.2、常见的Ribbon/Spring LoadBalancer的负载均衡策略自SpringCloud2020版本开始,已经弃用Ribbon,改用Spring自己开源的Spring Cloud LoadBalancer了。Ribbon 负载均衡策略:RoundRobinRule(轮询策略):按照顺序依次选择可用的服务实例,逐个进行调用。RandomRule(随机策略):随机选择一个可用的服务实例进行调用。WeightedResponseTimeRule(加权响应时间策略):根据服务实例的响应时间和权重来动态计算一个权重值,从而决定调用哪个服务实例。RetryRule(重试策略):在一定的重试次数内,尝试多次调用不同的服务实例,直到找到一个可用的实例。Spring Cloud LoadBalancer 负载均衡策略:Spring Cloud LoadBalancer 是基于 Reactor 实现的负载均衡组件,它提供了以下常用的负载均衡策略:RoundRobinLoadBalancer:轮询策略,按照顺序依次选择可用的服务实例进行调用。RandomLoadBalancer:随机策略,随机选择一个可用的服务实例进行调用。NacosLoadBalancer:根据服务的集群名和权重来动态计算选择服务实例。3、限流相关3.1、Hystrix和Sentinel有什么异同Hystrix 和 Sentinel 都是流行的服务容错和限流组件,用于提高微服务架构的稳定性和可靠性。相同点:服务保护:Hystrix 和 Sentinel 都可以实现服务熔断、限流等功能,保护系统在面对异常情况下的稳定性。监控:两者都提供了监控和统计功能,可以帮助开发人员实时了解服务的运行状况。区别:实现方式:Hystrix 主要基于线程池和信号量来实现服务隔离和容错。Sentinel 则基于"流量控制、熔断降级、系统负载保护"来实现服务保护和限流。功能特点:Hystrix 主要提供服务熔断、线程隔离、超时控制等功能。3.2、如何利用Sentinel配置限流启动Sentinel控制台;项目中引入Sentinel依赖;先访问要限流的资源;访问Sentinel控制台,设置按照qps或者线程数等限流规则3.3、滑动窗口算法在限流中,滑动窗口算法通常用于实现基于时间的限流策略,例如限制一定时间窗口内的请求数量。滑动时间窗口算法中只包含1个固定跨度的窗口,但窗口是可移动动的,与时间区间无关。具体规则如下:窗口时间跨度Interval大小固定,例如1秒时间区间跨度为Interval / n ,例如n=2,则时间区间跨度为500ms窗口会随着当前请求所在时间currentTime移动,窗口范围从currentTime-Interval时刻之后的第一个时区开始,到currentTime所在时区结束。4、Gateway相关-路由断言、过滤器4.1、网关作用作用:路由与鉴权,以外有如下: 限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则。 缓存:数据缓存。 日志:日志记录。 监控:记录请求响应数据,api耗时分析,性能监控。 鉴权:权限身份认证。 灰度:线上灰度部署,可以减小风险。 路由:路由是API网关很核心的模块功能,此模块实现根据请求,锁定目标微服务并将请求进行转发。4.2、实现原理初始化阶段:Spring Cloud Gateway 启动时会加载配置文件中定义的路由规则,创建对应的 RouteDefinition 对象。路由匹配:当接收到一个请求时,Gateway 会依次匹配定义的路由规则,找到符合条件的路由。过滤器链:针对匹配到的路由,依次执行该路由配置的过滤器链,对请求进行处理。执行过滤器:每个过滤器可以修改请求和响应,记录日志,进行权限校验等操作。转发请求:经过所有过滤器处理后,将请求转发给目标服务。返回响应:将目标服务的响应返回给客户端。4.3、路由断言类型在 Spring Cloud Gateway 中,断言(Predicate)用于匹配传入的 HTTP 请求,并决定是否要将请求路由到特定的目标服务。断言可以根据请求的不同属性(如路径、请求头、请求参数等)来进行条件匹配,从而实现灵活的路由规则。常见类型有如下:

名称

说明

示例

After

是某个时间点后的请求

- After=2037-01-20T17:42:47.789-07:00[America/Denver]

Before

是某个时间点之前的请求

- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Between

是某两个时间点之前的请求

- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]

Cookie

请求必须包含某些cookie

- Cookie=chocolate, ch.p

Header

请求必须包含某些header

- Header=X-Request-Id, \d+

Host

请求必须是访问某个host(域名)

- Host=**.somehost.org,**.anotherhost.org

Method

请求方式必须是指定方式

- Method=GET,POST

Path

请求路径必须符合指定规则

- Path=/red/{segment},/blue/**

Query

请求参数必须包含指定参数

- Query=name, Jack或者- Query=name

RemoteAddr

请求者的ip必须是指定范围

- RemoteAddr=192.168.1.1/24

Weight

权重处理

- Weight=group1, 2

XForwarded Remote Addr

基于请求的来源IP做判断

- XForwardedRemoteAddr=192.168.1.1/24

4.4、过滤器实现方式在 Spring Cloud Gateway 中,过滤器(Filter)用于对传入的 HTTP 请求或传出的 HTTP 响应进行处理,可以实现日志记录、请求转发、权限校验、请求修改等功能。Spring Cloud Gateway内置了许多常用的过滤器,同时也支持自定义过滤器来满足特定的业务需求。以下是一些常用的内置过滤器及其功能:AddRequestHeader:向请求头中添加指定的键值对。AddRequestParameter:向请求参数中添加指定的键值对。RewritePath:重写请求路径。StripPrefix:去除请求路径中的n段前缀。SetStatus:设置响应的状态码。AddResponseHeader:向响应头中添加指定的键值对。


相关文章
|
2月前
|
监控 Java 测试技术
OOM排查之路:一次曲折的线上故障复盘
本文记录了一次Paimon数据湖与RocksDB集成服务线上频繁OOM的排查历程。通过分析线程暴增、堆外内存泄漏,最终定位到SDK中RocksDB的JNI内存未释放问题,并借助Flink重构写入链路彻底解决。分享了MAT、NMT、async-profiler等工具的实战经验与排查思路,为类似技术栈提供借鉴。
OOM排查之路:一次曲折的线上故障复盘
|
2月前
|
人工智能 JSON 数据挖掘
大模型应用开发中MCP与Function Call的关系与区别
MCP与Function Call是大模型应用中两大关键技术。前者为跨模型标准化通信协议,实现工具与模型解耦;后者是模型调用外部功能的内置机制。二者互补协作,推动AI应用向更开放、灵活、可扩展的方向发展。
|
2月前
|
Java 网络安全 开发工具
[MES]不合格订单接入提醒功能(☆☆☆) 1.代码运行
本文介绍入职后如何快速搭建开发环境并运行项目,包括克隆代码、配置JDK/Maven/Git等工具的求助策略,并模拟真实需求:实现不合格工单超30分钟自动通知(短信/钉钉),涉及Git、Maven、SpringBoot及定时任务技术,提升新人实战能力。
|
2月前
|
canal 关系型数据库 MySQL
微服务原理篇(Canal-Redis)
本课程讲解多数据源同步方案,重点介绍Canal+MQ实现MySQL到Elasticsearch的数据同步机制,涵盖Canal伪装MySQL slave原理、binlog解析、消息顺序性保障,并深入Redis持久化、集群模式、缓存一致性及分布式锁等核心知识点。
 微服务原理篇(Canal-Redis)
|
2月前
|
消息中间件 Java UED
异步消息组件MQ基础
本课程介绍MQ的应用场景及RabbitMQ入门,涵盖同步与异步调用区别、消息队列的解耦与流量削峰作用,学习RabbitMQ收发消息、交换机类型、队列特性及在商城项目中的应用。
异步消息组件MQ基础
|
2月前
|
安全 算法 Java
第一章 Java基础
本文系统讲解Java核心知识,涵盖基础语法、面向对象、集合类、异常处理、IO流、多线程、JVM原理、反射泛型及Tomcat优化等内容,结合代码示例与底层机制分析,助力深入理解Java编程与性能调优。
 第一章 Java基础
|
2月前
|
缓存 关系型数据库 MySQL
微服务原理篇(XXLJOB-幂等-MySQL)
本课程介绍XXL-JOB分布式任务调度平台,涵盖其优势、组成结构及搭建方法,学习如何实现定时任务、避免重复执行,并掌握热点缓存更新、幂等处理、数据库索引优化与SQL调优等实战技能。
|
2月前
|
自然语言处理 搜索推荐 Java
ES分布式搜索引擎入门
本课程介绍Elasticsearch的核心概念与应用,涵盖倒排索引原理、IK分词器使用及Java Client操作,实现高效全文检索、增删改查、批量导入、查询优化等功能,提升搜索性能与体验。
ES分布式搜索引擎入门
|
2月前
|
消息中间件 Kafka 数据库
异步消息组件MQ基础
本课程介绍MQ的应用场景及RabbitMQ入门,涵盖同步与异步调用区别、消息队列模型、交换机类型(Fanout、Direct、Topic)、惰性与优先级队列特性,以及消息堆积解决方案,并结合商城项目实践,帮助掌握高效解耦、流量削峰等核心技能。
异步消息组件MQ基础
|
2月前
|
存储 缓存 NoSQL
Redis:内存陡增100%深度复盘
事故因大KEY调用量随流量增长,导致带宽占满,Redis内存使用率迅速达100%。虽有淘汰机制,但缓冲区激增(尤其Pub/Sub输出缓冲)占用大量内存,超出实例容量,致使SET/GET超时崩溃。根本原因为客户端缓冲区失控,非数据本身膨胀,最终Redis无法服务。
Redis:内存陡增100%深度复盘