在这篇博客中,我们将深入探讨微服务的基本概念、其核心优势、实现微服务架构时的关键技术与挑战,以及如何在实际项目中应用微服务。通过了解微服务的原理与应用场景,你将能够更好地理解它如何帮助企业解决系统复杂性,提升开发效率和系统的稳定性。
目录
前言
在当今快速发展的技术环境中,微服务架构已成为构建现代化分布式应用的重要方法。随着单体架构的局限性逐渐显现,越来越多的企业开始转向微服务架构,以便更灵活地应对变化、提高系统的可扩展性与可维护性。微服务将传统的单一应用拆分为多个小型、独立的服务,每个服务专注于单一功能,能够独立开发、测试和部署。
在这篇博客中,我们将深入探讨微服务的基本概念、其核心优势、实现微服务架构时的关键技术与挑战,以及如何在实际项目中应用微服务。通过了解微服务的原理与应用场景,你将能够更好地理解它如何帮助企业解决系统复杂性,提升开发效率和系统的稳定性。
导入项目
此次微服务拆分主要对黑马商城的项目进行拆分。主要通过CentOS7系统上的docker来进行部署。
安装数据库Mysql
其中有MySQL的配置文件和初始化脚本:
创建一个通用网络
docker network create hgq
创建mysql容器
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=1234 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
--network hgq\
mysql
后端
打开service窗口,新增启动项
配置文件选择application-local.yml文件成功,接下来直接运行即可。
前端
直接在windows下将其复制到一个非中文、不包含特殊字符的目录下。然后进入hmall-nginx后,利用cmd启动即可:
# 启动nginx
start nginx.exe
# 停止
nginx.exe -s stop
# 重新加载配置
nginx.exe -s reload
# 重启
nginx.exe -s restart
认识微服务
单体架构
单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
优点:
- 架构简单
- 部署成本低
缺点:
- 团队协作成本高
- 系统发布效率低
- 系统可用性差
如果想使用高并发测试我们需要下载一个工具Jmeter工具,下载教程如下:
https://blog.csdn.net/Shi_MM/article/details/126280735
总结:
单体架构适合开发功能相对简单,规模较小的项目。
微服务
微服务架构,是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体架构中的功能模块拆分为多个独立项目。
- 粒度小
- 团队自治
- 服务自治
SpringCloud
SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud
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) |
2.2.x, 2.3.x (Starting with SR5) |
|
2.1.x |
|
2.0.x |
|
1.5.x |
|
1.5.x |
微服务拆分
熟悉项目
登录
搜索商品
购物车会实时的获取商品的最新信息,当商品价格被修改该后,购物车商品内对应的价格也会改变。购物车表内的物品的价格还是刚加入购物车时的价格。
下单
服务拆分原则
什么时候拆分?
- 创业型项目:先采用单体架构,快速开发,快速试错。随着规模扩大,逐渐拆分。
- 确定的大型项目:资金充足,目标明确,可以直接选择微服务架构,避免后续拆分的麻烦。
怎么拆?
从拆分目标来说,要做到:
- 高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。
- 低耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖,
从拆分方式来说,一般包含两种方式:
- 纵向拆分:按照业务模块来拆分
- 横向拆分:抽取公共服务,提高复用性
拆分服务
工程结构主要分为两种:
- 独立Project
- Maven聚合
完全解耦:每一个微服务都创建为一个独立的工程,甚至可以使用不同的开发语言来开发,项目完全解耦。
优点:服务之间耦合度低
缺点:每个项目都有自己的独立仓库,管理起来比较麻烦
Maven聚合:整个项目为一个Project,然后每个微服务是其中的一个Module
优点:项目代码集中,管理和运维方便(授课也方便)
缺点:服务之间耦合,编译时间较长
需求:
- 将hm-service中与商品管理相关功能拆分到一个微服务module中,命名为item-service
- 将hm-service中与购物车有关的功能拆分到一个微服务module中,命名为cart-service
新建一个moudle
导入依赖
<?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>
<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>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</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>
编写启动类ItemApplication类
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);
}
}
application.ymal文件
server:
port: 8081
spring:
application:
name: item-service #微服务名称
profiles:
active: dev
datasource:
url: jdbc:mysql://${hm.db.host}:3306/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
将hm-service
中与商品管理有关的代码到item-service
将对应的代码copy到item-service模块
总结
微服务架构的引入,无疑为企业带来了更加灵活、高效的系统架构方案。它通过将大而复杂的应用拆解为若干小而独立的服务,能够极大地提升应用的可扩展性、容错性以及开发效率。在现代化的云原生应用、DevOps和持续交付的背景下,微服务正成为企业数字化转型的核心支撑。
总之,微服务架构为现代软件开发带来了前所未有的灵活性,但在实现过程中仍需谨慎思考,合理规划和实施。通过合理的拆分、有效的治理、以及配套的技术栈支持,微服务能够为企业带来更高的业务价值和技术优势。
在未来,随着云计算、容器化、服务网格等技术的发展,微服务将变得更加成熟和易于实施,成为支撑企业业务创新和扩展的坚实基础。