tmerclub-doc/基本开发文档/mall4cloud新增微服务流程.md
2025-03-20 17:43:07 +08:00

448 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# tmerclub项目新增一个微服务
```
说明: 本文以新增一个分销微服务(tmerclub-distribution)项目模块为例子
(默认已创建tmerclub_distribution数据库)
```
> 总体上分为5步
>
> 1. 新建tmerclub-distribution微服务模块
>
> 2. 修改或者新增tmerclub_distribution的pom.xml、bootstrap.yml、Dockerfile、启动类上注解
>
> 3. nacos上新增tmerclub-distribution.yml文件配置数据源
>
> nacos上修改tmerclub-gateway.yml文件配置路由
>
> nacos上新增tmerclub-distribution相关seata的配置;
>
> 4. 新建tmerclub-api-distribution模块远程feign调用接口模块
>
> 5. tmerclub-distribution引入tmerclub-api-distribution模块新增一些配置
## 1. 新增项目
a.在tmerclub上右键 New -> Module
![](../img/基本开发文档/新增模块_1.png)
b.我们要新增一个可以带启动类的项目这里我们选择用springboot快速创建一个项目选择Spring Initialiar
![](../img/基本开发文档/新增模块_2.png)
c.点击 Next 下一步
```
Group: com.mall4j.cloud
Artifact: tmerclub-distribution
Type: Maven
Language: Java
Packaging: Jar
Java version: 8
Version: 0.0.1-SNAPSHOT
Name: distribution
Description: tmerclub 分销服务
Package: com.mall4j.cloud.distribution
```
![](../img/基本开发文档/新增模块_3.png)
d.点击 Next 下一步,这里我们不需要选择任何依赖,我们需要在项目新增完成后,手动添加修改依赖
![](../img/基本开发文档/新增模块_4.png)
e.点击 Next 下一步
```
Module Name: tmerclub-distribution
Content root: 这个会根据 Module Name 自动修改。
Module file location: 这个会根据 Module Name 自动修改
```
![](../img/基本开发文档/新增模块_5.png)
最后点击 Finish 等待项目创建,创建完成的项目如下所示
![](../img/基本开发文档/修改模块_1.png)
## 2.修改项目tmerclub-distribution
a.我们需要删除掉一些文件和.mvn、test文件夹
```
.mvn
application.properties
test
.gitignore
HELP.md
mvnw
mvnw.cmd
```
删除完成后的结果如下图所示
![](../img/基本开发文档/修改模块_2.png)
b.修改tmerclub-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>tmerclub</artifactId>
<groupId>com.mall4j.cloud</groupId>
<version>0.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>tmerclub-distribution</artifactId>
<description>tmerclub 分销服务</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>tmerclub-common-database</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-common-security</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-api-product</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-api-search</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-api-platform</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-api-multishop</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-api-order</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-api-delivery</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-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>
```
在tmerclub的pom.xml的modules里面添加tmerclub-distribution模块
```
<modules>
<module>tmerclub-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上面新增一个tmerclub-distribution.yml配置文件并且配置好数据源
```yaml
Data ID: tmerclub-distribution.yml
Group: DEFAULT_GROUP
配置格式: YAML
配置内容:
#数据源
spring:
datasource:
url: jdbc:mysql://192.168.193.128:3306/tmerclub_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.新增完成后我们需要在我们的网关tmerclub-gateway配置一下tmerclub-distribution的路由在nacos上找到我们的tmerclub-gateway.yml文件新增tmerclub-distribution路由配置
```yaml
- id: tmerclub-distribution
uri: lb://tmerclub-distribution
predicates:
- Path=/tmerclub_distribution/**
filters:
- RewritePath=/tmerclub_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远程调用的接口都抽取了出来放在了tmerclub-api这个模块下面所以我们要新增一个tmerclub-api-distribution模块
```
a.在tmerclub-api上右键 New -> Module
![](../img/基本开发文档/新增模块api_1.png)
b.我们只是新增一个模块这个地方不需要启动类所以我们这里创建一个maven就好了
![](../img/基本开发文档/新增模块api_2.png)
c.点击 Next 下一步
```
Parent: tmerclub-api // 选择tmerclub-api
Name: tmerclub-api-distribution
Lacation: 自动填写
GroupId: com.mall4j.cloud.api
Artifactld: tmerclub-api-distribution
Version: 0.01
```
![](../img/基本开发文档/新增模块api_3.png)
4.点击 Finish ,创建完成后如图所示
![](../img/基本开发文档/新增模块api_4.png)
删除test、resource文件夹修改pom.xml文件新增tmerclub-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>tmerclub-api</artifactId>
<groupId>com.mall4j.cloud</groupId>
<version>0.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>tmerclub-api-distribution</artifactId>
<packaging>jar</packaging>
<description>分销对内接口</description>
<dependencies>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-common-order</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-common-product</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
```
新增的DistributionFeignClient.class类
接口上要加上注解@FeignClient(value = "tmerclub-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 = "tmerclub-distribution",contextId ="distribution")
public interface DistributionFeignClient {
}
```
## 4.完善tmerclub-distribution的配置和feign接口实现
在tmerclub-distribution项目引入tmerclub-api-distribution
```xml
<dependency>
<groupId>com.mall4j.cloud</groupId>
<artifactId>tmerclub-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("tmerclub商城接口文档").description("tmerclub商城接口文档Swagger版").termsOfServiceUrl("")
.contact(new Contact("广州蓝海创新科技有限公司", "", "")).version("1.0").build();
}
}
```
到这里微服务就创建完成了,相关基本配置也搭建好了。