关于Java Chassis 3的契约优先(API First)开发
本文分享自华为云社区《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)开发的更多相关文章
- webservice07#契约优先#webservice实现简单的动态web项目
1, 用户管理 User{username,password,nickname} 属性. 2,契约优先[ 先用schema做标准来写wsdl.再生成服务器端的接口,再编写接口的类] 在src下创建目录 ...
- Atitit 实现java的linq 以及与stream api的比较
Atitit 实现java的linq 以及与stream api的比较 1.1. Linq 和stream api的关系,以及主要优缺点1 1.2. Linq 与stream api的适用场景1 1. ...
- Atitit.java eval功能的实现 Compiler API
Atitit.java eval功能的实现 Compiler API 输出echo2 输出目录配置2 针对编译器,JDK 设计了两个接口,分别是 JavaCompiler 和JavaCompiler ...
- 如何精确地测量java对象的大小-底层instrument API
转载: 如何精确地测量java对象的大小-底层instrument API 关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象 ...
- Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错
使用了极光推送的 jar 包项目在从 SVN 中检出后,假设不又一次对 jar 包和 Bulid Path 进行配置就会抛出 java.lang.NoClassDefFoundError: cn.jp ...
- Java SE 6 新特性: 编译器 API
新 API 功能简介 JDK 6 提供了在运行时调用编译器的 API,后面我们将假设把此 API 应用在 JSP 技术中.在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面 6 个步骤: ...
- Java 9 揭秘(10. 模块API)
Tips 做一个终身学习的人. 在本章节中,主要介绍以下内容: 什么是模块 API 如何在程序中表示模块和模块描述 如何读取程序中的模块描述 如何表示模块的版本 如何使用Module和ModuleDe ...
- Java 9 揭秘(12. Process API 更新)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: Process API是什么 如何创建本地进程 如何获取新进程的信息 如何获取当前进程的信息 如何获取所有系统进程的信息 如何设置创建,查 ...
- 计算机程序的思维逻辑 (95) - Java 8的日期和时间API
本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和 ...
- java工具类(一)之服务端java实现根据地址从百度API获取经纬度
服务端java实现根据地址从百度API获取经纬度 代码: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...
随机推荐
- S7Comm报文详解
S7协议是西门子公司为其S7系列PLC(可编程逻辑控制器)通信而设计的一种专用协议.S7协议主要用于西门子PLC之间的通信,以及PLC与其他设备的通信.该协议支持多种通信方式,如MPI(多点接口).P ...
- Web、Android等程序开发中src引入外部文件和资源的方法总结
方法一:使用相对于当前文件(源文件)的相对路径 使用 ../ 对于这个例子来说 ../ 把路径带到了项目根目录的下一级目录 1 <script src="../static/js/wo ...
- C++ 自动计时
#include<iostream> #include<chrono> struct Timer { std::chrono::time_point<std::chron ...
- 性能对比 Go、Python、Perl、Ruby、Rust、C/C++、PHP、Node.js、Java.. 等多编
1. 有人说 Python 性能没那么 Low? 这个我用 pypy 2.7 确认了下,确实没那么差, 如果用 NumPy 或 其它版本 Python 的话,性能更快.但 pypy 还不完善,pypy ...
- 如何利用OpenHarmony ArkUI的Canvas组件实现涂鸦功能?
简介 ArkUI是一套UI开发框架,提供了开发者进行应用UI开发时所需具备的能力.随着OpenAtom OpenHarmony(以下简称"OpenHarmony")不断更新迭代,A ...
- BI小白收藏|一文告诉你什么是商务智能
近年来,商务智能(BI)已成为继企业资源计划之后企业信息化建设的热点领域,在国内发展迅速.利用商务智能可以为企业整合集成现有的业务数据,在深度挖掘分析的基础上为管理决策者提供决策辅助,提高科学决策水平 ...
- Qt 实现涂鸦板二:实现放大功能
在一的基础上改造: .h 文件 #pragma once #include <QtWidgets/QWidget> #include "ui_xuexi.h" #inc ...
- 【郑州轻工业大学】HarmonyOS宠物健康系统的开发分享
原文:https://mp.weixin.qq.com/s/upcS6PcMS7UBR5jgoP7eow,点击链接查看更多技术内容. 本期我们给大家带来的是家庭宠物健康监测系统开发者杨光的分享,希望能 ...
- 2024-04-13:用go语言,给定一个整数数组 `nums`, 请编写一个函数,返回一个新的数组 `counts`。 满足以下条件:对于每个 `nums[i]`, `counts[i]` 表示在
2024-04-13:用go语言,给定一个整数数组 nums, 请编写一个函数,返回一个新的数组 counts. 满足以下条件:对于每个 nums[i], counts[i] 表示在 nums[i] ...
- hive窗口分析函数使用详解系列二之分组排序窗口函数
1.综述 我们讨论面试中各大厂的SQL算法面试题,往往核心考点就在于窗口函数,所以掌握好了窗口函数,面对SQL算法面试往往事半功倍. 已更新第一类聚合函数类,点击这里阅读 hive窗口函数聚合函数类 ...