首页 > 编程语言 >关于Java Chassis 3的契约优先(API First)开发

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

时间:2024-05-09 09:02:55浏览次数:25  
标签:Java name sayHello Chassis API 契约 服务

本文分享自华为云社区《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,name,sayHello,Chassis,API,契约,服务
From: https://www.cnblogs.com/huaweiyun/p/18181306

相关文章

  • Face Detection API
    一个针对图像中的人脸进行识别的底层加速平台组件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,user-scalable=no,initial-scale=1.0"......
  • 经过dnat后访问kube-apiserver证书认证失败
    问题现象iptables-tnat-IOUTPUT-d10.10.10.10-ptcp--dport443-jDNAT--to-destination192.168.0.105:6443#报错requesteddomainnamedoesnotmatchtheserver'scertificate,无法通过证书认证。curlhttps://10.10.10.10:443/livez--key./client.key--cert......
  • 三维API sheder 基础
    这个shader是靠三维数学影响二维像素导致像素颜色改变它是每个像素走一遍脚本算法写的时候注意语言格式写错了shader脚本是不能用的,根本就不好使这个可以用区域用xyzy为0没第三坐标,Y是三维的高度xz才是地面用数字限制出是椭圆啊,还是正方形长方形啥的全影响就不锁......
  • 如果你还不了解 Java Class 文件结构,来看看这篇吧
    文章首发于【Java天堂】,跟随我探索Java进阶之路!Class文件是什么JavaClass文件是Java编译器将源代码编译后的二进制表示,它是Java虚拟机(JVM)运行的基础。Class文件绝大部分内容是在1997年发布的第一版《Java虚拟机规范》中就已经定义好的,后续20多年的发展过程当中Java经历了大......
  • 5.8——前端api
    文章分类模块importrequestfrom"@/utils/request.js";//import{useTokenStore}from"@/stores/token.js";//文章分类列表查询//文章分类列表查询exportconstarticleCategoryListService=()=>{//获取token状态//consttokenStore=useTokenStore();//通过......
  • 实时股票数据API接口websocket接入方法
    一、使用websocket的协议提升传输速度实时金融股票API接口对于投资者和交易员来说至关重要。通过使用WebSocket接入方法,可以轻松获取实时金融股票API接口的数据并及时做出决策。WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的轮询请求。这种接入方法具有多......
  • 编程:java 发送email程序:通用版本:借鉴“蚂蚁小哥 <[email protected]>”的文章
     1packagecom.alibaba.otter.canal.adapter.launcher.loader;23importjava.text.SimpleDateFormat;4importjava.util.*;5importjavax.mail.*;6importjavax.mail.internet.*;78publicclassJavaxJavaMailClient{910private......
  • Java ThreadLocal 类的使用
    基于Java-ThreadLocal类的使用整理ThreadLocal表示线程的局部变量,当前线程可以通过set/get来对这个局部变量进行操作,其他线程不能对其进行访问ThreadLocal支持泛型,也就是支持指定value类型,像是ThreadLocal<Date>就是指定value为Date类型。每个线程会有一......
  • Java容器化改造
    dockerjava项目容器化改造前后端分离项目前端https://gitee.com/yuco/eladmin-web.git后端https://gitee.com/yuco/eladmin.git要素:vuenpmspringbootmysqlredisjava后端容器化思路:了解在物理机虚拟机的部署流程,然后编写dockerfile进行容器化部署。java项目,使用mv......
  • 用友接口对接怎么做,U8API接口对接,轻松应对复杂集成场景!
    在企业上云的大趋势下,U8+全面转向互联网方向,深入融合云应用,一站式提供财务、营销、制造、采购、设计、协同、人力等领域的“端+云”服务,并通过软硬一体化、产业链协同的策略全面赋能成长型企业在技术、供应链、生产、财税、营销等领域的创新升级。为成长型企业提供基于互联网的......