当前位置:网站首页>微服務系統設計——子服務項目構建

微服務系統設計——子服務項目構建

2022-06-24 18:36:00 莊小焱

摘要

經過前期的需求分析和模型設計與系統架構設計,我們對項目的整體結構有了更清晰的認識,剩下的工作就是依據設計,將項目骨架拉出來,往裏面直充血肉。構建起系統中的子微服務模塊。

一、搭建整個項目骨架

約定項目名稱為 parking-project ,建立 Maven 項目,packaging 方式 為 pom,用於管理所有模塊。在 parking-project 項目下依據功能模塊依次建立 maven module 子項目。采用 IDE工具。以 Maven Project 形式創建父項目,用於管理子模塊功能。

可以看到,子模塊自動將 parent project 設置為 parking-project 父項目。由於是采用 Spring Boot 的方式構建子項目,此處選擇 packaging 方式為 jar 。依此連續創建各種子模塊即可,最終的結果如下:

簡單介紹下各模塊的功用:

  1. parking-base-serv,pom 項目,裏面包含兩個子模塊:parking-admin,parking-gateway。
  2. parking-admin,監控子項目的運行情况。
  3. parking-gateway,網關子服務,配合 JWT 實現會話、驗權等功用。
  4. parking-carwash,洗車子服務,連接 park-carwash 數據庫。
  5. parking-card,積分子服務,連接 park-card 數據庫。
  6. parking-charging,計費子服務,連接 parking-charging 存儲庫
  7. parking-finance,財務子服務,連接 parking-finance 存儲庫。
  8. parking-member,會員子服務,連接 park-member 存儲庫。
  9. parking-resource,資源子服務,連接 park-resource 存儲庫。
  10. parking-message,消息子服務,連接 park-message 存儲庫,連同 rocketmq 存儲消息數據
  11. parking-common,存儲通用的工具類,實體包等等。

二、創建會員子服務

2.1 引入 spring-boot-starter-parent 依賴

每個子模塊都是一個 Spring Boot 項目,如果在子模塊中引入,會造成大量的重複工作,而且版本不宜統一維護,容易出現多版本的混亂局面,所以 Spring Boot 的版本需要全局統一維護。每個子項目需要構建成 jar 文件運行,子項目中已經依賴父項目的配置,每個子項目 pom.xml 文件都有這樣的依賴:

    <parent>
        <groupId>com.mall.parking.root</groupId>
        <artifactId>parking-project</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

如果按照常見的方式,再用 parent 方式引入 spring-boot-starter-parent 依賴,顯然違背單個 pom 文件中只有一個 parent 標簽的標准,編譯就會不通過。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

為解决這個問題,此處采用 parking-project 父項目中以 depencyMangement 方式引入 spring-boot-starter-parent,子項目依賴 parent 父配置即可。

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

有小夥伴可能會提出直接在根項目的 pom 采用 parent 的方式引入,子模塊直接通過 maven 依賴就可以,這種方式在獨立運行 Spring Boot 項目時沒問題。後續以同樣的方式引入 Spring Cloud 或 Spring Cloud Alibaba ,一個 parent 標簽顯然不滿足這個需求,用 dependencyManagement 的方式可以規避這個問題。

2.2 引入 MBG 插件

MBG 插件可以自動生成 mapper 接口、mapper xml 配置、相應實體類,主要作用在於快速開發,省去不必要的代碼編寫。

在 pom 中配置依賴 MBG 的插件:

<build>
    <finalName>parking-member-service</finalName>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <configuration>
                <!-- mybatis 用於生成代碼的配置文件 -->
                <configurationFile>src/test/resources/generatorConfig.xml</configurationFile>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
        </plugin>
    </plugins>
</build>

在 src/test/resource 目錄下寫入 generatorConfig.xml 文件,配置 MBG 插件 所需的基本配置項。

<generatorConfiguration>
<!-- 本地 mysql 驅動比特置 -->
  <classPathEntry location="/Users/apple/.m2/repository/mysql/mysql-connector-java/5.1.42/mysql-connector-java-5.1.42.jar" />

  <context id="mysqlTables" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/park-member?useUnicode=true" userId="root"
                        password="root">
                        <property name="useInformationSchema" value="true"/>
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

<!-- 生成 model 實體類文件比特置 -->
    <javaModelGenerator targetPackage="com.mall.parking.member.entity" targetProject="src/test/java">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>
<!-- 生成 mapper.xml 配置文件比特置 -->
    <sqlMapGenerator targetPackage="mybatis.mapper"  targetProject="src/test/resources">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>
<!-- 生成 mapper 接口文件比特置 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.mall.parking.member.mapper"  targetProject="src/test/java">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

<!-- 需要生成的實體類對應的錶名,多個實體類複制多份該配置即可 -->
     <table tableName="member" domainObjectName="Member">
        <generatedKey column="tid" sqlStatement="SELECT REPLACE(UUID(), '-', '')"/>
    </table>
    <table tableName="vehicle" domainObjectName="Vehicle">
        <generatedKey column="tid" sqlStatement="SELECT REPLACE(UUID(), '-', '')"/>
    </table>
    <table tableName="month_card" domainObjectName="MonthCard">
        <generatedKey column="tid" sqlStatement="SELECT REPLACE(UUID(), '-', '')"/>
    </table>
  </context>
</generatorConfiguration>

配置完成後,在項目名稱” parking-member “ 上右鍵,彈出菜單中選擇" Run As " —>" Maven build… ",在 Goals 欄目中輸入如下命令:

mybatis-generator:generate

命令執行成功後,在對應的目錄下找到相應的文件,而後 copy 到 src/java 對應的目錄下,再將 test目錄下生成的文件删除。

  • 1.4 版本之前的,MBG 插件生成的 xml 文件,是追加模式,而不是覆蓋,容易形成重複的標簽。
  • MBG 並不會生成 controller/service 層相關的代碼,需要自己手動完成。

2.3 引入 Lombok,簡化代碼

由於編譯階段就要使用 lombok,所以需要在 IDE 中安裝 lombok 插件,才能正常編譯。

2.4 日志注解

如果不想每次都寫,可以用注解@sl4j來打印日志。

private  final Logger logger = LoggerFactory.getLogger(當前類名.class);

2.5 引入MyBatis依賴

更高效的引入MyBatis,這裏采用 starter 的方式引入,同樣在根pom.xml 文件中維護組件版本。

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

在 application.properties 配置文件中設置數據庫連接,Spring Boot 2.x 版本默認采用是 HikariCP 作為 JDBC 連接池。

mybatis.type-aliases-package=com.mall.parking.member.entity

#如果需要更換 Druid 連接池,需要增加如下的配置項:
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#use new driver replace deprecated driver:com.mysql.jdbc.Driver.
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/park_member?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root

使 mapper 接口文件能够被系統掃描,在主類中通過@mapperscan注解,或直接在mapper接口文件上加@mapper注解。

2.6 測試框架是否成功

@RestController
@RequestMapping("member")
@Slf4j
public class MemberController {

    @Autowired
    MemberService memberService;

    @RequestMapping("/list")
    public List<Member> list() {
        List<Member> members = memberService.list();
        log.debug("query member list = " + members);
        return members;
    }

}

MemberServiceImpl 實現類

@Service
public class MemberServiceImpl implements MemberService {

    @Autowired
    MemberMapper memberMapper;

    @Override
    public List<Member> list() {
        MemberExample example = new MemberExample();
        List<Member> members = memberMapper.selectByExample(example);
        return members;
    }

}

啟動項目,成功後顯示成功日志:

2019-12-30 16:45:13.496  INFO 9784 --- [           main] c.mall.parking.member.MemberApplication  : Started MemberApplication in 6.52 seconds (JVM running for 7.753)

打開 Postman 插件,測試剛才的方法是否正常,操作如下:

2.7 多環境配置

日常產品研發中必然涉及到多部署的問題,比如開發環境、測試環境、生產環境等,這就要求代碼部署能够應對多環境的要求。通過人工修改的方式,不但容易出錯,也會浪費人力成本,必須結合自動化構建來提高准確性。Spring Boot 提供了基於 profile 的多環境配置,可以在各微服務項目上增加多個配置文件,如

  1. application.properties/yml 基礎公共配置
  2. application-dev.properties/yml 開發環境配置
  3. application-test.properties/yml 測試環境配置
  4. application-pro.properties/yml 生產環境配置

在公共配置文件 application.properties 中,通過配置 spring.profiles.active = dev 來决定啟用哪個配置,或在啟動構建包時,增加命令來激活不同的環境配置: java -jar parking-member.jar --spring.profiles.active=dev至此,第一個簡單的 Spring Boot 模塊搭建完成,下一步將 park-member 模塊的正常業務功能編碼完成即可。

博文參考

原网站

版权声明
本文为[莊小焱]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/175/202206241324330269.html