本篇文章讨论了微服务相关知识,包括单体架构与微服务架构的特点、微服务拆分方法、服务调用、注册与发现、以及 OpenFeign 的使用等内容。关键要点包括:

  1. 微服务的

什么是微服务

单体架构

整个项目的所有功能模块都在一个工程中开发,项目部署时需要对所有模块一起编译、打包。如下图所示:

优点:当项目规模较小时,这种模式上手快,部署、运维都很方便。

缺点:

  • 团队协作成本高
  • 系统发布效率差:任何模块变更时都需要发布整个系统,而且模块之间耦合、制约比较多,修改一个模块需要对比多个其他模块,导致发布效率很差。
  • 系统可用性差:单体架构各个功能模块会作为一个服务部署,相互之间会影响,一些热点服务会耗尽系统资源,导致其他服务低可用。

微服务架构

微服务架构是一种软件设计模式,通过将大型单体应用拆分成多个独立的小型服务,每个服务专注特定的业务功能。这种架构旨在提高系统的灵活性、可扩展性和可维护性。它满足以下核心要点:

  • 单一职责:一个服务负责一部分业务功能,其核心数据不依赖于其他模块
  • 团队自治:每个微服务有自己独立的开发、测试、发布、运维人员
  • 服务自治:每个微服务独立部署,访问自己独立的数据库。同时要做好服务隔离,避免对其他服务产生影响

例如,上面图中的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

而为了应对在大型微服务项目中服务提供者数量太多,微服务不好管理的问题,就引入了注册中心的概念。三者关系如下: