微服务项目的整合和测试(九)

微服务项目的整合和测试(九)

学习目标
l 微服务项目的整合
l 接口可视化工具——Swagger-UI

一.微服务项目整合

1.微服务服务项目结构预览(本项目模拟的是一个简单的商城管理系统)

  • 1.下载项目地址:https://github.com/shi469391tou/microservice-mallmanagement.git
    在这里插入图片描述
    在这里插入图片描述
  • 2.导入包
    在这里插入图片描述
    在这里插入图片描述
  • 3.项目整体结构
    在这里插入图片描述
    本项目通过一个名为microservice-mallmanagement的Maven父项目构建了四个子项目,关于这四个子项目的描述具体如下。
    microservice-eureka-server: 用于服务注册发现。
    microservice-gateway-zuul: 用于API网关。
    microservice-orderservice:用于订单管理服务。
    microservice-userservice: 用于用户管理服务。
    其中的microservice-orderservice和microservice-userservice就是我们实际需要开发的微服务项目,也是商城管理项目的核心,而另外的microservice- eureka-server和microservice-gateway-zuul子项目则属于辅助服务。
    本商城项目只编写了其中的用户和订单管理服务,实际开发中还会涉及到更多服务,例如后台管理服务、日志管理服务等。若要添加其他服务,只需参考用户或订单管理微服务项目在所开发的服务项目中添加相关的配置,并将服务注册到Eureka注册中心即可。

2.微服务项目功能介绍

  • 1.microservice-eureka-server(Eureka注册中心)
    该子项目使用了Spring Cloud 的组件Eureka, 主用于搭建一个服务注册中心,microservice-gateway-zuul、microservice-orderservice、microservice-userservice都将通过配置注册到该注册中心。对应的配置文件application.yml内容,如图所示:(修改完成“Ctrl+s”保存)
    在这里插入图片描述
    图中,配置了应用名称和服务端口,同时通过Eureka 的相关配置指定了Eureka注册中心的地址http://eureka-server:${server.port}/eureka/(即http://localhost:8761/eureka/),当部署到测试或线上环境时,需要根据上面注释中的提示信息进行地址更改。
  • 2.microservice-gateway-zuul(Zuul API网关)
    该子项目使用了Spring Cloud的组件Zuul,主要作为其他微服务项目的API网关,来实现其他微服务接口的动态代理。microservice-orderservice和microservice-userservice微服务都可以使用Zuul网关服务进行代理请求。其对应的配置文件application.yml的具体内容,如图所示:
    在这里插入图片描述
    在这里插入图片描述
    在图中,同样先配置了应用名称和服务端口,同时通过Eureka的相关配置将该API网关服务注册到了Eureka 注册中心(这里需注意当部署到测试或线上环境时,需要根据上面注释中的提示信息进行注册地址修改)。最后部分实现了Zuul 的相关配置,分别配置了serviceId为user-service和order-service的两个应用的路径映射。
  • 3.microservice-orderservice(订单管理微服务)
    该子项目就是一个使用传统的Spring Boot框架开发的订单管理微服务项目,主要用于进行商城订单管理,并提供有关订单管理的RESTFUL风格的API接口方法。其对应的配置文件application.yml的具体内容,如图所示:
    在这里插入图片描述
    在图中,除了配置服务的应用名称、端口以及Eureka注册中心外,还额外增加了MySQL数据库的配置。上述配置文件不仅要注意上线测试时需要修改Eureka注册中心配置,还需要注意MySQL数据库url的配置。
    *如果MySQL数据库使用非Docker容器方式进行配置,那么MySQL数据库的url要修改为“MySQL数据库服务的IP+端口”的形式;
    *如果是使用Docker容器启动的MySQL数据库服务,那么MySQL数据库的url要根据上面的提示修改为"MySQL 数据库的服务名称或容器名称+端口号”的形式。
    该项目对应的控制器类OrderContoller的具体内容,如图所示。
    在这里插入图片描述
    从图中看出,该订单管理项目的接口控制器类OrderController中只是简单地定义了一个根据 userid 查询订单集合的方法,同时该方法还通过@HystrixCommand注解配置了Spring Cloud的熔断器Hystrix, 并编写了回调方法。
  • 4.microservice -userservice (用户管理微服务)
    该子项目也是一个传统的Spring Boot框架开发的用户管理微服务项目,主要用于进行商城用户管理,并提供有关用户管理的RESTFUL风格的API接口方法。其对应的配置文件application.yml的具体内容,如图所示:
    在这里插入图片描述
    从图中可以看出,用户管理微服务的配置和订单管理微服务的配置基本相同。除了服务名称和端口外,只是增加了一个Spring Cloud 组件Ribbon 提供的客户端负载均衡常量ORDERSERVICEURL的配置(原本是订单服务的IP+端口号)。
    该项目对应的控制器类UserContoller的具体内容,如图所示。
    在这里插入图片描述
    在这里插入图片描述
    从图中可以看出,UserContoller中也只是简单地定义了一个根据username 查询订单集合的getOrderByUsername()方法。执行方法时,会通过@Value注解使用Ribbon客户端负载均衡的功能引入配置文件中订单微服务的常量值ORDERSERVICEURL, 然后在方法中先通username查询出对应的userid,然后使用RestTemplate的exchange()方法远程调用订单管理微服务接口进行订单集合查询。RestTemplate 的exchange()方法用于远程调用其他RESTFUL接口方法,并返回指定的对象集合。其方法的四个参数分别表示请求地址、请求方式、请求参数实体以及返回结果对象。
    至此,商城管理系统的整体结构和子项目功能及主要配置就已介绍完毕。

3.微服务项目的启动和测试
商城管理系统的启动非常简单,只要运行各自的启动类即可。唯一需要注意的是,项目中的microservice-gateway-zuul、microservice-orderservice 和microservice-userservice都注册到了microservice-eureka-server项目的服务注册中心上,所以必须先启动microsevice-eureka-server项目,运行成功后才可启动其他三个子项目。由于microservice-orderservice(订单微服务)和microservice-userservice(用户微服务)都涉及了MySQL数据库的连接使用,所以启动这两个微服务项目之前必须先创建好对应的数据库和表,并初始化相关数据。

  • 1.MySQL客户端连接工具Navicat

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2.启动MySQL,使用连接工具Navicat
    在这里插入图片描述
    在这里插入图片描述
    我们可以通过MySQL客户端连接工具(如Navicat )执行SQL脚本文件来初始化数据库和表,SQL脚本的内容如图所示。
    在这里插入图片描述
    在图中,创建了一个名为microsevice_mallmanagement的数据库,同时在该数据库中分别创建 tb_order和 tb_user表,并插入了一些初始化数据。完成全部子项的启动并运行成功后,通过地址http://localhost:8761,即可访问Eureka服务注册中心,效果如图所示:
    在这里插入图片描述
    从图中可以看出,所有服务均已正常启动,并且其他的三个子项目都已正确注册到了Eureka注册中心。启动成功后,即可对系统的功能进行测试,具体执行步骤如下。
  • 3.测试接口方法
    分别通过microservice-orderservice和microservice-usersevice两个微服务项目的地址来访问各自暴露的API接口方法,效果如图所示。代理访问地址为
    http://localhost:7900/order/findOrders/1
    在这里插入图片描述
    http://localhost:8030/user/findOrders/shitou
    在这里插入图片描述
    以上两种微服务的接口调用方法是通过调用各自的服务地址和对应的API接口方法进行的测试。
  • 4.测试API网关服务
    针对上面的microservice-orderservice 和microservice-userservice两个微服务项目,可以通过Zuul组件提供的API网关进行对应的接口代理测试,效果如图所示。代理访问地址为
    http://localhost:8050/order-service/order/findOrders/1
    在这里插入图片描述
    http://localhost:8050/user-service/user/findOrders/shitou
    在这里插入图片描述
    从图中访问地址和显示结果可以看出,使用Spring Cloud的Zuul组件实现API网关服务时,只需要访问microsevice-gateway-zuul的服务地址并连接其他微服务映射的路径即可访问其他注册到Eureka注册中心的服务。

二.接口可视化工具——Swagger-UI

微服务架构是面向服务的架构,在整个使用微服务架构搭建的项目中,服务数量众多,而每一个服务中又包括了一系列的RESTFUL风格的API。无论是开发人员调用服务中的API,还是测试人员在测试时,都需要知道服务中有哪些功能,以及如何获取服务中的API。此时,我们就可以通过当前流行的接口可视化工具Swagger-UI来完成这项工作。
(若是按照之前的步骤下载的代码,则不需要下载需要Swagger-UI项目。下载Swagger-UI项目,地址:https://github.com/swagger-api/swagger-ui.git)

1.Swagger-UI使用方法

Swagger-UI可让任何人在不实现任何逻辑的情况下,以可视化的方式与后台服务端API接口方法进行交互。Swagger-UI的配置不会污染其他业务代码,我们通过引入Swagger-UI的配置即可自动生成相应的可视化接口文档,来对项目中的接口进行测试,这极大地简化了客户端与服务端的访问,方便开发和测试人员使用。Swagger-UI官网以及其他开发者为其使用提供了多种配置方式,下面就以其中一种比较简单的的配置方式进行讲解,具体步骤如下。

  • 1.查看dist目录是否在需要使用Swagger-UI工具项目的resources目录下,这里以microservice-userservice项目为例,效果如图所示。
    在这里插入图片描述
    从图中可以看出,加入的dist目录中的文件主要就是一些css、js和html等文件,都是用来显示和渲染Swagger-UI工具页面的。
  • 2.查看在是否已加入Swagger依赖。
    在这里插入图片描述
  • 3.查看配置类SwaggerConfiguration。
    在这里插入图片描述
    在这里插入图片描述
    上述配置类中,通过Docket对象配置了一些API接口文档生成信息,并通过build()方法生成对应的测试文档。其中配置的ApiInfo对象是用来在文档页面显示API接口描述信息的,可以省略: paths()方法用于匹配映射microservice-userservice项目中的以"/user”开头的接口方法。此处我们只是以microservice-userservice微服务为例展示了配置过程,而microservice-orderservice微服务项目配置Swagger-UI工具的方法与此相同,只需要更改SwaggerConfiguration 类中的映射路径和ApiInfo信息即可。

2.Swagger-UI使用测试

完成上一步,分别完成microservice-userservice 和microservice-orderservice 与Swagger-UI接口文档工具的整合后,只需重新启动项目即可查看整合效果。

  • 1.整合测试
    重新启动所有整合了Swagger-UI接口文档工具的微服务项目,启动成功后,通过对应“服务地址IP+端口+/swagger-ui.html"请求路径即可进入测试页面,效果如图所示。
    http://localhost:8030/swagger-ui.html
    在这里插入图片描述
    http://localhost:7900/swagger-ui.html
    在这里插入图片描述
    浏览器已显示出了Swagger-UI的测试页面,且页面中分别列出各自的接口控制器类user-controller和order-controller ,这说明项目与Swagger-UI整合成功。
  • 2.接口测试
    以用户管理 API接口测试文档为例,先单击user-controller面板,会展示出接口中所有方法(项目只有一GET 方法),再单击某个具体的方法会展示出详细信息,效果如图所示。
    在这里插入图片描述
    从图中的标注信息可以很清楚地知道页面各部分信息的作用,我们主要关心的是具体的某个测试方法的参数。在参数信息输入框中填写username的参数值shitou (之前MySQL数据库初始化时插入的数据),然后单击“try it out”按钮即可进行测试。
    在这里插入图片描述
    从图中可以看出,该方法正确查询出了username为shitou的用户订单信息,同时在结果上方还提供了另外的Curl和URL两种请求方式。如果项目的接口方法有所变更,只需要将对应服务重启,并刷新文档页面就会自动更新对应的方法。
    对Swagger-UI的使用感兴趣可根据需要自行与其他项目整合进行测试,也可以参考Swagger-UI官方提供的使用方式学习更多的内容,具体参考地址为https://swagger.io/docs/swagger-tools/#swagger-ui-documentation-29。

三.出现的问题及解决

  1. 启动microservice-gateway-zuul出现问题。
    在这里插入图片描述
    解决方法:参考https://blog.csdn.net/u010227638/article/details/79579704修改 C:\Windows\System32\drivers\etc\hosts文件,加入一行内容。
    在这里插入图片描述
    注意:连接数据库MySQL,编辑连接,将localhost改为127.0.0.1,否则会出现java.net.UnknownHostException: mysql错误。
  2. 测试接口方法——未显示内容。
    解决方法:修改了microservice-orderservice和microservice-userservice的application.yml文件,将url路径中mysql改为localhost,应该是之前在hosts文件中修改的内容引起的。
    在这里插入图片描述