说到与Dubbo框架兼容的协议,您的第一个反应是什么?默认情况下,可能会有Dubbo支持的dubbo协议,以及Dangbo为Dubbo贡献的旧的其余协议,或今天的主角http。
太阳是红色的,花是五颜六色的,读者和朋友们很好,现在是时候分享达博的知识了。说到与Dubbo框架兼容的协议,您的第一个反应是什么?默认情况下,可能会有Dubbo支持的dubbo协议,以及Dangbo为Dubbo贡献的旧的其余协议,或今天的主角http。到目前为止,Dubbo的最新版本已发展到2.7.3,并且已兼容:dubbo,hessain,http,injvm,jsonrpc,memcached,native-thrift,thrift,redis,rest,rmi,webservice,xml,等使用方法尚未在官方文档中完成。事实证明,达博(Dubbo)接受了很多协议。有点意外吗?
使用如此众多的RPC协议,有些人可能会遇到以下问题:休息,jsonrpc,Web服务不依赖于HTTP通信吗?为什么会有单独的http协议?它并没有着急回答这个问题,而是将我们带入了今天的话题,在Dubbo框架中引入了所谓的http协议。
Dubbo中的http协议
在Dubbo中,使用http协议与其他协议基本相同,只需指定该协议即可。
服务器属性的可选值:jetty,tomcat,servlet。
配置完成后,当服务使用者发起对服务提供商的呼叫时,底层将使用标准http协议进行通信。可以在https://github.com/apache/dubbo-samples直接找到一个官方示例,其中的子模块dubbo-samples-http创建一个http协议调用的示例。
为避免误解,我们声明:在本文中,所有http协议都专门指dubbo中的http协议,而不是每个人都熟悉的通用http协议。
http协议的基本原理
从默认的dubbo协议更改为http协议是一件非常简单的事情。以上是从用户角度看的所有内容。接下来,我们将探讨基本的实现原理。通过查看Dubbo的源代码,找到HttpProtocol的实现,您可能会感到惊讶,基本上信任HttpProtocol的一个类,实现HTTP协议
Dubbo中http协议的详细说明
要了解自定义dubbo协议的实现,大约有30个类! http协议的实现是如此简单,其背后有两个主要原因:
远程层使用http通信,不需要自定义编解码器。
引用和导出逻辑由Spring提供的HttpInvoker封装。
Spring提供的神圣的HttpInvoker是什么?实际上,这是一个相对不常见的概念,但并不复杂。简而言之,它是使用Java序列化将对象转换为字节并通过http发送它们。在服务器端,Spring可以Map url,在容器中找到相应的bean反射调用过程,无论您是否还没有看到它,都可以通过以下示例快速理解该概念。
春季HttpInvoker
该部分可以在Spring文档中找到:https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#remoting-httpinvoker-server
以下示例显示了如何使用本机Spring HttpInvoker实现远程调用。
创建服务提供商
Public AccountServiceImpl类实现AccountService {
@Override
公共帐户findById(int id){
帐户account=新帐户(id,新日期()。ToString());
退货账户;
}
}
@豆
AccountService accountService(){
返回新帐户ServiceImpl();
}
@Bean('/AccountService')
public HttpInvokerServiceExporter accountServiceExporter(AccountService accountService){
HttpInvokerServiceExporter exporter=新的HttpInvokerServiceExporter();
exporter.setService(accountService);
exporter.setServiceInterface(AccountService.class);
退货出口商;
}
公开服务的代码非常简单,需要注意两点:
org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter是由Spring封装的服务展示者,它使用serviceInterface作为公共接口来为服务外实现类提供服务。
@Bean('/AccountService')不仅指定IOC容器中Bean的名称,而且还充当路由映射。如果本地服务器在端口8080上公开,则示例服务的路径为http://localhost:8080/AccountService。
创建服务使用者
@配置
公共类HttpProxyConfig {
@Bean('accountServiceProxy')
公用HttpInvokerProxyFactoryBean accountServiceProxy(){
HttpInvokerProxyFactoryBean accountService=新的HttpInvokerProxyFactoryBean();
accountService.setServiceInterface(AccountService.class);
accountService.setServiceUrl('http://localhost:8080/AccountService');
退货服务;
}
}
@SpringBootApplication
公共类HttpClientApp {
公共静态void main(String [] args){<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx</center>
</body>
</html>
上海IT外包服务网 链接:http://www.linemore.com