作为Nodejs开发者可能会对java中常用的一些技术工具不太关心,主要原因大概除了语言级别的间隙就是Nodejs相对于java来说比较轻量级,大多用来开发简单系统,用不到其他工具。根据经验来说,开发相同功能的系统,Nodejs的开发周期和代码体量上也会比Java少太多,毕竟java出生年代长,生态丰富,如果不使用几个框架都感觉不是在开发系统。而Nodejs要开发一个web系统基本使用express或koa就差不多够了。所以对于Nodejs开发者来说,分布式,消息队列,远程调用等技术接触就少些。当然,不用这些技术其实也不会有太大影响,但是对于一个有追求有理想的码农来说我们的眼界不应该局限于系统能运行就行。 下面就来介绍一些可以在nodejs中使用的JAVA常用工具和技术。
elasticsearch ElasticSearch(以下简称ES)是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。看见了吧,这就是一个使用JAVA开发的全文搜索引擎,到底有什么用呢?就是可以提供像google和百度一样的搜索功能,就算不需要这样功能,也可以用于管理后台的字段搜索,大家知道数据库的搜索效率比较差,有索引的字段还好,没有的就很慢了,这时ES就可以派上用场了,把数据同步进ES,不论查询列表还是以字段搜索都是极快的,是redis缓存的很好补充。
ELK ELK(ElasticSearch,LogStash,Kibana)是三个工具的组合, Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的、多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件。 Kibana是一个使用nodejs开发的web应用,用于查询和操作ES,就是一个ES的图形界面。 如果nodejs系统布署在多台服务器,那么查看日志是件很头疼的事,你不知道请求发送到哪一台服务器,需要挨个查看,如果服务超过5台,这绝对是噩梦。这时候ELK就是很好的解决方案,LogStash收集每一台服务器的日志统一存到ES中,利用ES的优点,查询任何关键字都很快很方便。
消息中间件(kafka) 拿用户注册为例,需要发送邮件,短信,这两个服务之间本没有关联关系,但我们的一贯作风是用户注册的时候调用邮件服务,短信服务,严谨一点会放在事务中操作,假如一个服务失败可能会让事务回滚,所有操作都失败。这是一种情况,另一种情况是如果要再注册后加积分,那么就得改代码,要是有更多服务要添加就得每次改代码发布,启停服务,不送积分了又要删代码,这就是耦合度太高导致的结果。使用消息中间件不仅能保证服务完整性还可以有效解耦,有兴趣可以去了解kafka,rabbitMQ,roketMQ等消息中间件。
远程调用RPC 通俗的来讲就是两台服务器A和B,A服务器直接调用B服务器上的函数,如果没有一个具体事例很难理解A服务器怎么可能调用到B服务器的函数,感兴趣可下载尝试:https://github.com/yuedun/nodejs-grpc 那么为什么要用rpc呢?A服务器要调用B服务的资源直接用http提供接口不就行了吗?其实http也算是一种远程调用,而且也比较简单直观,但是其效率较低,调用成本高,三次握手耗时,甚至请求头的数据量比请求体还大。那么就需要一种更高效的调用协议了——rpc。为什么需要RPC,而不是简单的HTTP接口
总结:以上的这些工具和技术和语言并没有绑定,java可以使用,nodejs也可以使用,推荐理由:投入成本小,使用收益高。
目前有很多Java的RPC框架,有基于Json的,有基于XML,也有基于二进制对象的。
论复杂度,RPC框架肯定是高于简单的HTTP接口的。但毋庸置疑,HTTP接口由于受限于HTTP协议,需要带HTTP请求头,导致传输起来效率或者说安全性不如RPC。
现在问题是,遇到怎样的瓶颈了才需要或者说更适合用RPC(比如像阿里这么大的请求并发量,简单的HTTP肯定达不到预期),但问题是大家所在的公司,要有像阿里这么大的量是比较少的,甚至说1/1000的量可能都没有,那我们还需要使用RPC吗?
技术应该不是为了使用新技术而去使用,而应该是旧技术存在某些瓶颈,存在难以支撑或者扩展性越老越差等问题暴露出来之后,用新技术来进行解决。
那RPC最大的优点,或者说它相比简单的HTTP接口,它的优势、更适合它的业务场景是怎样呢?简单的HTTP又哪里不足,哪些场景明显不太适合呢?
RPC=Remote Produce Call 是一种技术的概念名词. HTTP是一种协议,RPC可以通过HTTP来实现,也可以通过Socket自己实现一套协议来实现.所以楼主可以换一个问法,为何RPC还有除HTTP 之外的实现法,有何必要.毕竟除了HTTP实现外,私有协议不具备通用性.那么我想唯一的答案就在于HTTP不能满足其业务场景的地方,所以这个就要具体 案例具体分析了.
http接口是在接口不多、系统与系统交互较少的情况下,解决信息孤岛初期常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议 进行传输。但是如果是一个大型的网站,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http 一样去3次握手什么的,减少了网络开销;其次就是RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统 一化的操作。第三个来说就是安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑。
rpc是一种概念,http也是rpc实现的一种方式。论复杂度,dubbo/hessian用起来是超级简单的。最近用dubbo和hessian比较多,http的几乎都被废弃了。
至于为什么用,其实很简单,业务场景不一样。我最早的单位所有的代码都在一个工程里,一次要发布几百m的代码。这种架构是非常有利于小程序的。但是我们为什么要应用rpc层呢,一个功能,一套代码下来不就解决了么?我觉得有几个好处:
1 灵活部署 2 解耦 至于为什么,当你用到的时候,你会体会。
系统做大了,肯定是需要做微服务的。 现在我们做电商就是这样,单独有一个订单系统,支付系统,商品系统,用户系统。都是分开部署,单独上线的。 但我们交互是用HTTP接口来交互的,我想转用RPC,但问题是我现在还没发现为什么需要用RPC,我还没能理解它的作用和意义。
用http交互其实就已经属于rpc了。
RPC:远程过程调用。RPC的核心并不在于使用什么协议。RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。通过RPC能解耦服务,这才是使用RPC的真正目的。RPC的原理主要用到了动态代理模式,至于http协议,只是传输协议而已。简单的实现可以参考spring remoting,复杂的实现可以参考dubbo。
RPC是一个软件结构概念,是构建分布式应用的理论基础。就好比为啥你家可以用到发电厂发出来的电?是因为电是可以传输的。至于用铜线还是用铁丝还是其他 种类的导线,也就是用http还是用其他协议的问题了。这个要看什么场景,对性能要求怎么样。比如在java中的最基本的就是RMI技术,它是java原 生的应用层分布式技术。我们可以肯定的是在传输性能方面,RMI的性能是优于HTTP的。那为啥很少用到这个技术?那是因为用这个有很多局限性,首先它要 保证传输的两端都要要用java实现,且两边需要有相同的对象类型和代理接口,不需要容器,但是加大了编程的难度,在应用内部的各个子系统之间还是会看到 他的身影,比如EJB就是基于rmi技术的。这就与目前的bs架构的软件大相径庭。用http必须要服务端位于http容器里面,这样减少了网络传输方面 的开发,只需要关注业务开发即可。所以在架构一个软件的时候,不能一定根据需求选定技术。
转自:https://www.cnblogs.com/winner-0715/p/5847638.html