从零开始 SDK 开发
从零开始 SDK 开发
文章目录
从零开始 SDK 开发什么是 SDK?什么场景下需要 SDK ?SDK 和 starter 的区别与联系SDK(Software Development Kit)Starter区别与联系
开发中常见的 SDK工具包算是 sdk 吗 ?是所有的情况下都需要 sdk 吗?SDK 开发实战使用推荐一个小而全的架构简单适合入门学习的 SDK仿照其对照另一个网站提供官网编写发布的 SDK重点问题pom 文件配置文件提示属性注入@ConfigurationProperties 和 @Value
其他问题坑
什么是 SDK?
software development kit 软件开发包
https://www.redhat.com/zh/topics/cloud-native-apps/what-is-SDK
什么场景下需要 SDK ?
平台扩展性: 如果你希望你的应用程序或平台能够被其他开发者扩展或定制,提供一个SDK可以让开发者更容易地与你的平台进行集成。降低开发门槛: 通过提供SDK,你可以帮助其他开发者更快速地开始使用你的服务或产品,从而提高了用户的采用率。版本控制: 当你的产品或服务有更新时,你可以通过更新SDK来确保集成方能够平滑过渡,而不会因为API的变动导致应用崩溃。快速原型开发: 使用SDK可以让开发者们快速构建原型,从而在短时间内验证概念和想法。跨平台支持: 通过提供多个SDK版本,可以让开发者在不同平台上使用你的服务,比如移动端、桌面端或者Web端。提高安全性: 通过提供SDK,你可以控制与你的服务进行通信的方式和权限,从而保证数据的安全性。支持开发生态系统: 提供SDK可以帮助你建立一个强大的开发者生态系统,吸引更多的开发者和合作伙伴。
比如,我就一个地方需要使用,我需要单独拿出来封装成 sdk 吗? 当然也不一定. 如果当然拥有 sdk 能让大家忽略具体实现能更快的进入到开发,更新的时候只需要换一下引入的模板就好了。
SDK 和 starter 的区别与联系
SDK(Software Development Kit)
定义:SDK是一组开发工具、库、文档等的集合,旨在帮助开发者更容易地构建应用程序、组件或服务。SDK通常包括了一系列的API(Application Programming Interface)和工具,使得开发者能够与特定平台、系统或服务进行交互。用途:
提供了对特定平台、系统或服务的访问和控制。简化了开发者与目标平台之间的交互过程。提供了示例代码、文档等,以便开发者更容易上手。 示例:Android SDK用于开发Android应用程序,AWS SDK用于与Amazon Web Services进行交互。
Starter
定义:Starter是Spring Boot框架的一部分,它是一种特殊类型的依赖库(Dependency)或模块,用于快速配置和引导特定功能或服务。Starter包含了所需的库、配置和其他依赖,可以帮助开发者轻松地集成特定功能到Spring Boot应用中。用途:
简化了特定功能的集成和配置过程。提供了默认配置,使得开发者可以快速启动项目。减少了对第三方库的繁琐配置。 示例:Spring Boot提供了许多starter,比如spring-boot-starter-web用于快速搭建Web应用,spring-boot-starter-data-jpa用于集成持久化。
区别与联系
角色不同:
SDK是一组工具和API,用于开发者构建应用程序,与特定的平台、系统或服务交互。Starter是Spring Boot框架提供的一种依赖库,用于快速配置和引导特定功能或服务。 应用场景:
使用SDK可以与特定的平台或服务进行交互,如操作系统、云服务等。使用Starter可以快速集成特定功能,比如Web开发、数据持久化等。 联系:
在实际开发中,可以同时使用SDK和Starter来加速开发过程。比如,使用特定SDK与外部服务通信,同时使用Spring Boot Starter来快速构建应用程序。
开发中常见的 SDK
调用第三方 API:在开发过程中,经常会需要与第三方服务进行交互,比如支付接口、社交平台API等。使用相应的SDK可以简化与这些服务进行通信的过程。内部不同系统 HTTP Client 频繁调用封装:在一个大型系统中,可能会涉及到多个内部子系统的通信。为了简化这些子系统之间的HTTP请求,可以封装一个SDK,提供一些常用的HTTP请求方法,让开发者可以更方便地进行调用。中台系统:中台系统通常是一个统一的服务层,为前后端提供接口和服务,也可能会提供一些SDK给前端或其他子系统使用,以便更方便地调用中台的功能。
工具包算是 sdk 吗 ?
工具包通常包含一系列的库、模块或工具集,用于解决特定领域或问题,以便开发人员能够更快速、高效地完成特定任务。这些工具包可以涵盖各种功能,例如数据处理、网络通信、安全加密、图形处理等。
因此,从某种意义上说,工具包可以被视为是一种特定领域的SDK,其目的是为了帮助开发人员在特定领域内开发应用程序。
是所有的情况下都需要 sdk 吗?
答案当然是否定的,没有绝对正确的答案,只要能有充足的理由说服自己就可以按照自己的规则来,比如我们团队有自己的严格规范,从业务的角度上考虑我们下游的使用者数量基数比较多,所以我需要sdk 减少重复步骤,方便开发,当我有响应的更改的时候也能更快的实现多处更改,减少版本差异的可能性,换更改的时候只需要更改引入的版本号,当然其中关于接口设计方面也会有差异的,这些需要有丰富的经验和掌握一些设计模式方面的知识。
如果我只用一遍,只有一个地方调用了这个接口,我单独为了它抽离一份sdk进行管理反而加大了开发难度,增加了工作成本,所以具体开发不开发 sdk 是看团队内部风格和实际情况去决定的。
SDK 开发实战
想要进行开发,第一点就是抄,抄大家现有实现,总结网上现有的教学信息,先进行信息搜集整合,看前人经验,当然我就找了两三个简单的抄了下,做了一两个例子,平时工作中使用我也会看一看其他人的实现;当然抄永远是抄如果止步的话就没啥进步了,多问些问题然后去在进行搜集整理,才能有自己的收获。
使用
最直观的感受 SDK 开发的好处,当然腾讯的指引做的非常好,新手能轻松找到并使用,这里就不过多介绍了。找到我们需要的,这里要 maven 坐标, sdk 源码包,当然我们看不到内部的实现只能推测它在接口提供方如何进行鉴权校验的.(这也是接口保护的一种隐藏内部实现,对外只提供有限信息,门面模式有这种作用。)
https://cloud.tencent.com/document/product/436/6474
https://cloud.tencent.com/document/product/436/68282
大厂 SDK 开发就是严谨,工具类,异常返回值,案例单元测试,应有尽有,目录接口清晰,一个 sdk 就是一个完整的项目,只是打包方式不同罢了,让用户更好更快的使用自家产品,提高产品竞争力。如果调用文档写的烂,难调用的话是会被骂的,除非处于业界垄断地位,不然有更好的都会选更好的,这里就不得不提一嘴微信小程序文档了,一言难尽。好的 SDK 开发是需要成本的,所以开发 SDK 不是一个万用银弹,考虑清楚有没有必要的基础下在进行下一步工作。
当然,写大问题,以上的 SDK 大而全不利于初学者学习,虽然万变万变不离其宗,但是更多的代码量更多的业务逻辑还是会对快速学习造成很大的影响的。
推荐一个小而全的架构简单适合入门学习的 SDK
这是一个调用一个第三方 ai 平台的 sdk, 拆解下来主要分几个部分, pom 依赖引入需要工具,更改打包方式和一些发布中央仓库时的配置,第二部分构建鉴权时的用户数据,第三部分发送请求,第四部分获取相应的 key 信息,第五部分 公共的请求响应拆解和异常信息封装.当然这只是大概的区分,目的就是为了让用户引入该依赖后,能在提示下使用自己的 key 快速的构建一个可以和远程系统交互的客户端,屏蔽掉鉴权,异常处理,返回参数拆解等冗余步骤,实现更好更快的开发。
https://github.com/liyupi/yucongming-java-sdk
仿照其对照另一个网站提供官网编写发布的 SDK
当然这个 SDK 的核心就是使用 httpclient 像目标服务方发送提供发所需要的参数,并对返回值拆解罢了。
https://github.com/yidiansishiyi/zelinai-client-sdk
public class ApiAuthUtils {
public static String generateNonce(Map
List
Collections.sort(sortedKeys);
// 拼接键值对成字符串s1
StringBuilder s1Builder = new StringBuilder();
for (String key : sortedKeys) {
String value = body.get(key);
if (value != null && !value.isEmpty()) {
if (s1Builder.length() > 0) {
s1Builder.append("&");
}
s1Builder.append(key).append("=").append(value);
}
}
String s1 = s1Builder.toString();
String s2 = s1 + appsecret;
String md5Sign = SecureUtil.md5(s2.toString());
return md5Sign.toLowerCase();
}
}
上述代码为参数加密代码,生成复合接口提供方提供的数据, 重点就在于看懂接口提供方的文档,除了这部分外,其余的都是为了 SDK 的使用者有更好的体验。代码很简单,相信嗯看几遍应该也能理解如何开发一个基础的 sdk 了。
重点问题
pom 文件配置文件提示属性注入
pom 文件
第一点, SDK 是一个特殊的工程,不需要打成 jar 包,需要删除快速初始化时生成的 模块,按照 创建 SDK 工程发布中央仓库的要求去重写 模块,当然没有的话在本地也没关系。
引入依赖时候尽量以最小需要原则为主,减少体积,减少发生冲突的可能性。
配置文件提示
红色选中部分为固定格式,该包能实现在配置文件中写配置时提示我们可能要输入的参数。
关于这个包的功能有详细的讲解贴这里就不赘述 点这里!!!
属性注入
@Configuration
@ConfigurationProperties(prefix = "zelinai.client")
@Data
@ComponentScan
public class ZelinaiClientConfig {
private String appkey;
private String appsecret;
@Bean
public ZelinaiClient zelinaiClient(){
return new ZelinaiClient(appkey,appsecret);
}
}
其实如果不提示的话也能用,就是不友好,另外属性注入也可以通过 @Value 注入.
@ConfigurationProperties 和 @Value
绑定复杂对象:
@ConfigurationProperties 更适合绑定整个配置文件或一组相关的属性到一个 JavaBean。@Value 通常用于绑定一个或多个具体的值。 松散绑定:
@ConfigurationProperties 支持松散绑定(忽略大小写、破折号和下划线之间的差异)。@Value 不支持松散绑定。 属性的默认值:
@ConfigurationProperties 支持指定属性的默认值。@Value 也支持指定默认值,但需要使用 ${} 表达式。 自动刷新:
@ConfigurationProperties 支持 Spring Boot 的自动刷新配置。@Value 不支持自动刷新。 支持 JSR-303 标准验证:
@ConfigurationProperties 支持 JSR-303 标准的验证。@Value 不支持验证。 用法场景:
@ConfigurationProperties 适用于将一组相关的配置属性绑定到一个类,并且通常在 @Configuration 或 @Component 类中使用。@Value 适用于注入一个具体的值,通常用于在 @Component 或 @Service 类中注入一些简单的属性值。
其他问题
当然,以上的开发都是站在使用者的角度看问题,实际上 SDK 的开发除了基础的能用之外还要好用,要从服务的提供方角度去看带如何开发 SDK ,可以去看有关 API 签名认证的东西,而且有些 SDK 不仅仅是简单的 httpclient 就能搞得定的,在具体的业务场景中会有不同的变化,前段时间看大佬开发的关于星火模型的开源 SDK,涉及到的东西会更复杂化,不过基础原理还是相同的,拆解开了无非是那几个步骤,当然,做到和做好还是有很长一段路要走的。
API安全之路:从黑客攻防到签名认证体系
坑
补全关于 API 签名认证网关部分
解决关于 SDK 中央仓库正式发布问题
编写其他大模型 SDK
重新建立新的一套专用于 SDK 开发的模板,解决通用一个套基础模板带来的问题,嗯可以把核心包提出来发一版,大家都用一样的.
计算机网络相关知识
深入理解其中原理