带着小白学习-微服务@[TOC](从零学习微服务)
一、先说说为什么要用微服务
我仍然想写一写微服务,主要就是我想用最简洁、最快速的方法给小白进行普及。
1.什么是微服务
当一个公司的业务是从最开始的小市场慢慢扩大到了一定规模,系统的功能也从最初的增删改查,上升到了用户量暴增、需求多种多样,谁都不想得罪(其中一个服务bug停止了,求求其他的正常运行啊),业务永远顺畅,某一开发人员离职了(系统等死???)等等等,那么你的系统就需要用微服务架构重新设计了。
那么微服务到底能帮我们实现什么?
(1)将一个复杂问题拆分成若干个简单的小问题,将一个大型的项目架构拆分成若干个微服务来协同完成。
(软件设计层面)。将一个庞大的工作拆分成若干个小步骤,分别由不同的人完成这些小步骤,最终将所有的结果进行整合实现大的需求(比如卖商品的电子商务网站)。
(2)一台服务器无法负荷高并发的数据访问量,那么就设置十台服务器一起分担压力,十台不行就设置一百台。
(物理层面)。很多人干同一件事情,来分摊压力。
2.是不是需要微服务(以下是AI说的)
3.如何把系统功能转换为或者拆解为合理的微服务?(以下是AI说的,我认为有道理)
4. 微服务需要的技术
要想了解这里的技术栈,就得先用个例子搞清楚微服务如何设计。
假设现在做一个外卖平台,我们分为两种情况来分析,首先是:
(1)系统功能
- 客户端:主要针对普通用户,用户注册、用户登录、菜单选购、查询订单
- 后台管理系统:主要是针对管理员,管理员登录、管理员退出、添加菜品、查询菜品、修改菜品、删除菜品、订单处理、添加用户、查询用户、删除用户。
(2)转换为微服务
先有四个服务提供者:
- account账户服务:用户和管理员的登录、退出。
- menu菜品服务:添加菜品、删除菜品、修改菜品、查询菜品。
- order订单服务:添加订单、查询订单、删除订单、处理订单。
- user用户服务:添加用户、查询用户、删除用户。
假设一位用户想点菜(服务消费者):那么他的路径就是:登录–>查询菜品–>添加订单。。。。他就只需要到上面的四个微服务中调用某个业务逻辑即可。
此时的整个系统工作原理是:
四个服务提供者和一个服务消费者都需要在注册中心进行注册,同时可以使用配置中心来对配置文件进行统一集中管理。
下面一张图可以形象的说明关系:
特别说明:此图来源于B站@Java大联盟,楠哥的视频“Spring Cloud从入门到实战”
此时的重点就转移到了注册中心、配置中心等
(3)微服务方案就登场了
目前主流微服务方案:Spring Cloud Alibaba(基础微服务全家桶) + Spring Cloud 原生组件(OpenFeign、Loadbalancer) 。
5.Spring Cloud Alibaba 官方组件(阿里提供)
(1)Nacos(注册中心 + 配置中心)
- 注册中心:微服务启动时把自己的地址注册到 Nacos;服务调用时从 Nacos 拉取可用服务实例,实现服务发现,替代 Eureka。
- 配置中心:统一管理所有微服务的配置文件(yaml),改配置不用重启服务,实时推送更新,替代 Spring Cloud Config。
- 特性:AP/CP 模式切换,支持集群,阿里主推,国内用得最多。
(2) Sentinel
- 核心能力:限流、熔断降级、热点参数限流、系统保护、权限控制。
- 作用:防止某个服务挂掉,连锁把整个微服务集群拖垮(雪崩保护)。
- 和 Hystrix 对比:Hystrix 已停更,Sentinel 功能更强,控制台可视化,是 SC Alibaba 默认熔断方案。
(3)Seata
- 场景:一次业务调用跨多个微服务、多个数据库,要么全部成功,要么全部回滚。
- 模式:AT 模式(最常用,无侵入)、TCC、SAGA、XA。
- 痛点:微服务天然没有本地事务,Seata 就是用来补这个短板。
(4)RocketMQ
- 作用:异步解耦、削峰填谷、事件通知。比如订单创建后异步发消息通知库存扣减。
- 微服务场景:异步通信,和同步 Feign 调用互补。
- 同类:RabbitMQ、Kafka;RocketMQ 事务消息对分布式业务友好。
(5)Spring Cloud Gateway
- 注意:Gateway 是 Spring Cloud 官方组件,不是 Alibaba 自研,但 SC Alibaba 项目标配网关。
- 功能:路由转发、鉴权、限流、跨域、请求日志、负载均衡。
- 位置:所有前端 / 外部请求先进网关,再转发到后端微服务。 旧版是 Zuul,现已淘汰,Gateway 是主流。
6. Spring Cloud 原生配套组件(和 SC Alibaba 一起搭配使用)
(1)OpenFeign
重要:OpenFeign 不属于 Alibaba 组件,属于 Spring Cloud 原生,但 SC Alibaba 项目几乎必用。
- 作用:像调用本地方法一样调用远程微服务,不用手写 Http 请求。写接口加注解,底层自动帮你发起 HTTP 请求。
- 底层负载均衡:新版 SpringCloud 移除 Ribbon,OpenFeign 默认搭配
Spring Cloud Loadbalancer。 - 搭配:Feign 调用异常时,可以交给 Sentinel 做熔断降级。
(2)Spring Cloud LoadBalancer
- 替代旧的 Ribbon。从 Nacos 拿到多个服务实例列表,在客户端选一个节点发起调用(轮询、随机等策略)。
- Feign、Gateway 底层都依赖它。
7. SPring boot与Spring Cloud与Spring Cloud Alibaba
这三者在我们开发过程中都要用到,那么他们的关系到底是什么?
- Spring Boot:基础开发框架,快速开发单体 Java Web 应用;
- Spring Cloud:基于 Spring Boot 的一套「微服务规范 + 原生组件全家桶」;注意:他主要是一个规范!!!!
- Spring Cloud Alibaba(SCA):Spring Cloud 规范的实现实现方案,阿里提供的组件集,用来替换掉已经停更的 Spring Cloud Netflix(Eureka/Hystrix/Zuul)。
Spring Boot(底座) → Spring Cloud(微服务标准) → Spring Cloud Alibaba(国内主流实现套件)。
8.开发版本兼容设定
做系统开发的时候,大家最头疼的就是版本兼容问题。所以在做这个项目的时候,也请务必搞清楚当前系统的最佳版本兼容。
一般不建议追求最新,尤其对于初学者来说,使用较为稳定的旧版本就完全可以掌握其中的原理。
(1)最新版本兼容可以上官网查看:
Spring Cloud Alibaba 版本说明
(2)之前版本兼容关系可以上阿里云开发者社区查看
Spring Cloud Alibaba 历史版本兼容关系
9.本次学习使用的nacos下载
Nacos 历史版本下载