https://github.com/AsyncHttpClient/async-http-client/tree/master/providers
最近由于项目需求,研究netty,本想自己利用netty封装个异步httpclient,可惜设计能力有限。在git上发现了这个开源的工程,遂研究一番,设计的非常好。
简要记录下:
1. 主要包括以下几个工程:
async-http-client-api 这个是所有基类接口
async-http-client-netty-provider 在netty基础上封装的异步httpclient
async-http-client-grizzly-provider 在grizzly基础上封装的异步httpclient
async-http-client-apache-provider 在apache的httpclient基础上封装的异步httpclient
2. 既然我要在封装netty,那么就需要async-http-client-api和async-http-client-netty-provider 就好。
3. 在API使用上,初始化过程,首先需要配置一个config类,netty对应的是NettyAsyncHttpProviderConfig。
基类中AsyncHttpClientConfig会通过NettyAsyncHttpProviderConfig生成一个config。
初始化客户端时,
if (config == null) {
return new AsyncHttpClient();
} else {
return new AsyncHttpClient(config);
}
注意AsyncHttpClient 是在基类中定义的。netty中对应的客户端类是NettyAsyncHttpProvider
在AsyncHttpClient中,需要注意的是:
定义了一个静态变量:
private static final String[] DEFAULT_PROVIDERS = {
"com.ning.http.client.providers.netty.NettyAsyncHttpProvider",
"com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider",
"com.ning.http.client.providers.apache.ApacheAsyncHttpProvider",
"com.ning.http.client.providers.jdk.JDKAsyncHttpProvider"
};
而AsyncHttpClient的构造函数中就用到了这个DEFAULT_PROVIDERS
public AsyncHttpClient(AsyncHttpClientConfig config) {
this(loadDefaultProvider(DEFAULT_PROVIDERS, config), config);
}
private static AsyncHttpProvider loadDefaultProvider(String[] providerClassNames,
AsyncHttpClientConfig config) {
AsyncHttpProvider provider;
for (final String className : providerClassNames) {
provider = loadProvider(className, config);
if (provider != null) {
return provider;
}
}
throw new IllegalStateException("No providers found on the classpath");
}
继续深入代码,发现他是通过加载JVM中当前线程中的类名来加载的,他会依次寻找com.ning.http.client.providers.netty.NettyAsyncHttpProvider等这些包名,如果找到则返回,所以如果代码中存在多个(存在netty,grizzly)也只会加载netty的而已。
(ps:在AsyncHttpProvider的注释中有写到:
/**
* Interface to be used when implementing custom asynchronous I/O HTTP client.
* By default, the {@link com.ning.http.client.providers.netty.NettyAsyncHttpProvider} is used.
*/
)
因此,整体的流程是先配置好config,然后AsyncHttpClient会根据加载在jvm中的包名去实现具体的httpclient(netty或grizzly或apache)。
还有要说明的一点,如果初始化的config不是netty的config,而是别的类型,在NettyAsyncHttpProvider中会进行判断,如果不是,则重新生成一个config。
也就是说如果有netty的代码,即使你声明的是grizzly的config,也只会实例化一个netty的客户端的。
所以如果需要使用grizzly或者apache的,请把netty的代码去除。
if (config.getAsyncHttpProviderConfig() != null
&& NettyAsyncHttpProviderConfig.class.isAssignableFrom(config.getAsyncHttpProviderConfig().getClass())) {
asyncHttpProviderConfig = NettyAsyncHttpProviderConfig.class.cast(config.getAsyncHttpProviderConfig());
} else {
asyncHttpProviderConfig = new NettyAsyncHttpProviderConfig();
}
4. netty客户端类NettyAsyncHttpProvider继承了SimpleChannelUpstreamHandler
非常巧妙的实现,主方法里就可以实现messageReceived方法了。
分享到:
相关推荐
Async-HTTP-Client采用了非阻塞I/O模型,基于NIO(非阻塞I/O)和Netty框架,能够在高并发环境下高效处理网络请求。这种模型允许应用程序在等待响应时继续执行其他任务,提高了整体系统的吞吐量。 2. **...
异步HTTP客户端一个利用的...// create a taskTask<AsyncHttpMessage> task = client.get("http://www.google.co.uk");// fork the tasktask.fork(m -> { // log the status System.out.println(m.getStatusCode());
Async Http Client Follow @AsyncHttpClient on Twitter. ...The library also supports the WebSocket Protocol. ... async-http-client LATEST_VERSION Version AHC doesn't use SEMVER, and won't. MAJOR = hu
《深入解析Async-HBase-Client:基于Netty的异步HBase客户端》 在现代大数据处理领域,HBase作为一款高性能、分布式的列式数据库,被广泛应用在实时数据存储和检索场景。为了优化HBase客户端的性能,提高系统吞吐量...
异步Http客户端 在Twitter上关注 。 AsyncHttpClient(AHC)库允许Java应用程序轻松执行HTTP请求并异步处理HTTP响应。 该库还支持WebSocket协议。 它建立在之上。 它当前在Java 8上编译,但也可以在Java 9上运行。新...
6、支持多种通信框架(Mina/Netty/Grizzly),支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带的协议。 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不...
2. **非阻塞I/O**:基于Netty库,`vertx-sql-client`利用非阻塞I/O来减少线程上下文切换,从而提高性能和减少内存消耗。这使得系统在处理大量并发连接时表现更佳。 3. **支持多种数据库**:该库支持包括MySQL和...
Netty的非阻塞I/O模型为vertx-mail-client提供了高效的网络通信基础。 5. **JavaMail API**: 虽然vertx-mail-client不是直接使用JavaMail API,但理解JavaMail对于理解SMTP客户端的工作原理是有帮助的。JavaMail...
//for netty 4.1.x and async-http-client:2.10.x libraryDependencies += "org.purang.net" %% "asynch" % "0.7.20" withSources() 在Maven Central中,检查上方的徽章。 对于旧版本,请使用: resolvers += ...
fastdfs 客户端 fastdfs-client是基于的 Java客户端。 支持多个跟踪服务器池和... FastdfsClient client = FastdfsClient . newBuilder() .connectTimeout( 3000 ) .readTimeout( 100 ) .healthCheck( 3 , 2 , 30
async io是指client端只需提交请求,由操作系统来负责在事件就绪后回调应用逻辑。事实上,目前只有Window在OS级别提供了对async io的支持,也即IOCP,在Linux还是要通过select、poll、epoll等来实现这个机制。 所以...
5. **EventLoop**: 类似于其他异步编程模型(如Netty框架),AsyncClient可能有一个或多个EventLoop,它们不断轮询Selector,处理就绪的事件。 6. **心跳机制**: 在服务器与客户端长时间无数据交互的情况下,心跳...
为了处理大量并发连接,可能需要使用到如 Netty、ZeroMQ 或 SignalR 这样的高性能通信框架。 六、安全与性能优化 网络通信中安全非常重要,C# 的 `SslStream` 类支持 SSL/TLS 加密,保证数据传输的安全性。同时,...
Lettuce采用Netty作为网络库,支持NIO,因此在处理大量并发连接时表现出色。它不仅提供了基本的Redis操作,还支持最新的Redis协议和特性,如Redis Sentinel和Cluster集群。Lettuce的API设计为面向对象,使用`...
2. UdpClient与UdpServer:UdpClient和UdpServer分别用于UDP的客户端和服务器端编程,它们提供了发送和接收数据报的功能。 3. WebClient与HttpClient:WebClient类用于下载文件和网页,HttpClient类是更现代的HTTP...
7. **网络编程框架**:除了基础的Socket类,还有许多高级网络编程框架,如Netty(Java)、ZeroMQ等,它们提供更强大的功能和更好的性能。虽然标签未提及,但了解这些框架对于深入网络编程也是有益的。 8. **错误...
5. **协议支持**:DotNetty支持多种网络协议,包括HTTP、WebSocket、Netty自定义的二进制协议等。开发者可以很容易地扩展支持新的协议。 6. **SocketServer.sln**:这是一个Visual Studio解决方案文件,很可能包含...