[TOC]
历史
架构发展
- 单体架构
- 垂直应用架构: 按服务独立拆分多个
- 分布式架构: 抽取公共层
- SOA: 增加服务注册中心进行集群调度
- 微服务: 服务间彻底拆分, 原子化
- 组成
服务治理: 服务自动注册与发现
服务调用: REST/RPC
服务员容错: 防止雪崩
链路追踪: 记录服务调用链路 - 实现:
ServiceComb: 前身是华为云
Spring Cloud
SpringCloud Alibaba
SpringCloud Alibaba
- Sentinel: 流量控制, 熔断降级, 负载保护
- Nacos: 服务治理
- RocketMQ, Dubbo
- Alibaba Cloud ACM: 配置中心
- Alibaba Cloud OSS: 存储
- Alibaba Cloud SchedualerX: 任务调度
- Alibaba Cloud SMS:短信服务
Nacos
- 服务治理: 主要用于服务的注册与发现. 解决普通restTemplate调用时直接硬编程写入ip端口, 且无负载均衡.
常见的有Zookeeper(主要解决分布式数据问题), Eureka(注册与发现), Consul(基于GO开发, 提供注册发现配置, 本身是可执行文件安装部署方便, kv存储等功能), Nacos(注册发现和配置, =Eureka+config) - 启动
nacos/bin/startup.cmd -m standalone
访问http://localhost:8848/nacos, nacos/nacos 使用
引入<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-nacos-discovery</artifactId> </dependency>
主类加入@EnableDiscoveryClient
application.yml加入
spring.cloud.nacos.discovery.server-addr: 127.0.0.1:8848
服务调用: DiscoveryClient负责服务注册和发现
@Autowired
private DiscoveryClient dc;
ServiceInstance si = dc.getInstances("service-product").get(0);//可以get不同的instance实现负载均衡, 或使用Ribbon(@LoadBalanced)
String url = si.getHost() + ":" + si.getPort();
restTemplate.getForObject("http://"+url+"/product"+pid, Product.class);- Ribbon负载均衡策略
- BestAvailabeRule: 选择请求最少的server
- availabilityFilteringRule: 过滤被标记为circuit tripped的server
- WeightResponseTimeRule: 分配时间权重
- RoundRobinRule: 轮询方式
- randomRule: 随机
- Feign: 声明式的伪http客户端, 像调用本地服务一样调用远程服务, nacos兼容feign, feign集成ribbon
服务容错
- 常见容错方式:
- 隔离: 将服务划分为若干相对独立的模块, 使风险只存在某个模块内部. 常用方法有线程池隔离和信号隔量隔离
- 超时: 超出设置时间则直接断开请求, 释放线程
- 限流
熔断: 当下游访问剧增而响应变慢或失败, 上游服务科暂时切断下游服务调用, 这种牺牲局部保全整体的措施叫熔断. 熔断3中状态:
- 关闭(Closed): 无故障
- 开启(Open): 后续调用不在经过网络, 而是直接执行本地的fallback方法
- 半熔断(Half-Open): 允许有限流量, 并监控成功率, 如达到预期则关闭熔断, 否则重回关闭
- 降级: 为服务提供托底方案, 一旦调用无法正常, 则使用托底方案
- 常见容错组件
- Hystrix: NetFlix组件, 用于隔离远程调用, 服务或第三方库
- Sentinel: alibaba组件
- Resilience4J: 轻量简单
对比
sentinel
- 集成
依赖com.alibaba.cloud.spring-cloud-starter-alibaba-sentinel
- 控制台
https://github.com/alibaba/Sentinel/releases
java -jar启动 - 项目加入配置
spring.cloud.sentinel.dashboard: localhost:8080
启动项目即可访问 - 原理
将微服务程序注册到sentinel控制台上, 即在微服务中指定控制台的地址, 并且还要开启一个跟控制台传递数据的端口. - 可以通过sentinel控制台添加限流规则: 流量控制或熔断降级, 可以通过并发线程数进行限制(请求线程堆积)或通过响应时间进行降级; 而Hystrix采用的是线程池隔离的方式, 优点是资源隔离, 缺点是线程包装成命令后执行会设计排队, 上下文切换等.
- sentinel规则
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。