热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手写框架,dubbo用的什么协议

但是是通过网络去连接,两个不同线程之间的调用。往泛了说像http网络协议传输数据,TCP协议输出数据都算的上是RPC。publicclassDispatcherServlet


dubbo :称为开源Java RPC框架


RPC :对Java程序员来说,RPC是远程方法调用。


远程方法调用:我们常用的是本地方法调用,而远程方法调用在性质上相似,也是方法调用。 但是通过网络连接的两个不同线程之间的调用。


通常,TCP协议输出数据的是RPC,就像http网络协议传输数据一样。


Dubbo:


1、dubbo协议数据格式netty


2、http协议数据格式tomcat,jetty 3358 www.Sina.com/http://www.Sina.com /


在java程序中,远程调用方法;


服务提供者:


1、提供服务的接口


2、提供实现类


3、注册服务(注册中心、本地注册)。


4、暴露服务(tomcat、nettyServer接受并处理请求)手写Dubbo


服务提供者的主要功能是方法的提供者


(远程方法的提供者)


如果需要暴露方法,就需要启动tomcat来暴露我们的方法。


tomcat是servlet容器,必须编写servlet才能接收请求。


publicclassdispatcherservletextendshttp servlet {


定义http servlet、处理程序(req、resp ); 是处理要求的方法。


@ overrideprotectedvoidservice (httpservletrequestreq,HttpServletResponse resp ) throws ServletException,io exception { newhhh


要指定并有效调用服务,需要以下四项


1、接口名称


2、方法名称


3、方法参数类型列表


4、方法值清单


我们把这四个需要的东西构建成一个对象,


Invocation对象


私有字符串接口名称; 私有字符串方法名称; 私有类[ ] param types; 私有对象[ ] params; //与上面一对一对应的处理程序处理请求一定需要得到以上4个值。 如何得到Invocation对象?


现在我们想提供一种叫光环服务的服务


publicinterfacehelloservice { string say hello (string username ); }假设我们只实现了一个服务


publicclasshelloserviceimplimplementshelloservice { @ overridepublicstringsayhello (字符串用户名称) Return'Hello3360' }我在这里,首先在本地注册服务


这使用与注册相关的类


publicclasslocalregister { privatestaticmapstring,Class map=new HashMap (; publicstaticvoidregist (字符串接口类,类impl类)映射. put (接口类,impl类); //给我接口名称和实现类,然后给map publicstaticclassget (string interfacename ) returnmap.get (接口名称) ); //通过接口名称获取相应的实现类}在本地注册


有这个注册类


使用此代码可以保存Invocation。


local register.regist (hello服务. class.getname ),hello服务impl.class );


然后,可以在handler中使用get方法获取Invocation类。


获取invocation方法后,可以执行请求


方法方法=impl class.get method (invocation.get method name ),invocation.getParamTypes );


varresult=(string ) method.invoke ) implclass.newinstance ),invocation.getParams );


这样我们就得到了结果


然后返回结果


system.out.println (“Tomcat :”

+ result);
IOUtils.write(result, resp.getOutputStream());

如果需要不通服务的实现类,可以通过添加多个版本实现。
服务消费者
发送数据方法,
发送的地址,哪个端口,发送的数据是什么
地址:hostname
端口:port
要发送的数据就是我们的:Invocation
利用jdk自带的http方式发送数据即可。

public String send(String hostname, Integer port, Invocation invocation) { try { URL url = new URL("http", hostname, port, "/"); HttpURLConnection httpURLCOnnection= (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("POST"); httpURLConnection.setDoOutput(true); OutputStream outputStream = httpURLConnection.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(outputStream); oos.writeObject(invocation); oos.flush(); oos.close(); InputStream inputStream = httpURLConnection.getInputStream(); String result = IOUtils.toString(inputStream); return result; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }

我们消费者去调用这个方法

HttpClient httpClient=new HttpClient(); Invocation invocation=new Invocation(HelloService.class,"sayhello",new Class[]{String.class},new Object[]{"方法"}); String result =httpClient.send("localhost",8080,invocation);

这就完成了远程的方法调用,但是这种调用方式对于消费者而言非常不友好。
这里我们利用jdk的动态代理

HelloService helloService = ProxyFactory.getProxy(HelloService.class); String xxx = helloService.sayHello("xxx"); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String mock = System.getProperty("mock"); if (mock != null && mock.startsWith("return:")) { String result = mock.replace("return:", ""); return result; } Invocation invocation = new Invocation(interfaceClass.getName(), method.getName(), method.getParameterTypes(), args); List urlList = RemoteMapRegister.get(interfaceClass.getName()); URL url = LoadBalance.random(urlList); Protocol protocol = ProtocolFactory.getProtocol(); String result = protocol.send(url, invocation); return result; }

把方法写活,只利用HelloService helloService = ProxyFactory.getProxy(HelloService.class);方法,然后再传入String xxx = helloService.sayHello(“xxx”);值就可以实现调用了。


推荐阅读
  • 本文整理了Java中io.netty.handler.codec.http.FullHttpRequest.content()方法的一些代码示例,展示了Fu ... [详细]
  • 吃透Netty源码系列四之NioEventLoop
    吃透Netty源码系列四之NioEventLoop新启动的线程的作用执行NioEventLoop的run方法执行任务一(通道注册register0)doRegisterpipeli ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 前言最近一段时间在整公司项目里一个功能的优化,用到了多线程处理。期间也是踩了不少的坑,在这里想说下我遇到的问题和注意事项。以及怎样知道启动的那些多线程都 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • Java开发面试问题,2021网易Java高级面试题及答案,实战案例
    前言大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是“HUAWEI”面经!这是一次真实的面试经历,虽然不是我自己亲身经历 ... [详细]
  • java程序员_9大行为导致Java程序员薪资过低, 你有几个?
    Java程序员薪水有高有低,有的人一个月可能拿30K、50K,有的人可能只有2K、3K。同样有五年工作 ... [详细]
  • Java中线程池,你真的了解会用吗
    2019独角兽企业重金招聘Python工程师标准在《深入源码分析Java线程池的实现原理》这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理。在文中 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有