SpringCloud系列教程:微服务的未来(九)认识微服务、微服务拆分

发布于:2025-02-11 ⋅ 阅读:(48) ⋅ 点赞:(0)

在这篇博客中,我们将深入探讨微服务的基本概念、其核心优势、实现微服务架构时的关键技术与挑战,以及如何在实际项目中应用微服务。通过了解微服务的原理与应用场景,你将能够更好地理解它如何帮助企业解决系统复杂性,提升开发效率和系统的稳定性。

目录

前言

导入项目 

安装数据库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类

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和持续交付的背景下,微服务正成为企业数字化转型的核心支撑。

总之,微服务架构为现代软件开发带来了前所未有的灵活性,但在实现过程中仍需谨慎思考,合理规划和实施。通过合理的拆分、有效的治理、以及配套的技术栈支持,微服务能够为企业带来更高的业务价值和技术优势。

在未来,随着云计算、容器化、服务网格等技术的发展,微服务将变得更加成熟和易于实施,成为支撑企业业务创新和扩展的坚实基础。


网站公告

今日签到

点亮在社区的每一天
去签到