六、SpringCloud
上一级页面:index-la
六、SpringCloud
6.1 Feign 声明式远程调用
6.1.1、简介
Feign 是一个声明式的 HTTP 客户端,他的目的就是让远程调用更加简单,Feign提供了 HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好的 HTTP 请求参数、格式、地址等信息
Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显示地使用这两个组件
SpringCloud - Feign,在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了 SpringCloud - Ribbon 自行封装服务调用客户端的开发量。
6.1.2、使用
1、引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、开启 feign 功能
@EnableFeignClients(basePackages = "com.atguigu.gulimall.pms.feign") // 指定feign包位置
3、声明远程接口
@FeignClient("gulimall-ware")
public interface WareFeignService {
@PostMapping("/ware/waresku/skus")
public Resp<List<SkuStockVO>> skuWareInfos(@RequestBody List<Long> skuIds)
}
总结
/**
* 1、想要远程调用别的服务
* 1.1 引入open-feing
* 1.2 编写一个接口,告诉SpringCloud这个接口需要调用的远程服务
* 1.2.1 生命接口的每一个方法都是调用远程服务的那个请求
* 1.3 开启远程调用功能
*/
6.2 Gateway
6.2.1、简介
网关作为流浪入口,常用功能包括路由转发,权限效验,限流控制等,而 SpringCloud GateWay作为 SpringCloud 官方推出的第二代网关框架,取代了 Zull 网关
网上测试 三种网关对应请求数
网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API,以降低管理成本和安全风险、包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能
Spring Cloud GateWay 旨在提供一种简单有效的方式来对 API 进行路由,并为他们提供切面,列如、安全性、监控/指标 和弹性等
官网文档地址
6.3 Sleuth+Zipkin 服务链路追踪
1、为什么用
微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请 求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。
链路追踪组件有Google 的Dapper, Twitter 的Zipkin,以及阿里的Eagleeye(鹰眼)等,它们都是非常优秀的链路追踪开源组件。
2、基本术语
- Span (跨度) :基本工作单元,发送一个远程调度任务就会产生一个Span, Span 是一个64位ID唯一标识的,Trace 是用另一个64ID唯一标识的,Span 还有其他数据信息,比如摘要、时间戳事件、Span的ID、 以及进度ID。
- Trace (跟踪) :一系列Span组成的一个树状结构。请求一个微服务系统的API接口,这个API接口,需要调用多个微服务,调每个微服务都会产生一个新的Span,所有由这个请求产生的Span组成了这个Trace
- Annotation (标注) :用来及时记录一个事件的,一些核心注解用来定义一个请求的开始和结束。这些注解包括以下:
- csClient Sent客户端发送一 个请求,这个注解描述了这个Span的开始
- srServer Received -服务端获得请求并准备开始处理它,如果将其sr诚去cs时间戳便可得到网络传输的时间。
- ssServer Sent(服务端 发送响应) -该注解表明请求处理的完成(当请求返回客户端),如果ss的时间戳诚去sr时间戳,就可以得到服务器请求的时间。
- crClient Received (客 户端接收响应)此时Span的结束,如果cr的时间戳诚去cs时间戳便可以得到整个请求所消耗的时间。
官方文档:
https://docs.spring.io/spring-cloud-sleuth/docs/2.2.5.RELEASE/reference/html/
如果调用顺序是这样的
3、整合 Sleuth
1、服务提供者与消费者导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2、打开 debug 日志
3、发起一次远程调用,观察控制台
4、整合 zipkin 可视化观察
通过 Sleuth 产生的调用链监控信息,可以得知微服务之间的调用链路,但监控信息只输出到控制台不方便查看,我们需要一个图形化的工具 -Zipkin ,Zipkin 是 Twitter 开源的分布式跟踪系统,主要用来收集系统的时序数据,从而追踪链路的调用问题,zipkin 官网地址如下:
https://zipkin.io/
1、docker 安装 zipkin服务器
docker run -d -p 9411:9411 openzipkin/zipkin
2、pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
3、application.yml
# zipkin查询服务器实例的URL
spring.zipkin.base-url=http://192.168.56.10:9411/
# 不查询自己
spring.zipkin.discovery-client-enabled=false
# 发送类型
spring.zipkin.sender.type=web
# 应用采样的请求概率
spring.sleuth.sampler.probability=1
5、Zipkin 数据持久化
Zipkin默认是将监控数据存储在内存的,如果Zipkin挂掉或重启的话,那么监控数据就会丢失。所以如果想要搭建生产可用的Zipkin,就需要实现监控数据的持久化。而想要实现数据持久化,自然就是得将数据存储至数据库。好在Zipkin 支持将数据存储至:
内存(默认)
MySQL
Elasticsearch
Cassandra
Zipkin 数据持久化相关官方文档地址如下