公司内部一般都是用自研的rpc pigeon
但是涉及到第三方合作都会使用http请求,如果你尝试使用httpclient你又会被众多的版本和不同的api所困扰,经常忘记设置线程数,忘记设置超时时间等。
就算你搞定了httpclient,你会发现与第三方定义的请求方式和描述难于维护,交于第二个维护的时候代码不容易阅读,于是基于javaAPI来请求http请求的想法萌生,就有了如下的微框架。
本框架有如下优势:
- 基于httpclient, 仅暴露常用的配置, 填掉了常见的坑
- 接口设计参考jsoup, 简易的语法让人耳目一新
- 支持所有的请求方法:GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS,TRACE
- 出参入参对json极为友好, 自动解析返回对象to pojo
- 可以像rpc一样基于java api发送http请求, 代码更加规范稳定, 易于管理
- 当返回值为HttpResult时, 调用失败也不会抛出异常.
- 支持返回值取json path, 例如:msg.user.id/msg.user[1].id 参考测试包下 ResultJsonPathTest
- 支持设计重试次数, 建议get请求都有重试机制, 参考测试包下 RetryTest
- 支持上传各种类型的文件, 支持File/InputStream/byte[]/base64上传, 参考测试包下 UploadFileTest
- 支持@PathVariable 如 http://.com/{key}/info -> http://.com/xiaojie.chen/info, 参考测试包下 SimpleTest
- 支持自定义httpclient, 参考 CustomHttpClientTest
- 自定义请求拦截器可以作于自定义授权
- 日志清晰,排查case十分方便
- 支持自定义植入监控,如大众点评的cat
- 开发者正处壮年,有问题立即反馈~~哈哈哈
具体的源码和使用方式请访问:
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>
相关推荐
基于Java AIO实现的RPC框架,能够利用异步I/O的优势,提高远程服务调用的效率和响应速度。 在设计基于Java AIO的RPC框架时,我们需要考虑以下几个核心知识点: 1. **Java NIO基础**:理解Java NIO的基础概念,包括...
本教程将深入探讨基于Java实现的高性能RPC框架——nfs-rpc,它旨在提供高效、易用且可扩展的解决方案。 一、RPC框架的核心概念 1. 客户端(Client):发起RPC调用的一方,通常在本地系统上运行,需要调用远程服务...
Java平台上的RPC框架有很多,如Hadoop的Hadoop RPC、Apache Thrift、Google的gRPC等,而“nfs-rpc”则是一个专门基于Java开发的高性能RPC框架。这个框架的设计目标是提供高效、稳定、易用的跨网络服务调用能力。 ...
通过以上介绍,我们可以看到这个基于Java Socket的手写RPC框架是如何利用核心概念实现远程服务调用的。它简化了分布式系统间的通信,提高了开发效率。然而,实际生产环境中,为了提高性能、稳定性和可扩展性,我们...
例如,可以使用HTTP/1.1或HTTP/2,结合RESTful API设计原则,实现基于HTTP的RPC通信。Java的HttpURLConnection类和HttpClient库(如Apache HttpClient)可以方便地处理HTTP请求和响应。 综上所述,构建一个Java实现...
在本项目中,我们将基于Netty实现一个手写的RPC框架。Netty是Java领域的一个高性能、异步事件驱动的网络应用程序框架,常用于构建高效的服务器和客户端。 首先,我们需要理解RPC框架的基本组成部分: 1. **服务...
本项目"nfs-rpc"是一个基于Java实现的高性能RPC框架,旨在提供高效、可靠且易用的服务调用解决方案。 在Java中,RPC框架如Hessian、Dubbo、gRPC等已经非常成熟,而nfs-rpc可能是针对特定场景或需求进行优化的版本。...
Apache Dubbo是一个由阿里巴巴开发并开源的高性能Java RPC(Remote Procedure Call)服务框架,它旨在提高微服务架构中的服务间通信效率。Dubbo的核心特性包括服务注册与发现、负载均衡、容错机制、以及监控与管理,...
客户端是发起RPC请求的程序。它通过创建API接口的代理对象,调用这个代理对象的方法,实际上会触发RPC调用。在Java中,这通常涉及到动态代理的使用,如Java的InvocationHandler接口和Proxy类。客户端需要知道服务端...
Java中的`Socket` API可以用于基本的TCP/IP通信,或者使用高效的NIO(非阻塞I/O)框架如Netty来提高性能。 - **多线程模型**:为了处理并发请求,服务器通常会使用线程池。线程池的配置如核心线程数、最大线程数、...
总之,基于Java的开源RPC服务框架为开发者提供了强大的工具,帮助他们构建高性能、高可用的分布式系统。通过对上述各个关键模块的掌握,开发者可以更好地利用这类框架,提升软件系统的整体质量和效率。
标题中的“基于 Spark Netty Rpc 框架,重新实现的一个 Netty Rpc 框架 ( scala + java )”指的是一个开发项目,该项目利用了Apache Spark的Netty RPC(远程过程调用)机制,并以此为基础创建了一个新的RPC框架。...
Java原生网络传输是SimpleRPCFramework实现的关键部分,这意味着框架在设计时充分利用了Java的Socket API和其他网络编程接口来构建高效的网络通信机制。Java原生网络传输的优势在于它的灵活性、稳定性和性能,能够...
这些框架提供了一套完整的API,帮助开发者快速构建基于JSONRPC的服务端和客户端。 首先,我们来看JSONRPC的核心概念: 1. **请求(Request)**: JSONRPC请求是一个包含方法名、参数和唯一ID的对象,用于指定客户端...
在Java中实现一个简单的RPC框架,我们需要理解以下几个关键概念和技术: 1. **网络通信**:RPC的核心是通过网络进行通信。在Java中,我们可以使用Socket API来实现客户端和服务器端之间的数据传输。Socket提供了低...
本项目实战主要基于JSON-RPC进行,我们将探讨如何使用Java实现一个简单的JSON-RPC服务端和客户端。 首先,JSON-RPC的基本工作原理是,客户端发起一个包含方法名和参数的JSON请求到服务器,服务器接收到请求后执行...
通常,RPC框架会封装这些底层细节,提供更高级别的API供开发者使用。 5. **调用模型**: RPC框架有多种调用模型,如同步阻塞、异步非阻塞、回调等。在同步阻塞模型中,调用方会等待直到返回结果;异步非阻塞模型中...
- Dubbo:阿里巴巴开源的Java RPC框架,专注于高性能、轻量级的远程服务调用。 - SOAP(简单对象访问协议):一种基于XML的早期RPC标准,通常用于Web服务。 - RESTful API:虽然不是严格的RPC,但可以实现类似的...
JSON-RPC for Java是一种基于JSON(JavaScript Object Notation)协议的远程过程调用(Remote Procedure Call)框架,它允许客户端通过网络调用服务器上的方法,实现了客户端与服务器端的轻量级通信。本文将详细解释...
5. **集成与应用**:在桌面开发中,该框架可以与各种编程语言和库结合,如C#、Java、Python等,通过API接口进行调用。开发者需要理解框架提供的API,以便在客户端和服务端之间创建和处理RPC调用。 6. **安全考虑**...