![微服务容器化开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/618/34171618/b_34171618.jpg)
2.4 编写框架代码
如果使用Spring Cloud“全家桶”构建项目的微服务框架,则可以使用EUREKA、Zuul、Config、Hystrix、Zipkin和Ribbon等组件。EUREKA用于服务注册与发现,Zuul用于网关与路由,Config用于统一配置,Hystrix用于熔断器,Zipkin用于调用链跟踪,Ribbon用于客户端调用的负载均衡。Spring Cloud各组件的详细介绍与使用读者可自行学习,此处不再赘述。
笔者的生产项目没有使用Spring Cloud微服务框架全套组件,而是结合微服务运行环境Kubernetes进行了取舍,选取了Zuul、Hystrix和Zipkin,而服务注册与发现则使用Kubernetes的服务发现与注册来代替,使用Spring Boot Security和JWT进行角色与权限控制。
2.4.1 创建Maven工程
创建一个Maven工程,目录名称为ecs-order-system,项目名称为eos-parent。该项目是父项目,后续各个微服务为其子项目(子模块)。下面对eos-parent项目的pom.xml文件进行解析。
(1)父项目定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_10.jpg?sign=1739237116-vBSmRPp5hb4Ke6uqE0A99jf1XZjw9z7U-0-91d71b560be53b0137c25c569e118e42)
定义eos-parent父项目的groupId、artifactId和版本号version。
(2)JDK版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_11.jpg?sign=1739237116-KP0hGKwq4zwWzGNAeMLgRgKSDNDZMmD1-0-8df1232434304979309e3d9e03e940fe)
定义eos-parent父项目及其子模块都是基于JDK1.8进行编辑和编译的。
(3)Spring Boot版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_12.jpg?sign=1739237116-E2TN3dFdyClqAZjyJsvrvuYB0D848IVV-0-df446f3ac21974bddc5cd9c62268de78)
定义将Spring Boot 1.5.13版本作为开发环境和运行环境。
(4)Spring Cloud版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_13.jpg?sign=1739237116-VQprYVq1rHzteIQW6TQFQl8GKQda2prO-0-560823d7367c063993e284f74c9d8edb)
定义将Spring Cloud Edgware.SR4版本作为开发和运行环境。
(5)Maven编译插件定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_14.jpg?sign=1739237116-kxB3ngNU3fegafcMXM9OaWVKW4eG2fLT-0-8df556cf5172c408ac08a0742010ba90)
定义使用Spring Boot的Maven插件进行微服务编译和打包。
(6)微服务公共依赖定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_15.jpg?sign=1739237116-3bsnqEm44SlcQZOXwx82n6jRgPPfOANS-0-2ed54fec5ebb4e7bd7cc7e954a1c6e9c)
微服务子模块的公共依赖定义包括RESTful API开发、熔断和调用链等需要依赖的包,版本号继承使用Spring Boot和Spring Cloud定义的版本即可,这些公共依赖定义在dependencies内部。
2.4.2 创建微服务模块
父项目设置完成后,需要创建各个微服务的子模块,单击父项目,选择“File/New”菜单中的“Module”命令,弹出的对话框如图2-6所示。
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_16.jpg?sign=1739237116-xNs1t0KPegbteVkZOubu7rDwMzcNASL3-0-001d0dfd7dcdc5f413cd94fd2ed5189a)
图2-6 创建微服务模块(一)
单击“Next”按钮,设置模块的GroupId、ArtifactId和Version,如图2-7所示。
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_17.jpg?sign=1739237116-LaUb5hj7wSmhggts4C1IAoGMzDnB1Wpj-0-19e6e7e8e0e40bedf71990a0d82f8f98)
图2-7 创建微服务模块(二)
如图2-7所示,子模块的GroupId和Version可以继承父项目。ArtifactId是微服务名称,一般采用“xxxx-xxxx-xxxx”的三段式命名规则,可以命名为“公司-产品-模块”。笔者参与的项目没有命名公司,而是从部门产品系统开始的,如eos-order-verify和eos-system-setting分别表示订单审核与系统设置微服务。
添加微服务子模块后,在父项目的pom.xml文件中会添加一个模块module,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_18.jpg?sign=1739237116-pcAbk9Remp83fMLBKJOZlR41Jf7A0fMW-0-0840a1850721c1fb2f81f75b17ed031b)
2.4.3 微服务代码结构
框架代码包括父项目和各子模块的代码结构与基本配置,在IDEA中,微服务eos-order-account的代码目录结构如图2-8所示。
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_19.jpg?sign=1739237116-pgEkY1oBdn0NstFq4UpTGMAzbcnntuzh-0-cf64d713b7e68698b0cbc45a4d788526)
图2-8 微服务eos-order-account的代码目录结构
配置文件包括Maven的pom.xml文件和Spring Boot的bootstrap.yml、application-dev.yml、application-prod.yml、application-test.yml。Java代码包括Spring Boot启动入口的OrderAccountApplication.java,以及Spring Boot开发的基本源代码目录controller、mapper、service等。
下面对各文件和目录进行详细介绍。
1.pom.xml文件
该段代码配置的关键是parent配置项,完整配置如下所示:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_20.jpg?sign=1739237116-gUOoGVcSf5oVZG2OGQSibNFcF0j7U1TJ-0-0bf6d05e678ca96560f62e750ca45430)
微服务的Maven配置pom.xml文件,使用parent设置继承父项目配置,同时设置自己的artifactId。
2.Spring Boot配置文件
微服务使用Spring Boot进行开发,配置文件包括application-dev.yml、application-prod.yml、application-test.yml、bootstrap.yml。其中,application-*.yml是运行在开发、测试和生产环境中的特殊配置,bootstrap.yml是微服务启动后首先加载的配置文件。
bootstrap.yml配置一般是固定不变的,如微服务名称、端口等;而application-*.yml配置是随运行变化而变化的,如数据库地址、redis地址、第三方接口地址、日志输出目录等。
application-dev.yml配置如下(节选):
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_21.jpg?sign=1739237116-cd8EEIDVjSttoinhxBHHbq1FWsB8WS37-0-73610ce5ade191a2682fb12cd5ebc68c)
application-prod.yml配置如下(节选):
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_22.jpg?sign=1739237116-7svBCXJqdg0AyucFGCAj5jqEirVEINFg-0-086ffcc91a26c70343e4e37a8fd30efc)
bootstrap.yml配置如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_23.jpg?sign=1739237116-IbzpkaxLDTDGu8OjrnqqRehrZRvK2lFp-0-4cffd588aa16cd6545e073e5ba3ffb40)
此处没有展示application-test.yml配置的内容,从application-dev.yml配置和application-prod.yml配置来看,主要是日志目录、数据库地址、redis地址等随运行环境不同而需要分开配置。
3.微服务入口文件
微服务入口的代码格式主要包括几个注解和main()函数,如下所示:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_24.jpg?sign=1739237116-KtbdbH7NeCUZjvCXePXoxlYXixQ9Mg0w-0-7e763ca211ab9e6a1dbb84eae27a9a11)
包含main()函数的OrderAccountApplication.java文件就是微服务eos-order-account的入口,引入Spring Boot启动注解@SpringBootApplication,需要注意的是,注解@EnableCircuitBreaker是熔断器使用的,后续章节会详细介绍。