开发者学堂课程【Spring Cloud Alibaba Nacos 详解(下):SptingCloud版协作流程】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/725/detail/12933
Spring Cloud 服务协作流程
内容介绍:
一、Spring Cloud 服务协作流程
二、总结
通过一些原生的 Spring Cloud 注解,可以快速来实现 Spring Cloud 微服务的服务发现机制,并使用 Nacos Server 作为服务发现中心,统一管理所有微服务。
一、Spring Cloud 服务协作流程
Spring Cloud 常见的集成方式是使用 Feign+Ribbon 技术来完成服务间远程调用及负载均衡的,
如下图:
在微服务启动时,会向服务发现中心上报自身实例信息,这里 Service B 包含多个实例。
每个实例包括:
IP 地址、端口号信息。
微服务会定期从 Nacos Server (服务发现中心)获取服务实例列表。
当 Service A 调用Service B 时,ribbon 组件从本地服务实例列表中查找Service B 的实例,如获取了多个实例如 Instance1、Instance2。这时 ribbon 会通过用户所配置的负载均衡策略从中选择一个实例。
最终,Feign 组件会通过ribbon 选取的实例发送 http 请求。
采用 Feign+Ribbon 的整合方式,是由Feign 完成远程调用的整个流程。
而 Feign 集成了Ribbon,Feign 使用 Ribbon完成调用实例的负载均衡。
1、负载均衡的概念
在 Spring Cloud 服务协议流程中,Service A 通过负载均衡调用 Service B,下边来了解一下负载均衡:
负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行,它是系统处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。它分为服务端负载均衡和客户端负载均衡。
服务器端负载均衡:
在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求,这就是服务端负载均衡。
例如 Nginx,通过 Nginx 进行负载均衡,客户端发送请求至 Nginx,Nginx 通过负载均衡算法,在多个服务器之间选择一个进行访问。即在服务器端再进行负载均衡算法分配。
客户端服务负载均衡:
Ribbon 就属于客户端负载均衡。在 ribbon 客户端会有一个服务实例地址列表,在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这是客户端负载均衡。即在客户端就进行负载均衡算法分配。
Ribbon 是客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例,如何挑选取决于负载均衡策略。
Ribbon 核心组件 IRule 是负载均衡策略接口,它有如下实现,仅做了解:
·RoundRobinRule (默认):轮询,即按一定的顺序轮换获取实例的地址。
·RandomRule:随机,即以随机的方式获取实例的地址。
·AvailabilityFilteringRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
·WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的机率越高;
刚启动时,如果统计信息不足,则使用 RoundRobinRule策略,等统计信息足够时,会切换到 WeightedResponseTimeRule
·RetryRule:先按照RoundRobinRule 的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务;
·BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
·ZoneAvoidanceRule:默认规则,复合判断 server 所在区域的性能和 server 的可用性选择服务器;
可通过下面方式在 spring boot 配置文件中修改默认的负载均衡策略:
account-service 是调用的服务的名称,后面的组成部分是固定的。
2、Feign 介绍
Feign 是 Netflix 开发的声明式、模板化的 HTTP 客户端,Feign 可以帮助我们更快捷、优雅地调用 HTTP API。Feign 的英文表意为“假装,伪装,变形”,可以理解为将 HTTP 报文请求方式伪装为简单的 java 接口调用方式。
参考第1章节的 Service A 调用 Service B 的例子,我们使用
Feign 实现这个过程,代码如下:
Service B 暴露“/service”服务端点
Feign 调用方式如下:
(1)声明 Feign 客户端
(2)业务调用
在业务调用时,减少了与业务无关的 http 请求相关代码的编写,使业务逻辑清晰。
分析 Feign 的优势:
·在声明 Feign 客户端之后,Feign 会根据 @FeignClient 注解使用 java 的动态代理技术生成代理类,在这里指定@FeignClient value 为service B,则说明这个类的远程目标为spring cloud 的服务名称为service B 的微服务。
·service B 的具体访问地址,Feign 会交由 ribbon 获取,若该服务有多个实例地址,ribbon 会采用指定的负载均衡策略选取实例。
·Feign 兼容 spring 的 web 注解(如:@GetMapping),它会分析声明 Feign 客户端方法中的 Spring 注解,得出 Http 请求 method、参数信息以及返回信息结构。
·当业务调用 Feign 客户端方法时,会调用代理类,根据以上分析结果,由代理类完成实际的参数封装、远程 http 请求,返回结果封装等操作。
另外,若在 Spring cloud 中使用Feign,需要引入以下依赖
Feign 默认集成了 Ribbon,可以直接使用。
还需要在 spring cloud 启动类中标注 @EnableFeignClients,表明此项目开启 Feign 客户端。
二、总结
通过上面的学习,我们已经了解 Spring cloud 的微服务是如何协作的,通过哪些组件的配合能够完成服务间协作,我们了解了什么是负载均衡,Feign 用于服务间Http 调用,Ribbon 用于执行负载均衡算法选取访问实例,而 Ribbon 的实例列表来源是由 Spring cloud 的服务发现中心提供(当前实现为 Nacos)。