终于学完阿里架构师推荐413页微服务分布式架构基础与实战笔记

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 目前,Spring Boot+Spring Cloud架构已经成为Java程序员的必备技能之一,刚开始学习时看到琳琅满目的Spring全家桶,可能会感到无从下手。如果只了解微服务中的各知识点,而忽略了以微服务分布式架构的方式学习系统的架构顺序,初学者可能就不知道如何使用微服务构建分布式系统。为了使读者更快掌握Spring Boot+SpringCloud的基础知识与架构方法,本文的章节顺序即应用系统的架构顺序。

前言

目前,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框架扩展内容。

这份【微服务分布式架构基础与实战】笔记共有413页,需要完整版的小伙伴,可以点击此处来获取就可以了!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
1月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
208 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
1天前
|
架构师
软考高级——系统架构师笔记1
### 简介 为了备战今年上半年的高级架构师考试,我选择在此记录备考笔记。参考教材为《系统架构设计师(第二版)》,并辅以希赛课程视频。考试分为三科:综合知识(75道选择题,150分钟)、案例分析(5道大题,必答1题选答2题,90分钟)和论文写作(4选1,3000字左右,120分钟)。期望通过努力顺利通过考试!
|
1月前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
317 36
微服务架构解析:跨越传统架构的技术革命
|
2天前
|
人工智能 安全 Java
微服务引擎 MSE:打造通用的企业级微服务架构
微服务引擎MSE致力于打造通用的企业级微服务架构,涵盖四大核心内容:微服务技术趋势与挑战、MSE应对方案、拥抱开源及最佳实践。MSE通过流量入口、内部流量管理、服务治理等模块,提供高可用、跨语言支持和性能优化。此外,MSE坚持开放,推动云原生与AI融合,助力企业实现无缝迁移和高效运维。
|
1月前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
52 0
|
3月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
1月前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
162 5
|
2月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
87 8
|
2月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
70 16