Dubbo(一)Apache Dubbo的基本认识

前言

在之前介绍过dubbo的使用,简单本地搭建了一个实例,原文地址如下:https://blog.csdn.net/liman65727/article/details/80111170

但是只是参照大牛的博客搭建了一个简单的使用实例而已,并没有加入自己的理解。

基本使用

基本使用可以参看原有的博客就可以了,但是针对其中每一项的配置,并没有自己的总结,这里重新针对这些配置再梳理一遍。

服务端配置

建立一个简单的maven项目,并在resource中建立META-INF/spring/application.xml文件,在这个文件中配置如下信息,从dubbo源码中可以看出,其实启动的路径是可以配置的,如果没有配置,dubbo在启动的时候是会默认去读取这个路径下的配置文件

从某一种程度上来说,服务端只是将服务以dubbo协议提供给客户端,客户端按照dubbo协议调用服务端所提供的服务。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
               http://dubbo.apache.org/schema/dubbo
               http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!--dubbo应用的服务端与客户端都需要配置name否则会提示no application name 的异常-->
    <dubbo:application name="dubbo-server"/>
    <!--协议名称,其实dubbo不止可以用dubbo的协议提供服务,还可以用webservice方式提供服务,这里配置的是dubbo协议-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--这里没有配置注册中心,即使没有使用注册中心,这个配置也不能省略,要以N/A的值替代-->
    <dubbo:registry address="N/A"/>
    <!--暴露指定的服务-->
    <dubbo:service interface="com.learn.service.api.IPayService" ref="payService"/>
    <!--暴露指定的服务-->
    <dubbo:service interface="com.learn.service.api.IQueryService" ref="queryService"/>
    <!--将指定的service交给spring进行托管-->
    <bean id="payService" class="com.learn.service.impl.PayServiceImpl"/>

    <bean id="queryService" class="com.learn.service.impl.QueryServiceImpl"/>
</beans>

客户端配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	   http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	   http://dubbo.apache.org/schema/dubbo
	   http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!--指定dubbo应用名称-->
    <dubbo:application name="dubbo-client"/>
    <!--没有注册中心的情况-->
    <dubbo:registry address="N/A"/>
    <!--通过url指定远程调用地址-->
    <dubbo:reference id = "queryService" interface="com.learn.service.api.IQueryService"
                     url="http://127.0.0.1:20880/com.learn.service.api.IQueryService"/>

</beans>

客户端使用实例:

/**
 * autor:liman
 * createtime:2019/9/22
 * comment:
 */
public class ClientApp {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext classPathXmlApplicationContext=
                new ClassPathXmlApplicationContext(new String[]{"application.xml"});

        IQueryService queryService = (IQueryService) classPathXmlApplicationContext.getBean("queryService");
        String queryServiceResult = queryService.queryPayList();
        System.out.println(queryServiceResult);
        System.in.read();
    }
}

 最终输出的结果可以在源码中查看,后文会贴上源码的地址。

引入zookeeper(可选)

从上面的实例来看,理论上其实可以不引入zookeeper也能完成远程调用,但是如果没有zookeeper,客户端维护服务端的远程调用地址就是一个很头疼的活儿,这也是zookeeper的主要作用。

引入zookeeper之后,客户端无需维护url属性,只需将上述的<dubbo:register/>中指定address即可,如下所示:

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

客户端和服务端均需要配置,完成配置之后,启动zookeeper,就无需在客户端维护不同的服务端地址。

RPC?

dubbo只是一个RPC框架么?其实从某一种程度上来讲,dubbo不只是一种RPC框架,dubbo可以支持所有主流的注册中心,针对RPC的协议,dubbo还支持rmi,hessian,http,webservice等,并不是只支持dubbo。下面以集成webservice协议为例来进行总结

1、需要在服务端引入依赖

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-simple</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.3.2</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>9.4.19.v20190610</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-servlet</artifactId>
    <version>9.4.19.v20190610</version>
</dependency>

2、服务端application.xml中引入如下配置

<dubbo:protocol name="webservice" port="8080" server="jetty"/>

 这个配置可以和之前的<dubbo:protocol name = "dubbo" port = "20880"/>共存

3、在暴露的服务中,指定注册协议

<dubbo:service interface="com.learn.service.api.IPayService" ref="payService" protocol="dubbo,webservice"/>

之后通过浏览器就可以查看wsdl文档了。这里就不再详细贴图了。

总之除了dubbo协议,其实dubbo还可以提供rest,HTTP的远程调用协议,所以与其说dubbo是一个RPC调用框架,倒不如说它是一个分布式服务治理组件。

dubbo-admin的使用

这个是dubbo的监控平台,我们需要从github上下载然后即可使用,下载地址:https://github.com/apache/dubbo-admin

使用步骤就在其readme文档中

无非就是先clone下来代码,然后修改配置文件中的注册中心地址,改为我们应用的注册中心地址,使用maven构建完成之后,运行打包成功的jar包之后,就可以看到dubbo-admin的界面了,其中还支持zookeeper的元数据配置。这个参考相关文档即可。

先贴一张maven构建成功后的截图

然后贴一张运行成功后截图

 

总结

dubbo不只是RPC,后续会用dubbo体验一下负载均衡

发布了129 篇原创文章 · 获赞 37 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/liman65727/article/details/102235601