分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

简单Tomcat ?HTTP RPC框架

发布时间:2023-09-06 01:13责任编辑:傅花花关键词:暂无标签

RPC基础知识

什么是RPC?

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。

RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC的模型

C/S模式
基于传输层协议(例如TCP/IP) 远程调用不是新的一种数据传输协议
事件响应基本模型(请求、计算、响应)

RPC设计的目的

通过固定的协议调用非本机的方法
提供不同语言程序之间通信
可以在不了解底层通信,像本地方法一样调用

RPC框架完全封装了网络传输以及其他细节,比如Spring的RPC框架在调用远程对象的方法时就像调用Spring Bean对象一样使用.

RPC的应用大量的分布式应用都使用了RPC协议,比如分布式操作系统、分布式计算、分布式软件设计

RPC过程详解

RPC框架封装网络传输和其他细节,消费者和生产者不用去关心底层原理

消费者的代理层控制了整个RPC调用的流程,生成代理对象,封装请求报文,发送请求之类的

服务提供者会有一个监听模块,用来监听请求,并且按照约定,应该是注册了的服务才会被消费者调用到,注册的服务需要被反射调用到,用来计算结果

RPC框架的特点和设计模型

封装网络交互

尽量不要让RPC框架的使用者涉及到过多的网络层的开发

远程调用对象的代理

将接口代理的对象放入到Spring 容器之中,方便服务端开发

支持容器(Spring、Jetty等)

支持Spring容器,还有Jetty这样的web容器

可配置,可扩展

尽量做到可配置,可扩展

设计模型

Proxy代理层

用于对象的代理,对象的反射调用,RPC流程的控制

Serialize序列化层

将请求和结果做序列化和反序列化

Invoke网络模块

网络通信相关的处理

Container容器组件

支持代理层监听网络请求

代码实现

pom.xml

[html]view plaincopy
  1. <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.ibigsea</groupId>
  4. <artifactId>http-rpc</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <dependencies>
  7. <dependency>
  8. <groupId>com.alibaba</groupId>
  9. <artifactId>fastjson</artifactId>
  10. <version>1.2.3</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>ch.qos.logback</groupId>
  14. <artifactId>logback-classic</artifactId>
  15. <version>1.0.13</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.mortbay.jetty</groupId>
  19. <artifactId>jetty</artifactId>
  20. <version>6.1.26</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.apache.httpcomponents</groupId>
  24. <artifactId>httpcore</artifactId>
  25. <version>4.3.3</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.apache.httpcomponents</groupId>
  29. <artifactId>httpclient</artifactId>
  30. <version>4.3.6</version>
  31. <exclusions>
  32. <exclusion>
  33. <artifactId>commons-logging</artifactId>
  34. <groupId>commons-logging</groupId>
  35. </exclusion>
  36. </exclusions>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework</groupId>
  40. <artifactId>spring-context</artifactId>
  41. <version>3.2.8.RELEASE</version>
  42. <exclusions>
  43. <exclusion>
  44. <artifactId>commons-logging</artifactId>
  45. <groupId>commons-logging</groupId>
  46. </exclusion>
  47. </exclusions>
  48. </dependency>
  49. <dependency>
  50. <groupId>commons-logging</groupId>
  51. <artifactId>commons-logging</artifactId>
  52. <version>1.2</version>
  53. </dependency>
  54. </dependencies>
  55. </project>

config包下面的

ConsumerConfig.java

[java]view plaincopy
  1. packagecom.ibigsea.rpc.config;
  2. /**
  3. *服务消费者配置
  4. *
  5. *@authorbigsea
  6. *
  7. */
  8. publicclassConsumerConfig{
  9. /**
  10. *请求地址服务提供者监听的地址和端口
  11. */
  12. privateStringurl;
  13. publicStringgetUrl(){
  14. returnurl;
  15. }
  16. publicvoidsetUrl(Stringurl){
  17. this.url=url;
  18. }
  19. }

ProviderConfig.java

[java]view plaincopy
  1. packagecom.ibigsea.rpc.config;
  2. /**
  3. *服务提供者配置
  4. *
  5. *@authorbigsea
  6. *
  7. */
  8. publicclassProviderConfig{
  9. /**
  10. *监听端口服务提供者监听请求端口
  11. */
  12. privateintport;
  13. publicProviderConfig(){
  14. }
  15. publicProviderConfig(intport){
  16. this.port=port;
  17. }
  18. publicintgetPort(){
  19. returnport;
  20. }
  21. publicvoidsetPort(intport){
  22. this.port=port;
  23. }
  24. }

序列化层

Request.java

[java]view plaincopy
  1. packagecom.ibigsea.rpc.serizlize;
  2. importjava.io.Serializable;
  3. importcom.alibaba.fastjson.annotation.JSONType;
  4. /**
  5. *请求信息
  6. *
  7. *@authorbigsea
  8. *
  9. */
  10. publicclassRequestimplementsSerializable{
  11. privatestaticfinallongserialVersionUID=-4363326153251862952L;
  12. privateClassclazz;
  13. privateStringmethod;
  14. privateObjectparam;
  15. publicRequest(){
  16. }
  17. publicRequest(Classclazz,Stringmethod,Objectparam){
  18. this.clazz=clazz;
  19. this.method=method;
  20. this.param=param;
  21. }
  22. publicClassgetClazz(){
  23. returnclazz;
  24. }
  25. publicvoidsetClazz(Classclazz){
  26. this.clazz=clazz;
  27. }
  28. publicStringgetMethod(){
  29. returnmethod;
  30. }
  31. publicvoidsetMethod(Stringmethod){
  32. this.method=method;
  33. }
  34. publicObjectgetParam(){
  35. returnparam;
  36. }
  37. publicvoidsetParam(Objectparam){
  38. this.param=param;
  39. }
  40. /**
  41. *通过反射执行对应的方法
  42. *
  43. *@parambean
  44. *@return
  45. *@throwsException
  46. */
  47. publicObjectinvoke(Objectbean)throwsException{
  48. returnclazz.getMethod(method,param.getClass()).invoke(bean,param);
  49. }
  50. }

JsonParser.java

[java]view plaincopy
  1. packagecom.ibigsea.rpc.serizlize;
  2. importcom.alibaba.fastjson.JSON;
  3. importcom.alibaba.fastjson.parser.ParserConfig;
  4. importcom.alibaba.fastjson.serializer.SerializerFeature;
  5. /**
  6. *反序列化
  7. *
  8. *@authorbigsea
  9. *
  10. */
  11. publicclassJsonParser{
  12. /**
  13. *反序列化请求将请求反序列化成一个请求报文
  14. *
  15. *@paramparam
  16. *@return
  17. */
  18. publicstaticRequestreqParse(Stringparam){
  19. returnJSON.parseObject(param,Request.class);
  20. }
  21. /**
  22. *反序列化响应将响应反序列化成一个响应报文
  23. *
  24. *@paramresult
  25. *@return
  26. */
  27. publicstatic<T>TresbParse(Stringresult){
  28. return(T)JSON.parse(result);
  29. }
  30. }

JsonFormatter.java

[java]view plaincopy
  1. packagecom.ibigsea.rpc.serizlize;
  2. importcom.alibaba.fastjson.JSON;
  3. importcom.alibaba.fastjson.parser.ParserConfig;
  4. importcom.alibaba.fastjson.serializer.SerializerFeature;
  5. /**
  6. *序列化
  7. *
  8. *@authorbigsea
  9. *
  10. */
  11. publicclassJsonFormatter{
  12. /**
  13. *将请求序列化成字符串
  14. *
  15. *@paramclazz
  16. *@parammethod
  17. *@paramparam
  18. *@return
  19. */
  20. publicstaticStringreqFormatter(Classclazz,Stringmethod,Objectparam){
  21. Requestrequest=newRequest(clazz,method,param);
  22. returnJSON.toJSONString(request,SerializerFeature.WriteClassName);
  23. }
  24. /**
  25. *将响应序列化成字符串
  26. *
  27. *@paramparam
  28. *@return
  29. */
  30. publicstaticStringresbFormatter(Objectparam){
  31. returnJSON.toJSONString(param,SerializerFeature.WriteClassName);
  32. }
  33. }


http容器 httpContainer.java

[java]view plaincopy
  1. packagecom.ibigsea.rpc.container;
  2. importorg.mortbay.jetty.Connector;
  3. importorg.mortbay.jetty.Server;
  4. importorg.mortbay.jetty.handler.AbstractHandler;
  5. importorg.mortbay.jetty.nio.SelectChannelConnector;
  6. importorg.slf4j.Logger;
  7. importorg.slf4j.LoggerFactory;
  8. importcom.ibigsea.rpc.config.ProviderConfig;
  9. /**
  10. *利用Jetty实现简单的嵌入式Httpserver
  11. *
  12. *@authorbigsea
  13. *
  14. */
  15. publicclassHttpContainer{
  16. privateLoggerLOG=LoggerFactory.getLogger(HttpContainer.class);
  17. privateAbstractHandlerhttpHandler;
  18. privateProviderConfigproviderConfig;
  19. /**
  20. *构造方法
  21. *
  22. *@paramhttpHandler
  23. */
  24. publicHttpContainer(AbstractHandlerhttpHandler){
  25. this(httpHandler,newProviderConfig(8080));
  26. }
  27. /**
  28. *构造方法
  29. *
  30. *@paramhttpHandler
  31. *@paramproviderConfig
  32. */
  33. publicHttpContainer(AbstractHandlerhttpHandler,ProviderConfigproviderConfig){
  34. this.httpHandler=httpHandler;
  35. this.providerConfig=providerConfig;
  36. }
  37. publicvoidstart(){
  38. //进行服务器配置
  39. Serverserver=newServer();
  40. try{
  41. SelectChannelConnectorconnector=newSelectChannelConnector();
  42. //设置监听端口
  43. connector.setPort(providerConfig.getPort());
  44. //设置handler,请求过来之后通过该handler来处理请求
  45. server.setHandler(httpHandler);
  46. server.setConnectors(newConnector[]{connector});
  47. server.start();
  48. LOG.info("容器启动~");
  49. }catch(Exceptione){
  50. LOG.error("容器启动异常~",e);
  51. }
  52. }
  53. }

RpcException.java

[java]view plaincopy
  1. packagecom.ibigsea.rpc.exception;
  2. /**
  3. *异常
  4. *
  5. *@authorbigsea
  6. *
  7. */
  8. publicclassRpcExceptionextendsThrowable{
  9. privateObjectdata;
  10. publicRpcException(Stringmessage,Throwablecause,Objectdata){
  11. super(message,cause);
  12. this.data=data;
  13. }
  14. publicRpcException(Objectdata){
  15. super();
  16. this.data=data;
  17. }
  18. publicObjectgetData(){
  19. returndata;
  20. }
  21. }

HttpInvoke.java

[java]view plaincopy
  1. packagecom.ibigsea.rpc.invoke;
  2. importjava.io.OutputStream;
  3. importjava.util.ArrayList;
  4. importjava.util.List;
  5. importorg.apache.http.HttpHost;
  6. importorg.apache.http.HttpResponse;
  7. importorg.apache.http.NameValuePair;
  8. importorg.apache.http.client.HttpClient;
  9. importorg.apache.http.client.entity.UrlEncodedFormEntity;
  10. importorg.apache.http.client.methods.HttpPost;
  11. importorg.apache.http.conn.routing.HttpRoute;
  12. importorg.apache.http.impl.client.HttpClients;
  13. importorg.apache.http.impl.conn.PoolingHttpClientConnectionManager;
  14. importorg.apache.http.message.BasicNameValuePair;
  15. importorg.apache.http.util.EntityUtils;
  16. importcom.ibigsea.rpc.config.ConsumerConfig;
  17. importcom.ibigsea.rpc.exception.RpcException;
  18. /**
  19. *http请求和响应处理
  20. *
  21. *@authorbigsea
  22. *
  23. */
  24. publicclassHttpInvoke{
  25. privatestaticfinalHttpClienthttpClient=getHttpClient();
  26. /**
  27. *单例
  28. */
  29. privatestaticHttpInvokehttpInvoke;
  30. privateHttpInvoke(){
  31. }
  32. publicstaticsynchronizedHttpInvokegetInstance(){
  33. if(httpInvoke==null){
  34. httpInvoke=newHttpInvoke();
  35. }
  36. returnhttpInvoke;
  37. }
  38. /**
  39. *发送请求
  40. *
  41. *@paramrequest
  42. *服务消费者将(类信息、方法、参数)封装成请求报文,序列化后的字符串
  43. *@paramconsumerConfig
  44. *服务消费者请求的地址
  45. *@return请求结果
  46. *@throwsRpcException
  47. */
  48. publicStringrequest(Stringrequest,ConsumerConf
我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved