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)用于监控系统的使用情况和性能,同时在多个提供者的情况下,提供服务治理功能,例如权重,生效/失效设置等。
下图是整个体系架构的描述。
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在整个分布式系统的架构中,按照分层的架构来架构,使得各个层级之间最大限度的松耦合.
小编感觉这文章有点乱。。。。。有需要更改的地方可以告诉小编哟