![微服务容器化开发实战](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=1739355493-hj0LQcx5Mo3jWDwqfBKrofBthQ057Wjo-0-16241f2158b0da374ce7c134d6bf51c4)
定义eos-parent父项目的groupId、artifactId和版本号version。
(2)JDK版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_11.jpg?sign=1739355493-i9eLzE3Y7kSFUE5xxIPG8bonFJj2RJjf-0-3195f2b573a558ecea67cdda097668b9)
定义eos-parent父项目及其子模块都是基于JDK1.8进行编辑和编译的。
(3)Spring Boot版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_12.jpg?sign=1739355493-1Vg1s4DXGkikskuZO69Pdhwq1qAhAaRl-0-c73809c2aa98e8e0a90d2e9fbc63e28b)
定义将Spring Boot 1.5.13版本作为开发环境和运行环境。
(4)Spring Cloud版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_13.jpg?sign=1739355493-CQXksZ8OS8BGOYYzCa4x9GU8eOWZ3cgv-0-4c81d219d657f64b4d00949ac15bca1e)
定义将Spring Cloud Edgware.SR4版本作为开发和运行环境。
(5)Maven编译插件定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_14.jpg?sign=1739355493-zOu5MLKB9mq7Gzlu4iPsEgkomHRIVY9F-0-58e89c0c45732909d173e62013755b6d)
定义使用Spring Boot的Maven插件进行微服务编译和打包。
(6)微服务公共依赖定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_15.jpg?sign=1739355493-SA85XqPlodKdcboz39gYWN3T19ggN2sj-0-5b8bde73c09c9dd0c48ab0562cc79cc1)
微服务子模块的公共依赖定义包括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=1739355493-U6QP5xjlQfROcQJmaYykzwRftqoAnj8Q-0-759109da3d62d4f3f11f1b42268cf9b3)
图2-6 创建微服务模块(一)
单击“Next”按钮,设置模块的GroupId、ArtifactId和Version,如图2-7所示。
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_17.jpg?sign=1739355493-bGEjIhcdQpLgViKmwEY2233OqW87uWLu-0-9b511993ef02cb92d4d17ced10f6713e)
图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=1739355493-8qDkJSHF30URMFwUkvdn7TISRov6O1Yc-0-0950b277b2a26ec54f8f2a82653636d4)
2.4.3 微服务代码结构
框架代码包括父项目和各子模块的代码结构与基本配置,在IDEA中,微服务eos-order-account的代码目录结构如图2-8所示。
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_19.jpg?sign=1739355493-9nuhWRaWVShRoAoNh9r1sSdaQEDN5sgL-0-8c23d7dca766b579e13140c9ecbfa7cc)
图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=1739355493-7gSuq4c3b9T9n6AkmENYiM1afUMWoWBE-0-296a604b02d77c72516d41a30e695434)
微服务的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=1739355493-y6NjHGfNTt25OJ7u7bhTM8YcCu0OSQq8-0-9dee4da220ebfdbe5a1d89a5954a6439)
application-prod.yml配置如下(节选):
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_22.jpg?sign=1739355493-JQEaGH0sDnnoj20BmksQx9mD8XUWBsyP-0-4fb9a8260e9938eec7f26ba4373a0582)
bootstrap.yml配置如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_23.jpg?sign=1739355493-BQ5d5St4TImKarNW7Jcow0r9hMw6IcDf-0-130e6f1b27c2c513be2a1255f9eba8c1)
此处没有展示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=1739355493-uF3TgsBGSdpPz4ClRkuUb2qDlGsC4Ff0-0-9fe3e6c7b01037f0237e0ab82922bc45)
包含main()函数的OrderAccountApplication.java文件就是微服务eos-order-account的入口,引入Spring Boot启动注解@SpringBootApplication,需要注意的是,注解@EnableCircuitBreaker是熔断器使用的,后续章节会详细介绍。