当前位置:网站首页>微服務系統設計——子服務項目構建
微服務系統設計——子服務項目構建
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 。依此連續創建各種子模塊即可,最終的結果如下:

簡單介紹下各模塊的功用:
- parking-base-serv,pom 項目,裏面包含兩個子模塊:parking-admin,parking-gateway。
- parking-admin,監控子項目的運行情况。
- parking-gateway,網關子服務,配合 JWT 實現會話、驗權等功用。
- parking-carwash,洗車子服務,連接 park-carwash 數據庫。
- parking-card,積分子服務,連接 park-card 數據庫。
- parking-charging,計費子服務,連接 parking-charging 存儲庫
- parking-finance,財務子服務,連接 parking-finance 存儲庫。
- parking-member,會員子服務,連接 park-member 存儲庫。
- parking-resource,資源子服務,連接 park-resource 存儲庫。
- parking-message,消息子服務,連接 park-message 存儲庫,連同 rocketmq 存儲消息數據
- 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 的多環境配置,可以在各微服務項目上增加多個配置文件,如
- application.properties/yml 基礎公共配置
- application-dev.properties/yml 開發環境配置
- application-test.properties/yml 測試環境配置
- application-pro.properties/yml 生產環境配置
在公共配置文件 application.properties 中,通過配置 spring.profiles.active = dev 來决定啟用哪個配置,或在啟動構建包時,增加命令來激活不同的環境配置: java -jar parking-member.jar --spring.profiles.active=dev至此,第一個簡單的 Spring Boot 模塊搭建完成,下一步將 park-member 模塊的正常業務功能編碼完成即可。
博文參考
边栏推荐
- SDL: cannot play audio after upgrading openaudio to openaudiodevice
- Selection (031) -cool_ How long can secret be accessed?
- 解决执行MapReduce程序控制台没有日志信息WARN Please initialize the log4j system properly
- 如何在 R 中执行稳健回归
- Eight digit
- Seven strategies for successfully integrating digital transformation
- Is there a security risk in opening an account online? What to do if the business department opening an account nearby is far away from home. Is there any capital requirement for opening an account?
- How MySQL works - Chapter 14
- Palindrome string (two methods)
- BOM(Browser Object Model)
猜你喜欢

Three layer switching experiment

How MySQL works - Chapter 14

How can an enterprise successfully complete cloud migration?

2022 network security C module of the secondary vocational group scans the script of the surviving target aircraft (municipal, provincial and national)

About pyqt5 to realize paging function (one window implements different interfaces)

国家出手了!对知网启动网络安全审查
[golang] leetcode intermediate - jumping game & different paths

Three indicators to help you measure the effectiveness of digital transformation

Specification for self test requirements of program developers

Eight recommended microservice testing tools
随机推荐
Tencent cloud won the "trusted cloud technology best practice - virtualization"
Do you know CMDB?
Nine practical guidelines for improving responsive design testing
Window object
696. count binary substring
DOM (document object model)
R language Quantitative Ecology redundancy analysis RDA analysis plant diversity species data visualization
Vite+web3:报错出现ReferenceError: process is not defined
Leetcode weekly buckle 281
Bigdecimalavoiddoubleconstructorrule: do not directly use the double variable as a parameter to construct BigDecimal
What if the database table structure changes? Smartbi products support one click synchronization
360 digital released information security trends in January: 120000 fraud risks were captured and users were reminded 2.68 million times
Gateway solves cross domain access
Does the wave of layoffs in Chinese enterprises in 2021 need to be "judged" by morality?
Get max value of a bit column - get max value of a bit column
How can an enterprise successfully complete cloud migration?
Mental models: the best way to make informed decisions - farnam
High quality defect analysis: let yourself write fewer bugs
Ten excellent business process automation tools for small businesses
How to start cloud native application development