前言
在之前介绍过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体验一下负载均衡