微服务架构~白话

微服务架构

  • 需要解决的问题

    1. 这么多服务,客户端如何访问
    2. 这么多服务,服务与服务之间如何通信
    3. 这么多服务,如何管理
    4. 这么多服务,挂了怎么办
  • 微服务架构=水疗会所

  • 服务消费者=你

  • 服务提供者=技师

  • 你怎么联系技师?需要注册中心=会所

    • 如果没有注册中心?
      • 你就需要社交软件,例如,微信,你要一个一个手机号码留着,联系方式,姓名等个人信息你要存着,就很麻烦,还要维护关系
    • 有注册中心?
      • 消费者(你)并不用维护和提供者(技师)的关系,可以找注册中心(会所)找到提供者(技师)
    • 缓存
      • Redis 缓存穿透,缓存击穿,缓存雪崩
        • 什么是缓存?
          • 8号技师(key),去会所直接说我找8号就可以直接提供服务.
        • 什么是缓存穿透?
          • 数据库和缓存里都没有这个数据(你拿着8号技师去会所找她服务,她离职了,你去找会长,会长就去技师房问8号技师在不在?不在)
          • 这就相当于穿透,拿着东西要服务的时候,没有key为8的值,就去数据库找,也没有.(又经过缓存又经过数据库),效率低
        • 什么是缓存击穿?
          • 例如,key很热门,属于爆款商品,就存到缓存,有可能有缓存失效时间,这笔数据失效的一瞬间,我就拿着id去缓存拿不到数据,就去数据取数据
          • (会长以为8号在会所,实际去吃饭了,然后通知技师,本来刚刚是在的,会长跟你说在,你去了,突然8号去吃饭去了,要想8号提供服务,等她回来路上会花点时间)
        • 什么是缓存雪崩?
        • 同一时间,集中式的key消失了(比如,我存10条数据,过期时间都是60秒,60秒一到,10条数据都失效了)
        • (你有8,9,10三个号码牌,你跟会长说”8号在不在?”,”不在”,”9号在不在?”,”不在”,”10号在不在?”,”也不在”,这就是雪崩,要么跟你额外安排吧,这就是去数据库里查,要么把她从家里喊过来)
    • 熔断机制
      • 警察来了,你去会所问会长,今天有什么服务啊,会长说”只有足疗”,谁问都一样只有足疗,返回一个固定的结果,因为警察来了嘛,对不对
    • 高可用
      • 你去会所找8号技师,8号不在,还有9号,你可以找9号,9号不在找10号,这就高可用,一直可以用
    • 高性能
      • 通过训练,提高技师们的能力,进行优化
    • 高并发
      • 负载均衡,8号,9号技师轮流服务

盖房子

  • 分布式,可以高可用
    • 一个人搬砖,一个人砌墙,一个人和泥,很多人干不同的事情
  • 集群,可以高可用
    • 十个人搬砖,十个人砌墙,十个人和泥,很多人干相同的事情
  • 高可用(集群,负载均衡,限流,降级,熔断)
    • 十个人干活,病了一个人没来干活,剩下九个人依然可以继续工作下去,一台服务器挂掉了不影响服务运行
  • 可扩展
    • 十个人这个活干不完,需要再叫几个人来帮忙一起干
  • 负载均衡
    • 有十个人,第一个先干一会,然后第一个人歇着让第二个人再干依次…
    • 如果不做负载均衡,第一个人干活,其他九个人看着,第一个累死了,然后上第二个人,最后都累死了,工程也没干完…
  • 限流
    • 老板说就100台服务器,你还问我要服务器,不能干就滚蛋,这时候,你需要做限流
    • 比如高峰期,放一部分请求过去,大部分请求拦截,这就是限流
      • 限流的方案秒杀
      • 限流的方案zuul网关(比如一秒钟只放一万个请求,剩下的先做拦截
        • 做一个熔断,返回一个提示信息,比如提示”服务器繁忙,稍后再试!”,两三秒之后没有那么繁忙了,就可以正常访问了)

高并发(分布式,静态技术,缓存技术,异步并发,池化,队列)

  • 分布式集群
    • 很多台服务器,加服务器
  • 静态技术
    • 比如商品详情页,被人访问的特别多,我们就可以生产静态页面,保存到服务器端,下次访问就不用渲染,通过静态页面做响应
  • 缓存技术
    • redis,缓存数据库,减少每次的请求访问时间,可能之前200毫秒,现在只需50毫秒,剩下更多的时间去处理更多的其他请求了
  • 异步并发
    • rabbitmq,消息中间件,用户访问有波峰和波谷,波峰的时候,先返回默认数据,把消息发送到队列
    • 比如,你下个订单,我先让你下载成功,然后我紧跟着再去处理库存问题,生产订单,处理物流信息,先把消息放队列里面去
    • 到了波谷,比较空闲了,然后从队列中获取消息再进行处理
  • 池化
    • 例如使用Tomcat线程池
  • 队列
    • 例如异步并发的消息队列