加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

一文具体解读 Dubbo 中的 Http 协议

发布时间:2019-10-12 06:50:57 所属栏目:教程 来源:儒雅程序员
导读:太阳红彤彤,花儿五颜六色,列位读者伴侣好,又来到了分享 Dubbo 常识点的时辰了。说到 Dubbo 框架支持的协议,你的第一回响是什么?或许会有 Dubbo 默认支持的 dubbo 协议,以及老生常谈的由当当孝顺给 Dubbo 的 rest 协议,可能是本日的主角 http。截至到
副问题[/!--empirenews.page--]

太阳红彤彤,花儿五颜六色,列位读者伴侣好,又来到了分享 Dubbo 常识点的时辰了。说到 Dubbo 框架支持的协议,你的第一回响是什么?或许会有 Dubbo 默认支持的 dubbo 协议,以及老生常谈的由当当孝顺给 Dubbo 的 rest 协议,可能是本日的主角 http。截至到今朝,Dubbo 最新版本演进到了 2.7.3,已经支持了:dubbo,hessain,http,injvm,jsonrpc,memcached,native-thrift,thrift,redis,rest,rmi,webservice,xml 等协议,有些协议的行使方法还没有补全到官方文档中。原本 Dubbo 支持这么多协议,是不是有点出乎你的料想呢?

一文具体解读 Dubbo 中的 Http 协议

这么多 RPC 协议,也许有人会发生如下的疑问:rest,jsonrpc,webservice 不都是依赖 http 通讯吗?为什么还单独占一个 http 协议?先不急着答复这个题目,而是引出本日的话题,先来先容下 Dubbo 框架中所谓的 http 协议。

Dubbo 中的 http 协议

在 Dubbo 行使 http 协媾和其他协议根基一样,只必要指定 protocol 即可。

  1. <dubbo:protocol name="http" port="8080" server="jetty" /> 

server 属性可选值: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 协议实现的云云简朴,背后首要缘故起因有两点:

  • remoting 层行使 http 通讯,不必要自界说编解码
  • 借助了 Spring 提供的 HttpInvoker 封装了 refer 和 exporter 的逻辑

Spring 提供的 HttpInvoker 是何方神圣呢?简直是一个较量生僻的观念,但并不伟大,简朴来说,就是行使 Java 序列化将工具转换成字节,通过 http 发送出去,在 server 端,Spring 能按照 Url 映射,找到容器中对应的 Bean 反射挪用的进程,没见地过它也没相关,可以通过下面的示例快速把握这一观念。

Spring HttpInvoker

本节内容可拜见 Spring 文档:https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#remoting-httpinvoker-server

下面的示例将会展示怎样行使 Spring 原生的 HttpInvoker 实现长途挪用。

建设处事提供者

  1. public class AccountServiceImpl implements AccountService { 
  2.  @Override 
  3.  public Account findById(int id) { 
  4.  Account account = new Account(id, new Date().toString()); 
  5.  return account; 
  6.  } 
  7. @Bean 
  8. AccountService accountService(){ 
  9.  return new AccountServiceImpl(); 
  10. @Bean("/AccountService") 
  11. public HttpInvokerServiceExporter accountServiceExporter(AccountService accountService){ 
  12.  HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter(); 
  13.  exporter.setService(accountService); 
  14.  exporter.setServiceInterface(AccountService.class); 
  15.  return exporter; 

袒露处事的代码相等简朴,必要留意两点:

  1. org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter 是 Spring 封装的一个处事袒露器,它会以 serviceInterface 为民众接口,以 service 为实现类向外提供处事。
  2. @Bean("/AccountService") 不只仅指定了 IOC 容器中 bean 的名字,还充当了路径映射的成果,假如当地处事器袒露在 8080 端口,则示例处事的会见路径为http://localhost:8080/AccountService

建设处事斲丧者

  1. @Configuration 
  2. public class HttpProxyConfig { 
  3.  @Bean("accountServiceProxy") 
  4.  public HttpInvokerProxyFactoryBean accountServiceProxy(){ 
  5.  HttpInvokerProxyFactoryBean accountService = new HttpInvokerProxyFactoryBean(); 
  6.  accountService.setServiceInterface(AccountService.class); 
  7.  accountService.setServiceUrl("http://localhost:8080/AccountService"); 
  8.  return accountService; 
  9.  } 
  10. @SpringBootApplication 
  11. public class HttpClientApp { 
  12.  public static void main(String[] args) { 
  13.  ConfigurableApplicationContext applicationContext = SpringApplication.run(HttpClientApp.class, args); 
  14.  AccountService accountService = applicationContext.getBean(AccountService.class); 
  15.  System.out.println(accountService.findById(10086)); 
  16.  } 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读