SpringCloud Alibaba框架介绍

 更新时间:2023年04月12日 10:17:05   作者:拒绝冗余  
spring cloud是一个基于springboot实现的微服务架构开发工具,目前主流的SpringCloud分为SpringCloud Netflix和阿里云开源的SpringCloud Alibaba两个系列,本文主要介绍SpringCloud Alibaba框架,感兴趣的朋友可以参考一下

前言

spring cloud是一个基于springboot实现的微服务架构开发工具,使用springcloud框架进行微服务业务开发是java后端开发必备技能,目前主流的SpringCloud分为SpringCloud Netflix和阿里云开源的SpringCloud Alibaba两个系列,由于博主一直用的是springcloud alibaba,所以本文以此为例总结一下SpringCloud Alibaba都有哪些组件及各自的作用。本文非实战文章,但是参考了冰河老师的《SpringCloud Alibaba实战》一书。

1.集成Nacos实现服务的自动注册与发现

如果系统采用了微服务的架构模式,随着微服务数量的不断增多,服务之间的调用关系会变得纵横交错,需要引入服务治理的功能。服务治理也是在微服务架构模式下的一种最核心和最基本的模块,主要用来实现各个微服务的自动注册与发现。能够实现注册中心功能的组件有:Zookeeper、Eureka、Consul、Etcd、Nacos等。SpringCloud Alibaba框架用的是nacos。

Nacos除了提供服务注册与发现功能外,还有一个重要功能是作为配置中心统一管理各服务的配置数据。集成nacos后只需要在application.yml文件中加入nacos配置即可,其余的配置加到nacos中,可以在线编辑修改发布,不需要重启对应的服务。

2. Feign负载均衡

Ribbon负载均衡是使用RestTemplate加上@loadBalance注解就可以通过服务名加上负载均衡策略去调用远程的服务。
但是这样实现的负载均衡仍然需要在业务代码中调用远程接口,有点low。OpenFeign组件是这种负载均衡实现方式的升级,面向接口编程,也就是说,咱们把注册中心中每一个服务都以一个接口的形式体现。
@FeignClient注解把一个庞大的微服务抽象成了一个接口,@FeignClient(value = “xxxxx”)中的value 属性具体指定是哪个微服务。
那么OpenFeign底层会帮我们通过微服务的服务名去获取到我们最关心的服务IP+Port,然后通过接口中的方法上配的@GetMapping(“/xxx/xxx”)来定位到具体方法。我们服务的消费者只需要调用这个接口中的方法,配合Ribbon使用,那么底层就会自动的调用远方的服务,负载均衡策略默认使用的是Ribbon中的轮询机制。

注:OpenFeign和Feign的区别:

Feign是SpringCloud中的一个轻量级RestFul的Http客户端,内置了Ribbon,用于客户端负载均衡,使用方法是使用Feign的注解去修饰一个接口,客户端调用这个接口那么久是调用远程的微服务了。
OpenFeign在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等。OpenFeign的@FeigenClient注解可以解析SpringMvc的@RequestMapping注解下的接口,通过动态代理的方式产生实现类,实现类中进行负载均衡的微服务远程调用!

3.使用Sentinel实现了接口的限流

Sentinel 从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性,它分为两个部分:

  1. 核心库(Java 客户端)不依赖任何框架/库,同时对 Dubbo / Spring Cloud 等框架也有较好的支持,整合时在项目的pom.xml文件中引入Sentinel的依赖即可。
  2. 控制台(Dashboard)基于 Spring Boot 开发,从官网下载的是后台打好的jar包,可以直接运行,不需要额外的 Tomcat 等应 用容器。

集成sentinel的服务中接口被调用后,可以从sentinel控制台看到它自动拦截到了每个接口,点击该接口就可以进行各种限流配置,如设置QPS阈值、并发流程数等。
注意:因为Sentinel是懒加载机制,所以需要访问一下接口,再去访问Sentinel 才有数据,并不是直接启动Sentinel就有的。

4.Feign整合Sentinel实现容错

系统中微服务数量较多时可能发生某些服务中断或者访问异常的情况,导致其他调用此服务的微服务也出现异常,从而系统可能出现不可用的情况,所以有必要添加服务容错机制。具体实现方式是在微服务中添加sentinel依赖并在Feign中增加如下配置:

feign:
sentinel:
enabled: true

容错类需要实现一个被容错的接口,并实现这个接口的方法,比如要为userService中的方法容错就要先建一个容错类userServiceFallBack类实现UserService接口,接口方法具体实现是userService服务中断或异常后的处理逻辑,比如返回各默认的对象等。接下来,在被远程调用的微服务的UserService 接口上的@FeignClient注解上指定容错类,如下所示。

@FeignClient(value = “server-user”, fallback = UserServiceFallBack.class)

5.API网关

API网关,其实就是整个系统的统一入口。网关会封装微服务的内部结构,为客户端提供统一的入口服务,同时,一些与具体业务逻辑无关的通用逻辑可以在网关中实现,比如认证、授权、路由转发、限流、监控等。目前,比较主流的API网关有:Nginx+Lua、Kong网关、Zuul网关(Netflix开源的网关)、Apache Shenyu网关、SpringCloud Gateway网关。SpringCloud Alibaba技术栈中,并没有单独实现网关的组件,一般使用SpringCloud Gateway实现网关功能。
客户端请求到 Gateway 网关,会先经过 Gateway Handler Mapping 进行请求和路由匹配。匹配成功后再发送到 Gateway Web Handler 处理,然后会经过特定的过滤器链,经过所有前置过滤后,会发送代理请求。请求结果返回后,最后会执行所有的后置过滤器。
在实际应用中,我们可以增加一个网关微服务,然后集成nacos服务,这样就能通过网关端口来统一访问注册到nacos中的其他微服务,也可以集成Sentinel在网关服务中实现限流。

6.Sleuth整合ZipKin实现链路追踪

为什么要实现链路跟踪?单体架构中可以使用AOP在调用具体的业务逻辑前后分别打印一下时间即可计算出整体的调用时间,使用 AOP捕获异常也可知道是哪里的调用导致的异常。但是在分布式微服务场景下,使用AOP技术是无法追踪到各个微服务的调用情况的,也就无法知道系统中处理一次请求的整体调用链路。
每个微服务只需要添加Sleuth的依赖,就可以在命令行查看链路追踪情况。

  • Sleuth支持抽样采集数据。尤其是在高并发场景下,如果采集所有的数据,那么采集的数据量就太大了,非常耗费系统的性能,通常的做法是可以减少一部分数据量,配置如下:
sleuth:
	enabled: true
	sampler.percentage: 1.0 #request采样率
  • Sleuth支持对异步任务的链路追踪,在项目中使用@Async注解开启一个异步任务后,Sleuth会为异步任务重新生成一个Span。

 在实际项目中通过查看日志的情况来了解系统调用的链路情况效率太差了,一般会将Sleuth和ZipKin进行整合,利用ZipKin将日志进行聚合,将链路日志进行可视化展示,并支持全文检索。Zipkin总体上分为服务端和客户端,我们需要下载并启动ZipKin服务端的Jar包(默认监听的端口号为9411),在各微服务中集成ZipKin的客户端(添加ZipKin依赖)。

通过ZipKin能够查看服务的调用链路,并且能够查看分析具体微服务的调用情况,找出系统的瓶颈点,进而进行针对性的优化。另外,ZipKin中也支持下载系统调用链路的Json数据,可以将数据保存到ElasticSearch、Cassandra或者MySQL中。

7.消息队列MQ

通过消息队列,我们可以实现多个进程之间的通信,例如,可以实现多个微服务之间的消息通信。MQ的最简模型就是生产者生产消息,将消息发送到MQ,消息消费者订阅MQ,消费消息。使用的比较多的MQ包含RabbitMQ、Kafka和RocketMQ。
引入MQ最大的优点就是异步解耦和流量削峰,但是引入MQ后也有很多需要注意的事项和问题,主要包括:系统的整体可用性降低、系统的复杂度变高、引入了消息一致性的问题。

到此这篇关于SpringCloud Alibaba框架介绍的文章就介绍到这了,更多相关SpringCloud Alibaba框架内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java enum实现自增赋值方式

    Java enum实现自增赋值方式

    这篇文章主要介绍了Java enum实现自增赋值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring Boot 结合 aop 实现读写分离

    Spring Boot 结合 aop 实现读写分离

    这篇文章主要介绍了Spring Boot 结合 aop 实现读写分离的示例,帮助大家更好的理解和使用Spring Boot框架,感兴趣的朋友可以了解下
    2020-11-11
  • spring通过构造函数注入实现方法分析

    spring通过构造函数注入实现方法分析

    这篇文章主要介绍了spring通过构造函数注入实现方法,结合实例形式分析了spring通过构造函数注入的原理、实现步骤及相关操作注意事项,需要的朋友可以参考下
    2019-10-10
  • 使用Okhttp实现上传文件+参数请求接口form-data

    使用Okhttp实现上传文件+参数请求接口form-data

    在进行接口对接时,常遇到需要传递多种类型参数及文件上传的情况,解决此问题的关键在于参数传递和文件上传的正确处理,在Service层和Controller层的传参,可以通过@RequestParam标注或直接使用请求实体类,但若结合文件上传,则不应使用@RequestBody注解
    2024-10-10
  • maven导入无法拉取所需依赖的解决方法

    maven导入无法拉取所需依赖的解决方法

    最近遇到个问题maven导入无法拉取所需依赖的解决方法,本文就来详细的介绍一下解决方法,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • 剑指Offer之Java算法习题精讲二叉搜索树与数组查找

    剑指Offer之Java算法习题精讲二叉搜索树与数组查找

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • IDEA实现序列化时如何自动生成serialVersionUID的步骤

    IDEA实现序列化时如何自动生成serialVersionUID的步骤

    这篇文章主要介绍了IDEA实现序列化时如何自动生成serialVersionUID的步骤,首先安装GenerateSerialVersionUID插件,当出现添加serialVersionUID选项,选中则会自动生成serialVersionUID,感兴趣的朋友一起学习下吧
    2024-02-02
  • Spring如何在xml文件中配置Bean

    Spring如何在xml文件中配置Bean

    这篇文章主要介绍了Spring如何在xml文件中配置Bean的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • java HttpURLConnection类的disconnect方法与http长连接详解

    java HttpURLConnection类的disconnect方法与http长连接详解

    这篇文章主要介绍了java HttpURLConnection类的disconnect方法与http长连接,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 如何理解Java线程池及其使用方法

    如何理解Java线程池及其使用方法

    线程池是首先创建一些线程,它们的集合称为线程池。使用线程池可以提高性能,它在系统启动时创建大量空闲的线程,程序将一个任务传给线程池,它就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务
    2021-06-06

最新评论