SpringCloud中的服务调用组件

  • 一 Ribbon+restTemplate服务调用
  • 1.1 restTemplate是啥
  • 1.2 Ribbon
  • 1.2.1 Ribbon基础
  • 1.2.1.1 什么是Ribbon?
  • 1.2.1.2 Ribbon的主要作用
  • 1.2.1.2.1 服务调用
  • 1.2.1.2.2 负载均衡
  • 1.2.1 Ribbon进阶
  • 1.2.2.1 负载均衡概述
  • 1.2.2.2 基于Ribbon实现负载均衡策略
  • 1.2.2.2.1 Ribbon内置的负载均衡策略
  • 1.2.2.2.1 内置负载均衡策略的配置文件的修改
  • 1.2.2.3 Ribbon的重试机制
  • 1.2.2.3.1 来源
  • 1.2.2.3.1 使用步骤
  • 1.2.2.4 Ribbon中负载均衡的源码解析
  • 1.2.2.5.1 Ribbon中的关键组件
  • 1.2.2.5.2 @LoadBalanced注解
  • 二 Feign 服务调用
  • 2.1 基础知识
  • 2.1.1 简介
  • 2.1.1.1 是个啥?
  • 2.1.1.2 作用
  • 2.1.2 基于Feign的服务调用案例中注意事项
  • 2.1.3 Feign与Ribbon的联系
  • 2.1.4 负载均衡
  • 2.2 进阶知识
  • 2.2.1 Feign的配置
  • 2.2.1 Feign的请求压缩
  • 2.2.1 Feign的日志级别
  • 2.2.1 Feign的源码分析
  • 3.服务调用的总结


一 Ribbon+restTemplate服务调用

1.1 restTemplate是啥

RestTemplate是由Spring提供的模版,可以在启动类中配置get方法,创建一个它的对象,然后使用的时候注入就可以了;RestTemplate是处理http请求的相关的工具类

1.2 Ribbon

1.2.1 Ribbon基础

1.2.1.1 什么是Ribbon?

Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中, Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读 取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。

1.2.1.2 Ribbon的主要作用
1.2.1.2.1 服务调用

基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进行调用

1.2.1.2.2 负载均衡

当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

1.2.1 Ribbon进阶

1.2.2.1 负载均衡概述

负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算法,将流量分配到后端服务集群上,从而为系统提供并行扩展的能力。
负载均衡分类
服务端负载均衡(常见nginx)
先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配
客户端负载均衡(常见ribbon)
客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配

1.2.2.2 基于Ribbon实现负载均衡策略
1.2.2.2.1 Ribbon内置的负载均衡策略
  1. com.netflix.loadbalancer.RandomRule :随机策略
  2. com.netflix.loadbalancer.RetryRule :重试策略。
  3. com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越高的被调用的可能性越大
  4. com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最小的实例返回。
  5. com.netflix.loadbalancer.AvailabilityFilteringRule :可用过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实力中轮询调用。
1.2.2.2.1 内置负载均衡策略的配置文件的修改

需要调用的微服务名称 shop-service-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

1.2.2.3 Ribbon的重试机制
1.2.2.3.1 来源

消费者可用调用服务A/B,但是由于A可能发生宕机等状况,当ribbon负载均衡到宕机的微服务上时,消费者就拿不到数据 还会产生异常,这时候ribbon提供了一种重制机制(消费者指定的一系列参数(请求连接的超时时间 返回数据的时间)范围内,超过就换请求)

1.2.2.3.1 使用步骤
  1. 引入spring重试组件 :spring-retry
  2. 对ribbon进行配置
1.2.2.4 Ribbon中负载均衡的源码解析
1.2.2.5.1 Ribbon中的关键组件

关键组件图:

RestTemplate 微服务调用去掉_java


组件解释:

  1. ServerList:可以响应客户端的特定服务的服务器列表。
  2. ServerListFilter:可以动态获得的具有所需特征的候选服务器列表的过滤器。
  3. ServerListUpdater:用于执行动态服务器列表更新。
  4. Rule:负载均衡策略,用于确定从服务器列表返回哪个服务器。
  5. Ping:客户端用于快速检查服务器当时是否处于活动状态。
  6. LoadBalancer:负载均衡器,负责负载均衡调度的管理。
1.2.2.5.2 @LoadBalanced注解

通过注释可以知道@LoadBalanced注解是用来给RestTemplate做标记,方便我们对RestTemplate添加 一个LoadBalancerClient,以实现客户端负载均衡。

二 Feign 服务调用

2.1 基础知识

2.1.1 简介

2.1.1.1 是个啥?

Feign是Netflix开发的声明式,模板化的HTTP客户端

2.1.1.2 作用
  1. Feign可帮助我们更加便捷,优雅的调用HTTP API。
  2. 在SpringCloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了
  3. Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
  4. SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka, 从而让Feign的使用更加方便。

2.1.2 基于Feign的服务调用案例中注意事项

  1. 添加一个@EnableFeignClients注解
  2. 再添加一个@FeignClient 用于激活Feign客户端
//指定需要调用的微服务名称 @FeignClient(name="shop-service-product") public interface ProductFeginClient {
//调用的请求路径
@RequestMapping(value = "/product/{id}",method = RequestMethod.GET) public Product findById(@PathVariable("id") Long id);
}
  1. 配置请求提供者的调用接口.

2.1.3 Feign与Ribbon的联系

ribbon是啥
Ribbon是一个基于 HTTP 和 TCP 客户端 的负载均衡的工具。它可以 在客户端 配置RibbonServerList(服务端列表),使用 HttpClient 或 RestTemplate 模拟http请求,步骤相当繁琐
feign是啥
Feign 是在 Ribbon的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。采用接口的 方式, 只需要创建一个接口,然后在上面添加注解即可 ,将需要调用的其他服务的方法定义成抽象方 法即可, 不需要自己构建http请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方 法,使得编写客户端变得非常容易

2.1.4 负载均衡

Feign中本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外引入依赖,也不需要再注册 RestTemplate 对象。

2.2 进阶知识

2.2.1 Feign的配置

Feign支持使用属性:

  1. feignName: FeginClient的名称
  2. connectTimeout : 建立链接的超时时长 readTimeout : 读取超时时长
  3. loggerLevel: Fegin的日志级别
  4. errorDecoder : Feign的错误解码器
  5. retryer : 配置重试
  6. requestInterceptors : 添加请求拦截器
  7. decode404 : 配置熔断不处理404异常

2.2.1 Feign的请求压缩

Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗
对应配置:

feign:
  compression:
	request:
		enabled: true # 开启请求压缩
		mime-types: text/html,application/xml,application/json # 设置压缩的数据类型 min-request-size: 2048 # 设置触发压缩的大小下限
	response:
		enabled: true # 开启响应压缩

2.2.1 Feign的日志级别

属性配置方式来达到日志效果
对应配置:

feign:
  client:
    config:
      shop-service-product:
        loggerLevel: FULL
logging:
  level:
    cn.itcast.order.fegin.ProductFeginClient: debug

属性解释:
logging.level.xx : debug : Feign日志只会对日志级别为debug的做出响应
feign.client.config.shop-service-product.loggerLevel : 配置Feign的日志Feign有四种日志级别:
1. NONE【性能最佳,适用于生产】:不记录任何日志(默认值)
2. BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间
3. HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
4. FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数 据

2.2.1 Feign的源码分析

@EnableFeignClients和@FeignClient两个注解就实现了Feign的功能,也是通过spring的自动装载实现的

3.服务调用的总结

Ribbon+RestTemplate
1. 通过Ribbon结合RestTemplate方式进行服务调用只需要在声明RestTemplate的方法上添加注解 @LoadBalanced即可
2. 可以通过 {服务名称}.ribbon.NFLoadBalancerRuleClassName 配置负载均衡策略
Feign
1. 服务消费者引入 spring-cloud-starter-openfeign 依赖
2. 通过 @FeignClient 声明一个调用远程微服务接口
3. 启动类上通过 @EnableFeignClients 激活Feign