Dubbo快速开始与依赖

Posted 程序员超时空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo快速开始与依赖相关的知识,希望对你有一定的参考价值。

1、参考

快速开始:http://dubbo.apache.org/en-us/docs/user/quick-start.html

依赖:http://dubbo.apache.org/en-us/docs/user/dependencies.html

Dubbo官方文档提供了一个最简单的快速入门示例,但它存在一点问题。本文从无到有,演示如何把这个最简单的示例运行起来。

2、创建演示项目及模块

创建名为dubbo-demo的项目,其中包括三个模块:

  1. dubbo-demo-api,定义服务接口接口
  2. dubbo-demo-provider,实现服务接口
  3. dubbo-demo-consumer,引用服务接口

新创建一个Maven简单项目,下一步:

填写Group Id、Artifact Id、Version、Packaging,其中Packaging是pom,点Finish按钮,生成的项目如下图所示:

把其中的src目录删除,接下来修改一下pom,修改后内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>aaa.bbb.ccc</groupId>
	<artifactId>dubbo-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<jdk.version>10</jdk.version>
		<maven.compiler.source>10</maven.compiler.source>
		<maven.compiler.target>10</maven.compiler.target>
	</properties>
</project>

只是增加properties属性,因为我本机安装的jdk是10.0.2,所以设置的值都是10,这个根据自己环境自行调整,但是Dubbo规定jdk的版本要1.6+。

接下来添加dubbo-demo-api模块。用鼠标右击项目dubbo-demo,从弹出的菜单中选择Maven,再从弹出的菜单中选择新建Maven模块,如下图,写上模块名、选上创建简单项目即可,其它使用默认值。

重复此操作,创建dubbo-demo-provider、dubbo-demo-consumer两个模块。最后结果如下图:

Eclipse自动向pom添加与Module有关的内容,现在dubbo-demo的pom.xml文件内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>aaa.bbb.ccc</groupId>
	<artifactId>dubbo-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<jdk.version>10</jdk.version>
		<maven.compiler.source>10</maven.compiler.source>
		<maven.compiler.target>10</maven.compiler.target>
	</properties>
	<modules>
		<module>dubbo-demo-api</module>
		<module>dubbo-demo-provider</module>
		<module>dubbo-demo-consumer</module>
	</modules>
</project>

3、在dubbo-demo-api模块中定义接口

按官方参考文档,向dubbo-demo-api模块中添加包org.apache.dubbo.demo,在包下边添加接口DemoService,结果如下图:

DemoService.java中的代码,直接从官网复制:

package org.apache.dubbo.demo;

public interface DemoService 
	String sayHello(String name);

本模块只是定义共享接口供provider与consumer使用,没有其它额外的依赖,也不用修改pom文件,pom.xml内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>aaa.bbb.ccc</groupId>
    <artifactId>dubbo-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>dubbo-demo-api</artifactId>
</project>

然后运行一下Maven的install命令,把这个接口打包安装到本地的Maven仓库,以便在其它模块中引用它。

右击模块名称,选择Run As,再选择Maven build…,如下图所示,在Goals中写入install:

然后点一下run按钮,从console确认一下jar包已经安装到本地仓库。

4、在dubbo-demo-provider模块中实现接口

因为实现接口时要依赖定义接口的jar包、dubbo的jar包、日志模块的jar包等,因此先修改其pom.xml文件,增加依赖包,修改后内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>aaa.bbb.ccc</groupId>
		<artifactId>dubbo-demo</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>dubbo-demo-provider</artifactId>

	<dependencies>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.6</version>
			<exclusions>
				<exclusion>
					<groupId>org.jboss.netty</groupId>
					<artifactId>netty</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>io.netty</groupId>
			<artifactId>netty-all</artifactId>
			<version>4.0.35.Final</version>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.16</version>
		</dependency>


		<dependency>
			<groupId>aaa.bbb.ccc</groupId>
			<artifactId>dubbo-demo-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>
</project>

官方文档中用的dubbo版本为2.5,9,如果用这个版本程序将无法运行(可能是向前兼容问题。定义配置文件的xsd应该修改过,2.5.9用这个xsd时会报配置文件格式错误)。我这里用的是2.6.6,发布版中的最新版本。本来在依赖dubbo时,项目会间接的依赖netty包,但是这个默认依赖的包好像缺东西,程序无法正常运行,因此强制排除,然后显式依赖netty-all这个包,这个包比较全。

然后是log4j,用来输出日志。再然后就是刚才定义的共享接口的包。

修改好pom后更新一下模块,看一下本模块的依赖状态,如下图所示:

其中spring、commons-logging、javassist等是dubbo间接依赖进来的,文档里有介绍。如果想使用其它版本的话可以像netty一样强制排除,然后再显式加入自己依赖的版本。

另外像netty-all、log4j等版本是官方考虑稳定性、性能等推荐选用的,文档上有说明,就按这个来。

接下来向模块中添加自定义包、添加接口实现代码、服务启动代码等:

DemoServiceImpl.java从文档中直接复制,内容如下:

package org.apache.dubbo.demo.provider;

import org.apache.dubbo.demo.DemoService;

public class DemoServiceImpl implements DemoService 

	@Override
	public String sayHello(String name) 
		return "Hello " + name;
	


Provider.java代码:

package org.apache.dubbo.demo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Provider 

	public static void main(String[] args) throws Exception 
		System.setProperty("java.net.preferIPv4Stack", "true");
		@SuppressWarnings("resource")
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[]  "META-INF/spring/dubbo-demo-provider.xml" );
		context.start();
		System.out.println("Provider started.");
		System.in.read(); // press any key to exit
	

接下来按文档在src/main/resources目录下添加配置文件,一个与dubbo有关,一个与日志有关。最后目录结构如下:

dubbo-demo-provider.xml内容,从文档复制的,不用修改:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       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">

    <!-- provider's application name, used for tracing dependency relationship -->
    <dubbo:application name="demo-provider"/>
    <!-- use multicast registry center to export service -->
    <dubbo:registry address="multicast://224.5.6.7:1234"/>
    <!-- use dubbo protocol to export service on port 20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!-- service implementation, as same as regular local bean -->
    <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
    <!-- declare the service interface to be exported -->
    <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
</beans>

log4j.properties也是从文档复制,不用修改,内容如下:

###set log levels###
log4j.rootLogger=info, stdout
###output to the console###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%ddd/MM/yy hh:mm:ss:sss z] %t %5p %c2: %m%n

运行一下代码,从控制台确认一下输出:

会有一些警告,不用在意。这样Provider已经运行起来,可以对外提供服务了。

我们知道Dubbo有一个Registry用来发布、定阅服务,推荐的Registry是Zookeeper。这个例子中用的是Multicast方式,非常简单,不用依赖额外的包,也不用启动额外的服务,测试的话没有问题。

5、在dubbo-demo-consumer模块中引用接口

Consumer的依赖与Provider一样,把Provider中的dependency配置复制过来就行,内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>aaa.bbb.ccc</groupId>
		<artifactId>dubbo-demo</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>dubbo-demo-consumer</artifactId>

	<dependencies>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.6</version>
			<exclusions>
				<exclusion>
					<groupId>org.jboss.netty</groupId>
					<artifactId>netty</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>io.netty</groupId>
			<artifactId>netty-all</artifactId>
			<version>4.0.35.Final</version>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.16</version>
		</dependency>


		<dependency>
			<groupId>aaa.bbb.ccc</groupId>
			<artifactId>dubbo-demo-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>
</project>

然后是配置文件,目录结构与Provider相同,其中日志的配置相同。直接把Provider中src/main/resources目录下的内容全部复制过来,然后将dubbo-demo-provider.xml改成dubbo-demo-consumer.xml,把内容按文档改一下就可以。最后目录结构如下:

dubbo-demo-consumer.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
	xmlns="http://www.springframework.org/schema/beans"
	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">

	<!-- consumer's application name, used for tracing dependency relationship 
		(not a matching criterion), don't set it same as provider -->
	<dubbo:application name="demo-consumer">
		<dubbo:parameter key="qos.enable" value="true" />
		<dubbo:parameter key="qos.accept.foreign.ip"
			value="false" />
		<dubbo:parameter key="qos.port" value="33333" />
	</dubbo:application>
	<!-- use multicast registry center to discover service -->
	<dubbo:registry address="multicast://224.5.6.7:1234" />
	<!-- generate proxy for the remote service, then demoService can be used 
		in the same way as the local regular interface -->
	<dubbo:reference id="demoService" check="false"
		interface="org.apache.dubbo.demo.DemoService" />
</beans>

这个文件的内容与官方文档稍有差别,增加了如下几行内容:

<dubbo:parameter key="qos.enable" value="true"/>
<dubbo:parameter key="qos.accept.foreign.ip" value="false"/>
<dubbo:parameter key="qos.port" value="33333"/>

Dubbo在启动Provider与Consumer时,同时还会启动一个telnet服务,这个服务用来远程管理、运维Provider与Consumer实例。默认这个服务占用22222端口。因为在本例中Provider与Consumer启动在同一台主机上,因此22222端口已经被Provider占用,所以要为consumer显式的配置另外一个端口,否则会报端口已绑定的错误。

接下来按文档向项目中添加package、代码,结果如下:

Consumer.java内容:

package org.apache.dubbo.demo.consumer;

import org.apache.dubbo.demo.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Consumer 

	public static void main(String[] args) 
		@SuppressWarnings("resource")
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[]  "META-INF/spring/dubbo-demo-consumer.xml" );
		context.start();
		// Obtaining a remote service proxy
		DemoService demoService = (DemoService) context.getBean("demoService");
		// Executing remote methods
		String hello = demoService.sayHello("world");
		// Display the call result
		System.out.println(hello);
	

运行一下程序,输出如下:

这样一个最简单的Dubbo实例就运行起来了。

以上是关于Dubbo快速开始与依赖的主要内容,如果未能解决你的问题,请参考以下文章

springboot-dubbo

RPC-Dubbo快速入门

Dubbo的使用

Dubbo | Dubbo快速上手笔记 - 环境与配置 #yyds干货盘点#

Dubbo01

初识 Dubbo