设计之道请求就进原则

编程

CDN加速

关于静态信息如图片、文件、css、js等资源,通常情况下采用CDN加速访问,其原理就是根据你的地理位置,由DNS解析服务器返回就近的IP地址,在从对应的IP下获取资源,如果资源不存在,则需要去资源的源头服务器拉取,具体访问过程参考如下图:

  • 用户发送请求->localDNS->ROOT DNS->域名授权服务
  • 再请求智能DNS,这是CDN流程中关键一环,如果有资源,就返回就近的CDN节点IP地址,客户端请求该CDN节点IP,获取内容
  • CDN节点首次或者过期之后需要从源头服务器拉取

服务路由

在上面的请求就近中我们介绍过,在业务层面也会做根据配置做请求最佳路由的设置,目前比较常见的服务治理框架都支持这种方式

  • dubbo针对多注册中心有丰富的路由策略,关于就近请求请参考ZoneAwareClusterInvoker,可以实现根据不同的zone优先调用同一个zone内的服务

    <dubbo:registry address="zookeeper://${zookeeper.address1}" zone="beijing" />

  • eureka提供了region和zone两个概念来进行分区,一个region下包含多个zone,服务提供者向多个zone下的注册中心发起注册,服务消费者根据自身所在的zone优先获取同一个zone下的服务调用地址,以这种方式实现请求的就进分配,DynamicServerListLoadBalancer会根据zone进行过滤保留与服务消费者处于同一个zone的server

    public class ZoneAffinityServerListFilter<T extends Server> extends

    AbstractServerListFilter<T> implements IClientConfigAware {

    //......

    @Override

    public List<T> getFilteredListOfServers(List<T> servers) {

    if (zone != null && (zoneAffinity || zoneExclusive) && servers !=null && servers.size() > 0){

    List<T> filteredServers = Lists.newArrayList(Iterables.filter(

    servers, this.zoneAffinityPredicate.getServerOnlyPredicate()));

    if (shouldEnableZoneAffinity(filteredServers)) {

    return filteredServers;

    } else if (zoneAffinity) {

    overrideCounter.increment();

    }

    }

    return servers;

    }

    }

     

  • 数据库层就进请求:
    通常情况下,不同的服务中心会建设不同的主库,以达到双活或者多活的目的,为了保证数据的最终一致性,需要做数据中心的双向同步,这里需要考虑保证低延迟、数据强一致、同步幂等校验、同步异常可回溯等等,业内已经有一些相对成熟的方案
     

 

 

以上是 设计之道请求就进原则 的全部内容, 来源链接: utcz.com/z/515929.html

回到顶部