电商平台微服务工程设计
电商平台微服务工程设计
- 1、微服务工程结构
- 2、电商平台微服务工程组建
- 3、数据库选型
- 4、微服务工程创建步骤
- 5、项目基本配置
- 6、创建模块
- 7、小结
在微服务技术大行当道之时,很多以前的单体项目都在进行微服务重构升级,本文就以电商平台微服务架构设计案例来说明如何组建工程和进行相关的微服务开发。
1、微服务工程结构
微服务的工程组建,我们将按业务类型来进行组织,即将同一业务类型的微服务放在同一个项目工程之中。同一业务类型的微服包括Rest API微服务和Web UI微服务,其中Rest API微服务又包含了业务领域的数据建模和接口服务等方面的设计,而Web UI微服务又包含了面向PC端的Web应用和面向移动端的Wap应用等方面设计。所以,使用这种组建方法,再根据不同功能进行模块划分,一个微服务项目工程大约包含如下表所示的模块结构。
微服务工程模块结构列表如下:
序号 | 模块名称 | 功能说明 | 类型 | 备注 |
---|---|---|---|---|
1 | -object | 查询对象设计 | 程序包 | 表示工程名称 |
2 | -domain | 业务领域设计 | 程序包 | 实体及持久化 |
3 | -restapi | Restful接口 | 微服务应用 | |
4 | -client | 接口客户端封装 | 程序包 | 由 UI 应用使用 |
5 | -web | PC端Web UI | 微服务应用 | |
6 | *-wap | 移动端Web UI | 微服务应用 |
其中,各个模块之间的调用关系如下图所示。
在这个调用关系中,Object模块为业务领域设计和接口客户端设计提供查询对象定义,Domain模块为RestAPI应用提供业务领域设计的服务调用,Client模块封装了对RestAPI的调用,给Web和Wap应用提供高并发的接口调用方法。从各个模块的调用关系中可以看出,使用我们组件的工程结构将是各种模块的最优化组合方式。
使用上面的工程结构,就可以针对电商平台的各种业务类型来组建工程。例如,在商品类目服务中,我们可以组建一个类目微服务工程,它的模块结构如下表所示。
商品类目微服务工程模块结构列表如下:
序号 | 模块名称 | 功能说明 | 类型 | 备注 |
---|---|---|---|---|
1 | catalog-object | 查询对象设计 | 程序包 | |
2 | catalog-domain | 业务领域设计 | 程序包 | 实体及持久化 |
3 | catalog-restapi | Restful接口服务 | 微服务应用 | |
4 | catalog-client | 接口客户端封装 | 程序包 | 由UI应用使用 |
5 | catalog-web | PC端WebUI | 微服务应用 | |
6 | catalog-wap | 移动端WebUI | 微服务应用 |
2、电商平台微服务工程组建
使用上一节的工程模块结构设计,我们就可以把整个电商平台微服务设计为如下表所示的微服务工程列表。
电商平台微服务工程列表如下:
序号 | 项目名称 | 功能说明 | 使用数据库 |
---|---|---|---|
1 | catalog-microservice | 类目微服务工程 | catalogdb |
2 | goods-microservice | 商品微服务工程 | goodsdb |
3 | order-microservice | 订单微服务工程 | orderdb |
4 | shopingcart-microservice | 购物车微服务工程 | shopingcart |
5 | payment-microservice | 支付微服务工程 | paymentdb |
6 | logistics-microservice | 物流微服务工程 | logisticsdb |
7 | comment-microservice | 评价微服务工程 | commentdb |
8 | customer-microservice | 顾客微服务工程 | customerdb |
9 | member-microservice | 会员微服务工程 | memberdb |
10 | track-microservice | 浏览记录微服务工程 | trackdb |
11 | merchant-microservice | 商家微服务工程 | merchantdb |
12 | manage-microservice | 瓶盖管理微服务工程 | managedb |
经过工程的组建,电商平台的各微服务分布在了十多个工程之中。其中除了最后面两个微服务工程,即商家微服务工程和平台管理微服务工程的模块结构有些特别之外,其他大部分工程的模块结构基本上都相同。
3、数据库选型
每个微服务工程都可以具有各自独立的数据库,因此,每个工程都可以根据其自身的业务特殊性,选择合适的数据库。
其中在浏览记录微服务工程中,是对用户浏览商品的足迹进行记录,它的数据量将会比较大,所以可以考虑使用NoSQL数据库,比如使用MongoDB会比较合适。而其他工程的数据库,基本上都可以使用MySQL数据库。
对于数据库的使用,在生产环境的安装和部署中,我们还将进行高可用和高性能的数据库集群设计。例如对于MySQL来说,通过使用主从设计、读写分离设计等方法,可以构建成一个能够持续扩容的数据库集群架构。不管数据库如何设计,它对于工程的调用来说是完全透明的,所以我们再工程中进行开发时,并不用花心思去理会数据库管理系统中复杂的设计。
4、微服务工程创建步骤
限于篇幅,本文不介绍整个电商平台所有微服务工程的创建,但是为了便于说明和演示,将商家微服务工程(merchant-microservice)为例进行介绍。下面就介绍一下创建一个微服务工程的步骤。
首先在eclipse中的文件菜单中选择新建Maven Project,这将打开一个新Maven项目的对话框,如下图:
勾上Create a simple project选项,取消Use default Workspace location选项,在Location栏后的Browse按钮选择新建好的E:\eclipse-workspace\merchant-microservice目录(注意此目录应该先手动创建好),然后点击Next进行下一步,如下图:
在对话框的GroupId中填写项目组织即程序包结构,此处为com.demo
在ArtifactId中填写项目名称,此处为merchant-microservice
在Version中选择默认0.0.1-SNAPSHOT就行
在Packaging中选择打包方式,Maven Project作为其他模块的父级,应该选择pom
在Name栏输入一个项目名称,此处为merchantmicroservice
在Description栏输入一段描述,可以省略
然后点击Finish按钮完成此Maven Project的创建。
接下来eclipse将会生成一个使用Maven进行项目管理的工程的基本结构,在工程的根目录中包含一个项目对象模型(即pom.xml),通过这个项目对象模型,可以进行一些组件的引用配置,如下图:
我们一版使用多模块的方式来组建工程,所以Maven Project下的src目录没有什么用处,可以将其删除。
5、项目基本配置
刚生成的项目对象模型只有groupId、artifactId、version、packaging、name、description几项配置,我们在创建项目的步骤中输入的配置如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>merchant-microservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>merchantmicroservice</name>
<description>This is a microservice project</description>
</project>
现在还要增加一些配置,才能将一个项目配置完整。下面分别进行交要说明。
(1)使用属性来设置编译工具的版本和项目的编码方式,如下:
<!-- 使用属性来设置编译工具的版本和项目的编码方式 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<maven-compiler.version>3.1</maven-compiler.version>
<maven-surefire.version>2.12.4</maven-surefire.version>
</properties>
其中,源代码和输出编码都使用UTF-8字符集,这将保证在中文环境中源代码编辑和程序运行的日志输出中都不会出现乱码的情况。
(2)使用父级配置,设定Spring Boot和Spring Cloud的版本号,这样,在后面创建的模块就将继承这个配置,并在引用相关组件时也可以不用再指定版本号,如下:
<!-- 使用父级配置,设定Spring Boot和Spring Cloud的版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<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>
</dependencies>
</dependencyManagement>
其中Spring Boot的版本号为2.1.4.RELEASE,Spring Cloud的版本号为Greenwich.SR1。
(3)配置starter,包括自动配置和单元测试,如下:
<!-- 配置starter -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
其中,将测试组件的范围指定为test,将可保证这些组件的引用只是作为测试时使用,而不会被放进发行包之中。
(4)使用统一的插件配置,如果模块中没有相关的构建配置,将默认使用这个配置
<!-- 使用统一的插件配置,如果模块中没有相关的构建配置,将默认使用这个配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire.version}</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
其中,测试插件surefire的配置忽略了在工程构建时对测试用例的调用。
将上面的各项配置综合起来,一个微服务项目的完整的配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>merchant-microservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>merchantmicroservice</name>
<description>This is a microservice project</description>
<!-- 使用属性来设置编译工具的版本和项目的编码方式 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<maven-compiler.version>3.1</maven-compiler.version>
<maven-surefire.version>2.12.4</maven-surefire.version>
</properties>
<!-- 使用父级配置,设定Spring Boot和Spring Cloud的版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<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>
</dependencies>
</dependencyManagement>
<!-- 配置starter -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 使用统一的插件配置,如果模块中没有相关的构建配置,将默认使用这个配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire.version}</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
完成项目对象模型即pom.xml文件的编辑之后,进行保存,将导入和下载配置中的相关组件,这将需要一定的时间,主要视网络情况而定。
6、创建模块
以上述创建的微服务工程merchant-microservice为例来创建模块。在eclipse中,将鼠标移至项目名称merchant-microservice的位置,单击鼠标右键,在弹出的菜单中选择New->Other,如下图:
在新建对话框中选择向导类型Maven->Maven Module,如下图:
点击Next,进入新建模块对话框如下图:
勾选Create a simple project选项
在Module Name栏输入模块名称,此处为merchant-object
点击Next按钮,如下图:
Packaging栏的打包方式(第一节微服务工程结构列表中此模块类型为程序包,因此选择jar,如果类型为微服务应用,可以选择war)选择jar
其他默认就可以,点击Finish完成模块创建。如下图:
按照以上步骤使用相同的方法创建merchant-domain、merchant-restapi、merchant-client、merchant-web等模块,完成后的效果如图:
这样就创建了一个微服务工程的基本结构。因为商家微服务工程没有移动端的WebUI,所以这里没有创建merchant-wap模块。
其中,生成的各个模块中都有一个项目对象模型可以用来对模块进行配置管理。
7、小结
本文设计了一个微服务工程的基本结构,并使用eclipse开发工具演示了创建这种微服务工程的方法,在后续开发中,我们可以使用这种工程结构进行各个模块的开发,对于这些模块的开发,主要包括两大类行的微服务应用,即高性能的Rest API微服务应用和高并发的Web UI微服务的开发,其他模块的开发都是为这两类微服务应用提供相关服务的。
还没有评论,来说两句吧...