如何以正确的方式构建可扩展的SDK(了解AWS SDK的收益)

2020-07-09 21:14:54

AWS SDK为110多项服务维护和发布SDK,每天对所有SDK进行同步和多次更新。有趣的是,他们实现了所有大公司都在努力实现的目标,无缝、毫不费力地推出了新的API。在AWS的旗舰娱乐大会“Re:Inent”期间,SDK更新了新的API,这些API在不到2小时的时间里刚刚宣布,供全世界使用。

要与任何AWS服务交互,您需要使用Python、Java或您的软件使用的任何其他语言的AWS SDK。

我一直是AWS的PHP SDK的一名工程师,它在Github上是开源的,任何人都可以查看AWS团队发布的代码。AWS管理超过8个SDK,包括用于Java、Ruby、python、javascript、PHP、Go、C++和少数其他语言的SDK。

通常,只管理一个SDK需要大量的工程师。要确保所有的API和功能在所有SDK上都可用,这是一项巨大的壮举。在这篇文章中,我们将讨论如何扩展SDK,以及AWS如何通过手动更新每个SDK来实现跨所有SDK的完美同步,而无需晃动SDK团队。

所有SDK都有两个部分,一个是核心,另一个包含所有特定于服务的代码。SDK的核心处理各种功能,如“使用AWS的Sigv4协议对每个请求进行签名”、安全功能、SSL处理、多线程、异步请求、服务员、分页器,以及更多功能。

每个SDK的其他部分基于特定于每个服务的“模型”文件。每个SDK中的所有模型文件都完全相似。

这种差别在AWS的python SDK中非常明显,它分为两个不同的存储库“boto”和“botocore”。

所有的模型文件都在一定程度上建立在OpenApi协议之上,并与Swagger API协议兼容。

以下是名为“api-2.json”的AWS PHP SDK中DynamoDB的JSON定义,Boto SDK中也存在名为“service-2.json”的完全相同的文件。

在AWS,每个服务都将发布这些JSON模型文件,这些文件指定了与每个API&;服务相关的所有信息。与其他SDK相比,每个SDK处理这些文件的方式略有不同。PHP SDK会在每个客户端动态加载这些JSON文件,以支持各种API,而Java SDK会将这些方法预先构建到具体的类中。

每个AWS团队都会维护并发布这些特定于服务的模型文件,然后每个SDK团队都可以按照自己喜欢的方式使用这些文件。

我相信这些在你看来就像我第一次看到它时一样神奇。那么让我们深入研究一下代码吧。我们将查看PHP SDK示例,因为这是我所在的团队的一部分,我对SDK了如指掌。

";调用";:{";名称";:";调用";,";http";:{";方法";:";发布";,";requestUri";:";/2015-03-31/functions/{FunctionName}/invocations";},";input";:{";shape";:";InvocationRequest";},";output";:{";shape";:";InvocationResponse";},";错误";:[{";形状";:";服务异常";},{";shape";:";ResourceNotFoundException";},{";shape";:";InvalidRequestContentException";},{";形状";:";RequestTooLargeException";},{";shape";:";UnsupportedMediaTypeException";},{";shape";:";TooManyRequestsException";},{";shape";:";InvalidParameterValueException";},{";shape";:";EC2UnexpectedException";},{";shape";:";SubnetIPAddressLimitReachedException";},{";shape";:";ENILimitReachedException";},{";shape";:";EC2ThrottledException";},{";shape";:";EC2AccessDeniedException";},{";shape";:";InvalidSubnetIDException";},{";shape";:";InvalidSecurityGroupIDException";},{";shape";:";InvalidZipFileException";},{";shape";:";KMSDisabledException";},{";shape";:";KMSInvalidStateException";},{";shape";:";KMSAccessDeniedException";},{";shape";:";KMSNotFoundException";},{";shape";:";InvalidRuntimeException";}]}。

上面的API需要一个“InvocationRequest”对象,并返回一个“InvocationResponse”对象。

";InvocationRequest";:{";类型";:";结构";,";必填";:[";函数名";],";成员";:{";函数名";:{";shape";:";NamespacedFunctionName";,";位置";:";URI";,";位置名";:";函数名";},";激发类型";::";形状";:";激发类型";,";位置";:";标题";,";locationName";:";X-Amz-Invocation-Type";},";日志类型";:{";形状";:";日志类型";,";Location";:";Header";,";locationName";:";X-Amz-Log-Type";},";ClientContext";:{";Shape";:";String";,";Location";:";Header";,";locationName";:";X-Amz-Client-Context";},";Payload";:{";shape";:";Blob";},";限定符";:{";形状";:";限定符";,";位置";:";查询字符串";,";位置名称";:";限定符";}},";有效载荷";:";有效载荷";}。

";InvocationResponse";:{";Type";:";Structure";,";Members";:{";StatusCode";:{";Shape";:";Integer";,";Location";:";statusCode";},";FunctionError";:{。,";位置";:";标题";,";locationName";:";X-Amz-Function-Error";},";日志结果";:{";形状";:";字符串";,";位置";:";标题";,";locationName";:";X-Amz-Log-Result";},";Payload";:{";shape";:";Blob";},";ExecutedVersion";:{";Shape";:";Version";,";Location";:";Header";,";locationName";:";X-Amz-Executed-Version";}},";Payload";:";Payload";},

PHP SDK会自动为每个请求和响应对象生成代码,如下所示:

$Result=$Client-&>;Invoke(array(//FunctionName是必需的';FunctionName';=&>;String';,';InvocationType';=&>;';String';,';LogType';=&>;';String';,';ClientContext';=>;&#。';混合类型:string|resource|\Guzzle\Http\EntityBodyInterface';,';限定符';=>;';字符串';,));

因此,对于这些服务更新,各个SDK团队根本不需要“手动”编写任何代码。服务团队(在本例中为AWS Lambda)只需确保他们创建的模型文件没有错误。SDK将能够自动生成对现有客户端的任何更新,以及为新的API和服务自动生成代码。

SDK团队最棒的部分是,IS是完全开源的,并且直接集成到各种AWS服务中。

API Gateway允许您部署Swagger(也称为OpenAPI标准)模型,然后使用API直接生成具有已内置到AWS SDK中的所有功能的SDK。

我希望这对为您的服务设计SDK有帮助。在任何SDK中,重点都应该放在创建符合“OpenApi”标准的模型文件上。有了API的标准模型,就可以用很少的开发时间启动各种语言的SDK,变得超级简单和快速。