分布式服务之Dubbo_01_基础框架搭建

来源:互联网 发布:篮球鞋 知乎 编辑:程序博客网 时间:2024/04/28 15:02

生活很简单,也很难,归根结底还是不简单,不管活得好还是不好。活得好,处处留心,活得小心翼翼。活得不好,处心积虑,心力交瘁,想要活好。活着不易,为自己活着更难。只不过还活着,总比死去好,活着还可以多看些风景,多一些经历。说到底活得好不好也只有自己知道,自己的心知道,活得累些却未必不开心,活得好些也未必能开心。不一定要求能为自己而活,能为别人而活,至少你不是孤独的,至少还有值得你为之活着的人。顺心也好,不顺心也罢,活着那便是好的。若闭眼可以梦见美丽的姑娘,睁眼可以看见明日的朝阳,那便更好。

开篇

最近一段时间开发暂时闲了下来,在这之余,回顾了一下公司项目的整体架构,略做整理,并写了些Demo,权当是做些总结吧。

这项目虽然算不上是什么大型项目,也没有所谓的高访问量、高并发、海量数据,虽项目不大,但架构尚全。其中一些子系统,如积分系统,也分离出单独的服务,分布治之。这里主要要说的也就是分布式服务,当然在此我不怎么讲太多理论方面的东西,因为很多地方我也说不清。暂且结合一些示例,窥其一二。

不过开篇之前还是要说一些与之相关的概念和技术。

其一,分布式

分布,从字面意思说那就是分布,这很字面了,换个词说,遍布。这词就更清楚了,如春天野花遍布满山,如我大中华无数省市、县镇遍布神州大地。再看看分布式系统,那不就是一个x系统,xx系统,xxx系统…遍布在一个大的xxxxx系统吗?而且x系统,xx系统,xxx系统…各司其职,共同为这个大的xxxxx系统服务,就像我们人体一样,心肝脾肺肾耳嘴鼻提供了不同的功能,才让一个人能呼吸,能思考,能说话。

再往深处想,我人体的某个器官没了,是不是人就挂了呢,当然不是绝对的,心脏没了,自然不能活,但像什么肾透支啦,或者割了一个去换爱疯啦,那自然还死不了。再想一想,我们身体的各个器官之间虽是各行其事,但它们之间也有着紧密的关联,只是它们之间建立的联系或许微妙无比,令人难以捉摸。

拿出分布式系统再想一想,这些分布的服务自然也有着联系,机器的联系那就是通信嘛,这可比人体简单多了。但说到服务间的通信,一言半语也说不清,当然我也说不出,那便不说太多。

其中涉及一个比较重要的协议,就是RPC(远程过程调用),说白了,就是为了解决服务之间调用问题的,要深入了解,出门左转百度或者谷歌。

RPC有许多成熟的实现方案,比如RMI、WebService,以及接下来要说到的Dubbo。

其二,Dubbo

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供…(不忍再复制了,去官网看吧http://dubbo.io/)

Dubbo是阿里的,说实话我觉得阿里一直很牛逼,中国几个巨头之中,我一向最服阿里,阿里开源了挺多技术,这种精神的确挺值得我们学习的。分享不仅是乐趣,更是进步和创新。

至于Dubbo的介绍,官网很详细了,至于如何使用,官网也很详细了,我在这里不过是结合一个较为完整的示例,说说怎么用它,以及会遇到的一些问题。

具体内容请继续往下看。

其三,Zookeeper

先不说Zookeeper,暂回到我们的身体,且说我们体内的器官如何运作,自然是离不开大脑的调度,它们之间的联系自然也与大脑紧密相关。大脑可以说是人体的核心,是中央调度者、指挥官,它控制人该干嘛干嘛,控制器官、组织该干嘛干嘛。因为有它的存在,人体各个功能才能有条不紊地进行。人体再复杂,有大脑的统辖,中国再广,有中央政府的统辖。多、杂、广而不乱,这才是最重要的。

回到分布式服务,如果很多服务集成到一个系统里,那自然很乱,自然需要有人管理吧。于是引出了Zookeeper。

Zookeeper,是Apache下的子项目(总感觉说到什么技术,都离不开Apache),他是为分布式服务的,为了更好管理这些繁杂的服务,为了它们之间更好的被调用。他就像人体的大脑,他给服务指定好栖身之地,给它们取一个好的名字,监听者它们得一举一动…

服务提供者

前面说这些,只是大致了解下分布式,他很牛逼,但不神圣。接下来,就根据具体的示例了解怎么通过Dubbo搭建一个基础的分布式框架。

说到服务,都会想到提供者和消费者,就像卖家和买家一样。服务不是凭空出现的,因为有人需要,所以有人提供,因为有人提供,它才出现。

示例是Dubbo结合Spring以及Zookeeper。

提供者大概结构:

提供者接口

提供者实现类

涉及的jar包(可能有些是不必要的):

涉及的jar包

这里将接口独立在了dubbo-interface这个项目,dubbo-provider通过Maven依赖。

interface中DubboProviderProvideService.java是提供的接口:

package com.oyjx.dubbo.provider.service;/** * dubbo-provuder提供服务的接口 * @autor ouyangjx * @date 2016-11-23 */public interface DubboProviderProvideService {    public String sayHello(String name);}

provider中DubboProviderProvideServiceImpl.java是接口的实现类:

package com.oyjx.dubbo.provider.service.impl;import org.springframework.stereotype.Service;import com.oyjx.dubbo.provider.service.DubboProviderProvideService;/** * dubbo-provuder提供服务的实现类 * @autor ouyangjx * @date 2016-11-23 */@Service("dubboProviderProvideService")public class DubboProviderProvideServiceImpl implements DubboProviderProvideService {    public String sayHello(String name) {        return "From dubbo provider:Hello," + name + "!";    }}

provider中的applicationContext-dubbo-provider.xml主要配置提供者要提供服务的接口,指定注册中心等:

<!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="dubbo_provider_demo" /><!-- 使用zookeeper注册中心暴露服务地址 --><dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" /><!-- 用dubbo协议在20880端口暴露服务,注意端口不要重复 --><dubbo:protocol name="dubbo" port="20880" /><!-- 声明需要暴露的服务接口 --><dubbo:service interface="com.oyjx.dubbo.provider.service.DubboProviderProvideService" ref="dubboProviderProvideService" />

注:示例中没有模拟多台服务器,所以Zookeeper也是安装在了本机。

名为dubboProviderProvideService的接口就当成了一个服务暴露出去了,等待消费者调用,那接下来就看看消费者那边。

服务消费者

消费者大概结构:

消费者接口

消费者引入提供者的接口

消费者实现类

这里一样的将接口独立在了dubbo-interface这个项目,dubbo-customer通过Maven依赖:

看看配置文件:

<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --><dubbo:application name="dubbo_customer_demo" /><!-- 使用zookeeper注册中心暴露服务地址 --><dubbo:registry address="zookeeper://127.0.0.1:2181" /><!-- 生成远程服务代理,可以像使用本地bean一样使用dubboProviderProvideService。注意不能直接依赖dubbo-provider项目!!! --><!-- timeout:远程调用超时时间 --><!-- check:启动时是否检查服务是否可用,false则不检查 --> <!-- 比如两个服务相互调用时,必须将check设置为flase,否则无法启动 --><dubbo:reference id="dubboProviderProvideService" interface="com.oyjx.dubbo.provider.service.DubboProviderProvideService" timeout="3000" check="false" />

消费者自然是需要从注册中心中拿到提供的接口,并通过注入创建其实例,实现远程调用;上面代码提到的一个check参数,挺有意思,消费者和提供者之间本是不相关的,但是消费者要调用其服务,默认会去检测其服务是否可用,若此时提供者还未启动,那消费者也不能正常了,所有设置check=false,消费者启动时不去检查提供者提供的服务是否可用。

customer中DubboCustomerCallServiceImpl.java实现对提供的接口进行调用:

package com.oyjx.dubbo.customer.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.oyjx.dubbo.customer.service.DubboCustomerCallService;import com.oyjx.dubbo.provider.service.DubboProviderProvideService;/** * dubbo-customer调用dubbo-provider提供的服务的实现类 * @autor ouyangjx * @date 2016-11-23 */@Service("dubboCustomerCallService")public class DubboCustomerCallServiceImpl implements DubboCustomerCallService {    @Autowired    DubboProviderProvideService dubboProviderProvideService;    public String sayHello(String name) {        // 调用远程方法,注意不能直接依赖dubbo-provider项目!!!(而是将接口封装在jar包中【如此例中的dubbp-interface】,然后引入)        return dubboProviderProvideService.sayHello(name);    }}

这里需要强调的一点是,因为要调用提供者提供的接口,所以消费者需要引入与之一致的接口,我一开始直接在消费者(dubbo-customer)中依赖提供者(dubbo-provider)这个项目,这样就可以找到提供服务的接口了,但后来发现这样出错了,所有才将接口分离在interface,其实在真实的项目中也会这样做的。

DubboProviderProvideService接口的实现类:

package com.oyjx.dubbo.provider.service.impl;import org.springframework.stereotype.Service;import com.oyjx.dubbo.provider.service.DubboProviderProvideService;/** * dubbo-provuder提供服务的实现类 * @autor ouyangjx * @date 2016-11-23 */@Service("dubboProviderProvideService")public class DubboProviderProvideServiceImpl implements DubboProviderProvideService {    public String sayHello(String name) {        return "From dubbo provider:Hello," + name + "!";    }}

调用结果:From dubbo provider…说明调用的是服务提供者提供的方法。的确,通过Dubbo调用其它服务的方法就像是调用本地方法一样,用的时候很是方便,同时我想效率应该也很高吧。

这里写图片描述

当然,服务提供者和消费者之间的关系不是绝对的,服务者也可以调用别的服务,消费者也可以提供服务,两个服务都是同为提供者和消费者的(具体可见源码,请往下看)。不过要注意的一点的暴露端口的服务不能重复;另外,还是上文提到的check参数,注意设置为false,否则两个服务都会无法启动!

具体的Demo源码已经上传至csdn(jar包不在里面,都是通过Maven添加的,可能下载起来会很慢,需要的可以留下邮箱)
点我下载

另,关于Dubbo的例子,在官网文档已经说得很详细了,特别是配置文件中涉及的标签和参数说明,此外,Dubbo并非只能结合Spring使用,官网文档也提供了其它使用方式,详情可见:
Dubbo用户指南

像这样的分布式服务用得还是较为广泛的,特别是一些高访问量、高并发的业务,很多系统都会将这些业务分离出来当做一个独立的系统,提供服务由其他业务调用,常见的比如:积分系统、支付系统、评论系统等。只是,将业务分离之后也会遇到许多难题,比如令人头疼的事务问题等。

Dubbo管理后台

dubbo提供了一个可视化的管理系统——dubbo-admin。

这个管理后台可以很清楚得看到注册在Zookeeper中的服务以及其机器分布,另外提供了一些负载均衡的强大的功能,具体可以百度或谷歌。

dubbo-admin是一个JavaWeb项目,直接下载并将war包扔到Tomcat就行,要注意的是需要将之放在和Zookeeper同一台机器上!浏览器打开连接,输入默认账号密码(root、root)即可进入首页:

这里写图片描述

这是在dubbo上的应用,可以看到它们既是提供者也是消费者:

这里写图片描述

这是在dubbo上注册的可被调用的服务:

这里写图片描述

关于分布式、关于Dubbo,还有很多深层次的东西可以探讨。讲真,往深了,我也不会,我也还要学,所以这篇暂到这里。

总结

  • 又到了总结时间;
  • 之一:分布分布,说的就是人多力量大,前提是所有人要能各司其职并且团结一心,否则万夫仍不可敌一人勇;
  • 之二:学无止境,我想学习某个技术不要求自己要完全懂它,首先要会用它,然后若有兴趣,再去深究它。知识是死的,人是活的,它是死是活完全在我。学以致用,活灵活用。
  • 之三:还是这句,多读书,多睡觉。我的意思是,多读好书,多睡好觉。什么是好书,你觉得好就是好书,不管是雅是俗。什么是好觉,困了就睡,就能睡好觉。
0 0
原创粉丝点击