1. 微服务
分布式系统开发一定会遇到的四个问题
- 这么多服务,客户端如何访问
- 这么多服务,服务之间如何通信
- 这么多服务,如何治理
- 服务挂了,怎么办?
根本原因:网络是不可靠的
解决方案
- SpringCloud Netflix
- Apache Dubbo Zookeeper
- SpringCloud Alibaba
SpringCloud 是一种生态,不是框架
如何解决
- API 网关,服务路由
- HTTP、RPC、异步调用
- 服务注册与发现->高可用
- 熔断、限流、服务降级
2. SpringCloud Alibaba最佳实践
1. Spring Cloud Gateway:网关
2. Nacos:服务注册和配置中心
3. Sentinel:熔断限流
4. Seata:分布式事务
5. RocketMQ:消息队列,削峰填谷
6. Docker:使用Docker进行容器化部署
7. Kubernetes:使用k8s进行容器化部署
异步非阻塞通信
- 消息队列
同步通信
- Netty -> NIO、A工O
- HTTP -> 应用层,跨防火墙,在不同的局域网之间通信
- RPC-> 远程过程调用,TCP,第四层,传输层,优点:速度快,缺点:不能跨防火墙,仅支持局域网通信
对内RPC,对外REST
3. 概述
Spring Cloud Alibaba项目都是基于Spring Cloud,而Spring Cloud项目又是基于Spring Boot进行开发,并且都是使用Maven做项目管理工具。在实际开发中,我们一般都会创建一个依赖管理项目作为Maven的 Parent项目使用,这样做可以极大的方便我们对Jar包版本的统一管理。
4. 项目结构
- dependencies管理
- 生产者
- 消费者
- 网关
单拎出来每个项目都是spring boot项目
5. Nacos
Nacos 致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助快速实现动态服务发现、服务配置、服务元数据及流量管理。
5.1. 服务注册与发现
服务注册和发现是微服务治理的根基,服务注册和发现组件是整个微服务系统的灵魂
5.2. 服务提供者
Restful风格的服务
5.3. 服务消费者
Feign默认集成了Ribbon,Nacos 也很好的兼容了Feign,默认实现了负载均衡的效果
- Feign采用的是基于接口的注解
- Feign整合了ribbon
6. Sentinel
在微服务架构中,为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的雪崩效应。为了解决这个问题,业界提出了熔断器模型。
6.1. 熔断器防止雪崩
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
6.2. 熔断器仪表盘
7. Gateway
7.1. Gateway-API网关
Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
7.2. Gateway-全局过滤器
全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP访问限制等等。
8. Nacos-分布式配置中心
9. SkyWalking
9.1. SkyWalking-链路追踪
什么是链路追踪
微服务架构是通过业务来划分服务的,使用REST调用。对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂。
面对以上情况,我们就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这就是所谓的APM(应用性能管理)。
9.2. SkyWalking-服务端配置
9.3. SkyWalking-客户端配置
Java Agent服务器探针
什么是探针
探针是用来探测语言版本情况、服务器运行状况用的,探针可以实时查看服务器硬盘资源、内存占用、网卡流量、系统负载、服务器时间等信息。
9.4. SkyWalking-Assembly插件
Assembly插件目的是提供一个把工程依赖元素、模块、网站文档等其他文件存放到单个归档文件里。
10. RocketMQ
主要用来实现异步通信
消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。主要具有以下优势:
- 削峰填谷:主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题·
- 系统解耦:解决不同重要程度、不同能力级别系统之间依赖导致一死全死
- 提升性能:当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统
- 蓄流压测:线上有些链路不好压测,可以通过堆积一定量消息再放开来压测