如何初始化一个Spring Boot微服务项目 | 豆包MarsCode AI刷题

110 阅读3分钟

前段时间一直头铁没有学微服务,一直都用单体的写法在写自己的小项目,然后最近感觉维护有点绷不住了,正好刷课看到微服务是必学的东西(我到底有多少没学的必学的东西……),于是就打算跟着Dubbo的商城Demo直接上手,体验一下微服务的开发。

1 创建项目结构

假设要新建的微服务项目名称为AlphaFrog Micro。选一个目录,在命令行中执行:

mvn archetype:generate -DgroupId=com.example -DartifactId=alphafrog-micro -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

然后Maven会生成一个默认的pom.xml文件。在pom.xml中设置java版本为17,然后选择一个适合自己的Spring Boot版本。我的选择是3.3.6,是考虑到之后可能会集成一些AI相关的内容(IJ里提示很多AI相关的包不支持3.4.0)。

然后在alphafrog-micro这个Maven Project的文件夹下,创建各个服务的文件结构。假设我们有如下的服务需要实现:

  • 境内基金服务
  • 境内股票服务
  • 境内指数服务
  • 境内金融数据爬取服务
  • 境内金融数据分析服务
  • 基金记账服务
  • 用户服务
  • 各个服务的interface
  • common

以境内基金服务为例,在上述文件夹下启动终端,并运行:

mvn archetype:generate -DgroupId=com.example -DartifactId=domesticFundService -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

剩余的服务就不赘述了。

刚才给出的命令生成的文件结构中,整个服务的入口在src/main/java/com/example,和实际我们想要的包含父文件夹artifactID和具体服务名称的样式不符;不过这个在IDE里改一下就好,不麻烦。

2 common包:POJO、DAO的家

2.1 POJO

各个服务都有可能会用到相同的实体对象。比如,对“基金净值”这个对象而言,境内金融数据爬取服务、境内基金服务、境内金融数据分析服务都会用到。在这三个服务下重复定义FundNav这个POJO对象肯定是不明智的。因此,我们可以创建一个common包,在其下创建pojo子包,然后再分门别类创建不同的POJO对象。

在需要引用这些POJO对象的服务的pom.xml中,添加对common包的依赖:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>common</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

即可在该服务中引用common包定义的POJO对象。

2.2 DAO

在单体架构的应用中,如果用MyBatis的话,我们可能会这么写DAO:

@Mapper
public interface FundNavDao {

    @Insert("insert into alphafrog_fund_nav(ts_code, ann_date, nav_date, unit_nav, accum_nav, accum_div, net_asset, total_net_asset, adj_nav) " +
            "values(#{tsCode}, #{annDate}, #{navDate}, #{unitNav}, #{accumNav}, #{accumDiv}, #{netAsset}, #{totalNetAsset}, #{adjNav})" +
            "ON CONFLICT do nothing")
    int insertFundNav(FundNav fundNav);
}

现在我们把这样的DAO迁移到微服务架构中。简单思考不难得出,因为不同服务最终访问的数据库在绝大多数情况下都是一致的,所以完全可以把大多DAO写到一个包里,这样就可以避免重复配置。

“诸多服务都会用到的东西”写在哪里呢?当然是common包了。但是随之而来,就有一个问题:单体架构下如上述写法所示的DAO是依赖于Spring上下文的(数据库连接配置依赖于application.yml);common包本身并不是一个Spring服务,也不应该把它写成一个Spring服务,所以直接复制粘贴单体架构下的DAO,不改别的东西,是不可行的。

回想单体应用下,我们使用@MapperScan注解扫描所有的Mapper并注入SQL连接;数据库连接配置由application.yml配置。那么在微服务架构下,我们则需要为每个使用数据库连接的服务都写一遍application.yml的数据库连接配置,然后在每个服务的入口类上添加注解:

@MapperScan("com.example.alphafrogmicro.common.dao")

即可。

今天先写这么多吧,