關於Java Chassis 3的契約優先(API First)開發

华为云开发者联盟發表於2024-05-09

本文分享自華為雲社群《Java Chassis 3技術解密:契約優先(API First)開發》,作者: liubao68。

契約優先(API First)開發是指應用程式開發過程中,將API設計作為第一優先順序的任務。契約優先開發隨著Web Services概念的發展而不斷得到重視,特別是微服務架構出現以後,API設計成為影響功能開放、效能最佳化等問題的關鍵因素。常見的契約優先開發框架和模式有如下幾種:

  • Web Services技術可以由設計人員先編寫WSDL描述WEB服務內容,然後結合工具生成程式碼。WSDL可以進行分發,不同的語言都可以結合WSDL生成客戶端。
  • gRPC技術可以由設計人員先編寫IDL描述RPC服務內容,然後結合工具生成程式碼。gRPC主要解決服務內部之間的呼叫。
  • Spring Boot允許開發人員利用swagger工具,先編寫Open API介面,然後透過工具生成RESTFul的服務端程式碼。

這些技術都要求設計人員掌握一種語言無關的描述語言(WSDL、IDL、Swagger等),並且透過工具生成具體語言的程式碼。它們支援的應用場景也有所差異,Web Service適合對外的WEB服務,gRPC適合對內的RPC服務。Java Chassis契約優先開發具備下面的幾個改進:

  • 允許直接使用Java語言定義服務介面,不需要設計者掌握新的描述語言。
  • 同時定義Web服務介面和內部RPC介面。

和Spring Boot一樣, Java Chassis的語言無關性描述語言仍然是Open API,透過Open API,可以滿足跨語言和服務分發的要求。

契約優先開發的過程

契約優先開發可以涵蓋設計、開發、測試、部署、運維等軟體開發的全流程,透過契約可以實現不同環節的並行工作,從而提高開發效率。 一個簡單的契約開發過程如下:

下面透過程式碼簡單展示透過Java語義定義契約,並實現提供者和消費者的過程。

  • 定義服務契約
@RequestMapping(path = "/provider")
public interface ProviderService {
  @GetMapping("/sayHello")
  String sayHello(@RequestParam("name") String name);
}
  • 定義提供者
@RestSchema(schemaId = "ProviderController", schemaInterface = ProviderService.class)
public class ProviderController implements ProviderService {
  @Override
  public String sayHello(String name) {
    return "Hello " + name;
  }
}
  • 定義消費者
@Configuration
public class ProviderServiceConfiguration {
  @Bean
  public ProviderService providerService() {
    return Invoker.createProxy("provider", "ProviderController", ProviderService.class);
  }
}

使用RPC方式訪問提供者。

@RestSchema(schemaId = "ConsumerController", schemaInterface = ConsumerService.class)
public class ConsumerController implements ConsumerService {
  private ProviderService providerService;

  @Autowired
  public void setProviderService(ProviderService providerService) {
    this.providerService = providerService;
  }

  @Override
  public String sayHello(String name) {
    return providerService.sayHello(name);
  }
}
  • 服務分發和Web服務訪問

提供者的服務定義會生成如下Open API資訊

openapi: 3.0.1
info:
  title: swagger definition for org.apache.servicecomb.samples.api.ProviderService
  version: 1.0.0
servers:
- url: /provider
paths:
  /sayHello:
    get:
      operationId: sayHello
      parameters:
      - name: name
        in: query
        required: true
        schema:
          type: string
      responses:
        "200":
          description: response of 200
          content:
            application/json:
              schema:
                type: string
            application/protobuf:
              schema:
                type: string
            text/plain:
              schema:
                type: string
components: {}

這個資訊可以用於WEB服務訪問,比如上面的資訊可以使用

GET /providers/sayHello?name=World

的HTTP請求來訪問。 對於其他框架或者語言,也可以使用Open API生成對應的程式碼來訪問。

服務治理

服務治理被設計為獨立於開發過程,結合Open API和服務治理規則描述語言,能夠對API進行服務治理配置。

servicecomb:
  matchGroup:
    helloOperation: |
      matches:
        - apiPath:
            prefix: "/provider/sayHello"
  rateLimiting:
    ## 限流器每10毫秒允許透過100個請求,如果一個請求超過1000毫秒沒有獲取到
    ## 許可,將被拒絕
    helloOperation: |
      rate: 100
      limitRefreshPeriod: 10
      timeoutDuration: 1000

上述規則對API介面進行限流控制。

契約優先開發的其他方面

測試方面,可以透過契約生成自動化測試程式碼,以覆蓋API的測試。 部署實施方面,可以將Open API資訊匯入閘道器,實現API能力開放、認證鑑權、計費等。 此外,契約還可以用於文件生成、應用監控統計等各個方面。

總結

Java Chassis基於JAVA語言的介面定義,可以同時滿足Native語言和平臺無關描述語言兩種情況的SDK分發,並且不需要使用工具生成額外的執行程式碼,給外部服務開發和內部服務開發提供了統一一致的開發體驗。 契約優先開發是面向服務化/微服務化非常高效的過程方法,Java Chassis給支援契約優先開發提供了很好的工具支援。

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章