`
wx1569020408
  • 浏览: 26904 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

基于javaAPI的http rpc请求微框架

 
阅读更多

公司内部一般都是用自研的rpc pigeon

但是涉及到第三方合作都会使用http请求,如果你尝试使用httpclient你又会被众多的版本和不同的api所困扰,经常忘记设置线程数,忘记设置超时时间等。

就算你搞定了httpclient,你会发现与第三方定义的请求方式和描述难于维护,交于第二个维护的时候代码不容易阅读,于是基于javaAPI来请求http请求的想法萌生,就有了如下的微框架。

本框架有如下优势:

  1. 基于httpclient, 仅暴露常用的配置, 填掉了常见的坑
  2. 接口设计参考jsoup, 简易的语法让人耳目一新
  3. 支持所有的请求方法:GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS,TRACE
  4. 出参入参对json极为友好, 自动解析返回对象to pojo
  5. 可以像rpc一样基于java api发送http请求, 代码更加规范稳定, 易于管理
  6. 当返回值为HttpResult时, 调用失败也不会抛出异常.
  7. 支持返回值取json path, 例如:msg.user.id/msg.user[1].id 参考测试包下 ResultJsonPathTest
  8. 支持设计重试次数, 建议get请求都有重试机制, 参考测试包下 RetryTest
  9. 支持上传各种类型的文件, 支持File/InputStream/byte[]/base64上传, 参考测试包下 UploadFileTest
  10. 支持@PathVariable 如 http://.com/{key}/info -> http://.com/xiaojie.chen/info, 参考测试包下 SimpleTest
  11. 支持自定义httpclient, 参考 CustomHttpClientTest
  12. 自定义请求拦截器可以作于自定义授权
  13. 日志清晰,排查case十分方便
  14. 支持自定义植入监控,如大众点评的cat
  15. 开发者正处壮年,有问题立即反馈~~哈哈哈

 

具体的源码和使用方式请访问:

https://github.com/chenxiaojie/http-invoker

 

使用入门:

最简单的实例,先定义个httpapi

public interface SimpleHttpApi {

    //get
    @RequestMapping(value = "/simple/{loginId}", method = HttpMethod.GET)
    Response<UserLoginModel> getByLoginId(@PathVariable("loginId") int loginId,
                                          @RequestParam(value = "employeeId") String employeeId,
                                          @RequestParam(value = "employeeName") String employeeName,
                                          @RequestParam(value = "ad") String ad);


    //post
    @RequestMapping(value = "/{path}", method = HttpMethod.POST)
    HttpResult<Response<UserLoginModel>> addUser5(@RequestBody UserLoginModel userLoginModel,
                                                  @PathVariable("path") String path,
                                                  @RequestParam(value = "employeeId") String employeeId,
                                                  @RequestParam(value = "employeeId") String employeeId2,
                                                  @RequestParam(value = "employeeId") String employeeId3,
                                                  @RequestParam(value = "employeeName") String employeeName,
                                                  @RequestParam(value = "ad") String ad);
    
    
    //upload
    @RequestMapping(value = "/{path}", method = HttpMethod.POST)
    HttpResult<Response<String>> upload(@RequestFile("a1.png") InputStream in,
                                        @RequestFile("a2.png") File file,
                                        @RequestFile("a3.png") byte[] fileBytes,
                                        @RequestFile("a4.png") String base64,
                                        @PathVariable("path") String path,
                                        @RequestParam(value = "employeeId") String employeeId,
                                        @RequestParam(value = "employeeId") String employeeId2,
                                        @RequestParam(value = "employeeId") String employeeId3,
                                        @RequestParam(value = "employeeName") String employeeName,
                                        @RequestParam(value = "ad") String ad);
    
    //retry
    @RequestMapping(value = "/simple/{loginId}", method = HttpMethod.GET, retryTimes = 1)
    HttpResult<Response<UserLoginModel>> getByLoginId(@PathVariable("loginId") String loginId,
                                                          @RequestParam(value = "employeeId") String employeeId,
                                                          @RequestParam(value = "employeeName") String employeeName,
                                                          @RequestParam(value = "ad") String ad);
    
    
    //jsonPath
    @RequestMapping(value = "/simple/list", method = HttpMethod.GET, retryTimes = 1, resultJsonPath = "data[1].employeeName")
    String queryUsers();

}

 

通过java方式调用

HttpInvocationHandler httpInvocationHandler = new HttpInvocationHandler();
httpInvocationHandler.setRequestUrlPrefix(Consts.URL);

SimpleHttpApi simpleHttpApi = (SimpleHttpApi) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
        new Class[]{SimpleHttpApi.class},
        httpInvocationHandler);

UserLoginModel userLoginModel = new UserLoginModel();
userLoginModel.setLoginId(1);
userLoginModel.setEmployeeId("0016004");
userLoginModel.setEmployeeName("陈孝杰");
userLoginModel.setAd("xiaojie.chen");

Response<UserLoginModel> response = simpleHttpApi.addUser(userLoginModel);

System.out.println(response.getData());

 

通过spring方式调用

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="httpParent" class="com.chenxiaojie.http.invoker.spring.HttpProxyFactoryBean" abstract="true" init-method="init">
        <property name="invocationHandler">
            <bean class="com.chenxiaojie.http.invoker.proxy.HttpInvocationHandler">
                <property name="requestUrlPrefix" value="http://localhost:8081/httpinvoker"></property>
            </bean>
        </property>
    </bean>

    <!-- 只需配置下方代码即可 -->
    <bean id="simpleHttpApi" parent="httpParent">
        <property name="proxyInterfaces" value="com.chenxiaojie.http.invoker.test.http.api.SimpleHttpApi"/>
    </bean>
</beans>

 

转载于:https://my.oschina.net/chenxiaojie/blog/1583957

分享到:
评论

相关推荐

    基于java aio 的RPC 远程调用框架.zip

    基于Java AIO实现的RPC框架,能够利用异步I/O的优势,提高远程服务调用的效率和响应速度。 在设计基于Java AIO的RPC框架时,我们需要考虑以下几个核心知识点: 1. **Java NIO基础**:理解Java NIO的基础概念,包括...

    基于java的高性能RPC框架 nfs-rpc.zip

    本教程将深入探讨基于Java实现的高性能RPC框架——nfs-rpc,它旨在提供高效、易用且可扩展的解决方案。 一、RPC框架的核心概念 1. 客户端(Client):发起RPC调用的一方,通常在本地系统上运行,需要调用远程服务...

    基于Java的高性能RPC框架 nfs-rpc.zip

    Java平台上的RPC框架有很多,如Hadoop的Hadoop RPC、Apache Thrift、Google的gRPC等,而“nfs-rpc”则是一个专门基于Java开发的高性能RPC框架。这个框架的设计目标是提供高效、稳定、易用的跨网络服务调用能力。 ...

    Java使用传统socket手写的远程RPC框架调用框架

    通过以上介绍,我们可以看到这个基于Java Socket的手写RPC框架是如何利用核心概念实现远程服务调用的。它简化了分布式系统间的通信,提高了开发效率。然而,实际生产环境中,为了提高性能、稳定性和可扩展性,我们...

    java实现rpc框架

    例如,可以使用HTTP/1.1或HTTP/2,结合RESTful API设计原则,实现基于HTTP的RPC通信。Java的HttpURLConnection类和HttpClient库(如Apache HttpClient)可以方便地处理HTTP请求和响应。 综上所述,构建一个Java实现...

    基于netty的手写rpc框架

    在本项目中,我们将基于Netty实现一个手写的RPC框架。Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于构建高效的服务器和客户端。 首先,我们需要理解RPC框架的基本组成部分: 1. **服务...

    基于Java的源码-高性能RPC框架 nfs-rpc.zip

    本项目"nfs-rpc"是一个基于Java实现的高性能RPC框架,旨在提供高效、可靠且易用的服务调用解决方案。 在Java中,RPC框架如Hessian、Dubbo、gRPC等已经非常成熟,而nfs-rpc可能是针对特定场景或需求进行优化的版本。...

    Apache Dubbo是一个高性能的,基于Java的开源RPC服务框架

    Apache Dubbo是一个由阿里巴巴开发并开源的高性能Java RPC(Remote Procedure Call)服务框架,它旨在提高微服务架构中的服务间通信效率。Dubbo的核心特性包括服务注册与发现、负载均衡、容错机制、以及监控与管理,...

    java自制简单RPC调用例子

    客户端是发起RPC请求的程序。它通过创建API接口的代理对象,调用这个代理对象的方法,实际上会触发RPC调用。在Java中,这通常涉及到动态代理的使用,如Java的InvocationHandler接口和Proxy类。客户端需要知道服务端...

    java 手写rpc框架 rpc-server and rpc-client

    Java中的`Socket` API可以用于基本的TCP/IP通信,或者使用高效的NIO(非阻塞I/O)框架如Netty来提高性能。 - **多线程模型**:为了处理并发请求,服务器通常会使用线程池。线程池的配置如核心线程数、最大线程数、...

    基于Java语言开发的开源RPC服务框架,提供高性能,高可用的远程调用能力。.zip

    总之,基于Java的开源RPC服务框架为开发者提供了强大的工具,帮助他们构建高性能、高可用的分布式系统。通过对上述各个关键模块的掌握,开发者可以更好地利用这类框架,提升软件系统的整体质量和效率。

    基于 Spark Netty Rpc 框架,重新实现的一个 Netty Rpc 框架 ( scala + java ).zip

    标题中的“基于 Spark Netty Rpc 框架,重新实现的一个 Netty Rpc 框架 ( scala + java )”指的是一个开发项目,该项目利用了Apache Spark的Netty RPC(远程过程调用)机制,并以此为基础创建了一个新的RPC框架。...

    SimpleRPCFramework是一款基于 Nacos 实现的 RPC 框架。网络传输实现了基于 Java 原生.zip

    Java原生网络传输是SimpleRPCFramework实现的关键部分,这意味着框架在设计时充分利用了Java的Socket API和其他网络编程接口来构建高效的网络通信机制。Java原生网络传输的优势在于它的灵活性、稳定性和性能,能够...

    JSONRPC+JSON+Java

    这些框架提供了一套完整的API,帮助开发者快速构建基于JSONRPC的服务端和客户端。 首先,我们来看JSONRPC的核心概念: 1. **请求(Request)**: JSONRPC请求是一个包含方法名、参数和唯一ID的对象,用于指定客户端...

    最简单的JAVA RPC框架实现

    在Java中实现一个简单的RPC框架,我们需要理解以下几个关键概念和技术: 1. **网络通信**:RPC的核心是通过网络进行通信。在Java中,我们可以使用Socket API来实现客户端和服务器端之间的数据传输。Socket提供了低...

    Java框架JSON-RPC项目demo代码实战

    本项目实战主要基于JSON-RPC进行,我们将探讨如何使用Java实现一个简单的JSON-RPC服务端和客户端。 首先,JSON-RPC的基本工作原理是,客户端发起一个包含方法名和参数的JSON请求到服务器,服务器接收到请求后执行...

    RPC框架底层模拟

    通常,RPC框架会封装这些底层细节,提供更高级别的API供开发者使用。 5. **调用模型**: RPC框架有多种调用模型,如同步阻塞、异步非阻塞、回调等。在同步阻塞模型中,调用方会等待直到返回结果;异步非阻塞模型中...

    RPC(远程过程调用)

    - Dubbo:阿里巴巴开源的Java RPC框架,专注于高性能、轻量级的远程服务调用。 - SOAP(简单对象访问协议):一种基于XML的早期RPC标准,通常用于Web服务。 - RESTful API:虽然不是严格的RPC,但可以实现类似的...

    java 使用json-rpc

    JSON-RPC for Java是一种基于JSON(JavaScript Object Notation)协议的远程过程调用(Remote Procedure Call)框架,它允许客户端通过网络调用服务器上的方法,实现了客户端与服务器端的轻量级通信。本文将详细解释...

    适用于桌面开发的JSONRPC框架

    5. **集成与应用**:在桌面开发中,该框架可以与各种编程语言和库结合,如C#、Java、Python等,通过API接口进行调用。开发者需要理解框架提供的API,以便在客户端和服务端之间创建和处理RPC调用。 6. **安全考虑**...

Global site tag (gtag.js) - Google Analytics