1 .Ribbon 负载均衡:轮询,权重,随机...
Nacos底层有依赖到Ribbon,用来做负载均衡 。
使用方法:加@LoadBalance 注解,可以用注册到Nacos的serviceName来替代ip:port。
例:http://serviceName/url
Ribbon有一个关键的接口,LoadBalanceInterceptor:作用是定时轮询访问Nacos接口,拉取Nacos注册中心拉取最新注册信息(服务列表)到本地,接收name+url,拆分取出name,获取name相关的ip:port,再通过指定的负载均衡方式,将请求分发到各个机器。
2. Feign 实现类似dubbo的像访问本地方法一样,访问远端服务。
1)@EnableFeignClient
2) @FeignClient(value="stock-service") -- service name
public interface StockService{
//接口1
@PostMapping(value = "/XXX/XXX")
String deductStock (@RequestBody Order order);
//接口2
···
}
Feign 会生成代理,组装url,拼接serviceName+url,依赖Ribbon,解析域名,...
3. Sentinel 降级,熔断,分布式系统的流量防卫兵:保证高可用,一个服务报错不能影响主链路。
feign:
sentinel:
enabled:true
3-1 降级:
@FeignClient(value ="credit-service",fallback = CreditServiceFallback.class)
配一个fallback的实现类,CreditServiceFallback implements CreditService(这个类写feign接口)
3-2 限流:
管理界面可以修改QPS,线程数等
3-3 熔断
管理界面点击熔断,配置异常比例,RT,异常数等。
超过几秒内的异常比例,不调用方法,直接调用fallback方法
原理:
通过滑动时间窗:Metric实时统计线上运行统计。通过filter分时间段统计指标,例每秒一个格子,将时间窗格的数据次数求和
4 Seata:分布式事务: 一般不用,在蚂蚁金服用的比较多。因为和钱相关,需要强一致,及时效性。但是加锁太多,效率太慢。
加依赖,回滚日志表配置
全局 @GlobalTransactional
本地 @Transactional
TCC模式:
AT模式:(默认)反向补偿 uodo Log
5
Nacos 服务注册:
引入nacos-discory依赖
开启心跳任务,每隔几秒访问http接口,向Nacos发起心跳。
Nacos 高并发架构
zookeeper 的集群架构:cp 一致性
Eureka:ap 可用性
Nacos:CP模式Raft协议实现,AP模式
如何实现高并发:每秒有大量数据注册,需要写入注册表。如果加锁,性能会较低。
架构设计:
CopyOnWrite:
Eureka:
客户端每隔30s 从注册中心拉取服务列表,动态发现注册信息。
如何实现注册表信息?ConcurrentHashMap<String,Map<String,List>>
为什么用map,不存数据库?
用内存结构,效率更高,ConcurrentHashMap支持并发,查找快
多级缓存设计思想:
在拉取注册表的时候:
首先从ReadOnlyCacheMap里查缓存的注册表
若没有,找ReadWriteCacheMap里查缓存的注册表
如果还没有,从内存中获取实际注册表数据
在注册表发生变更的时候:
在内存中更新变更的注册表数据,同时过期掉ReadWriteCacheMap,
此过程不会影响ReadOnlyCacheMap提供人家查询注册表
默认每30s Eureka Server会将ReadWriteCacheMap更新到ReadOnlyCacheMap
默认每180sEureka Server会将ReadWriteCacheMap里的数据失效
下次有服务拉取注册表,又会从内存中获取最新的数据了,同时填充各级缓存。