1)我们既然是 In action, 我不解释太多标准细节的东西,读者可以自行通过附件1提供的链接,去查询标准相关的细节,开奖,下面是两张 JAX-RS 的 Lifecycle(具体请参见附件 spec 链接)的图片,读者可以先尝试理解一下图片 以帮助理解程序。 Server-side : Client-side: 2)将附录2中的源代码下载下来,用 intellij 或 eclipse 以 gradle 项目形式导入. 该项目的 JAX-RS 标准由 cxf 实现,与 Springboot 进行集成,在将项目导入后找到 类 Application, 右键 debug run,即可将该 springboot 的服务器端启动。 3)服务端启动后,http 服务即被放在了 :8080, 可访问 :8080/ws 测试 cxf servlet dispatcher 是否启动成功。此时找到 类 ClientMainDemo,这个类既是我们生成的客户端 它是业务逻辑、性能监控、传递一些 session 信息给 stateless 服务的使用 main 方法的测试。我们在 “2” 中的服务启动好之后,直接 debug 执行 ClientMainDemo 中的 main 方法: 具体代码详解我们下一步再讲(其实我不想讲解代码,代码即是文档,还烦请各位有兴趣的同学下载代码来看,代码并不复杂) 我们可以看到如下的日志: case a. 第一个 request 在服务端可以看到日志: 在客户端看到日志: 我们可以看到,服务器发现了一个 request,并且记录了它被 call 了一次(我在代码中加的日志),与此同时 在客户端我们看到该 request 发起和结束的日志, 可以统计到 request 的状态、耗时等信息, 在客户端的track埋点功能 done。 case b. 是 DEMO 中的第三个 request, 我们将一个 ThreadLocal 中的变量设置好, 并使用 jaxrs 的 provider 进行拦截并将该值读取出来放进 http request 的 header。 我们可以在客户端看到日志: 服务端看到日志: 4)执行步骤“3”之后,我们发现我们需要的三个功能都已经实现了, 我们再来具体看一看代码是怎么做的(具体的框架搭建请参考源码): 1、自动生成可与服务器交互的客户端(该客户端需要 publish 成 jar 包到 repo 中,给集成方使用) CXF 框架提供了一个叫做 JAXRSClientFactory 的类, 可以根据 endpoint + 接口 + jaxrs providers 的方式来生成客户端接口, 详细代码参见JaxrsExampleFacade 2、埋点 track 客户端执行性能(服务端我没做), 读者可以自己做 我自定义了一个类 叫做 UUIDHeaderClientRequestFilter,该类实现了 jaxrs 标准中 client 端的两个 filter 接口, 并且我将其放进了 client 的生命周期,即可用于生成每个 request 的 uuid 并且将其性能 track 起来,代码如下: 3、传递一些作为上游服务器拥有的 session 类参数给无状态的服务端 与 UUIDHeaderClientRequestFilter 一样, 实现一个叫做 OperatorHeaderClientRequestFilter 的 jaxrs provider (多个 provider 之后请读者注意控制它们的 Priority),该 Filter 会从 ThreadLocal 中读取变量值,放进 requestheader,具体代码如下: 与此同时在服务器端也实现一个叫做 OperatorFilter 的类, 作为 jaxrs 的 provider 实现 ContainerRequestFilter 和 ContainerResponseFilter, 将 http header 中的值读出来并放到 ThreadLocal 中, 在 request 结束时清空 threadlocal,详细代码如下: 希望这篇文章在您的服务化之路上有一定思路上的帮助。 附录: jax-rs spec下载地址:https://jcp.org/aboutJava/communityprocess/final/jsr339/index.html 本文源码地址:https://github.com/Agileaq/jax-rs-example.git (责任编辑:本港台直播) |