第二章 微服务流程、模块设计

作者为冰河忠实粉丝,可以加入【冰河技术】知识星球获取源码,也可以关注【冰河技术】公众号,加入社群学习,学习氛围好,干货满满。
冰河技术.jpg

1 项目流程设计

整个项目主要分为用户服务、商品服务和订单服务,整个过程模拟的是用户下单扣减库存的操作。这里,为了简化整个流程,将商品的库存信息保存到了商品数据表,同时,使用商品微服务来扣减库存。各服务之间的调用流程如下。
image.png
整体流程为:用户通过客户端调用订单微服务的提交订单的接口后,订单微服务会分别调用用户服务和商品服务的接口来查询用户信息和商品信息,并校验商品库存是否充足,如果商品库存充足的话,就会保存订单。并且会调用商品服务的扣减库存的接口来扣减库存。

2 技术选型

整个项目采用SpringCloud Alibaba技术栈实现,主要的技术选型如下所示。

  • 持久层框架:MyBatis、MyBatis-Plus
  • 微服务框架:SpringCloud Alibaba
  • 消息中间件:RocketMQ
  • 服务治理与服务配置:Nacos
  • 负载均衡组件:Ribbon
  • 远程服务调用:Fegin
  • 服务限流与容错:Sentinel
  • 服务网关:SpringCloud-Gateway
  • 服务链路追踪:Sleuth+ZipKin
  • 分布式事务:Seata
  • 数据存储:MySQL+ElasticSearch

3 项目总体结构

为了方便开发和维护,同时为了模块的复用性,整体项目在搭建时,会将实体类模块、公共模块、用户服务、商品服务和订单服务放在同一个Maven父工程下,作为父工程的子模块。
image.png
其中各模块说明:

  • shop-springcloud-alibaba-mawenda:Maven父工程
  • shop-common:公共模块
  • shop-bean:各服务通用Bean模块,包含实体类、Dto、Vo等
  • shop-order:订单服务 8060
  • shop-product:商品服务 8070
  • shop-user:用户服务 8080

4 项目搭建

4.1 创建Maven父工程

在IDEA中创建Maven工程,名称为shop-springcloud-alibaba-xx,创建后在项目的pom.xml文件中添加StringBoot与SpringCloud alibaba相关的配置,如下所示。

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.2.6.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<modules>
  <module>shop-common</module>
  <module>shop-bean</module>
  <module>shop-user</module>
  <module>shop-product</module>
  <module>shop-order</module>
</modules>

<properties>
  <java.version>1.8</java.version>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
  <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
  <logback.version>1.1.7</logback.version>
  <slf4j.version>1.7.21</slf4j.version>
  <common.logging>1.2</common.logging>
  <fastjson.version>1.2.51</fastjson.version>
  <mybatis.version>3.4.6</mybatis.version>
  <mybatis.plus.version>3.4.1</mybatis.plus.version>
  <mysql.jdbc.version>8.0.19</mysql.jdbc.version>
  <druid.version>1.1.10</druid.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>${spring-cloud-alibaba.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

4.2 创建子模块

搭建的具体细节可以查看冰河技术 环境搭建专栏,完成数据库建表,公共模块、实体类模块、用户模块、产品模块、订单模块的搭建。
image.png

4.3 搭建完成

我最终的搭建效果如下:
image.png

4.4 测试接口

分别启动用户服务、产品服务、订单服务,然后通过api测试工具进行测试。

4.4.1 请求用户服务获取用户信息

http://localhost:8060/user/get/1001

4.4.2 请求产品服务获取产品信息

http://localhost:8070/product/get/1001

4.4.3 请求订单服务创建订单

  • 库存充足的情况下,请求成功

http://localhost:8080/order/submit_order?productId=1001&userId=1001&count=10

  • 库存不足的情况下,返回失败信息

http://localhost:8080/order/submit_order?productId=1001&userId=1001&count=1000

5 总结

我的理解大白话就是:

  • 在一个父Maven工程下创建了多个服务模块,将公共部分提取出来,增加代码的复用性
  • 根据不同的业务进行拆分,各服务模块通过定义声明Restful接口进行交互,降低了各业务的耦合度,开发时一个项目也不局限在一种开发语言,增加了灵活性,后面部署也不会因为局部的更改使整个项目都重新部署。

6 硬编码问题

当前用户服务和商品服务所在的IP地址和端口号硬编码到了订单服务中,会存在三个很明显的问题。

  1. 用户服务和产品服务的IP地址或端口发生变化,订单服务会变得不可用,需要同步修改请求用户服务、产品服务的IP与端口。
  2. 如果系统中提供了多个用户服务和产品服务,则无法实现微服务的负载均衡功能。
  3. 当系统需要支持更高的并发,需要部署更多的服务,系统会变得更复杂。

所以,微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微服务架构中的多模块设计主要是为了实现服务解耦、可扩展性和易维护性。下面是一种常见的微服务模块设计方式: 1. 拆分服务:将整个系统按照业务功能进行拆分,每个模块对应一个独立的微服务。例如,用户管理、订管理、支付管理等可以分别作为一个独立的服务。 2. 定义接口:在每个模块中定义清晰的接口,包括输入参数、输出结果和操作方法。接口应该尽量简洁明了,只暴露必要的方法和数据。 3. 服务间通信:不同的模块之间通过网络进行通信,可以使用RESTful API或者消息队列等方式进行交互。这样可以使得各个模块独立部署、独立扩展,提高系统的灵活性。 4. 数据管理:每个模块可以有自己的数据库,避免多个模块共用一个数据库造成数据耦合。如果需要跨模块查询或操作数据,可以通过服务间通信来实现。 5. 部署和扩展:每个模块可以独立部署,并且可以根据负载情况进行水平扩展。这样可以更好地应对系统压力变化和业务需求的变更。 6. 统一网关:为了方便客户端访问和管理,可以在微服务架构上加上一个统一的网关层,用于路由请求和进行身份验证等。这样可以屏蔽底层微服务的复杂性,提供简洁的接口给客户端使用。 需要注意的是,微服务模块设计需要根据具体业务需求和系统规模来决定。在设计过程中,要考虑模块之间的依赖关系、通信成本、数据一致性等因素,以及合理划分模块的粒度和职责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值