在这篇博客中,我们将深入探讨微服务的基本概念、其核心优势、实现微服务架构时的关键技术与挑战,以及如何在实际项目中应用微服务。通过了解微服务的原理与应用场景,你将能够更好地理解它如何帮助企业解决系统复杂性,提升开发效率和系统的稳定性。
目录
前言
导入项目
安装数据库Mysql
前端
认识微服务
单体架构
SpringCloud
微服务拆分
熟悉项目
服务拆分原则
拆分服务
总结
前言
在当今快速发展的技术环境中,微服务架构已成为构建现代化分布式应用的重要方法。随着单体架构的局限性逐渐显现,越来越多的企业开始转向微服务架构,以便更灵活地应对变化、提高系统的可扩展性与可维护性。微服务将传统的单一应用拆分为多个小型、独立的服务,每个服务专注于单一功能,能够独立开发、测试和部署。
在这篇博客中,我们将深入探讨微服务的基本概念、其核心优势、实现微服务架构时的关键技术与挑战,以及如何在实际项目中应用微服务。通过了解微服务的原理与应用场景,你将能够更好地理解它如何帮助企业解决系统复杂性,提升开发效率和系统的稳定性。
导入项目
此次微服务拆分主要对黑马商城的项目进行拆分。主要通过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) |
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 |
微服务拆分
熟悉项目
登录
搜索商品
购物车会实时的获取商品的最新信息,当商品价格被修改该后,购物车商品内对应的价格也会改变。购物车表内的物品的价格还是刚加入购物车时的价格。
下单
服务拆分原则
什么时候拆分?
- 创业型项目:先采用单体架构,快速开发,快速试错。随着规模扩大,逐渐拆分。
- 确定的大型项目:资金充足,目标明确,可以直接选择微服务架构,避免后续拆分的麻烦。
怎么拆?
从拆分目标来说,要做到:
从拆分方式来说,一般包含两种方式:
- 纵向拆分:按照业务模块来拆分
- 横向拆分:抽取公共服务,提高复用性
拆分服务
工程结构主要分为两种:
- 独立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类
java">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文件
java">server:port: 8081
spring:application:name: item-service #微服务名称profiles:active: devdatasource:url: jdbc:mysql://${hm.db.host}:3306/hm-item?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: ${hm.db.pw}
mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandlerglobal-config:db-config:update-strategy: not_nullid-type: auto
logging:level:com.hmall: debugpattern:dateformat: HH:mm:ss:SSSfile:path: "logs/${spring.application.name}"
knife4j:enable: trueopenapi:title: 黑马商城商品管理接口文档description: "黑马商城商品管理接口文档"email: zhanghuyi@itcast.cnconcat: 虎哥url: https://www.itcast.cnversion: v1.0.0group:default:group-name: defaultapi-rule: packageapi-rule-resources:- com.hmall.item.controller
将hm-service
中与商品管理有关的代码到item-service
将对应的代码copy到item-service模块
总结
微服务架构的引入,无疑为企业带来了更加灵活、高效的系统架构方案。它通过将大而复杂的应用拆解为若干小而独立的服务,能够极大地提升应用的可扩展性、容错性以及开发效率。在现代化的云原生应用、DevOps和持续交付的背景下,微服务正成为企业数字化转型的核心支撑。
总之,微服务架构为现代软件开发带来了前所未有的灵活性,但在实现过程中仍需谨慎思考,合理规划和实施。通过合理的拆分、有效的治理、以及配套的技术栈支持,微服务能够为企业带来更高的业务价值和技术优势。
在未来,随着云计算、容器化、服务网格等技术的发展,微服务将变得更加成熟和易于实施,成为支撑企业业务创新和扩展的坚实基础。