MXY-- 扩展

架构设计概念

分布式系统:系统多个模块在不同服务器上部署
高可用:系统中部分节点失效时 其他节点能够接替 其继续提供服务
集群一个特定领域的软件部署在多台服务器并做为一个整体提供一类服务,集群具有高可用性

负载均衡

1.1 负载均衡是什么
请求发送到系统时,通过某些方式均匀的分布到多个节点上,每个节点能够均匀处理请求负载
1.2 负载均衡策略
基于Ribbon方式的负载均衡,Netfix默认提供了七种负载均衡策略,对于SpringCloud Alibaba解决方案中有提供了NacosRule策略,默认的负载均衡策略时轮询策略

  1. RoundRobinRule 轮询策略(默认)
  2. RandomRule 随机
  3. RetryRule 轮询策略(重试采用的默认也是轮询)
  4. WeightedResponseTimeRule 响应速度决定权重:对RoundRobbin的一种增强 加入了人权重和计算响应时间的概念 其中响应速度最快的权重越大 权重越大被选中的几率越大
  5. BestAvailableRule 最优可用(底层也有RoundRobinRule):判断最优其实用的是并发连接数 选择并发连接数较小的server发送请求
  6. AvailabilityFilteringRule 可用性过滤规则
  7. ZoneAvoidanceRule 区域内可用性能最优

1.3 Robbin是什么?与Nginx什么区别
主要负责请求分发 将不同请求根据不同负载均衡策略分发到服务器上 起到一个环节请求压力的作用 Robbin主要作为选择的角色存在 真正发起请求的时Feign/OpenFeign
Nginx是属于服务器端的负载均衡 Robbin是属于客户端的负载均衡 Nginx的客户端发起的请求不知道会被负载到哪台服务器上,但Robbin的请求都是明确的 Nginx是进程之间调用时做负载均衡 而Robbin是进程内部选择调用时做的负载均衡

1.4 修改均衡负载
1.4.1 在配置类中修改

//修改均衡负载 指定为随机策略 默认均衡负载为BestAvailableRule(带有轮询机制)
   @Bean
   public IRule rule(){
       return new RandomRule();
   }
底层负载均衡策略中含@ConditionalOnMissingBean注解 所以当修改负载均衡策略时跳过原始的bean的BeanDefinition 加载动作
**@ConditionalOnMissingBean**注解作用在@Bean上 它的作用就是在容器加载它作用的Bean时 检查容器在目标类型的bean是否存在

1.4.2 在配置文件中修改

#        修改负载均衡 设置为RandomRule  随机策略
#sca-provider:
#  ribbon:
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

由于打包后修改不方便 在配置中心中修改

正向代理/反向代理

1.1 正向代理
系统内部要访问外部网络时 统一通过一个代理服务器把请求转发出去 在外部网络看来就是代理服务器发起的访问
1.2 反向代理
外部请求进入系统时,代理服务器把该请求转发到系统中的某台服务器上,对外部请求来说,与之交互的只有代理服务器,代理服务器实现的就是反向代理
正向代理隐藏的是用户 反向代理隐藏的是服务器

扩展

1.扩展 — 缓存淘汰算法
1.1 原理: LRU 根据数据的历史访问记录来淘汰数据,其核心思想是”如果数据最近被访问过,那么将来被访问的几率也很高
1.2 实现:最常见的实现是使用一个链表保存缓存数据 LRU算法是通过双向链表来实现 利用jdk的LinkHashMap 覆写RemoveEldestEntry(Map,Entry)方法(新数据插入到链表头部 数据被访问时 将数据移到链表头部 当链表满的时候 将链表尾部的数据丢弃)
1.3 优缺点:LRU命中率会低一些,且存在“缓存污染”的问题,但由于其简单和代价小,实际应用反而更多
1.4 最简单的LRU算法实现

import java.util.LinkedHashMap;
import java.util.Map;

public class LruTest {
    static Map<String,Integer> cache;

    public static void main(String[] args) {
        cache = new LinkedHashMap<String,Integer>(3,0.75f,true){
            //容量为3 扩充因子0.75 设置按照访问顺序排序
            @Override
            //删除不常访问的entry实体
            protected boolean removeEldestEntry(Map.Entry eldest) {
                //默认为false 不删除 设置删除容量 当容量大于三时返回true进行删除
                return cache.size()>3;
            }

        };
        cache.put("A", 100);
        cache.put("B", 100);
        cache.put("C", 100);
        cache.put("D", 100);
        System.out.println(cache);
        cache.get("C");
        cache.get("B");
        System.out.println(cache);
    }
}

2.扩展 ---- 双向链表
1.1 链表的定义:链表是一系列的存储数据元素的单元通过指针串接起来指向其他单元的指针
1.1.1 链表的结点:具有一个数据域和多个指针域的存储单元通常称为结点 指针域用于指向下一个具有相同结构的结点 链表的第一个和最后一个结点称为首结点和尾结点
1.1.2 单链表的定义:只有一个指针节点 称为单链表
*1.1.3 链表的原理 *:链表中尾结点的特征是其next引用为空(null),链表中每个节点的next引用都相当于一个指针,指向另一个结点,借助这些next引用,可以从链表的首结点移动到尾结点
1.1.4 结点的线性次序:结点P的next引用指向结点S,则P是S的直接前驱,S是P的直接后续
1.1.5 单链表的重要特性:通过前驱结点找到后续结点,而无法从后续结点找到前驱结点
1.2 双向链表的定义:又称为双链表,是链表的一种,每个数据节点中都有两个指针,分别指向直接后继和直接前继
1.2.1双向链表的特点
1)数据结构中具有双向指针
2)插入数据的时候需要考虑前后的方向的操作
3)删除数据时也要考虑前后方向的操作
1.2.2 双向链表的原理:与单向链表相比,双向链表的初始化只是在每个结点处增加上一个节点的指针
1.2.3 双向链表的结点:有两个指针域分别指向前一个结点和后一个结点,还有一部分用来保存节点数据,初始化结点需要将两个指针都指向空

3.扩展 ---- LinkedHashMap
定义:HashMap和双向链表合二为一即是LinkedHashMap。所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表双向链表的HashMap。
作用:HashMap是无序的 所得元素并不是按照最初位置排序,有些场景 我们需要一个可以保持插入顺序的Map,而HashMap的子类LinkedHashMap很好的解决这个问题
原理:通过维护一个额外的双向链表保证了迭代顺序 该迭代顺序可以是插入顺序(默认实现)也可以是访问顺序

在这里插入图片描述
4.扩展 ---- 击穿、雪崩、穿透
1.1 击穿:单个key查询时缓存中查询不到到数据库中查询 如果数据量不大活着并发不大没什么问题,但是如果数据库数量巨大并且高并发那么就会造成数据库压力过大而奔溃
1.2 雪崩:多个key查询并且出现高并发,缓存中失效或者查不到,然后都去数据库中查询,从而导致数据库压力突然飙升,从而崩溃
1.3 穿透:一般是恶意频繁查询对系统造成问题,key缓存并且数据库不存在,所以每次查询都会查询数据库从而导致数据库崩溃

5.扩展 ---- 限流算法
1.1计数器:确定方法的最大访问量MAX,每次进入方法前计数器+1 将结果和最大并发量MAX比较,如果大于等于MAX,则直接返回;如果小于MAX,则继续执行
1.2 令牌桶:系统会按恒定1/QPS时间间隔往桶里加入Token,如果桶达到上限就丢弃令牌,新请求来临时,会各自拿走一个Token,若没有Token可拿了就阻塞或者拒绝服务
1.3 漏斗算法
水进入漏斗里,漏斗以一定的速度出水,当水流入的速度过大也就是满了则直接溢出,强制性过滤算法不具备灵活性

漏斗适合请求到达频率稳定、需要严格控制处理速率的场景,而令牌桶适合允许突发请求的情况
*1.4 滑动窗口算法*:

用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值