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获得 :

乍一看似乎不错,但我们最好确保一切按预期进行。 一旦我们有了带有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 )。

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

附带说明一下,如果您更靠近图片中的痕迹,您可能会注意到服务器和使用者使用了不同版本的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

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

  1. 解决Kafka消费端错误:o.s.kafka.listener.LoggingErrorHandler : Error while processing: null

    简单记录下使用kafka遇到的问题,万一也会有小伙伴遇到了呢. 程序端使用springboot服务消费kafka,某天出现消息大量堆积,经过定位到错误日志如下: 2020-05-12 10:22:36 ...

  2. kafka消费端慢慢延迟(网络带宽不足)

    2020-09-29 问题描述:线上业务出现推送延迟,启动测试工具订阅topic,能看到数据正常时间能对上(数据写进去了),用kafka自带的也能对上, 通过分析后发现工具记录的日志在9点41分启动- ...

  3. Kafka消费异常报Failing OffsetCommit request since the consumer

    目录 前言 排查与解决 总结 前言 前段时间线上某个业务系统的Kafka消费端出现数据异常,一直在重复消费某个时间段内的数据,导致界面上重复数据越来越多,询问运维发现前几日有出现过一次网络波动,推测可 ...

  4. 鉴权kafka生产端(SCRAM)

    前言 kafka官网关于sasl_scram 鉴权Kafka消费端配置 创建SCRAM Credentials 依赖zk,需要先启动zk,然后在zk中创建存储SCRAM 凭证: cd kafkaclu ...

  5. 京东慧采平台让企业享受消费端的购物既视感

    中国电商市场竞争最为激烈的显然是每年的购物狂欢节--双十一.据统计,今年天猫的GMV(商品交易总额)超千亿元人民币,同比增长52.7%,全网包裹数6.8亿个,再次证明了其在电商市场的地位.然而你可能并 ...

  6. kafka 服务端消费者和生产者的配置

    在kafka的安装目录下,config目录下有个名字叫做producer.properties的配置文件 #指定kafka节点列表,用于获取metadata,不必全部指定 #需要kafka的服务器地址 ...

  7. rabbitmq 不同的消费者消费同一个队列_RabbitMQ 消费端限流、TTL、死信队列

    消费端限流 1. 为什么要对消费端限流 假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户端,会出现这样情况: 巨量的消息瞬间全部推送过来,但是我 ...

  8. kafka 基础概念、命令行操作(查看所有topic、创建topic、删除topic、查看某个Topic的详情、修改分区数、发送消息、消费消息、 查看消费者组 、更新消费者的偏移位置)

    文章目录 前言 1. 基础概念 Broker Producer Consumer Consumer Group Topic Partition Replica 2. 命令行操作 2.1 查看所有top ...

  9. rabbitmq 消费端代码获取队列名称_RabbitMQ四:生产者--队列--消费者

    AMQP协议的梳理和名词解析 建议先把上篇AMQP协议先看一遍,理解一下,由于用XMind绘图,电脑屏幕比较小,不能截取全部,如果想要全图和源代码,请下面留言....... 可以点击图片,打开到新的页 ...

最新文章

  1. LTE: MIB和SIB,小区选择和重选规则
  2. 20145223 《信息安全系统设计基础》课程总结
  3. oracle active data guard概述
  4. (原)ubuntu16中编译boost1.61.0库
  5. C# Color颜色对照表
  6. vba 不等于_EXCEL中VBA基础语句(1)
  7. 每个人都是生活的导演
  8. 使用jQuery获取表格内容、:nth-child() 选择器用法
  9. Azure: 给 ubuntu 虚机挂载数据盘
  10. Atitit.spring体系结构大总结 1. Spel表达式解析 1 2. Srping mvc 1 3. Ioc 4 3.1. ApplicationContext在BeanFactory的基础
  11. 悉数美剧《黑客军团》中的黑客工具
  12. Adobe Photoshop 2021 22.4.2 绿色精简版
  13. 期末作业实验报告:MLP实验对比(MLPClassifier)
  14. 纳米数据,足球比分,赛事数据接口api,足球数据接口
  15. 蓝牙4.0、经典蓝牙、BT、BLE的关系与区别
  16. 单元测试——(王婧201421123065,陈艺菡201421123068)
  17. 直播系统开发,一对一直播源码开发
  18. 未归一化导致Dead ReLU的悲剧
  19. JS应用(资料很全)
  20. Masm for Winodws 集成实验环境安装绿色免费版

热门文章

  1. 牛客算法周周练4 题解
  2. CodeForces 1191A---Tokitsukaze and Enhancement
  3. CF914G Sum the Fibonacci(FWT模板+子集卷积)
  4. P6113-[模板]一般图最大匹配【带花树】
  5. jzoj6803-NOIP2020.9.26模拟tom【构造】
  6. nssl1323,jzoj(初中)2107-交流【dfs,容斥,组合数】
  7. USACO2.3【dfs,dp,背包】
  8. 【DP】奇怪汉诺塔(ybtoj DP-1-2)
  9. 【拓扑排序】【DP】奖金(ssl 1325)
  10. 【高精】Oliver的成绩(jzoj 2008)