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

java,chassis,api,first · 浏览次数 : 0

小编点评

## Java Chassis 3技术解密:契约优先(API First)开发 **简介:** Java Chassis 是一个基于API的软件开发框架,可以帮助开发人员创建跨语言、跨平台的RESTful API服务。 契约优先开发是指将API设计作为首要任务,通过工具自动生成代码实现API的功能。 **主要特点:** * 语言无关性描述语言:可以使用Java描述服务接口,并通过工具生成对应语言的代码。 * 设计、开发、测试、部署、运维全流程协同处理。 * 通过契约生成自动化测试代码,提高测试效率。 * 可以用于文档生成、应用监控统计等各个方面。 **技术支持:** * Web Service:WSDL * gRPC:IDL * Spring Boot: OpenAPI **示例:** 定义服务接口: ```java @RequestMapping(path = \"/provider\") public interface ProviderService { @GetMapping(\"/sayHello\") String sayHello(@RequestParam(\"name\") String name); } ``` 定义提供者和消费者: **提供者:** ```java @RestSchema(schemaId = \"ProviderController\", schemaInterface = ProviderService.class) public class ProviderController implements ProviderService { @Override public String sayHello(String name) { return "Hello " + name; } } ``` **消费者:** ```java @Configuration public class ProviderServiceConfiguration { @Bean public ProviderService providerService() { return Invoker.createProxy("provider", "ProviderController", ProviderService.class); } } ``` **使用示例:** 使用 OpenAPI 文档生成API信息,并使用GET请求访问服务: ```bash curl -X GET \ -H "Content-Type: application/json" \ -O - \ "openapi: 3.0.1\ninfo: \ntitle: swagger definition for org.apache.servicecomb.samples.api.ProviderService\nversion: 1.0.0\nservers:- url: /providerpaths: /sayHello: \nget: 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" ```

正文

本文分享自华为云社区《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给支持契约优先开发提供了很好的工具支持。

 

点击关注,第一时间了解华为云新鲜技术~

 

与关于Java Chassis 3的契约优先(API First)开发相似的内容:

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

本文分享自华为云社区《Java Chassis 3技术解密:契约优先(API First)开发》,作者: liubao68。 契约优先(API First)开发是指应用程序开发过程中,将API设计作为第一优先级的任务。契约优先开发随着Web Services概念的发展而不断得到重视,特别是微服务架构

关于《Java并发编程之线程池十八问》的补充内容

一、写在开头 在上一篇文章我们写《Java并发编程之线程池十八问》的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充。 二、Runnable vs Callable 在创建线程的时候,一般会选用 Runnable 和 Callable 两种方式。 【源码对

[转帖]关于Java:是否可以覆盖-XX + HeapDumpOnOutOfMemoryError生成的堆转储的文件权限?

https://www.codenong.com/12484559/ Can you override the file permissions for the heap dump produced by -XX+HeapDumpOnOutOfMemoryError? 在Linux上,使用-XX+H

关于Java已死,看看国外开发者怎么说的

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f4928251cca8446891aafb4d014abf39~tplv-k3u1fbpfcp-zoom-1.image) 博主在浏览 medium 社区时,发现了一篇点赞量 1.5k 的文

Java多线程

一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建

第119篇: JavaScript 类

好家伙,我们先来复习一下 关于Java,类的三大特征: 1、封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 2、继承,继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复代码。 3、多态,体现为覆盖和重载,Js没有重载,有

给师妹写的《Java并发编程之线程池十八问》被表扬啦!

写在开头 之前给一个大四正在找工作的学妹发了自己总结的关于Java并发中线程池的面试题集,总共18题,将之取名为《Java并发编程之线程池十八问》,今天聊天时受了学妹的夸赞,心里很开心,毕竟自己整理的东西对别人起到了一点帮助,记录一下! Java并发编程之线程池十八问 经过之前的学习,我们知道在Ja

关于对于Java中Entity以及VO,以及DTO中Request对象序列化的学习

关于 Serializable的探讨 前提引入 是由于软件测试上有同学提到说,什么该字段在程序刚运行时,导致jvm激增,所以吸引了我的注意 回顾代码 MybatisPlus Generator自动生成的entity中就经常带有这个, 而且我在开发代码的时候VO,以及DTO常常是直接复制对应的enti

Java爬虫-爬取疫苗批次信息

今年3月份开始,就接到通知, 根据《关于开展有关人群第二剂次脊髓灰质炎灭活疫苗补种工作的通知》国疾控卫免发〔2024〕1号文件要求,在2016年3月1日至2019年9月30日之间出生的儿童,凡无接种禁忌者,需补齐2剂次脊髓灰质炎灭活疫苗。由于我家一直是异地打针【在外漂打工,懂的都懂】,疫苗本上信息又

Java 21 新特性:switch的模式匹配

在之前的Java 17新特性中,我们介绍过关于JEP 406: switch的模式匹配,但当时还只是关于此内容的首个预览版本。之后在JDK 18、JDK 19、JDK 20中又都进行了更新和完善。如今,在JDK 21中,该特性得到了最终确定!下面,我们就再正式学习一下该功能! 在以往的switch语