从对dubbo理解到Restful风格使用

最近在Restful远程调用和dubbo之间弄得迷迷糊糊的,碰到很多脑洞大开的问题,问部门大佬有时都不能理解我问的是啥。最近一直在研究,看到一篇当当网dubbox团队写的文章,感觉有点头绪了,所以赶紧写下来,怕回头又忘了。下面写下我问题的一个产生过程,在讲下我后来理解。如有不对的地方,真的希望多多指点下我....大四出来实习,感觉会的东西真的不够用。刚刚说的那篇文章地址在Dubbo中开发REST风格的远程调用(RESTful Remoting)

我产生脑洞的过程和重新的理解:

1.大学期间,网上找教学视频看,第一次听到了分布式的概念,前面文章总结了,并将当时自己写的“玩具”(就是一整套项目页面 控制层 服务层 Dao层在一个项目的那种),改造了下。将前端(页面 控制层)抽出来做了一个单独的项目,后端(服务层 Dao层)抽出一个单独的项目,中间通过dubbo调用。在这两个项目Spring里整合dubbo,配置像下面这个样子









|------------------------------------------------------------------------------------------------------------|






我们可以看到,上面这种操作,给我的感觉就是服务端创建了service的对象,而前端有好像“拿到”了这个对象,当时蠢萌蠢萌的我,直接说呵呵,不就是一个对象流在网络上传递吗,把service对象序列化下,在前端反序列化下,大功告成~现在想想真的傻,首先序列化对象,只会序列化对象 类名 属性类型 属性值,你传过去给前端,你的方法实现前端还是没有啊。其次,即使我们有种技术可以把对象传到我这个前台项目,那分布式的一个意义,就是分布式之后我们可以更具并发量的不同,来安排每个项目或者叫服务安排机器,那如果你全部项目都是把对象给前端项目来执行,那并发量还不是落在了前端项目上?最近网上了解下,其实dubbo是创建了代理对象来两个项目间通信,当我们在前端调用对象的方法时,实际上调用代理对象的方法来发请求,我没有深入了解,但大体方向应该是没错的,等到毕设做完再来钻研钻研吧。

2.这个问题还是在我以前做的“玩具”与公司项目之间差别产生的。以前我写的项目 浏览器或者用jQuery发RestFul请求(我不知道浏览器怎么发delete和put请求..)到springmvc,springmvc拦截到请求分发给controller,然后controller调用dubbo给的service对象的后台方法。好了,这样Rest也用到了dubbo远程调用也用到了,完美.... 从对dubbo理解到Restful风格使用_第1张图片

但是,敲公司的代码的时候,他并没有所谓controller这一层,而是前台直接通过jQuery发请求(没有了java代码了),到service上(service接口上面写有rest形式 注解@path(/v1/xxx)),实现了前后端的分离。从对dubbo理解到Restful风格使用_第2张图片

可是这下我就蒙了,那我所有的前台页面直接通过Rest格式请求我服务层的业务了我要啥业务直接用请求取就好了,要你dubbo有个锤子用。跑去问有经验同事,同事问,你服务与服务之间怎么调用呢?我说也可以通过请求工具发请求啊,同事问那我一个服务调用5个服务,而这个服务还集群,那五个服务还调用其他乱七八在的服务。你这url图得多乱?dubbo就是干这件事的啊!....我说对哟..之前看过dubbo用zookeepr做注册中心的时候了解过.....而且下图还有一个问题,当存在b需要调d服务时 d和d’是集群,b怎么知道知道调那个d呢?一个d蹦了怎么办? dubbo有集群容错和负载均衡功能。
从对dubbo理解到Restful风格使用_第3张图片从对dubbo理解到Restful风格使用_第4张图片

这个问题本质上还是我理解得不够深,半桶水。像我上面有controller层的那个无非可以理解成 前端页面发请求 请求我controller服务,controller服务在调用了后台服务。 还有一个点就是,我前台界面请求后台服务的url路由乱怎么办,我的理解是,对于单种服务获取必须得记,但是单种服务下的集群,可以用nginx来做负载均衡(这个是我猜的,百度查不到,具体也没实际做过这种项目,还望懂得大佬指点)。

3.这个是关于上面问题。我对真正服务端接收请求有了一些理解。我们的项目之所以能接到请求Url,在最早学习javaweb的时候我们知道可以配servlet有servlet-mapping,而后来学习springmvc时候,我么只需配一个dispatcherservlet,在springmvc中他用一个分发servlet帮我们处理所有请求到对应的有@requestmapping的controller。而在我上面说的前台页面直接ajax请求到服务的时候,我们没有springmvc,这个时候dubbo提供了一个请求分发servlet(com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet),他能分发请求到  有 标准Java REST API:JAX-RS 的注解@path 的服务层实现或者接口上。具体的可以看我上面给的链接,感觉写的很好很容易明白。

你可能感兴趣的:(项目技术)