关于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给支持契约优先开发提供了很好的工具支持。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
理论+实践,带你了解分布式训练
本文分享自华为云社区《大模型LLM之分布式训练》,作者: 码上开花_Lancer。 随着语言模型参数量和所需训练数据量的急速增长,单个机器上有限的资源已无法满足大语言模型训练的要求。需要设计分布式训练(Distributed Training)系统来解决海量的计算和内存资源要求问题。 在分布式训练系统环境下需要将一个模型训练任务拆分成多个子任务,并将子任务分发给多个计算设备,从而解决资源瓶颈。但是如何才能利用包括数万计算加速芯片的集群,训练模型参数量千亿甚至是万亿的大规模语言模型?这其中涉及到集群架构、并行策略、模型架构、内存优化、计算优化等一系列的技术。 我将详细介绍分布式机器学习系统的基础概念、分布式训练集群架构、分布式训练并行策略,并以DeepSpeed 为例介绍如何在集群上训练大语言模型。 一、分布式训练概述 分布式训练(Distributed Training)是指将机器学习或深度学习模型训练任务分解成多个子任务,并在多个计算设备上并行地进行训练。图1给出了单个计算设备和多个计算设备的示例,这里计算设备可以是中央处理器(Central Processing Unit,CPU)...
- 下一篇
【GaussDB(for MySQL)】 Big IN查询优化
本文分享自华为云社区《【MySQL技术专栏】GaussDB(for MySQL) Big IN查询优化》,作者:GaussDB 数据库。 背景介绍 在生产环境中,经常会遇到客户业务的SQL语句进行过滤查询,然后进行聚合处理,并且IN谓词列表中包含几千甚至上万个常量值。如下所示,此类语句的执行时间非常长。 MySQL优化 开源MySQL在处理列IN (const1, const2, .... )时,如果列上面有索引,优化器会选择Range scan进行扫描,否则会使用全表扫描方式。range_optimizer_max_mem_size系统变量控制范围优化过程分析中可使用的最大内存。如果IN谓词的列表元素非常多,IN中每个的内容都会被视为OR每个,OR大约占用230字节,如果元素个数很多,则使用更多的内存。如果使用内存会超过定义的最大内存,会使范围优化失效,优化器将改变策略,如转换为全表扫描,从而引发查询的性能下降。 对于这个优化问题,可以通过调整range_optimizer_max_mem_size来处理。range_optimizer_max_mem_size定义的内存是会话级别...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作