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

news2024/11/22 13:57:21

时间飞逝,转眼间毕业七年多,从事 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名片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可视化大屏--响应式适配解决方案flexible.js

响应式适配解决方案flexible.js 最近公司开了第二个项目,是一个可视化大屏。 那么,在可视化大屏的基础上,我们肯定是要适配所有的屏幕设备,不能出现一换电脑,样式就紊乱的情况。 so,我们也不需要自己写媒体查询了&…

第40讲:MySQL索引的语法以及基本使用

文章目录1.索引的使用语法2.索引的基本使用2.1.准备一张数据表2.2.按照如下需求为表中的字段创建索引2.3.查看创建的索引2.4.删除索引3.验证使用索引前后的执行效率1.索引的使用语法 1)创建索引 创建索引时,如果不指定索引的类型,默认就是常…

极简示例揭示 SwiftUI 中 @ObservedObject 与 @StateObject 状态的关键区别

问题现象 话说在 SwiftUI 中视图是状态的函数,这话一点都不假。正是秉性各异的各种状态构成了 SwiftUI 视图千变万化的功能。 这里,我们将为大家揭开其中两个常用状态,即 @ObservedObject 与 @StateObject 状态之间的最关键不同,并带领大家绕过实际使用中可能出现的坑: …

秋染田野稻菽飘香 国稻种芯·中国水稻节:河北各地农业丰收

秋染田野稻菽飘香 国稻种芯中国水稻节:河北各地农业丰收 河北日报 (记者郝东伟) 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&#x…

JavaIO流:模型

IO 的字面意思是读/写数据,IO 模型是读/写数据的方式。常用到的读/写数据方式有:同步阻塞 IO、同步非阻塞 IO、IO 多路复用、信号驱动、异步 IO ~ 本篇内容包括:Java IO 与 IO 模型、五种 IO 模型、三种 Java IO 模型。 文章目录一…

计算机组成原理期末复习第三章-2(唐朔飞)

计算机组成原理期末复习第三章-2(唐朔飞) ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:&am…

电子元器件企业面临缺货涨价,SRM协同系统助力企业采购数字化智慧升级

近年来,在移动互联网技术不断发展、消费电子产品制造水平提高和居民收入水平增加等因素的驱动下,电子元器件行业呈现蓬勃发展的态势。未来随着5G、物联网、人工智能、虚拟现实、新型显示等新兴技术与消费电子产品的融合,这会使得行业需求量持…

linux进程间通信-FIFO,让你全方位理解

有名管道(FIFO) 有名管道也被称为FIFO文件,是一种特殊的文件。由于linux所有的事物都可以被视为文件,所以对有名管道的使用也就变得与文件操作非常统一。 (1)创建有名管道 用如下两个函数中的其中一个,可以创建有名管道。 #include #include …

python项目上线

python项目上线一 购买服务器二 使用MobaXterm连接服务器三 上线图四 安装git五 安装mysql六 安装redis七 安装python八 安装uwsgi九 安装虚拟环境十 安装nginx十一 前端部署十二 后端部署12.1 git拉取代码,安装依赖12.2 配置数据库12.3 迁移数据库12.4 使用uwsgi启…

作为微软开发者官方号,我们又要做点特别的事情了

在“感谢”二字最容易说出口的日子 谢谢每一个你,像一颗颗星星一样 点亮 MSDN 微软开发者社区的技术宇宙 我们也将在这个最值得感谢的日子 做一点特别的事情 MSDN 到底什么来头? MSDN 微软开发者社区已经成立快10年了,相信有很多资深开发…

Android服务器的通信方式

目录 一.HTTP协议 1.简介 2.Get和Post的使用 1.Get请求 2.Post请求 3.Get请求和Post请求的区别 二.Socket Socket的使用类型主要有两种: 客户端: 三.Socket 与 Http 对比 Android与服务器的通信方式主要有两种,一是Http通信&#xf…

Docker安装Gitlab-ruuner

第一步 # 拉取镜像 docker pull gitlab/gitlab-runner:latest # 启动容器 docker run -d --name gitlab-runner --restart always -v /opt/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest 第二步 查看/…

Windows 上修改 docker 的镜像文件存储位置(修改 WSL 文件映射)

Windows 上修改 docker 的镜像文件存储位置(修改 WSL 文件映射)1、起因2、修改2.1 关闭 Docker Desktop2.2 备份镜像2.3 WSL 取消注册 docker-desktop-data2.4 镜像数据导回 WSL 并挂载到新路径3、验证1、起因 一开始在 Windows 上安装了 docker 后&…

运动用品品牌排行榜,2022年值得买的运动用品推荐

如今,人们的生活节奏越来越快,工作和生活压力大。因此,人们越来越重视体育运动,通过体育运动达到放松和锻炼身体的目的,运动装备也就跟着火热起来。无论是进行室内或户外活动,选一套合适的运动装备是很有必…

【java】java 类型安全 与 unchecked warning

1.概述 1.1. What does type-safety mean? 我的总结: 从概念上来说,Type Safety,最本质上,就是对于内存(Memory)的“正确访问”。假如说,在内存的一块区域上存储着一个String类型的对象;按照正常的逻辑,这块内存区域就应该被当作String来进行处理,这就是所谓的“…

MASA Framework 事件总线 - 进程内事件总线

概述 事件总线是一种事件发布/订阅结构,通过发布订阅模式可以解耦不同架构层级,同样它也可以来解决业务之间的耦合,它有以下优点 松耦合横切关注点可测试性事件驱动 发布订阅模式 通过下图我们可以快速了解发布订阅模式的本质 订阅者将自…

nginx简单学习笔记

目录什么是nginx?反向代理负载均衡动静分离安装nginxNginx常用命令nginx.conf配置文件1、位置2 nginx配置文件组成Nginx 反向代理实例Nginx 配置实例-负载均衡nginx 分配服务器策略Nginx配置实例-动静分离nginx原理什么是nginx? Nginx是一个高性能的 HT…

【附源码】计算机毕业设计JAVA医院住院综合服务管理系统

【附源码】计算机毕业设计JAVA医院住院综合服务管理系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: …

第五站:操作符(第一幕)

操作符相关的知识,在我们初识C语言(第三幕)这篇文章中其实已经讲到过了。但是那一次讲解仅仅只是一些粗略的知识讲解,我们在那里面已经提到过,后续会专门超级详细的讲解操作符的知识,我们现在就来攻下操作符…

2022亚太数学杯数学建模竞赛B题(思路、程序......)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…