微服务学习笔记
本篇文章讨论了微服务相关知识,包括单体架构与微服务架构的特点、微服务拆分方法、服务调用、注册与发现、以及 OpenFeign 的使用等内容。关键要点包括:
- 微服务的
什么是微服务
单体架构
整个项目的所有功能模块都在一个工程中开发,项目部署时需要对所有模块一起编译、打包。如下图所示:

优点:当项目规模较小时,这种模式上手快,部署、运维都很方便。
缺点:
- 团队协作成本高
- 系统发布效率差:任何模块变更时都需要发布整个系统,而且模块之间耦合、制约比较多,修改一个模块需要对比多个其他模块,导致发布效率很差。
- 系统可用性差:单体架构各个功能模块会作为一个服务部署,相互之间会影响,一些热点服务会耗尽系统资源,导致其他服务低可用。
微服务架构
微服务架构是一种软件设计模式,通过将大型单体应用拆分成多个独立的小型服务,每个服务专注特定的业务功能。这种架构旨在提高系统的灵活性、可扩展性和可维护性。它满足以下核心要点:
- 单一职责:一个服务负责一部分业务功能,其核心数据不依赖于其他模块
- 团队自治:每个微服务有自己独立的开发、测试、发布、运维人员
- 服务自治:每个微服务独立部署,访问自己独立的数据库。同时要做好服务隔离,避免对其他服务产生影响
例如,上面图中的4个功能模块,我们可以拆分成商品、用户、交易、购物车这几个模块,分别交给不同的团队去开发,并独立部署:

大家之前可能听说过分布式架构,分布式就是微服务的拆分过程,其实微服务架构正式分布式架构的一种最佳实践方案。
虽然微服务能解决单体架构的问题,但是在拆分的过程中,也会面临其他的问题:
- 如果出现跨服务的业务该怎么处理呢?
- 页面请求到底该访问哪个服务?
- 如何实现各个服务之间的隔离?
SpringCloud
SpringCloud 框架就能解决这种问题。SprigCloud 框架可以说是目前 Java 领域最全的微服务组件的集合了。

而 SpringCloud 是依托于 SpringBoot 的自动装配能力,两者版本有对应条件:
| SpringCloud版本 | SpringBoot版本 |
|---|---|
| 2022.0.x aka Kilburn | 3.0.x |
| 2021.0.x aka Jubilee | 2.6.x, 2.7.x (Starting with 2021.0.3) |
| 2020.0.x aka Ilford | 2.4.x, 2.5.x (Starting with 2020.0.3) |
| Hoxton | 2.2.x, 2.3.x (Starting with SR5) |
| Greenwich | 2.1.x |
| Finchley | 2.0.x |
| Edgware | 1.5.x |
| Dalston | 1.5.x |
另外 Alibaba 的微服务产品 SpringCloudAlibaba 目前也成为了 SpringCloud 组件的一员。
我们要使用的话,在 父工程 hmall 的 pom.xml 中引入依赖:

指定版本如下,这样后续使用的时候就无需指定版本了。

微服务拆分
微服务拆分原则
拆分商品、购物车服务
服务的远程调用
服务的注册与发现
上一章我们实现了微服务的拆分,并且通过 Http 请求实现了跨微服务的远程调用。不过这种手动发送 Http 请求的方式存在几个问题。
试想一下,如果商品微服务调用过多,为了应对高并发我们进行了多实例部署,如下图:

此时,每个item-service的实例其IP或端口不同,问题来了:
- item-service这么多实例,cart-service如何知道每一个实例的地址?
- http请求要写url地址,
cart-service服务到底该调用哪个实例呢? - 如果在运行过程中,某一个
item-service实例宕机,cart-service依然在调用该怎么办? - 如果并发太高,
item-service临时多部署了N台实例,cart-service如何知道新实例的地址?
为了解决上述问题,就必须引入注册中心的概念了。
注册中心原理
在微服务调用的过程中,包括两个角色:
- 服务提供者:提供接口功其他服务访问,如 item-service
- 服务调用者:调用其他服务提供的接口,如 cart-service
而为了应对在大型微服务项目中服务提供者数量太多,微服务不好管理的问题,就引入了注册中心的概念。三者关系如下:

