体质指数微服务应用快速开发

前言

在您进一步阅读之前,请确保您已阅读了快速入门指南,并已成功运行体质指数微服务。接下来将进入体质指数微服务应用的开发之旅。

快速开发微服务应用

快速入门指南中已对体质指数微服务的架构进行了说明,其主要由两个微服务组成:

  • 体质指数计算器:负责处理运算事务。

  • 体质指数界面:提供用户界面及网关服务。

在开始前,需要先在服务的父工程中添加以下依赖项:

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.apache.servicecomb</groupId>
  5. <artifactId>java-chassis-dependencies</artifactId>
  6. <version>1.0.0-m1</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.hibernate</groupId>
  15. <artifactId>hibernate-validator</artifactId>
  16. </dependency>
  17. </dependencies>

注意: java-chassis-dependencies 这个依赖是以pom的形式导入来统一项目中的依赖项的版本管理。

下面将对这两个微服务的实现进行介绍,其代码已托管于github上。

体质指数计算器实现

体质指数计算器提供运算服务,其实现分为三部分:

  • 具体运算实现

  • 服务端点定义

  • 服务启动入口

具体运算实现

本模块负责计算体质指数,根据公式 (体质指数=\frac{体重}{身高^2}) 进行实现,代码如下:

  1. public interface CalculatorService {
  2. double calculate(double height, double weight);
  3. }
  4. @Service
  5. public class CalculatorServiceImpl implements CalculatorService {
  6. @Override
  7. public double calculate(double height, double weight) {
  8. if (height <= 0 || weight <= 0) {
  9. throw new IllegalArgumentException("Arguments must be above 0");
  10. }
  11. double heightInMeter = height / 100;
  12. return weight / (heightInMeter * heightInMeter);
  13. }
  14. }

服务端点定义

服务端点用于生成服务契约,使得服务间能无缝进行通信。首先定义端点接口:

  1. public interface CalculatorEndpoint {
  2. double calculate(double height, double weight);
  3. }

引入 ServiceComb 依赖:

  1. <dependency>
  2. <groupId>org.apache.servicecomb</groupId>
  3. <artifactId>spring-boot-starter-provider</artifactId>
  4. </dependency>

暴露运算服务的Restful端点:

  1. @RestSchema(schemaId = "calculatorRestEndpoint")
  2. @RequestMapping("/")
  3. public class CalculatorRestEndpoint implements CalculatorEndpoint {
  4. private final CalculatorService calculatorService;
  5. @Autowired
  6. public CalculatorRestEndpoint(CalculatorService calculatorService) {
  7. this.calculatorService = calculatorService;
  8. }
  9. @Override
  10. @GetMapping("/bmi")
  11. public double calculate(double height, double weight) {
  12. return calculatorService.calculate(height, weight);
  13. }
  14. }

ServiceComb从0.3.0版本之后提供了对SpringMvc中简化注解(即GetMapping等)的支持。

这里用@RestSchema注释端点后, ServiceComb 微服务框架会自动生成对应的服务端点契约,并根据如下的 microservice.yaml 文件中的定义来配置端点端口,将契约和服务一起注册到服务注册中心。

  1. APPLICATION_ID: bmi
  2. service_description:
  3. name: calculator
  4. version: 0.0.1
  5. servicecomb:
  6. service:
  7. registry:
  8. address: http://127.0.0.1:30100
  9. rest:
  10. address: 0.0.0.0:7777

服务启动入口

服务启动入口中只需添加 @EnableServiceComb 的注解即可启用 ServiceComb 微服务框架,代码如下:

  1. @SpringBootApplication
  2. @EnableServiceComb
  3. public class CalculatorApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(CalculatorApplication.class, args);
  6. }
  7. }

体质指数界面实现

本模块负责提供用户界面及网关服务。其实现主要分为三部分:

  • 前端界面

  • 网关及路由规则

  • 服务启动入口

其中,前端界面的组件使用了Bootstrap来开发。

网关及路由规则

网关服务主要用到了业界有名的Netflix Zuul来实现。

引入依赖:

  1. <dependency>
  2. <groupId>org.apache.servicecomb</groupId>
  3. <artifactId>spring-boot-starter-discovery</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.apache.servicecomb</groupId>
  7. <artifactId>spring-boot-starter-servicecomb</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.apache.servicecomb</groupId>
  11. <artifactId>spring-cloud-zuul</artifactId>
  12. </dependency>

ServiceComb从0.4.0-SNAPSHOT版本之后新增了spring-cloud-zuul模块使能提供对zuul的兼容。

application.yaml 文件中配置路由规则及服务端口信息:

  1. zuul:
  2. routes:
  3. calculator: /calculator/**
  4. # disable netflix eureka since it's not used for service discovery
  5. ribbon:
  6. eureka:
  7. enabled: false
  8. server:
  9. port: 8889

microservice.yaml 文件中配置网关服务的信息和服务注册中心的地址。

  1. APPLICATION_ID: bmi
  2. service_description:
  3. name: gateway
  4. version: 0.0.1
  5. servicecomb:
  6. service:
  7. registry:
  8. address: http://127.0.0.1:30100

此处将服务注册中心和Zuul相结合使其能发现服务。

服务启动入口

服务启动入口也只需要声明启用 ServiceCombZuul 即可。

  1. @SpringBootApplication
  2. @EnableZuulProxy
  3. @EnableServiceComb
  4. public class GatewayApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(GatewayApplication.class, args);
  7. }
  8. }

至此,体质指数应用已开发完毕,您可以通过快速入门指南中的步骤对其进行验证。

下一步