kafka 消费端 api_在消费者的眼中:您真的需要为您的API提供客户端库吗?

kafka 消费端 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会提供很好的文档来进行说明。 要注意的重要的的就是语言 ,分别设置为Java假装 。 需要注意的一件事是, 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

kafka 消费端 api

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

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

相关文章

linux 进程的vss rss uss,内核/内存管理中的VSS/RSS/PSS/USS

转自&#xff1a;http://www.douban.com/note/161471809/RSS is the total memory actually held in RAM for a process.RSS can be misleading, because it reports the total all of the shared libraries that the process uses, eventhough a shared library is only loade…

如何将类加载到内存

// 将类Driver加载到内存&#xff0c;在内存会产生一个和类Driver对应的Class实例 Class class Class.forName("com.mysql.jdbc.Driver");// 获取类加载器&#xff0c;任何类都有个class属性&#xff0c;这个属性返回类在内存中对应的那个Class实例&#xff0c;通过…

idea资源包下创建资源包_根据谁创建资源授权资源

idea资源包下创建资源包我的一位同事向我提出了一个关于StackOverflow的有趣问题&#xff0c;并由于我在Spring方面的经验&#xff0c;建议我回答一个很好的问题。 问题是&#xff0c;“ 如何基于使用批注在REST中创建资源的用户来授权特定资源 。” 要点是&#xff1a; 我正…

如何卸载linux中的docker,linux centos7 安装、卸载docker

docker安装1&#xff1a;查看系统版本cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core)2:安装docker(yum方式)$ yum install docker3&#xff1a;查看是否安装成功$docker version若输出以下&#xff0c;说明安装成功Client:Version: 1.12.6API version: …

html页面中Location对象跳转页面用法

姓名&#xff1a;<input name"name"/></br> 薪水&#xff1a;<input name"salary"/></br> 年龄&#xff1a;<input name"age"/></br> <input type"submit" value"确认"/></br…

java orm框架有哪些_Java Stream ORM现在带有JOIN

java orm框架有哪些Speedment是一个Java Stream ORM工具包和运行时&#xff0c;它使您可以将数据库表作为标准Java Streams查看。 由于不必混合使用Java和SQL&#xff0c;因此该应用程序变得更加紧凑&#xff0c;从而使其开发速度更快&#xff0c;更不容易出错并且易于维护。 流…

linux pdb创建表空间,ORACLE12C PDB创建默认表空间和用户语句(示例代码)

第一次接触到12C CDB和PDB数据库&#xff0c;且客户提供的是ORACLE一体机&#xff0c;只有访问权&#xff0c;费劲周折&#xff0c;今记录12C创建默认路径表空间语句和用户--创建默认表空间&#xff1a;create tablespace tablesapce_name datafile size 500M autoextend on …

用户在页面输入的中文数据,servlet如何获得正确的中文值

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 告诉浏览器&#xff0c;返回的是html页面&#xff0c;而且是以utf-8编码的response.setContentType("text/html;charsetutf-8");//reques…

java编写排序的代码_在Java 8之前,您编写了几行代码来对对象集合进行排序?...

java编写排序的代码在Java 8之前&#xff0c;您编写了几行代码来对对象集合进行排序&#xff1f; Java 8您需要多少个&#xff1f; 您可以在Java 8中用一行完成。 让我们看看下面的Employee类。 public class Employee {private String name;private Integer age;public Emp…

java全局变量和局部变量_Java 10 –局部变量类型推断

java全局变量和局部变量在本文中&#xff0c;我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能。 从Java的第一个版本开始&#xff0c;它是一种强类型化的语言&#xff0c;我们需要提及每种变量数据类型。 我们都感到Java是冗长的语言&#…

JS_Java_Oracle_MySQL截取字符串的函数

JS 截取字符串 函数 substring(indexStart, indexEnd)&#xff1a; function f1() {var s abcd;// 字符串的字符下标从0开始&#xff0c;从下标为2的字符c开始截取&#xff0c;截取到下标为3的字符d为止&#xff0c;含头不含尾&#xff0c;所以字符d没有被截取&#xff0c;最…

linux安装meld rpm,Linux meld安装

meld是一款图形化的文本比较工具&#xff0c;该工具在windows与linux平台下均有对应版本&#xff0c;最新版本为3.14.2&#xff0c;附上下载地址http://meldmerge.org/meldmeld相较diff命令其输出结果更加直观&#xff0c;因此在linux下使用该工具进行程序源码的比较。忘了说了…

linux注册平台驱动,关于Linux驱动的平台注册方式-- platform_driver_register

http://hi.baidu.com/deep_pro/blog/item/754f7764b73099fbf636544a.htmlcdev_add 、register_blkdev 这样的驱动注册函数platform_driver_register这样的写法&#xff0c;但是没有看到哪本书介绍了相关内容简要说&#xff0c;使用这种方式&#xff0c;可以轻松的实现device和d…

JDBC连接Oracle数据库的参数配置

Oracle 的连接 URL 字符串&#xff1a;jdbc:oracle:thin:host:port:sid 在数据库配置文件 db_oracle.properties 的配置字段如下&#xff1a; urljdbc:oracle:thin:localhost:1521:orcl dbUserlwx dbPassword123456 driverNameoracle.jdbc.OracleDriver

jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用

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

IntelliJ IDEA for Mac 如何设置字体和字号

按组合键 Command , 打开偏好设置窗口&#xff0c;在左侧菜单导航栏找到 Editor --> Font&#xff0c;如下图所示&#xff1a;

vs mono linux,[.NET][C#.NET]走跳在Linux的人生(八).NET Core与Mono执行

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;我们来试试用.NET Core从Windows环境开发&#xff0c;然后porting到Linux环境(布署及执行.NET Core)&#xff0c;之前曾看过stackoverflow文章提到Mono的性能问题&…

java char类型空值_展望Java的未来:空值类型

java char类型空值尽管有前途的Java值类型不是迫在眉睫&#xff0c;但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下&#xff0c;以了解事情的进展情况并了解即将发生的事情。 诚然&#xff0c;由于我对所用术语的了解有限&#xff0c;并且其中某些消息的底层细节&a…

IntelliJ IDEA 如何设置编辑窗口的背景图片

按下组合键 Shift Command A&#xff0c;打开查找动作的窗口&#xff0c;在输入框中输入 set Background Image&#xff0c;然后选中它&#xff0c;如下图所示&#xff1a; 背景图片设置窗口如下所示&#xff1a;

2013下半年福建高等学校非计算机专业学生计算机二级c语言原题,2013年福建省计算机二级c语言真题及答案(填空题部分)...

1、程序Ccon441.c的功能是&#xff1a;从键盘输入一个直角三角形的两条直角边a和b&#xff0c;计算并输出其周长和面积。将程序填写完整。#include#includevoid main(){double a,b,c,circle,area;printf("Input 2 edges:");scanf(/**/ "%lf %lf" /**/,&…