【微服务架构】SpringCloud Alibaba(七):Nacos 2.1.0 作为注册中心(源码分析之GRPC)

在这里插入图片描述
个人主页:道友老李
欢迎加入社区:道友老李的学习社区

一、SpringCloud Alibaba

Spring Cloud Alibaba是阿里巴巴提供的一站式微服务解决方案,是Spring Cloud体系中的一个重要分支,它将阿里巴巴在微服务领域的实践经验和开源技术进行了整合,为开发者提供了一系列便捷的工具和组件,用于构建分布式微服务应用。以下是其详细介绍:

1、核心组件

  • Nacos:用于服务注册与发现以及配置管理。它可以帮助微服务实例自动注册到注册中心,并能够动态获取配置信息,使应用程序能够灵活地应对配置的变化,无需重启服务。
  • Sentinel:主要用于流量控制、熔断降级等功能。它可以保护微服务免受高并发、流量异常等情况的影响,确保系统在压力下能够稳定运行,避免因个别服务出现问题而导致整个系统崩溃。
  • RocketMQ:是一款高性能、高可靠的分布式消息队列。它在微服务架构中常用于实现异步消息传递、解耦系统组件之间的依赖关系,从而提高系统的整体性能和可扩展性。
  • Seata:致力于提供分布式事务解决方案,确保在分布式系统中数据的一致性。它通过对事务的协调和管理,使得多个微服务之间在进行数据交互时能够遵循ACID原则。

2、优势

  • 一站式解决方案:涵盖了微服务架构中的多个关键领域,包括服务治理、配置管理、流量控制、分布式事务等,开发者无需再从多个不同的开源项目中进行整合,大大降低了微服务架构的搭建和维护成本。
  • 与Spring Cloud生态的深度集成:基于Spring Cloud的编程模型和规范进行开发,使得熟悉Spring Cloud的开发者能够快速上手并轻松集成到现有的Spring Cloud项目中,充分利用Spring Cloud的各种特性和优势。
  • 阿里巴巴的技术实力和实践经验支持:得益于阿里巴巴在大规模分布式系统开发和运营方面的丰富经验,Spring Cloud Alibaba的组件经过了实际生产环境的考验,具有较高的稳定性、性能和可扩展性,能够应对各种复杂的业务场景和高并发流量。

3、应用场景

  • 电商系统:在电商业务中,存在多个微服务,如商品服务、订单服务、库存服务等。Spring Cloud Alibaba可以通过Nacos进行服务注册与发现,使用Sentinel对各个服务的流量进行控制,利用RocketMQ实现异步消息通知,比如下单成功后异步通知库存服务扣减库存,通过Seata保证分布式事务的一致性,确保订单和库存等数据的准确性。
  • 金融系统:金融领域对数据一致性和系统稳定性要求极高。Spring Cloud Alibaba的Seata可以确保在多个金融业务操作之间的分布式事务一致性,如转账操作涉及到两个不同账户服务之间的资金变动。Nacos可以提供配置管理,方便对金融业务的各种配置参数进行动态调整,Sentinel则可以防止因突发的高并发交易对系统造成冲击。
  • 物联网(IoT)平台:物联网场景中,大量的设备会产生实时数据并上传到云端。Spring Cloud Alibaba可以通过Nacos管理各个物联网服务的注册与发现,使用RocketMQ接收和处理大量的设备数据消息,进行异步处理和分发。Sentinel可以对物联网服务的流量进行控制,防止因设备数据突发增长导致系统过载。

二、设计注册中心

1、分布式框架的注意点:三高架构

  • 高可用

    高可用性(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性(一直都能用)。

    解决方案:集群

  • 高并发

    高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。 高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。

    解决方案:

    • 垂直扩展增强单机硬件性能
    • 水平扩展
  • 高性能

    高性能(High Performance)就是指程序处理速度快,所占内存少,cpu占用率低

    解决方案:

    指程序处理速度快: 这里设计我们数据存储结构、访问机制、集群同步

2、注册中心的设计

image.png

  • 服务注册
  • 注册表结构设计
  • 服务发现
  • 服务订阅
  • 服务推送
  • 健康检查
  • 集群同步:设计到数据同步,数据同步我们有哪些协议 raft 、distro、ZAB

三、Nacos作为注册中心源码分析

10、GRPC源码分析

image.png

10.1、客户端源码分析

我们找到客户端注册的代码:

image.png

image.png

通过他初始化实例,我们知道他他真正的调用方法

image.png

通过方法getExecuteClientProxy需要确定具体代理类 grpcClientProxy

image.png

我们查找grpcClientProxy的初始化的地方。

image.png

那NamingGrpcClientProxy应该grpc的核心逻辑

image.png

我们进入start方法:

image.png

上面方法分为两部分:

key1:是将处理的Handler放到对应的List<ServerRequestHandler> serverRequestHandlers 那后面一定是在客户端处理请求的时候,从哪这里面拿到对应的Handler进行处理

image.png

key2: 启动这里 这里是关键,我们进来看一下:

image.png

image.png

上图是简单描述:我们可以看一下第4、5、6、7步

key4:选择一个服务

image.png

image.png

key5:连接服务

image.png

key6: 发送事件到队列, 我们可以全文搜索哪里处理这个队列

线程池里面的一个线程正在处理,如

image.png

image.png

image.png

image.png

image.png

key7:

如果前面同步连接都失败的话,我们就进行异步连接

image.png

我们全文搜索就会发现在上文中的第二个线程中会进行处理

image.png

image.png

image.png

总结:在连接成功还是连接失败后都是异步进行处理,我们可以参考这种方式

10.2、服务端源码分析

image.png

服务处理rpc的请求,那我们可以进行猜测一下服务端进行搜索RpcServer,如下

image.png

那BaseRpcServer应该是处理RPC的请求,我们看一下对应代码

image.png

通过名称我们应该知道他是启动server,那我们查看哪里调用他

image.png

通过上图我们知道,他是构造方法之后我们进行服务启动

image.png

key1: 增加拦截器 ,这里主要获取一些远端Ip+port信息

image.png

key2: 这里面重点是建立连接和处理请求

image.png

key2.1 处理请求

我们想我们Springmvc处理请求的时候,我们是根据路径判断对应的controller,这里我们的请求应该是那个具体的handler呢? 我们是根据type,这个type其实就是请求类型

如下图:获取对应type ,然后根据type获取对应的的RequestHandler

image.png

我们进入getByRequestType

image.png

image.png从上图我们知道这里是将相应handler以map的形式进行存放,那这个key我们通过debug知道他对应的值,为请求参数的的名称

那什么时候进行初始化的:

image.png

image.png

那Handler对应泛型的第一参数类型名称是什么,那我们拿InstanceRequestHandler来举例:也就是InstanceRequest

image.png

总结:我们处理实例就是用的监听器来获取对应的所有实例,然后以map处理,所有请求从这map中拿取对应的对象。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道友老李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值