卷出头了,终于学完阿里架构师推荐 413 页微服务分布式架构基础与实战笔记
创始人
2024-02-11 01:44:40

时间飞逝,转眼间毕业七年多,从事 Java 开发也六年了。我在想,也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。

写这一套 Java 面试必备系列文章的初衷。

  1. 整理自己学过的知识,总结,让其成为一套体系,方便日后查阅。

  2. 现在不少 Java 开发者还比较迷茫,没有形成自己的一套知识体系。希望这一系列的文章能够帮助他们。

目前,Spring Boot+Spring Cloud 架构已经成为 Java 程序员的必备技能之一,刚开始学习时看到琳琅满目的 Spring 全家桶,可能会感到无从下手。如果只了解微服务中的各知识点,而忽略了以微服务分布式架构的方式学习系统的架构顺序,初学者可能就不知道如何使用微服务构建分布式系统。为了使读者更快掌握 Spring Boot+SpringCloud 的基础知识与架构方法,本文的章节顺序即应用系统的架构顺序。

分布式可以理解为人体器官,人体可看成分布式系统,大脑是注册中心的集群,四肢与器官是提供服务的微服务,前进的距离是微服务运行之后的返回值,消耗的体力是微服务中处理的逻辑,影响的记忆是某些微服务对数据库的增删改查。分布式可看成一种思想,而 Spring Cloud 与 Spring Boot 是实现了这种思想的工具。

无论多复杂的分布式应用程序,整合多少个服务器,调用多少种服务接口,使用多少种协议,使用集群还是高可用的何种架构方式,使用客户端还是服务端的何种负载均衡,使用哪个消息中间件、哪个数据库集群,使用搜索引擎/非关系型数据库/时序性数据库/关系型数据库/文件管理等多少种存储介质,其分布式本质都是分布式自身的思想。建议读者动手将本文实例都敲在 IDE 中,在 Linux 服务器上搭建各集群,那么上面那些看起来颇具难度的问题,都将不会是难题。

目录

主要内容

介绍微服务分布式的相关概念,搭建第一个微服务项目,了解微服务项目的运行过程。通过微服务整合 Consul 注册中心,搭建第一个微服务+注册中心的分布式系统。多个微服务与 Consul 注册中心相连,彼此通信,微服务获得彼此的接口及地址,调用彼此的接口与服务。

然后无可避免地需要处理彼此通信时报错的情况,以免单一微服务无法正常提供服务,导致整个分布式系统的瘫痪。此时采用 Ribbon 客户端负载均衡方案,依靠多台服务器部署多个相同微服务项目,以提高系统的性能。在分布式通信不足以解决全部报错问题时,可选择 Hystrix 进行更精细划分,保证在任何一台微服务出现问题时,系统整体仍然能正常运行。

至此初步搭建了分布式系统,然后开始增加微服务的增删改查等业务功能。在系统处理增删改查过程的同时,还需要事务功能的支撑与管理。在初步增删改查后,依靠微服务的缓存增加微服务的性能,同时需要确保 Redis 与 MySQL 之间的增删改查一致性。另外,如果有特殊业务需求,可由分布式消息通信彼此协作、沟通、处理。

在处理基本业务后,还会有定时任务等业务需求,此时需要微服务的任务调度进行处理。而单节点任务调度的微服务可能会有宕机或重复执行等相关问题,只有使多台微服务同时进行任务调度,且彼此协同的情况下,才能解决此类问题。这时需要 Quartz 分布式任务调度解决多个任务调度间彼此协同、相互管理等问题。若有文件上传、下载等相关需求,需要使用微服务的文件上传管理。单节点文件上传可能存在磁盘空间不足或不易管理等问题,需要 FastDFS 分布式文件管理以解决多台文件管理服务器彼此协同、磁盘扩容等问题。

第 1 章微服务分布式架构设计原理;

本章 1.3 节利用 Spring Boot 创建了第一个微服务应用程序。1.5 节将该应用程序的端口号修改为 9090。1.7 节将该应用程序的 properties 配置文件修改成了 YAML 配置文件。1.8 节通过单配置文件让工程适应多应用场景。1.9 节通过多配置文件使工程适应多环境进行开发。

在实际工程中,分布式的环境集成经常会使用多环境配置,多环境配置是微服务十分重要的部分。另外,在实际工程中建议多运用 bootstrap.yml 和 bootstrap.properties 文件,以方便日后维护。

第 2 章分布式的注册中心;

2.3 节初步认识了 Consul 注册中心,并且搭建了 Consul 注册中心的集群,使 Consul 注册中心可以更加良好地运行。

2.4 节使用 Spring Cloud 整合了 Consul 进行注册并获得其他服务的注册地址。

2.5 节使用 Spring Cloud 整合了 Consul 的 Config 功能,可以通过 Java 代码获取 Consul 上的配置参数,方便多个微服务工程管理相同的配置信息。

在得到了其他微服务信息后,第 3 章将介绍使用 Feign 框架通过 Consul 注册中心调用其他微服务接口。

第 3 章分布式的通信;

基于微服务的分布式架构,本章使用 Feign 达到多个微服务互相通信的目的。当调用 Server 端出现异常时,通过 Feign 降级回退函数返回。

微服务集成 Swagger 减少了多个程序员之间的沟通成本,在某程序员提供 Swagger UI 后,其他程序员可以直接了解接口地址、名称、入参、返回值等信息。在得到其他接口的信息后,通过 Feign Client 端可以调用 Server 端微服务提供的接口。Feign 的拦截器在 Feign Client 端调用其他 Server 接口时,对本次请求统一处理。

如果 Feign Client 端调用的 Server 端发生了报错现象,Feign 的 Fallback 类和 Feign 的 Fallback 工厂分别用降级回退类与降级回退工厂,直接将本次请求通过降级函数回退给前台,不会造成线程的阻塞。

如果 Feign Client 端调用的 Server 端发生超时现象,可通过配置 Feign 内置的 Ribbon 负载均衡器进行解决。一旦 Server 端发生超时现象,Feign 都会直接将本次请求通过降级函数回退给前台,不会造成线程的阻塞。

第 4 章分布式的客户端负载均衡;

通过将多个微服务使用相同的微服务名称注册在同一个注册中心上,Feign Client 可以使用 Ribbon 根据算法调用其中任何一个微服务,通过多台服务器提高应用程序的并发承受能力。在分布式架构中,分布式通信是最重要的环节之一,注册中心保证分布式能够得到相关的通信地址,客户端负载均衡减小了分布式通信的并发压力。

第 5 章分布式的断路器;

5.2 节实现了更高级的降级回退方式,在一个函数中使用多个 Feign Client 的 Service,若有任何异常,整个函数都会回退到降级函数中。

5.4 节实现了在调用某个函数后,将该函数的返回结果作为缓存,以防多次调用产生高并发,用“函数名+入参”的形式作为 Key 值,将返回结果作为 Value 值缓存。在一个函数中使用多个 Feign Client 的 Service,以减小多个微服务之间沟通的并发压力。

5.5 节实现了在多次调用某个函数后,将多个线程合并成一个线程进行调用,减小了系统内存和线程并发数量的压力。在一个函数中使用某个 Feign Client 的 Service,将多次得到的 ID 合并成一个 List 对其他微服务进行请求,减小多个微服务之间沟通的并发压力。

5.6 节利用 Hystrix 自带的 Dashboard 性能监控仪表盘页面和性能监控控件,监控其他微服务的 Hystrix 线程池,包括 Hystrix 线程池目前的剩余线程数目、线程池容量、并发情况、运行情况、执行次数等。

其实 Hystrix 自带的 Dashboard 仪表盘使用方法十分简单,在需要被监控的微服务中通过 application 资源配置文件打开被调用地址,通过 @Bean 注解将性能控件相关内容配置在 Spring 容器上,监控端 Dashboard 仪表盘使用 @EnableHystrix-Dashboard 注解开启页面,并在页面上调用 Hystrix 性能控件的相关地址即可。

分布式的三大剑客:注册中心 Consul(包括通信 Feign)、微服务 Spring Application、断路器 Hystrix 已经全部介绍完成。一般在分布式系统搭建初期,先要搭建三个基本要素,再在每个微服务中增加增删改查等业务逻辑。

第 6 章微服务的异步线程池;

异步线程池是一个底层实现复杂但使用方法非常简单的技术,优雅停止异步线程池的测试执行过程则比较复杂。此处要注意每个细节,尤其是在优雅停止异步线程池且执行完成所有应该执行的线程后,线程池中的线程数目是否正确归零。

如果想了解更多关于优化异步线程池的内容,可参考 Java 自带的线程池、Java 第三方线程池、Java 并发编程等相关内容。不论用 Java 自带的线程池,还是第三方开源的线程池,对于异步线程池来说都只是不同的实现而已,并无区别。因为每种线程池的优雅停止实现都不相同,所以每种不同实现出来的异步线程池的优雅停止也不同。

第 7 章微服务整合持久化数据源;

本章通过 Spring Boot 微服务整合 MyBatis 注解和 JPA 注解,达到操作数据库进行增删改查操作的效果。

由于 JPA 注解、MyBatis 注解的分页和多表十分类似,本章不再重复介绍。通过运用 7.2 节和 7.4 节中的 @Select、@Query 等注解,可了解利用注解进行数据库开发的思想。

第 8 章微服务事务;

通过 8.2 节的实例更加完整地了解 @Transational 注解,包括该注解在 @Service 层对多个 dao 层的应用方式,扩展了第 7 章的内容,希望通过本章可以使读者更加清晰地理解事务的使用方式、传播行为、隔离级别等内容。

第 9 章微服务的缓存与分布式的消息通信;

Redis 是最简洁的非关系型缓存数据库,在实际工作中使用较多。9.2 节与 9.6 节分别使用 Spring Data Redis 与 Spring Cache 整合 Redis 以实现缓存的增删改查操作。

9.5 节使用 Redis 作为消息通信中间件进行多个微服务之间的通信。

第 10 章微服务的任务调度与分布式的任务调度;

10.1 节整合了单点任务调度,10.4 节整合了分布式任务调度,以此介绍了任务调度的分布式方法。

Quartz 使用方法十分简捷,在实际项目中也可以使用其他分布式解决方案的框架。其实更重要的是理解任务调度的分布式原理,而非死记硬背 API。

第 11 章微服务的文件上传与分布式文件管理;

11.2 节实现了微服务文件上传,11.7 节实现了微服务的分布式上传。

11.5.4 节介绍了分布式上传的原理,以及微服务的即将上传服务器、文件服务器分割成两个服务器进行操作。FastDFS 安装较为复杂,可参考相关书籍。

第 12 章扩展与部署;

本章拓展了分布式架构的相关方案,总结了本文前几章未涉及的 Spring Boot 与 Spring Cloud 框架扩展内容。

需要文章中配套资料的朋友可以+文末wx名片免费领取

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...