# mall4cloud项目新增一个微服务

```
说明: 本文以新增一个分销微服务(mall4cloud-distribution)项目模块为例子
(默认已创建mall4cloud_distribution数据库)
```

> 总体上分为5步：
>
> 1. 新建mall4cloud-distribution微服务模块
>
> 2. 修改或者新增mall4cloud_distribution的pom.xml、bootstrap.yml、Dockerfile、启动类上注解
>
> 3. nacos上新增mall4cloud-distribution.yml文件，配置数据源；
>
>    nacos上修改mall4cloud-gateway.yml文件配置路由；
>
>    nacos上新增mall4cloud-distribution相关seata的配置;
>
> 4. 新建mall4cloud-api-distribution模块远程feign调用接口模块
>
> 5. mall4cloud-distribution引入mall4cloud-api-distribution模块，新增一些配置



## 1. 新增项目

a.在mall4cloud上右键 New -> Module

![](../img/基本开发文档/新增模块_1.png)

b.我们要新增一个可以带启动类的项目，这里我们选择用springboot快速创建一个项目，选择Spring Initialiar

![](../img/基本开发文档/新增模块_2.png)

c.点击 Next 下一步

```
Group:  com.mall4j.cloud

Artifact: mall4cloud-distribution

Type: Maven

Language: Java

Packaging: Jar

Java version: 8

Version: 0.0.1-SNAPSHOT

Name: distribution

Description: mall4cloud 分销服务

Package: com.mall4j.cloud.distribution
```



![](../img/基本开发文档/新增模块_3.png)

d.点击 Next 下一步，这里我们不需要选择任何依赖，我们需要在项目新增完成后，手动添加修改依赖

![](../img/基本开发文档/新增模块_4.png)

e.点击 Next 下一步

```
Module Name: mall4cloud-distribution
Content root: 这个会根据 Module Name 自动修改。
Module file location: 这个会根据 Module Name 自动修改
```



![](../img/基本开发文档/新增模块_5.png)

最后点击 Finish 等待项目创建，创建完成的项目如下所示

![](../img/基本开发文档/修改模块_1.png)

## 2.修改项目mall4cloud-distribution

a.我们需要删除掉一些文件和.mvn、test文件夹：

```
.mvn
application.properties
test
.gitignore
HELP.md
mvnw
mvnw.cmd
```

删除完成后的结果如下图所示

![](../img/基本开发文档/修改模块_2.png)

b.修改mall4cloud-distribution的pom.xml文件, 依赖可根据实际需要引入或者删除，pom.xml修改后如下所示

```
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mall4cloud</artifactId>
        <groupId>com.mall4j.cloud</groupId>
        <version>0.0.1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mall4cloud-distribution</artifactId>
    <description>mall4cloud 分销服务</description>
    <packaging>jar</packaging>


    <dependencies>
        <!--注册中心客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-common-database</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-common-security</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-api-product</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-api-search</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-api-platform</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-api-multishop</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-api-order</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-api-delivery</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-common-rocketmq</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <configuration>
                    <skip>false</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

```

在mall4cloud的pom.xml的modules里面添加mall4cloud-distribution模块

```
 <modules>
 	<module>mall4cloud-distribution</module>
 </modules>
```





c. 新增bootstrap.yml文件，并且配置好项目的端口、名称以及nacos注册中心的地址

![](../img/基本开发文档/修改模块_3.png)

d. 修改启动类上的启动配置

```
@SpringBootApplication(scanBasePackages = { "com.mall4j.cloud" },exclude = UserDetailsServiceAutoConfiguration.class)
@EnableFeignClients(basePackages = {"com.mall4j.cloud.**.feign"})
```



![](../img/基本开发文档/修改模块_4.png)



e. 先去nacos上面新增一个mall4cloud-distribution.yml配置文件，并且配置好数据源

```yaml
Data ID: mall4cloud-distribution.yml
Group: DEFAULT_GROUP
配置格式： YAML

配置内容：
#数据源
spring:
  datasource:
    url: jdbc:mysql://192.168.193.128:3306/mall4cloud_distribution?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=FALSE&useJDBCCompliantTimezoneShift=TRUE&useLegacyDatetimeCode=FALSE&serverTimezone=GMT%2B8&allowMultiQueries=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=TRUE&useAffectedRows=TRUE
    username: root
    PASSWORD: root
```



![](../img/基本开发文档/nacos_module_yml.png)



f.新增完成后，我们需要在我们的网关mall4cloud-gateway，配置一下mall4cloud-distribution的路由，在nacos上找到我们的mall4cloud-gateway.yml文件，新增mall4cloud-distribution路由配置

```yaml
- id: mall4cloud-distribution
          uri: lb://mall4cloud-distribution
          predicates:
            - Path=/mall4cloud_distribution/**
          filters:
            - RewritePath=/mall4cloud_distribution(?<segment>/?.*), $\{segment}
```



![](../img/基本开发文档/nacos_module_gateway.png)



j.我们引入了seata，所以 还需要在nacos的application.yml上配置seata

```
seata:
  enableAutoDataSourceProxy: false
  config:
    type: nacos
    nacos:
      namespace: nacos中seata的命名空间id
      dataId: "seataServer.properties"
      server-addr: ${spring.cloud.nacos.discovery.server-addr}
      password: ${spring.cloud.nacos.discovery.password}
      username: ${spring.cloud.nacos.discovery.username}
  registry:
    type: nacos
    nacos:
      server-addr: ${spring.cloud.nacos.discovery.server-addr}
      password: ${spring.cloud.nacos.discovery.password}
      username: ${spring.cloud.nacos.discovery.username}
      namespace: ${seata.config.nacos.namespace}
```



![](../img/基本开发文档/nacos_seata_module.png)

我们尝试启动，如果启动成功且服务没有打印错误日志，我们这个微服务基本上是创建成功了。

接下来，我们需要完善一些服务需要的其他内容



## 3.新增远程调用api

```
就我们的项目结构设计而言，我们把feign远程调用的接口都抽取了出来，放在了mall4cloud-api这个模块下面，所以我们要新增一个mall4cloud-api-distribution模块
```

a.在mall4cloud-api上右键 New -> Module

![](../img/基本开发文档/新增模块api_1.png)

b.我们只是新增一个模块，这个地方不需要启动类，所以我们这里创建一个maven就好了

![](../img/基本开发文档/新增模块api_2.png)

c.点击 Next 下一步

```
Parent: mall4cloud-api  // 选择mall4cloud-api
Name: mall4cloud-api-distribution
Lacation: 自动填写
GroupId: com.mall4j.cloud.api
Artifactld: mall4cloud-api-distribution
Version: 0.01
```



![](../img/基本开发文档/新增模块api_3.png)

4.点击 Finish ，创建完成后如图所示

![](../img/基本开发文档/新增模块api_4.png)

删除test、resource文件夹，修改pom.xml文件，新增mall4cloud-api-distribution的feign接口

![](../img/基本开发文档/新增模块api_5.png)

修改后的pom.xml文件

```
<?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">
    <parent>
        <artifactId>mall4cloud-api</artifactId>
        <groupId>com.mall4j.cloud</groupId>
        <version>0.0.1</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mall4cloud-api-distribution</artifactId>
    <packaging>jar</packaging>
    <description>分销对内接口</description>

    <dependencies>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-common-order</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.mall4j.cloud</groupId>
            <artifactId>mall4cloud-common-product</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>
```

新增的DistributionFeignClient.class类

接口上要加上注解@FeignClient(value = "mall4cloud-distribution",contextId ="distribution")

```
package com.mall4j.cloud.api.distribution.feign;

import org.springframework.cloud.openfeign.FeignClient;

/**
 * @author cl
 * @date 2021-08-05 16:07:34
 */
@FeignClient(value = "mall4cloud-distribution",contextId ="distribution")
public interface DistributionFeignClient {
}

```



## 4.完善mall4cloud-distribution的配置和feign接口实现

在mall4cloud-distribution项目引入mall4cloud-api-distribution

```xml
 <dependency>
     <groupId>com.mall4j.cloud</groupId>
     <artifactId>mall4cloud-api-distribution</artifactId>
     <version>${project.version}</version>
 </dependency>
```

DistributionFeignController来实现DistributionFeignClient接口

```
public class DistributionFeignController implements DistributionFeignClient {
}

```



![](../img/基本开发文档/修改模块_5.png)



添加Swagger文档配置SwaggerConfiguration.class

```java
/**
 * Swagger文档，只有在测试环境才会使用
 *
 * @author FrozenWatermelon
 */
@Configuration
@EnableSwagger2
@EnableKnife4j
public class SwaggerConfiguration {

	@Bean
	public Docket baseRestApi() {
		return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
				.apis(RequestHandlerSelectors.basePackage("com.mall4j.cloud.distribution.controller")).paths(PathSelectors.any())
				.build();
	}

	@Bean
	public ApiInfo apiInfo() {
		return new ApiInfoBuilder().title("mall4cloud商城接口文档").description("mall4cloud商城接口文档Swagger版").termsOfServiceUrl("")
				.contact(new Contact("广州蓝海创新科技有限公司", "", "")).version("1.0").build();
	}

}
```

到这里微服务就创建完成了，相关基本配置也搭建好了。
