分布式微服务系统所带来的技术问题

如题,目前,不管是包含Spark、Flink等分布式计算框架的大数据Hadoop生态圈,还是以SpringCloud为服务治理主体的微服务,还有炒得火热的区块链平台,都是分布式下的智慧结晶,那今天来说说在分布式系统下所能遇到的一系列经典的技术问题,程序员要保持学习,今天,把此技术问题做一个理论汇总,具体的解决方案,等本人亲自动手证明之后,再把成果做分享。在这里插入图片描述

分布式下所遇到的技术问题有如下几种:

(1)分布式服务治理框架

  • 如果要让不同的子系统或者服务之间互相通信,首先必须有一套分布式服务框架。这套框架包括各种拥有各自功能的组件也可以说是小框架、中间件。
  • 比如,子服务的注册问题:也就是各个服务可以互相感知到对方在哪里。
  • 之后便是子服务之间的通信问题,服务间可以发送请求过去,可以通过构造HTTP模板或者RPC远程调用的方式。对了,高并发下唯一选择还是MQ。
  • 还有啥需要的功能?网关?统一配置?链路追踪?ELK日志?容错回退?等等等等…
  • 在这里,最常见的技术就是框架dubbo以及spring cloud,当然大厂一般都是自己有服务框架(除了自己造的轮子,大部分是封装了一下springcloud来方便使用)。
    (2)分布式事务
  • 普通的单体项目如SSM、SpringBoot等,对于查询之外的事务操作,已经有极其方便的@Transactional。
  • 但是一旦你的系统拆分为了多个子系统之后,那么一个贯穿全局的分布式事务应该怎么来实现?
  • 这个你需要了解TCC、最终一致性、2PC等分布式事务的实现方案和开源技术,此外,TX-LCN也是不错的分布式技术解决方案,当然,阿里巴巴的那一套也是很好很好。还有,CAP理论,是事务的理论基础,说的就是可用性、一致性、分区容错性三者,三者不可能同时保证,只有CP\CA\AP三种可能。
  • 还有一点极其重要,除了对于数据库层面的CAP,还有消息中间件Kafka的CAP定则,为什么也有?因为KafkaMQ本身何尝不是一种可暂存可持久化的数据存储点呢?
    (3)分布式锁
  • 不同的系统之间如果需要在全局加锁获取某个资源(变量?对象?)的锁定,此时应该怎么来做?
  • 毕竟大家不是在一个JVM里(又不是部署一个机器,不然宕机还有啥分布式的意义)了,不可能用synchronized来在多个子系统之间实现锁吧,是不是?
    (4)分布式缓存
  • 分布式缓存指的是什么?分布式缓存当然也是缓存(废话)!只是面向分布式系统所升级的缓存技术,它具体指的是与应用分离的缓存组件或服务,其最大的优点是自身就是一个独立的应用,与本地应用隔离,多个应用可直接的共享缓存。
  • 如果你原来就是个单块系统,那么你其实是可以在单个JVM里进行本地缓存就可以了,比如搞一个HashMap键值对系统来缓存一些数据,比如单机springboot配置redis。
  • 但是现在你有很多个子系统,他们如果要共享一个缓存,你应该怎么办?怎么用Redis等缓存中间件?
    在这里插入图片描述
    (5)分布式消息
  • 在单块系统内,就一个JVM进程内部,你可以用类似LinkedList之类的数据结构作为一个本地内存里的队列。
  • 但是多个子系统之间要进行消息队列的传递呢?那是不是要引入类似RabbitMQ之类的分布式消息中间件?
  • 当然,选用中间件的时候,综合性能选择rabbitMQ,大吞吐量选择Kafka,不管哪种MQ,适合某一个特定场景才行,因此,怎么解决频繁更换MQ配置的问题?MQ和项目的配置太过紧密,需要解耦,是不是考虑用SpringCloudStream来解耦配置MQ?
  • 注意,SpringCloud和SpringBoot配置Kafka的pom有很大区别。
    (6)分布式搜索
  • 如果在单块系统内,你可以比如在本地就基于Lucene来开发一个全文检索模块,但是如果是分布式系统下的很多子系统,你还能直接基于Lucene吗?
    明显不行,你需要在系统里引入一个外部的分布式搜索系统,比如ElasticSearch,啥?!不知道ES?我也只是知道,记着学就是了,现在面试不问问es、netty、redis都不好意思。
    (7)分布式会话
  • 说到会话,session?no no no,单体项目的东西,不能用在这,那咋整?这就是微服务下的单点登录问题了。
  • 微服务下,用Json Web Token生成分布式令牌,里面负载有用户的基本信息、角色等,当然,是加密的,这就是一个用户出入各个子服务的身份凭证。
  • 但是,jwt本身只是个加密解密信息的令牌厂家,各个子服务不会自己拿到它看它是啥,那怎么实现过滤申请jwt凭证、校验流程做认证呢?Spring Cloud Security OAuth2和JWT的组合真是目前完美。
  • OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该令牌在限定时间、限定范围访问指定资源,这里主要是第三方登录获取用户信息的问题。
    (8)分布式配置
  • 分布式项目中一般会单独建一个项目用来做全局配置整理,以及、动态刷新git库配置文件,通过请求刷新其他服务的配置,spring cloud config便是,但是阿里的nacos=eureka+config,是不是更好用?方案很多,方便、强大才最好。
    (9)分布式日志收集处理
  • 成熟方案 : ELK。
    (10)分布式监控报警中心
  • 请求在各个子服务之间的访问流程追踪监控方案,链路追踪SringCloud Sleuth,配合ELK日志分析使用,追踪微服务调用出现的问题点。
    在这里插入图片描述

以上,谢谢观看

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值