# 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修改后如下所示 ``` mall4cloud com.mall4j.cloud 0.0.1 4.0.0 mall4cloud-distribution mall4cloud 分销服务 jar com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.mall4j.cloud mall4cloud-common-database ${project.version} com.mall4j.cloud mall4cloud-common-security ${project.version} com.mall4j.cloud mall4cloud-api-product ${project.version} com.mall4j.cloud mall4cloud-api-search ${project.version} com.mall4j.cloud mall4cloud-api-platform ${project.version} com.mall4j.cloud mall4cloud-api-multishop ${project.version} com.mall4j.cloud mall4cloud-api-order ${project.version} com.mall4j.cloud mall4cloud-api-delivery ${project.version} com.mall4j.cloud mall4cloud-common-rocketmq ${project.version} com.xuxueli xxl-job-core org.springframework.boot spring-boot-maven-plugin io.fabric8 docker-maven-plugin false ``` 在mall4cloud的pom.xml的modules里面添加mall4cloud-distribution模块 ``` mall4cloud-distribution ``` 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} ``` ![](../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文件 ``` mall4cloud-api com.mall4j.cloud 0.0.1 4.0.0 mall4cloud-api-distribution jar 分销对内接口 com.mall4j.cloud mall4cloud-common-order ${project.version} com.mall4j.cloud mall4cloud-common-product ${project.version} ``` 新增的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 com.mall4j.cloud mall4cloud-api-distribution ${project.version} ``` 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(); } } ``` 到这里微服务就创建完成了,相关基本配置也搭建好了。