对于一个后端开发,分布式在目前基本是必备的一块知识了,无论是在工作实践中,还是在面试中,这块的知识都非常重要。
对我自己来说,从毕业后一开始做单体应用,到后面做依赖ESB的Saas开发,到做微服务分布式应用,可以说正好经历了服务发展的各个阶段,对架构演进有着我自己的理解。
然而,我目前在公司做的项目严格来讲叫“分布式单体”,缺少互联网的高并发的场景,因此我对分布式这一块也比较薄弱。
虽然公司里缺少这方面的锻炼,但我想,我自己也可以尝试去做一些开源项目,把自己对分布式的想法进行落地,这就是我写这个系列的文章的原因。
我主张程序员要“知行合一”,不光要学知识,也要把知识给用到实际,这才能真正形成一个闭环。这也是为什么很多人看了很多知识,但依然感觉学了就忘的原因。
这一篇文章,对我来说是一个开端,我会从这一篇开始,不断深入研究分布式,并把它们在我自己的开源项目里进行落地。
这篇先谈一谈我目前对分布式的粗浅认知,以及我打算怎么去做。我也不过是个渴望成长的小白,还有很多有待提高的地方,以下文字若有偏颇,欢迎讨论交流~
从单体到微服务
单体应用往往适用于简单的项目,随着业务量的增加,单体架构也就变成了巨石架构,越来越难维护,这时候微服务就出现了。
相比于单体架构,微服务有以下几点好处:
- 独立:每个微服务都是独立的项目,可以由不同的人或团队进行维护,可以并行研发,增加迭代速度。
- 可扩展性:可快速地添加服务实例,增强服务能力。
- 隔离:每个服务的失败不会大面积地波及整个服务运行体系。
当然,微服务也有缺点,就是带来了系统的复杂度,但是比起他所带来的优点,实在是瑕不掩瑜。
从rpc到分布式
既然单体应用被拆分了多个服务,那么首先解决的问题是服务间通信。
rpc,全称Remote Procedure call,远程过程调用,就是为了解决服务间通信而存在。简单来说,就是“像调用本地方法一样调用远程方法”。
rpc有几个关键的技术点,比如如何找到调用的函数,如何序列化和反序列,如何进行网络传输等。
目前比较主流的rpc框架有grpc,spring cloud的feign。
除了调用远程方法之外,分布式要考虑的东西远不止这些。
因为服务多了,就需要有一系列服务治理的措施,包括服务注册发现机制,负载均衡,限流,熔断,降级,重试,监控等等。
这就进入了一个广袤的世界,分布式的魅力也在于此。
分布式的十大场景
我这里总结了分布式十大场景,当然以下很多内容我都并未实践过,只是心里知道有他们的存在,我将在后续的时间里,按照规划的路线,逐步点亮技能树,把分布式这块的知识完全搞定,做到知行合一。
1. 服务注册与发现
负责把服务注册进来,监听服务状态,让消费者能动态知道集群的状态变化
例子:spring cloud eureka,consule
2. 服务集群与路由
实现服务的负载均衡
例子:类似nginx,多种路由算法
3. 配置中心
负责分布式环境下的配置更新
例子:apollo, nacos
4. 分布式ID
对大量数据和消息进行唯一表示,生成全局唯一的ID
例子:美团Leaf算法,雪花算法
5. 分布式缓存
说白了就是Redis的高可用架构,典型场景分布式session
例子:Redis
6. 分布式事务
这是分布式领域特别复杂的一块内容,解决方法也非常多,比如2pc,TCC,事务性消息等。
例子:阿里开源的seata
7. 限流
流量控制,典型的算法有漏桶算法和令牌桶算法。
例子:阿里开源的sentinel
8. 熔断和降级
为了防止服务雪崩,及时止损。
例子:Hystrix
9. 分布式调度
分布式环境下实现一些报表任务,定时任务等等。
例子:xxl-job
10. 分布式锁
解决高并发问题。
例子:Redission
当然分布式里面的内容远不止我上面列的,还包括分布式追踪(skywalking),监控等等,这里就不一一列举了。
我的计划是通过一个开源项目,尽可能把以上的要点都囊括,既帮助自己巩固知识,也希望自己的努力能帮助一些同样在这块领域探索的人。