一文详解达博中的http协议

  

太阳红彤彤,花儿五颜六色,各位读者朋友好,又来到了分享达博知识点的时候了。说到达博框架支持的协议,你的第一反应是什么?大概会有达博默认支持的达博协议,以及老生常谈的由当当贡献给达博的其他协议,或者是今天的主角http。截止到目前,达博最新版本演进到了2.7.3,已经支持了:达博,hessain, http, injvm, jsonrpc, memcached, native-thrift,节俭,复述,休息,rmi、网络服务、xml等协议,有些协议的使用方式还没有补全到官方文档中。原来达博支持这么多协议,是不是有点出乎你的意料呢?

  

这么多RPC协议,可能有人会产生如下的疑问:休息,jsonrpc,网络服务不都是依靠http通信吗?为什么还单独有一个http协议吗?先不急着回答这个问题,而是引出今天的话题,先来介绍下达博框架中所谓的http协议。

  

& lt; !——更多的在

  

达博中的http协议

  

在达博使用http协议和其他协议基本一样,只需要指定协议即可。

  
 <代码类="语言xml "> & lt;达博:协议名称=癶ttp”端口==奥胪贰??080”服务器在 
  

服务器属性可选值:jetty, tomcat servlet。

  

配置过后,当服务消费者向服务提供者发起调,用底层便会使用标准的http协议进行通信。可以直接在https://github.com/apache/dubbo-samples中找到官方示例,其中的子模块:dubbo-samples-http构建了一个http协议调用的例子。

  
  

为避免大家误解,特在此声明:本文中,所有的http协议特指的是达博中的http协议,并非那个大家耳熟能详的通用的http协议。

     

http协议的底层原理

  

从默认的达博协议改为http协议是非常简单的一件事,上面便是使用者视角所看到的全部的内容了,接下来我们将会探讨其底层实现原理。

  

翻看达博的源码,找到HttpProtocol的实现,你可能会吃惊,基本就依靠HttpProtocol一个类,就实现了http协议

  

一文详解达博中的http协议

  

要知道实现自定义的达博协议,有近30个类! http协议实现的如此简单,背后主要原因有两点:

  
      <李> remoting层使用http通信,不需要自定义编解码李   <李>借助了春天提供的HttpInvoker封装了引用和出口国的逻辑李   
  

春提供的HttpInvoker是何方神圣呢?的确是一个比较生僻的概念,但并不复杂,简单来说,就是使用Java序列化将对象转换成字节,通过http发送出去,在服务器端,春天能根据url映射,找到容器中对应的Bean反射调用的过程,没见识过它也不要紧,可以通过下面的示例快速掌握这一概念。

  

春HttpInvoker

  
  

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

     

下面的示例将会展示如何使用春原生的HttpInvoker实现远程调用。

  

创建服务提供者

  
 <代码类="语言java ">公共类AccountServiceImpl实现AccountService {
  @Override
  公共账户findById (int id) {
  账户账户=new账户(id、新的日期().toString ());
  返回账户;
  }
  } 
  
 <=坝镅詊ava代码类> @ bean
  AccountService AccountService () {
  返回新AccountServiceImpl ();
  }
  
  @ bean (“/AccountService”)
  公共HttpInvokerServiceExporter accountServiceExporter (AccountService AccountService) {
  HttpInvokerServiceExporter出口国=new HttpInvokerServiceExporter ();
  exporter.setService (accountService);
  exporter.setServiceInterface (AccountService.class);
  返回出口国;
  } 
  

暴露服务的代码相当简单,需要注意两点:

  
      <李> <代码> org.springframework.remoting.httpinvoker。HttpInvokerServiceExporter>   <李> @ bean (“/AccountService")不仅仅指定了奥委会容器中bean的名字,还充当了路径映射的功能,如果本地服务器暴露在8080端口,则示例服务的访问路径为<代码> http://localhost: 8080/AccountService   
  

创建服务消费者

  
 <=坝镅詊ava代码类> @ configuration
  公开课HttpProxyConfig {
  @ bean (“accountServiceProxy”)
  公共HttpInvokerProxyFactoryBean accountServiceProxy () {
  HttpInvokerProxyFactoryBean accountService=new HttpInvokerProxyFactoryBean ();
  accountService.setServiceInterface (AccountService.class);
  accountService.setServiceUrl (" http://localhost: 8080/AccountService”);
  返回accountService;
  }
  }

一文详解达博中的http协议