Spring Boot 微服务上容器平台的最佳实践 - 8 - Rest Service

2022-04-21 14:02:46 浏览数 (1)

前言

今天开始第八篇, 主要介绍 spring微服务的相关设计和开发思路, 这次介绍REST服务的实现.

Airports 服务是应用程序中最简单的微服务,这为构建基本的Spring Boot REST服务提供了很好的参考。

Spring Boot Rest Service

Spring Boot Application Class

要将Java项目指定为Spring Boot应用程序,需要包含一个用SpringBootApplication注释的Java类,该类实现默认的Java main方法.

代码语言:javascript复制
package com.redhat.refarch.obsidian.brownfield.lambdaair.airports;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RestApplication
{
 public static void main(String[] args)
 {
  SpringApplication.run( RestApplication.class, args );
 }
}

声明应用程序名称(application name)也是一种良好的实践,它可以作为common application properties的一部分。这个应用程序使用以每个项目的名称开头的application.yml 文件.

代码语言:javascript复制
spring:
  application:
    name: airports

Maven Project File

每个微服务项目都包含一个Maven POM文件,该文件除了声明模块属性(module properties)和依赖项外,还包含一个配置文件定义(profile definition),用于使用fabric8-maven-plugin创建和部署K8S或OpenShift镜像。

该POM文件使用一个属性(property)来声明包含操作系统和Java开发工具包(JDK)的基础镜像。此应用程序中的所有服务都构建在Red Hat Enterprise Linux (RHEL)基础镜像之上,其中包含一个受支持的OpenJDK版本:

代码语言:javascript复制
<properties>
...
  <fabric8.generator.from>registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift</fabric8.generator.from>
</properties>

要轻松地包含提供REST服务的简单Spring Boot应用程序的依赖项,请声明以下两个构件(artifacts):

代码语言:javascript复制
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

此应用程序中的每个服务还声明了对Spring Boot Actuator 组件的依赖关系,其中包括许多附加功能,可以帮助监视和管理应用程序。

代码语言:javascript复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

当声明了对Actuator的依赖时,fabric8会生成默认的OpenShift health probes,该probes与Actuator服务通信,以确定服务是否正在运行(running)并准备(ready)好为请求提供服务:

代码语言:javascript复制
    livenessProbe:
      failureThreshold: 3
      httpGet:
        path: /health
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 180
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1
    readinessProbe:
      failureThreshold: 3
      httpGet:
        path: /health
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1

Spring Boot REST Controller

要接收和处理REST请求,需要包含一个用RestController注释的Java类.

代码语言:javascript复制
...
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Controller

在application properties(应用程序属性)中为该服务指定监听端口:

代码语言:javascript复制
server:
  port: 8080

每个REST操作都由Java方法实现。业务操作通常需要指定请求参数:

代码语言:javascript复制
@RequestMapping( value = "/airports", method = RequestMethod.GET )
public Collection<Airport> airports(
  @RequestParam( value = "filter", required = false ) String filter)
{
 ...

启动初始化

Airports 服务在启动时使用 eager initialization(即时初始化)将机场数据加载到内存中。这是通过监听特定类型事件的ApplicationListener实现的:

代码语言:javascript复制
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Component
public class ApplicationInitialization implements 
ApplicationListener<ContextRefreshedEvent>
{
 @Override
 public void onApplicationEvent(ContextRefreshedEvent 
contextRefreshedEvent)

小结

这篇有2个知识点:

  1. 当声明了对Actuator的依赖时,fabric8会生成默认的OpenShift health probes. 这也算fabric8的一个优势, 少了人工加probe的步骤;
  2. 能外部化的配置都可以外部化到: application properties里. 它可以是application.yml.

0 人点赞