一、简介
Apache Dubbo 是一款微服务开发框架,主要功能是RPC通信与微服务治理。这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。同时 Dubbo 是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。
详细文档可以查看dubbo官网:https://dubbo.apache.org/zh/docs/ dubbo源码地址:https://github.com/apache/dubbo dubbo示例源码地址:https://github.com/apache/dubbo-samples
二、dubbo的简单应用
1、创建三个项目:
provider:服务提供项目
consumer:服务调用项目
service-api:服务的公共接口项目
2、引入依赖包
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.11</version>
</dependency>
3、定义接口和实现
在service-api下:定义公共接口:
public interface HelloService {
String sayHello(String name);
}
在provider定义实现类(provider需要引入service-api的依赖):
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name +
", request from consumer: " + RpcContext.getContext().getRemoteAddress());
return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
}
}
4、用 Spring 配置声明暴露服务。xml配置文件默认放在resources/METAINF/spring/ 文件夹下,名字随意。
在provider下配置application.xml:
<?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:application name="service-provider"/>
<!--配置注册中心,没有就用N/A-->
<dubbo:registry address="N/A"/>
<!--协议和端口-->
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="包名.HelloService" ref="helloService"/>
<bean id="helloService" class="包名.HelloServiceImpl"/>
</beans>
在consumer里定义(consumer需要引入service-api的依赖)application.xml:
<?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:application name="service-consumer"/>
<!--配置注册中心-->
<dubbo:registry address="N/A"/>
<!--没配置注册中心的话需要使用服务的url protocol://ip:端口/路径-->
<dubbo:reference interface="包名.HelloService" id="helloService "
url="dubbo://192.168.56.1:20880/包名.HelloService"/>
</beans>
5、启动以及调用服务
启动服务:
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/spring/application.xml");
context.start();
System.out.println("dubbo service started");
//让程序一直运行
System.in.read();
}
或者直接使用dubbo的启动方法
public static void main( String[] args ) {
Main.main(new String[]{"spring","log4j"});
}
调用服务:
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/META-INF/spring/application.xml");
context.start();
HelloService helloService = ( HelloService) context.getBean("helloService ");
String hello = helloService .sayHello("world");
System.out.println(hello);
}
服务分组:
使用服务分组区分服务接口的不同实现,当一个接口有多种实现时,可以用 group 区分。
服务端:
<dubbo:service group="feedback" interface="com.xxx.IndexService" />
<dubbo:service group="member" interface="com.xxx.IndexService" />
客户端引用:
<dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" />
<dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" />
任意组:
<dubbo:reference id="barService" interface="com.foo.BarService" group="*" />
三、dubbo的注册中心及协议的支持
1、注册中心
作为主流的服务治理组件,当然不能没有注册中心,dubbo最开始使用的是zookeeper来支持注册中心。在新版本中也提供了诸如consul、etcd、nacos、sofa、zookeeper、redis、multicast等组件来实现注册中心。dubbo支持的注册中心(不同版本有所不同):
以zookeeper为注册中心为例:
1、引入依赖包(使用curator):
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
2、在spring的配置文件配置注册中心
provider:
单机配置:
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
或
<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181" />
集群配置:
<dubbo:registry address="zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181" />
或
<dubbo:registry protocol="zookeeper" address="10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181" />
配置多个注册中心
<dubbo:registry id="rg1" address="zookeeper://127.0.0.1:2181"/>
<dubbo:registry id="rg2" address="zookeeper://10.20.153.10:2181"/>
consume:
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--使用注册中心就不用使用url了,使用了多个配置中心,使用registry注明-->
<dubbo:reference interface="包名.HelloService" id="helloService" registry="rg1"/>
详情参考dubbo官方文档注册中心配置:https://dubbo.apache.org/zh/docs/references/registry/
2、远程通信协议
Dubbo 对于 RPC 通信协议的支持,不仅仅是原生的 Dubbo 协议,它还围绕着 rmi、hessian、http、webservice、thrift、rest 有了多协议的支持,使得其他 rpc 框架的应用程序可以快速的切入到 dubbo生态中。 同时,对于多协议的支持,使得不同应用场景的服务,可以选择合适的协议来发布服务,并不一定要使用 dubbo 提供的长连接方式。
dubbo支持的协议(不同版本会有所不同):
以webService为例:
1、引入依赖:webService基于http,需要web容器的支持,所以引入jetty。
<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、配置spring的配置文件:
provider:
<dubbo:protocol name="webservice" port="8080" server="jetty"/>
<dubbo:reference interface="包名.HelloService" id="helloService" registry="rg1" protocol="webservice"/>
启动服务之后 ,可以使用 :
http://localhost:8080/包名.HelloService?wsdl 来获得Webservice的wsdl描述文档。
这里需要注意zookeeper新版本引入了AdminServer功能,此功能也使用了jetty,可能会造成8080端口冲突。
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:application name="world" />
<dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用dubbo协议暴露服务 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
<!-- 使用rmi协议暴露服务 -->
<dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" />
</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:application name="world" />
<dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="hessian" port="8080" />
<!-- 使用多个协议暴露服务 -->
<dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
</beans>