tmerclub-doc/基本开发文档/tmerclub新增微服务流程.md

448 lines
12 KiB
Markdown
Raw Normal View History

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