![微服务容器化开发实战](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=1738942730-BUQEwq7cJCYt6Gusuy3LhOWVjTbrsSci-0-9216b5dba298103d20f3c9693ea2bc5c)
定义eos-parent父项目的groupId、artifactId和版本号version。
(2)JDK版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_11.jpg?sign=1738942730-zm7vuWpDXjSOFyJLaxXqrHiwyt8QEduQ-0-52f6c6a5cde7f2fd3ce60add2f9e7303)
定义eos-parent父项目及其子模块都是基于JDK1.8进行编辑和编译的。
(3)Spring Boot版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_12.jpg?sign=1738942730-BbDNZTQxluLtJlXGKEkwx7ykC2pIWaxG-0-0b6087a53ea09c3fd43a9bd29ab0e0b5)
定义将Spring Boot 1.5.13版本作为开发环境和运行环境。
(4)Spring Cloud版本定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_13.jpg?sign=1738942730-lcv5rScvoAUXiL0cD11pOeuIwG5EWZfo-0-b1da445a7def9e2a15cf999050394695)
定义将Spring Cloud Edgware.SR4版本作为开发和运行环境。
(5)Maven编译插件定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_14.jpg?sign=1738942730-5IBOqr4UJmyipenS7Xi67RErCNRK4sCm-0-642cc1d7b1f06c83cd5d899bfac2de63)
定义使用Spring Boot的Maven插件进行微服务编译和打包。
(6)微服务公共依赖定义,具体如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_15.jpg?sign=1738942730-YpCw4XKkbrEb87naVrM8VZ1z4KL09Vto-0-dfa68c4520f2897f8f18add7467b5e7e)
微服务子模块的公共依赖定义包括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=1738942730-nwC4vcKCUpM9IdXECj4XHF9EZPoH1Tn0-0-e2d940c6b80b94756cb42ef2ce8538f8)
图2-6 创建微服务模块(一)
单击“Next”按钮,设置模块的GroupId、ArtifactId和Version,如图2-7所示。
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_17.jpg?sign=1738942730-i4haLOJ0f6QcsWV9kvXmh7C1VQUpbXPs-0-5ef4c2fe7cc82d9a225be94a6c97a8ce)
图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=1738942730-5kqjWG27QL9bpeITyvba2SA0YaOfF1Xx-0-4a6a69589b6863366354024bb88512bd)
2.4.3 微服务代码结构
框架代码包括父项目和各子模块的代码结构与基本配置,在IDEA中,微服务eos-order-account的代码目录结构如图2-8所示。
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_19.jpg?sign=1738942730-5NbJvTMAlY7GxLdxqe9Uvm7PxTg66vOv-0-b3e1627ec20dd2c62b348568070673ad)
图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=1738942730-qaQwr30AzhKX4tIq3JbFGl7KhLfiPjao-0-fecbe636fdcab1d296b3f54ced35dbe0)
微服务的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=1738942730-eYHplob3ngMLRVqKokbnIUa5SHfqP3Av-0-a2bddd553ca5b9368395d751cd4e6085)
application-prod.yml配置如下(节选):
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_22.jpg?sign=1738942730-qouhDIgqPJUOkm0Z4WKTPVVWOi3u3Xsj-0-db8a99115e93df2a87ec578ca397764e)
bootstrap.yml配置如下:
![img](https://epubservercos.yuewen.com/94E691/18279401408275806/epubprivate/OEBPS/Images/txt002_23.jpg?sign=1738942730-KOkZFw54nov9hGcBPpyZlOrXkGrHIn6l-0-c0eb6cc4f553cbecfbc5bbaedd9682a2)
此处没有展示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=1738942730-sRgCQuyDjpBLKwKzN9Rd6nQQSB6WB2Xz-0-cc4c93918e44b036e8b9e1022e4766dd)
包含main()函数的OrderAccountApplication.java文件就是微服务eos-order-account的入口,引入Spring Boot启动注解@SpringBootApplication,需要注意的是,注解@EnableCircuitBreaker是熔断器使用的,后续章节会详细介绍。