Skip to content

项目介绍 ​

1. Maven父子工程 ​

随着微服务架构的流行,多模块开发成为开发的日常。那么如何统一的控制和管理多个微服务项目的依赖和版本成为了一个难题。Maven父子工程很好了给了我们解决方案。

场景一 ​

image-20230410110215417

解决方案

image-20230410110252883

通过上面这个案例我们不难发现,使用Maven的父子工程,可以有效的管理子工程的依赖和版本。

但是目前的功能还不够强大。

场景二 ​

image-20230410110449625

解决方案

image-20230410110623487

2. 项目结构 ​

2.1 代码结构 ​

  • duolaimall 是所有其他maven工程的父工程,不包含任何代码, 集中管理我们项目中所使用到的,第三方开源框架的版本。

  • duolaimall-common

    common项目的父工程,管理下面各个common项目的依赖

    xml
    <modules>
        <module>common-util</module>
        <module>common-service</module>
        <module>common-mq</module>
    </modules>
    • common-util

      1)放了一些公共的请求,响应的公共类等

      1. 自定义异常及异常相关工具类

      2. 公共的系统响应码

      3. Redis的自动装配相关类

      4. MybatisPlus配置类

      5. 公共的工具类

      6. 公共的实体类

    • common-service

      管理了xxx-service服务可能会用到的一些依赖

      1. Redis常量类
      2. 各个服务中可能会用到的其他公共类
    • common-mq

      公共消息模块

  • duolaimall-gateway: 基于Spring Cloud Gateway

  • duolaimall-product、duolaimall-order、duolaimall-user、duolaimall-xxx

    • 它们都各自代表一个服务

    • xxx-api 该服务对外暴露的公共的请求和响应的实体类

    • xxx-service 该工程中的代码是真正的服务实现代码

    • xxx-service 一定依赖于 xxx-api

2.2 代码细节 &#8203;

注意:在我们的整个项目,不会有任何一个maven工程依赖于xxx-service。比如说 user-service肯定不会依赖于 order-service。

  • xxx-api

    服务提供者和服务的消费者,都需要使用到的一些数据流转对象(Data Transfer Object)

  • xxx-service

    • XxxApplication 服务启动的主类
  • model:里面放的是数据库映射对象,每一个po对象都会映射到数据库中的一张表

  • config:相关配置
  • controller:相关controller类,提供给外部通过web访问
  • dto:数据流转对象
  • query:请求入参
  • service:服务相关接口以及实现
  • converter:MapStruct转换器相关的类
  • client:该包下放的是这个服务用来调用其他服务时所使用的FeignClient

3. 数据库 &#8203;

项目会用到的数据库如下

image-20230410114456368

只需要创建数据库,然后导入对应的SQL文件即可。

sql
# 比如导入product服务的数据库
# 1. 创建创建数据库
create database mall_product character set utf8 collate utf8_bin;

# 2. 导入数据 mall_product (也可以使用navicat直接导入)
use mall_product;
source mall_product.sql

4. 配置的管理 &#8203;

为了方便对于配置的管理,我们统一将各种服务的配置统一放到Nacos配置中心中来管理,为了方便起见,我们给大家提供了一个Nacos的配置导出文件nacos_config_export_xxxxxx.zip,该配置文件里包含了我们的所有配置,我们只需要将其导入到Nacos配置中心即可。

关于配置中心的配置,我们还需要注意:

  • 有一个common.yaml的配置集,其中放的都是一些公共配置,如果有需要,各个服务可以使用share-configs的方式使用该配置集中的配置
  • 如果某个服务还需要使用自己的配置,那么和之前一样,可以把自己独有的配置放到${spring.application.name}-${spring.profiles.avtive}.${file-extention}这个配置集中即可
  • 因为所有的配置都放到了配置中心,所以各个服务只需要有bootstrap.yml这个配置文件即可
  • 在配置中心中,我们还需要把所有配置文件中,将所有的Redis,Mysql,Nacos,MinIO等的地址改为虚拟机的IP地址

gateway的bootstrap.yml配置文件内容

yml
spring:
  application:
    name: server-gateway
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: 你的虚拟机ip:8848
      config:
        server-addr: 你的虚拟机ip:8848
        file-extension: yaml
        shared-configs:
          - data-id: common.yaml

product-service的bootstrap.yml配置文件内容

yml
spring:
  application:
    name: service-product
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: 你的虚拟机ip:8848
      config:
        server-addr: 你的虚拟机ip:8848
        file-extension: yaml
        shared-configs:
          - data-id: common.yaml

5. 网关搭建 &#8203;

为了解决跨域问题,我们可以在网关中添加一个自定义Filter,在所有返回的请求中,添加HTTP CORS响应头解决跨域问题。

java
@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsWebFilter(){

        // cors跨域配置对象
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.addAllowedOrigin("*"); //设置允许访问的网络
        configuration.setAllowCredentials(true); // 设置是否从服务器获取cookie
        configuration.addAllowedMethod("*"); // 设置请求方法 * 表示任意
        configuration.addAllowedHeader("*"); // 所有请求头信息 * 表示任意

        // 配置源对象
        UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();
        // 对所有请求设置该跨域配置
        configurationSource.registerCorsConfiguration("/**", configuration);
        // cors过滤器对象
        return new CorsWebFilter(configurationSource);
    }
}

6. 后台项目启动 &#8203;

为了让大家方便的启动后台项目,我们给大家提供了后台项目,我们给大家提供了一个jar包,我们只需执行如下命令即可启动

java -jar  jar包名称(jar包名称带.jar后缀)

需要注意的是,后台项目监听本机的8888端口, 前台项目监听本机的 8000端口

7. 测试 &#8203;

在测试的时候,不要动不动就打开前端测试,那样的话测试效率很低,建议:

  • 用单元测试测试对数据库的访问,服务的业务,以及服务的调用,用postman或者RestTemplate测试服务的Controller

    java
    // 测试数据库访问
    @Autowired
    xxxMapper xxxMapper;
    @Test
    public void testMapper() {
    // 可能自己造数据
    }
    
    
    // 测试微服务的各个业务类
    @AutoWired
    ITestProductDetailService productDetailService;
    @Test
    public void testService() {
     // 我们可能要自己造数据
      Long id = xxx;
      productDetailService.getXXX(id)
        
    // 需要自己造数据
    }
    
    
    // 在订单服务中,测试对于商品服务的调用
    @Autowired
    ProductFeignClient productClient; // FeignClient
    public void testCallRemoteService() {
        
    }
    
    
    // 测试服务的Controller 直接使用Postman发送http请求即可

笔记 &#8203;

  • 父子工程:版本管理,工程聚合