不知所措:您是否真的需要为您的API提供客户端库?

RESTful Web服务和API的优点在于,任何使用HTTP协议的使用者都可以理解和使用它。 但是,同样的难题一遍又一遍地弹出:您是否应该将Web APis与客户端库一起使用? 如果是,您应该支持哪些语言或/和框架?

通常这并不是一个容易回答的问题。 因此,让我们退后一步,想一想总体思路:客户端库可以为消费者带来什么价值?

也许有人会说降低采用的门槛。 确实,特别是在强类型语言的情况下,从您喜欢的IDE探索API合同(请语法突出显示和自动完成!)非常方便。 但是总的来说, RESTful Web API非常简单,一开始就可以使用,并且好的文档当然在这里会更有价值。

其他人可能说,保护消费者避免使用多个API版本或粗糙边缘是件好事。 也是有道理的,但我认为这只是掩盖了有关Web API的设计和随着时间的发展而存在的缺陷。

总而言之,无论您决定捆绑多少个客户端,任何通用的HTTP使用者( curl , HttpClient , RestTemplate ,您都可以命名)仍然可以访问这些API。 做出选择是很棒的,但是维护费用可能会很高。 我们可以做得更好吗? 正如您可能已经猜到的,因此在本帖子中,我们当然有很多选择。

成功的关键要素是使用OpenAPI v3.0或什至其前身Swagger / OpenAPI 2.0 (或RAML , API Blueprint并没有多大关系)来维护RESTful Web API的准确规范。 在使用OpenAPI / Swagger的情况下,该工具为王:可以使用Swagger Codegen (一种模板驱动的引擎)以多种不同的语言生成API客户端(甚至是服务器存根),这就是我们要讨论的内容在这篇文章中。

为了简化操作,我们将实现上一篇文章中构建的人员管理Web API的使用者。 首先,我们需要得到它开始的OpenAPI V3.0规范的YAML (或JSON )格式。

java -jar server-openapi/target/server-openapi-0.0.1-SNAPSHOT.jar

然后:

wget http://localhost:8080/api/openapi.yaml

太棒了,实际上完成了一半的工作。 现在,让我们让Swagger Codegen带头。 为了不使问题复杂化,我们假设使用者也是Java应用程序,因此我们可以毫无困难地理解其机制(但是Java只是其中一种选择, 受支持的语言和框架的列表令人惊讶)。

在本文中,我们将使用OpenFeign ,这是最高级的Java HTTP客户端绑定程序之一。 它不仅非常简单易用,而且还提供了许多集成,我们将从中很快受益。

<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-core</artifactId><version>9.7.0</version>
</dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-jackson</artifactId><version>9.7.0</version>
</dependency>

Swagger Codegen可以作为独立的应用程序从命令行运行,也可以作为Apache Maven插件运行(后者是我们要使用的插件)。

<plugin><groupId>io.swagger</groupId><artifactId>swagger-codegen-maven-plugin</artifactId><version>3.0.0-rc1</version><executions><execution><goals><goal>generate</goal></goals><configuration><inputSpec>/contract/openapi.yaml</inputSpec><apiPackage>com.example.people.api</apiPackage><language>java</language><library>feign</library><modelPackage>com.example.people.model</modelPackage><generateApiDocumentation>false</generateApiDocumentation><generateSupportingFiles>false</generateSupportingFiles><generateApiTests>false</generateApiTests><generateApiDocs>false</generateApiDocs><addCompileSourceRoot>true</addCompileSourceRoot><configOptions><sourceFolder>/</sourceFolder><java8>true</java8><dateLibrary>java8</dateLibrary><useTags>true</useTags></configOptions></configuration></execution></executions>
</plugin>

如果某些选项不是很清楚,那么Swagger Codegen会提供很好的文档来进行说明。 要注意的重要方面是languagelibrary ,它们分别设置为javafeign 。 需要注意的一件事是, OpenAPI v3.0规范的支持大部分已经完成,但是您仍然可能会遇到一些问题(如您所注意到的,版本是3.0.0-rc1 )。

构建完成后,您将得到的是纯朴的Java接口PeopleApi (带有OpenFeign批注),它是人员管理Web API规范(来自/contract/openapi.yaml )的直接投影。 请注意,所有模型类也会生成。

@javax.annotation.Generated(value = "io.swagger.codegen.languages.java.JavaClientCodegen",date = "2018-06-17T14:04:23.031Z[Etc/UTC]"
)
public interface PeopleApi extends ApiClient.Api {@RequestLine("POST /api/people")@Headers({"Content-Type: application/json", "Accept: application/json"})Person addPerson(Person body);@RequestLine("DELETE /api/people/{email}")@Headers({"Content-Type: application/json"})void deletePerson(@Param("email") String email);@RequestLine("GET /api/people/{email}")@Headers({"Accept: application/json"})Person findPerson(@Param("email") String email);@RequestLine("GET /api/people")@Headers({"Accept: application/json"})List<Person> getPeople();
}

让我们将其与具有相同规范的Swagger UI解释进行比较,可从http:// localhost:8080 / api / api-docs?url = / api / openapi.json获得 :

客户端库API规范

乍一看似乎正确,但我们最好确保一切按预期进行。 一旦有了带有OpenFeign注释的接口,就可以使用Feign构建器家族将其启用 (在本例中,通过代理实现),例如:

final PeopleApi api = Feign.builder().client(new OkHttpClient()).encoder(new JacksonEncoder()).decoder(new JacksonDecoder()).logLevel(Logger.Level.HEADERS).options(new Request.Options(1000, 2000)).target(PeopleApi.class, "http://localhost:8080/");

伟大,流利的建筑风格的岩石。 假设我们的人员管理Web API服务器已启动并正在运行(默认情况下,它将在http:// localhost:8080 /上可用):

java -jar server-openapi/target/server-openapi-0.0.1-SNAPSHOT.jar

我们可以通过调用新构建的PeopleApi实例方法来与之通信,如下面的代码片段所示:

final Person person = api.addPerson(new Person().email("a@b.com").firstName("John").lastName("Smith"));

真的很酷,如果我们将其倒回一点,我们实际上什么也没做。 仅提供Web API规范,一切都是免费提供给我们的! 但是,让我们不要在这里停下来,提醒自己,使用Java接口不会消除我们正在处理远程系统的现实。 毫无疑问,事情迟早会在这里失败。

不久前,我们了解了断路器及其在分布式系统中正确应用时的实用性。 以某种方式将这个功能引入我们基于OpenFeign的客户端真的很棒。 请欢迎该家族的另一个成员HystrixFeign builder与Hytrix库无缝集成:

final PeopleApi api = HystrixFeign.builder().client(new OkHttpClient()).encoder(new JacksonEncoder()).decoder(new JacksonDecoder()).logLevel(Logger.Level.HEADERS).options(new Request.Options(1000, 2000)).target(PeopleApi.class, "http://localhost:8080/");

我们唯一需要做的就是将这两个依赖项添加到使用者的pom.xml文件中(严格来说,如果您不介意使用旧版本,则不需要hystrix-core )。

<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-hystrix</artifactId><version>9.7.0</version>
</dependency><dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-core</artifactId><version>1.5.12</version>
</dependency>

可以说,这是集成多么容易和直接的最好的例子之一。 但这还不是故事的结局。 分布式系统中的可观察性从来没有像现在这样重要,正如我们不久前所了解的那样 ,分布式跟踪在帮助我们解决这一问题上非常有用。 再说一次, OpenFeign开箱即用地支持它,让我们来看一下。

OpenFeign与兼容OpenTracing的跟踪器完全集成。 Jaeger跟踪器就是其中之一,它具有非常好的Web UI前端,可以探索跟踪和依赖项。 让我们先运行它,幸运的是它是完全Docker化的。

docker run -d -e \COLLECTOR_ZIPKIN_HTTP_PORT=9411 \-p 5775:5775/udp \-p 6831:6831/udp \-p 6832:6832/udp \-p 5778:5778 \-p 16686:16686 \-p 14268:14268 \-p 9411:9411 \jaegertracing/all-in-one:latest

为了使OpenFeign客户端了解OpenTracing功能,还必须引入几个其他依赖项。

<dependency><groupId>io.github.openfeign.opentracing</groupId><artifactId>feign-opentracing</artifactId><version>0.1.0</version>
</dependency><dependency><groupId>io.jaegertracing</groupId><artifactId>jaeger-core</artifactId><version>0.29.0</version>
</dependency>

Feign构建器的角度来看,唯一的变化(除了引入tracer实例之外)是将客户端包装到TracingClient中 ,如下面的代码片段所示:

final Tracer tracer = new Configuration("consumer-openapi").withSampler(new SamplerConfiguration().withType(ConstSampler.TYPE).withParam(new Float(1.0f))).withReporter(new ReporterConfiguration().withSender(new SenderConfiguration().withEndpoint("http://localhost:14268/api/traces"))).getTracer();final PeopleApi api = Feign.builder().client(new TracingClient(new OkHttpClient(), tracer)).encoder(new JacksonEncoder()).decoder(new JacksonDecoder()).logLevel(Logger.Level.HEADERS).options(new Request.Options(1000, 2000)).target(PeopleApi.class, "http://localhost:8080/");

在服务器端,我们还需要与OpenTracing集成。 Apache CXF 对它提供了一流的支持 ,捆绑到cxf-integration-tracing-opentracing模块中。 让我们将其作为依赖项包括在内,这一次是服务器的pom.xml

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-integration-tracing-opentracing</artifactId><version>3.2.4</version>
</dependency>

根据配置应用程序的方式,应该有一个可用的跟踪程序实例,例如,稍后应将其传递给OpenTracingFeature

// Create tracer
final Tracer tracer = new Configuration("server-openapi", new SamplerConfiguration(ConstSampler.TYPE, 1),new ReporterConfiguration(new HttpSender("http://localhost:14268/api/traces"))).getTracer();// Include OpenTracingFeature feature
final JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
factory.setProvider(new OpenTracingFeature(tracer()));
...
factory.create()

从现在开始,通过生成的OpenFeign客户端对任何人员管理API端点的调用将完全可在Jaeger Web UI中找到,该Web UI可从http:// localhost:16686 / search获取 (假设Docker主机为localhost )。

客户端库消费者openapi

我们的场景非常简单,但请想象一下实际的应用程序,其中单个请求在系统中传输时,可能会发生数十个外部服务调用。 没有适当的分布式跟踪,每个问题都有机会变成一个谜。

附带说明一下,如果您更靠近图片中的痕迹,则可能会注意到服务器和使用者使用了不同版本的Jaeger API。 这不是错误,因为最新发布的Apache CXF版本使用的是较旧的OpenTracing API版本(因此,也使用了较旧的Jaeger客户端API),但这不会阻止事情按预期进行。

这样,就该总结了。 希望在RESTful Web服务和API的世界中基于合同(甚至更好,首先合同)开发的好处变得越来越明显:智能客户端的生成, 消费者驱动的合同测试 ,可发现性和丰富的文档越来越多只是一些提及。 请利用它!

完整的项目资源可在Github上找到 。

翻译自: https://www.javacodegeeks.com/2018/06/provide-client-libraries-apis.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自适应盲均衡3】多模算法(MMA)——复数改进常模算法(MCMA)的理论推导与MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 接上篇【自适应均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 理论推导 MMA或者MCMA其实是在CMA基础上改进而得到的,有学者称其为实虚部分开的常模算法。该算法使均衡器输出信号的实部与虚部分别收敛于各自的模值,改…

程序猿必备工具『CSDN浏览器助手』之超实用小工具测评

CSDN浏览器助手简介 CSDN浏览器助手由CSDN官方开发&#xff0c;集成【一键呼出搜索】、【万能快捷工具】、【个性标签页】和【 “真”免广告】四大功能&#xff0c;打开后给人的第一印象就是 清新脱俗 四个字&#xff0c;功能非常丰富&#xff0c;快捷键的使用能够大大提高工作…

【自适应盲均衡4】基于RLS的多径衰落信道均衡算法(RLS-CMA)的理论推导与MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 一、回顾CMA和MMA 对于前面两种算法 【自适应均衡】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 【自适应均衡】多模算法(MMA)——复数改进常模算法(MCMA)的理论推导与MATLAB仿真 误差信号为:

【自适应(盲)均衡6】信号过多径衰落信道的矩阵乘法表示之Toeplitz矩阵和Toeplitz块矩阵的生成(分数间隔FSE)

关注公号【逆向通信猿】更精彩!!! 信号过系统(多径信道)的连续形式 信号过系统(多径信道)的离散采样形式 通常接收端处理的是数字信号,需对接收信号进行采样,当采样率为符号速率时,即为符号间隔采样;采样率为符号速率的P倍时,为分数间隔采样 至于为什么要用分数…

JDK 9/10/11:Java字符串上+ =带来的副作用

问题“ 为什么array [i &#xff05;n] i ”在Java 8和Java 10中给出不同的结果&#xff1f; ”已于本周初发布在StackOverflow.com上 。 它指向JDK9和更高版本中存在的Java编译器中的错误 &#xff0c;但JDK8中不存在。 如StackOverflow线程上所述&#xff0c; Didier L提供…

【自适应盲均衡7】分数间隔的复数常模算法(FSE-CMA)

关注公号【逆向通信猿】更精彩!!! 理论推导 基于分数间隔的复数常模算法(FSE-CMA)的推导其实与符号间隔的算法是类似的,见 【自适应盲均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 分数间隔均衡器模型 分数间隔均衡器通常有两种比较经典的模型,…

JavaFX技巧30:带有DropShadow的ScrollPane

最近&#xff0c;在我的一个项目中&#xff0c;我发现用户很难看到ScrollPane实例的内容当前是否已滚动。 一种更清晰的方法是在滚动窗格的顶部添加阴影。 这也是Google的Material Design建议的。 所以我尝试了一下。 在我的解决方案中&#xff0c;我只是向ScrollPane添加了一…

【有限域除法】二元多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】试读更多内容!!! 二元多项式除法电路原理 例: g ( x ) = x 4 + x 2 + x + 1 g(x)=x^4 + x^2+x+1

Spring Apache Kafka教程

在本SpringApache Kafka课程中&#xff0c;我们将学习如何在Spring Boot项目中开始使用Apache Kafka&#xff0c;并开始生成和使用我们所选主题的消息。 除了一个简单的项目外&#xff0c;我们还将深入探讨Kafka的术语以及分区概念在Kafka中的工作方式。 让我们开始吧。 1.简介…

adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用

adf4351使用方法众所周知&#xff0c;可以通过某些URL直接从浏览器或某些外部应用程序调用有限任务流。 如果任务流的属性“ URL invoke”设置为“ URL-invoke-allowed”&#xff0c;则启用此功能&#xff0c;该功能通常在集成项目中使用。 通常&#xff0c;客户端&#xff08;…

【定时同步系列2】16QAM调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】阅读更多内容!!! 算法回顾 关于O&M算法的原理、公式推导与详解,请参考博客: 【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导 鉴于前期有很多读者私信博主O&M算法的MATLAB仿真过程,前期太忙没来得及做。终于抽得一日闲,可…

【定时同步系列3】8PSK调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(实信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于8PSK调制,仿真结果如下: 误码率曲线图 假设 E b / n 0 = 14 d B Eb/n_0 = 14dB

借助Web技术,桌面用户界面将保持活跃

要了解Java桌面应用程序有什么问题&#xff0c;让我们看一下JavaFX&#xff08;桌面应用程序的领先UI框架&#xff09;的新功能。 很明显&#xff0c;它正在向Web方法发展&#xff0c;从Web世界中借用了越来越多的功能。 JavaFX支持一部分CSS功能&#xff0c;并附带其自己的属性…

Win10窗口侧边栏设置Win7模式

本人非常不喜欢Win10的几个系统功能 贴靠窗口时自动调整窗口大小&#xff0c;填满可用空间关将窗口对齐时&#xff0c;显示能够在其旁边对齐的内容当我调整某个贴靠窗口的大小时&#xff0c;也调整任何相邻贴靠窗口的大小 想调整成Win7那种模式和风格的话&#xff0c;设置如下…

VS2017无法打开文件MSVCRTD.lib

需要添加组件&#xff0c;如下图

【定时同步系列4】QPSK调制+OM定时(FFT实现及频域补偿)+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于QPSK调制,仿真结果如下: **分析:**可以看出,补偿前的定时相位约为-0.1,补偿后的相位在0附近波动,但由于没有进行环路滤波(可采用卡尔曼滤波器),所以波动很大,这也导致了后续解调结果不理想,实际中必须加入滤波器…

【锁相环系列2】数字判决反馈环之BPSK信号解调MATLAB仿真(含环路滤波器参数设置)

关注公号【逆向通信猿】更精彩!!! 仿真结果 频偏补偿之前的星座图,是一个“环”。 频偏补偿后的BPSK信号星座图 解调误码率曲线 <

hadoop emr_在Amazon EMR上运行Hadoop MapReduce作业

hadoop emr不久前&#xff0c;我发布了如何使用CLI设置EMR群集的信息。 在本文中&#xff0c;我将展示如何使用适用于AWS的Java SDK来设置集群。 展示如何使用Java AWS开发工具包执行此操作的最佳方法是展示我认为完整的示例&#xff0c;因此让我们开始吧。 设置一个新的Maven…

【MFC系列2】Win32项目转换为MFC项目

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 一、MFC的组成 a)必须有一个CWinApp的派生类&#xff1b; b)必须用派生类在全局定义一个对象theApp; c)在派生类中必须重写InitInstance虚函数&#xff1b; d)MFC程序就用CWinApp派生类中的InitInstance虚…

servlet面试常问问题_50个Servlet面试问答

servlet面试常问问题Servlet是Java EE的一个非常重要的主题&#xff0c;所有Web应用程序框架&#xff08;例如Spring和Struts&#xff09;都建立在它之上。 这使servlet成为Java访谈中的热门话题。 在这里&#xff0c;我提供了50个servlet面试问题的列表&#xff0c;并提供了答…