微服务入门-1、RPC、APIgateway

微服务 (Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模组化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic) 的 API 集相互通讯。

微服务的优势:

  • 独立性
    每个微服务的构建、部署、扩容、缩容、数据库都是独立的。数据库表修改时,互补影响。
  • 敏捷性
    功能单一、可快速添加新需求
  • 技术栈灵活
    可以发挥不同语言的优势,例如:用 python 来爬数据,nodejs 来处理 io 流
  • 高效团队
    可以分发给不同的团队进行开发

微服务的不足

  1. 额外的工作;
  2. 数据一致性;
  3. 沟通成本;
    需要额外工作,例如:服务的拆分(即如何拆分微服务,哪些服务应该拆到一起)、服务注册、服务发现、微服务间的通信。每个微服务都持有独立的数据库,无法做到数据强一致性,只能做到最终结果一致性。做微服务也会增加团队的沟通成本。

微服务通信方式

微服务可以使用两种基本消息传递模式 -- 同步与异步消息传递,来与其他微服务通信。

  1. 同步通信。 在此模式下,一个服务使用 HTTP 或 RPC(Remote Procedure Call,翻译过来为“远程过程调用”) 框架等协议调用另一个服务公开的 API。 此选项之所以称作同步消息传递模式,是因为调用方需要等待接收方返回的响应。比较通用的 RPC 框架有:gRPC(Google)、Thrift(Apache)

  2. 异步消息传递。 在此模式下,服务可以在不等待回应的情况下发送消息,然后一个或多个服务以异步方式处理该消息。比较流行的消息队列有:RabbitMQ、ZeroMQ、Kafka、ActiveMQ

我们是否需要用微服务?
以我们公司为例,部门内部多个项目之间没有微服务的必要了,因为几个项目之间关联度不大,没有相互的调用,落地页生成的URL是通过用户手动整理进行投放的,所以没有必要,但是部门之间的通信是多种多样的,比如对数据中心的请求,对天网部门的请求都有不同的格式,这就可以发挥微服务的优势了,所以公司层面做了微服务的架构,包括服务注册,服务发现,服务通信都有相应的系统进行配置,各个部门之间使用API gateway方式进行通信,简洁方便。

 

微服务中是怎么通信的:

什么是 RPC

Remote Procedure Call,即为 -- 远程过程调用。通俗地解释一下:你有 A、B 两台电脑,A 电脑用 python 实现了一个加法运算,此时此刻 B 电脑有一个用 Java 实现的程序,想调用 A 电脑的加法运算程序。然而,内存空间不在同一台电脑,且编程语言也不相同,如何调用呢?此时此刻就用网络来表达调用的语义与调用参数。当然,现在我们不用自己去实现这些东西,当下有很多成熟的 RPC 框架供我们选择。

RPC 原理

什么都别说,先上图。

 

RPC原理

在往下看之前,我们先来了解一下:stub
stub 规定了 server 能够提供什么服务,这在 server 和 client 上是一致的。
RPC 调用链文字描述:
(1)client 以本地调用方式调用服务;
(2)client stub 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
(3)client stub 找到服务地址,并将消息发送到服务端;
(4)server stub 收到消息后进行解码;
(5)server stub 根据解码结果调用本地的服务;
(6)server 执行方法并将结果返回给 server stub;
(7)server stub 将返回结果打包成消息并发送至 client;
(8)client stub 接收到消息,并进行解码;
(9)client 得到最终结果。

RPC 调用链:
(1)client 发起请求:rpc call --> send --> network
(2)server 接受请求:network --> receive --> local call
(3)server 返回结果:local return --> send --> network
(4)client 接收结果:network --> receive --> rpc return

以上就是 RPC 的原理,需要说明的是,它是同步调用的。

常用 RPC 框架对比

RPC 种类dubbonrpcxgrpcthrift
开发语言Javago跨语言跨语言
服务治理××
多序列化框架支持××
多种注册中心××
管理中心××
跨语言××

一下文字为引用(https://colobu.com/2016/09/05/benchmarks-of-popular-rpc-frameworks/)文章的描述:

Dubbo 是阿里巴巴公司开源的一个 Java 高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。不过,略有遗憾的是,据说在淘宝内部,dubbo 由于跟淘宝另一个类似的框架 HSF(非开源)有竞争关系,导致 dubbo 团队已经解散(参见http://www.oschina.net/news/55059/druid-1-0-9 中的评论),反到是当当网的扩展版本仍在持续发展,墙内开花墙外香。其它的一些知名电商如当当、京东、国美维护了自己的分支或者在 dubbo 的基础开发,但是官方的库缺乏维护,相关的依赖类比如 Spring,Netty 还是很老的版本(Spring 3.2.16.RELEASE, netty 3.2.5.Final),倒是有些网友写了升级 Spring 和 Netty 的插件。

rpcx 是Go语言生态圈的 Dubbo, 比 Dubbo 更轻量,实现了 Dubbo 的许多特性,借助于Go语言优秀的并发特性和简洁语法,可以使用较少的代码实现分布式的 RPC 服务。

gRPC 是 Google 开发的高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。

thrift 是 Apache 的一个跨语言的高性能的服务框架,基于 thrift 进行序列化。也得到了广泛的应用。

其中比较受关注的是:grpc 与 thrift 。
grpc 支持的语言:C++,C#,Dart,Go,Java,Node.js,Objective-C,PHP,Python,Ruby,
thrift 支持的语言:C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi 等



作者:zone7_
链接:https://www.jianshu.com/p/6e5f6f1280b9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

什么是 API gateway

API gateway 处于客户端与各个微服务之间,它担任了反向代理的角色,将不同的请求路由到相对应的微服务中去。与此同时,它还有以下功能:安全,限流,缓存,日志,监控,重试,熔断等。

为什么要用 API gateway

首先我们来大胆想想一下,你是一个公司的 CTO,你公司的产品是要做一个类似于当当的卖书产品,叫【叮叮当当】。那么你的产品可能有以下三端:

  • 网页版
  • Android/iOS 客户端
  • 小程序
    当然你的产品做得足够大的话,你有必要开放一些给第三方调用的 REST API 接口。
    那么现在来讨论一下产品的一些功能:
  • 登录注册(登录注册、用户基础信息的存取)
  • 价格服务(记录价格、双十一特价、秒杀价、优惠券价等价格的计算)
  • 产品服务(产品信息、名称、单价、图片展示)
  • 库存服务(记录产品库存)
  • 评价服务(购买商品后的客户评价、讨论区)
  • 第三方开放接口(例如:微信开放平台,提供给第三个调用的接口)

那么问题来了:
问题来了:
来了:

  • 客户端与众多微服务交互,协议不统一,有些协议是对客户端不友好的。
  • 数据不统一,可能在一个操作中,需要多个微服务的数据组装起来,才是我们一次请求想要的数据。
  • 微服务 ip 和 port 改变,客户端无法感知。
  • 不同的终端需要不同的数据,移动端可能仅仅 json 数据就能解决问题,网页端可能需要更多的数据展示。
  • 关于鉴权,众多微服务,难道每个微服务都独立拥有一套鉴权系统吗?

解决方案 -- API gateway(如图)
使用 API gateway,那么众多问题都得到解决:

  • 各个微服务先与 API gateway 交互,转换成客户端友好的 REST API。
  • 在 API gateway 中组装好数据再返回给客户端。
  • 在 API gateway 中修改 ip 与 port 客户端无感知,正常使用。
  • 采用多个 API gateway ,不同 API gateway 响应不同的数据给不同终端。
  • 在 API gateway 中统一鉴权,省去多余代码。

产品架构

多 API gateway 架构

如此修改之后,众多问题都迎刃而解,客户端对众多微服务是无感知的。



作者:zone7_
链接:https://www.jianshu.com/p/ec72df73568c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

<think>好的,我需要帮用户规划学习Spring Cloud Alibaba微服务的路径,从入门到进阶。首先,我得回想一下用户提到的引用内容,尤其是引用[1]关于版本兼容性的问题,还有引用[3]提到的消息队列解耦应用的部分。这些引用可能需要整合到教程中,确保用户了解版本选择和核心组件如消息队列的应用。 接下来,我应该分阶段来构建教程。入门阶段需要涵盖基础概念和环境搭建,这里需要强调Spring Boot,因为它是Spring Cloud的基础。引用[2]提到Spring Boot的Profile功能,可以用来管理不同环境的配置,这点很重要,应该在配置管理部分详细说明。 然后,核心组件部分要包括Nacos作为注册和配置中心,Sentinel负责流量控制,Seata处理分布式事务,以及RocketMQ用于消息队列。这些组件都是Spring Cloud Alibaba的关键,需要逐一解释它们的作用和使用方法。特别是引用[3]中提到的消息队列解耦系统,可以结合RocketMQ的实战案例来说明。 进阶阶段需要深入微服务的高级特性,比如分布式事务和链路追踪。这里可以引用Seata来处理事务问题,同时结合Sleuth和Zipkin进行监控。安全方面,Spring Security和OAuth2也是必须涵盖的内容,确保微服务的安全性。 项目实战部分,通过电商案例将各个组件串联起来,让用户有实际的操作经验。运维部署阶段,Docker和Kubernetes的整合是当前的主流,需要指导用户如何进行容器化部署和监控。 最后,持续学习部分推荐官方文档和社区资源,帮助用户保持知识的更新。同时,要生成相关问题,引导用户深入思考各个组件的应用和优化,例如版本兼容性问题、配置管理的最佳实践,以及消息队列在系统解耦中的具体作用。 需要注意的是,所有引用的内容要自然地融入教程中,比如在讲配置管理时提到引用[2],在消息队列部分引用[3]。版本选择部分则引用[1]的内容,确保用户理解版本匹配的重要性。整个回答结构要清晰,步骤明确,帮助用户逐步掌握Spring Cloud Alibaba的各个方面。</think>### Spring Cloud Alibaba 微服务学习路径规划 以下是从入门到进阶的系统化学习框架,整合Spring Cloud Alibaba核心组件与微服务设计思想,结合引用内容的关键知识点: --- #### **第一阶段:基础入门** 1. **环境搭建与版本选择** - 安装JDK 8+、Maven 3.6+、IDEA开发工具 - 根据**Spring Boot与Spring Cloud Alibaba版本兼容性**选择稳定组合[^1],例如: $$ \text{Spring Boot 2.6.x} + \text{Spring Cloud 2021.0.x} + \text{Spring Cloud Alibaba 2021.0.5.0} $$ - 通过Spring Initializr快速生成项目模板:https://start.spring.io 2. **Spring Boot核心知识** - 配置文件格式(YAML/Properties)与多环境配置(`spring.profiles.active`)[^2] - 自动装配原理与`@SpringBootApplication`注解 - RESTful API开发与`@RestController` 3. **微服务基础概念** - 服务注册与发现(Service Registry) - 配置中心(Configuration Management) - 服务调用RPC/HTTP)与负载均衡 --- #### **第二阶段:核心组件实战** 1. **Nacos:注册中心与配置中心** - 部署Nacos Server(单机模式/Docker) - 服务注册与发现:`spring-cloud-starter-alibaba-nacos-discovery` - 动态配置管理:`spring-cloud-starter-alibaba-nacos-config` ```yaml # 示例:Nacos配置中心连接 spring: cloud: nacos: config: server-addr: localhost:8848 file-extension: yaml ``` 2. **Sentinel:流量控制与熔断降级** - 定义资源与规则(QPS、线程数、熔断策略) - 集成Feign实现服务熔断 - 实时监控与仪表盘 3. **Seata:分布式事务** - AT模式原理与全局事务注解`@GlobalTransactional` - 事务协调器(TC)与资源管理器(RM)部署 4. **RocketMQ:消息队列** - 消息生产与消费模型(Producer/Consumer) - 消息可靠性投递(事务消息) - **应用解耦实战**:订单系统与库存系统通过消息队列异步通信[^3] --- #### **第三阶段:进阶架构设计** 1. **微服务高级特性** - 网关层:Spring Cloud Gateway实现路由与鉴权 - 链路追踪:Sleuth + Zipkin - 服务网格:Istio与Spring Cloud整合 2. **安全与权限控制** - OAuth2协议与Spring Security整合 - JWT令牌在微服务间的传递 3. **性能优化** - 缓存策略:Redis分布式缓存 - 数据库分库分表:ShardingSphere --- #### **第四阶段:项目实战与运维** 1. **电商系统实战案例** - 模块划分:订单服务、库存服务、支付服务、用户服务 - 技术整合:Nacos + Sentinel + Seata + RocketMQ 2. **容器化部署** - Docker镜像构建与Docker Compose编排 - Kubernetes集群部署(Deployment/Service/Ingress) 3. **监控与日志** - Prometheus + Grafana监控微服务指标 - ELK(Elasticsearch, Logstash, Kibana)日志分析 --- #### **持续学习资源** - 官方文档:[Spring Cloud Alibaba GitHub](https://github.com/alibaba/spring-cloud-alibaba) - 社区实践:Alibaba Cloud Native Community - 书籍推荐:《Spring Cloud Alibaba微服务原理与实战》 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值