写点什么

关于 Java Chassis 3 的契约优先(API First)开发

作者:EquatorCoco
  • 2024-05-09
    福建
  • 本文字数:2164 字

    阅读完需:约 7 分钟

契约优先(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;  }}
复制代码


  • 定义消费者

@Configurationpublic 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.1info:  title: swagger definition for org.apache.servicecomb.samples.api.ProviderService  version: 1.0.0servers:- url: /providerpaths:  /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: stringcomponents: {}
复制代码


这个信息可以用于 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 给支持契约优先开发提供了很好的工具支持。


文章转载自:华为云开发者联盟

原文链接:https://www.cnblogs.com/huaweiyun/p/18181306

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
关于Java Chassis 3的契约优先(API First)开发_Java_EquatorCoco_InfoQ写作社区