微服务拆分 示例:黑马商城拆分商品服务模块
服务拆分原则
什么时候拆?
在实际操作中,我们首先需要确定在项目的哪个阶段进行服务拆分最为合适。例如,是在项目初期就进行拆分,还是在项目发展到一定规模后再进行拆分。选择合适的时机可以避免不必要的风险和成本。
所以,对于大多数小型项目来说,一般是先采用单体架构,随着用户规模扩大、业务复杂后再逐渐拆分为微服务架构。
怎么拆?
微服务拆分时粒度要小,这其实是拆分的目标。具体可以从两个角度来分析:
高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。
低耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖,或者依赖接口的稳定性要强。
明确了拆分目标,接下来就是拆分方式了。我们在做服务拆分时一般有两种方式:
纵向拆分:就是按照项目的功能模块来拆分
横向拆分:是看各个功能模块之间有没有公共的业务部分,如果有将其抽取出来作为通用服务
黑马商城项目结构
拆分商品服务
一般微服务项目有两种不同的工程结构:
完全解耦:每一个微服务都创建为一个独立的工程,甚至可以使用不同的开发语言来开发,项目完全解耦。
优点:服务之间耦合度低
缺点:每个项目都有自己的独立仓库,管理起来比较麻烦
Maven聚合:整个项目为一个Project,然后每个微服务是其中的一个Module
优点:项目代码集中,管理和运维方便(授课也方便)
缺点:服务之间耦合,编译时间较长
步骤
1. 在hmall中创建module
2.导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<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>
<parent>
<groupId>com.heima</groupId>
<artifactId>hmall</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.ktjy</groupId>
<artifactId>item-service</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--common-->
<dependency>
<groupId>com.heima</groupId>
<artifactId>hm-common</artifactId>
<version>1.0.0</version>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.编写启动类
代码如下:
package com.hmall.item;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.hmall.item.mapper")
@SpringBootApplication
public class ItemApplication {
public static void main(String[] args) {
SpringApplication.run(ItemApplication.class, args);
}
}
4.接下来是配置文件,可以从hm-service业务模块中拷贝
其中application.yaml内容如下
server:
port: 8081
spring:
application:
name: item-service # 微服务名称
profiles:
active: dev
datasource:
url: jdbc:mysql://${hm.db.host}:3307/hm-item?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: ${hm.db.pw}
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
global-config:
db-config:
update-strategy: not_null
id-type: auto
logging:
level:
com.hmall: debug
pattern:
dateformat: HH:mm:ss:SSS
file:
path: "logs/${spring.application.name}"
knife4j:
enable: true
openapi:
title: 黑马商城商品管理接口文档
description: "黑马商城商品管理接口文档"
email: zhanghuyi@itcast.cn
concat: 虎哥
url: https://www.itcast.cn
version: v1.0.0
group:
default:
group-name: default
api-rule: package
api-rule-resources:
- com.hmall.item.controller
而剩下的application-dev.yaml和application-local.yaml直接从hm-service拷贝即可,不用更改
5.然后拷贝hm-service中与商品管理有关的代码到item-service,如图
别忘了这里有一个地方的代码需要改动,就是ItemSetviceImpl中的deducStock方法:
修改前:
修改后:
这也是因为ItemMapper的所在包发生了变化,所以这里要修改路径
6.导入数据库表。默认的数据库连接的是虚拟机
然后会在数据库创建一个名为hm-item的database,将来的每一个微服务都会有自己的一个database:
7.配置启动项
在项目中按下Alt+8便可弹出下面的控制台,idea工具版本基本上在2022年版本以上此方法有效
如果控制台出来了启动类没出来的话,点击右侧刷新Maven就有了
然后右键打开编辑框填写active profiles:
8.启动item-service,,访问商品微服务的swagger接口文档:http://localhost:8081/doc.html
然后测试其中的根据id批量查询商品这个接口,结果如下:
有数据,说明商品微服务抽取成功了!