Dubbo分布式系统实现

近期很多人在问小编分布式,小编就整理了一下资料,有什么问题,可以在下面评论填写

Dubbo分布式系统实现

Dubbo是一个非常轻量级的分布式RPC框架,它使用Spring进行配置,而非注入式的编程方式,深受大家的喜爱。粗浅的研究了一下其应用,并使用Web容器(Jetty)实现了一个基于Dubbo的分布式系统,提供多种服务,并可以在多个服务源中进行切换。国内使用Dubbo的企业有:阿里巴巴、京东、当当、携程、去哪儿、搜狐、南方航空、中软国际、软通动力、各大电信运营商等

体系架构

Demo系统的参与者包括

服务的消费者(Consumer)是多种形式,这里采用war包的方式放到Jetty服务器中。后台由Spring容器进行管理,以获得服务的句柄;前台为了简便,使用最基本的Servlet来展现获取的服务内容;

服务的提供者(Provider)同时采用多种形式,这里也同样采用war包方式放到Jetty服务器中,并由Spring容器进行管理。系统可以有多个Provider,这就需要多个Jetty环境,并在注册中心注册;

服务注册中心(Registry)用于管理所有服务,Consumer和Provider都要在配置中指明注册中心地址。Registry可以使用Redis和Zookeeper来显示,本Demo使用后者。

Dubbo实现的监控中心(Monitor)和服务治理程序(Admin)用于监控系统的使用情况和性能,同时在多个提供者的情况下,提供服务治理功能,例如权重,生效/失效设置等。

下图是整个体系架构的描述。

Dubbo分布式系统实现

API的定义

API是Java接口定义的约定Consumer和Provider都可使用的函数列表。Consumer通过API了解Service能够提供的服务;Provider提供服务的实现。其中

Service.java只是一个空接口,所有的服务都延续自这个接口。

public interface Service { }

DateService.java提供一个关于日期的服务,调用后会回到一个当前的日期。

public interface DateService extends Service {

public DateServiceResult getCurrentDate();

}

MathService.java提供一个关于数字的服务,调用后会返回一个排序的数组(相对于参数)。

public interface MathService extends Service {

public NumberServiceResult sort(int[] numbers);

}

StringService.java提供一个关于字符串的服务,调用后会返回一个翻转的字符串(相对于参数)。

public interface StringService extends Service {

public StringServiceResult reverse(String str);

}

API作为一个独立的,其Java的jar包发布给Consumer使用。API之主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

服务的消费者

为了方便,这里将服务的Consumer作为基本的Servlet来处理。如果Servlet可以运行,应用到JSP,或是JSF环境中水到渠成。而Consumer中最重要的是获取服务的句柄,因为由于有API的存在,所以在静态编程中,是很简单的,且没有技术难度。其获取句柄的代码在init方法中,如下:

@Override

public void init() throws ServletException {

super.init();

ServletContext servletContext = this.getServletContext();

WebApplicationContextctx=WebApplicationContextUtils

.getWebApplicationContext(servletContext):

dateService = (DateService) ctx.getBean("dateService");

}

不言而喻,通过Spring容器获得真实的对象(由Provider实现),并从对象的调用结果中获取我们需要的内容。

服务的提供者

服务提供者框架是指:多个服务提供者实现一个服务,系统为客户端提供多个实现,并把他们从多个实现中解出来。它的改变对它们的客户端是透明的,这样有更好的可扩展性。JDBC等就是用了服务提供者框架

服务提供者框架是指这样的一个系统:提供者为框架的用户提供了多个API实现,框架必须提供一种机制来注册这些实现以便用户能够使用它们。框架的客户直接使用API,无需关心自己到底在使用哪个实现。

服务的Provider是比较简单的,只需要实现API所定义的方法即可,这里就不列举了。但为了将这个实现加载到Dubbo的系统中,也需要Spring容器,并打成War包发布到Jetty中。

Spring容器的配置

如下:

web.xml

web.xml的配置对于Consumer和Provider都是一样的,即定义Spring容器,如下所示

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/classes/applicationContext*.xml</param-value>

</context-param>

作为Consumer,还要定义Servlet的映射,不再过多的详述。

Consumer如下:

<!-- !!!!! COMMON SETTING !!!!! -->

<!-- Name consumer. -->

<dubbo:application name="dubbo-evaluation-consumer" />

<!--Use ZooKeeper as registry. -->

<dubbo:registry address="zookeeper://10.16.2.46:2181" />

<!-- Find monitor from registry for statistics and charts. -->

<dubbo:monitor protocol="registry" />

<!-- !!!!! DECLARE SERVICE !!!!! -->

<!-- Declare interface of STRING service. -->

<dubbo:referenceid="stringService"

interface="com.synnex.dubboevaluation.service.StringService" />

<!-- Declare interface of MATH service. -->

<dubbo:reference id="mathService"

interface="com.synnex.dubboevaluation.service.MathService" />

<!-- Declare interface of DATE service. -->

<dubbo:reference id="dateService"

interface="com.synnex.dubboevaluation.service.DateService" />

对于Consumer,比较重要的有以下几点

一、使用 dubbo:registry 声明注册中心;

二、使用 dubbo:reference 声明接口。

Provider如下:

<!- - !!!!! COMMON SETTING !!!!! - ->

<!- - Name provider - ->

<dubbo:application name="dubbo-evaluation-provider" />

<!- - Use ZooKeeper as registry. - ->

<dubbo:registry address="zookeeper://10.16.2.46:2181" />

<!- - Show service at 20880 with dubbo protocol. - >

<dubbo:protocol name="dubbo" port="20880" />

<!- - Find monitor from registry for statistics and charts. - ->

<dubbo:monitor protocol="registry"/>

<!-- !!!!! DECLARE SERVICE !!!!! -->

<!- - Declare interface of STRING service. - ->

<dubbo:service interface="com.synnex.dubboevaluation.service.StringService"

ref="stringService" />

<!- - Implement service as local. - ->

<bean id="stringService" class="com.synnex.dubboevaluation.service.StringServiceImpl" />

<!- - Declare interface of MATH service. - ->

<dubbo:service interface="com.synnex.dubboevaluation.service.MathService"

ref="mathService" />

<!- - Implement service as local. - ->

<bean id="mathService" class="com.synnex.dubboevaluation.service.MathServiceImpl" />

<!- - Declare interface of DATE service. - ->

<dubbo:service interface="com.synnex.dubboevaluation.service.DateService"

ref="dateService" />

<!- - Implement service as local. - ->

<bean id="dateService" class="com.synnex.dubboevaluation.service.DateServiceImpl" />

其对于Provider,其比较重要的有以下:

一、使用 dubbo:registry 声明注册中心;

二、使用 dubbo:service 声明服务;

三丶使用 bean id="xxxService" 声明服务的实现。

就这样为分布式系统的服务治理框架就出现了,dubbo也就这样产生了。dubbo在整个分布式系统的架构中,按照分层的架构来架构,使得各个层级之间最大限度的松耦合.

小编感觉这文章有点乱。。。。。有需要更改的地方可以告诉小编哟

相关推荐