Dubbo快速上手案例
最近开始学习Dubbo框架, 这一篇主要总结了首次使用Dubbo并集成Spring的一个快速上手的例子
所需环境
zookeeper作为dubbo的注册中心,dubbo服务提供方和消费方都需要在zookeeper注册中心注册
注: 本案例选择在Docker中运行Zookeeper
具体的docker启动Zookeeper服务的命令如下:
1 2 3 4
| >docker run -d -p 2181:2181 \ -v /home/zk/workspace/dubbo_learn/quick-start/zookeeper/data/:/data/ \ --name=zookeeper \ --privileged zookeeper
|
使用时请将具体Zookeeper保存目录修改为你的实际目录
开始搭建
服务提供方和消费方都需要的包
这里我新建maven工程为pom工程,将共同的项目依赖写到pom.xml中
① 总的项目结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| zk@jasonkay:~/workspace/dubbo_learn/quick-start$ tree . ├── docker_cmd.sh ├── dubbo-api │ ├── dubbo-provider.iml │ ├── pom.xml │ ├── src │ │ └── main │ │ ├── java │ │ │ └── top │ │ │ └── jasonkayzk │ │ │ └── service │ │ │ └── DemoService.java │ │ └── resources ├── dubbo-consumer │ ├── dubbo-provider.iml │ ├── pom.xml │ ├── src │ │ └── main │ │ ├── java │ │ │ └── top │ │ │ └── jasonkayzk │ │ │ └── ConsumerTest.java │ │ └── resources │ │ ├── dubbo-consumer.xml │ │ ├── log4j.properties │ │ └── springmvc.xml ├── dubbo-provider │ ├── dubbo-provider.iml │ ├── pom.xml │ ├── src 原文链接:https://blog.csdn.net/jingyangV587/article/details/84986577 │ │ └── main │ │ ├── java │ │ │ └── top │ │ │ └── jasonkayzk │ │ │ ├── ProviderTest.java │ │ │ └── service │ │ │ └── DemoServiceImpl.java │ │ └── resources │ │ ├── dubbo-provider.xml │ │ ├── log4j.properties │ │ └── springmvc.xml ├── pom.xml
|
② pom.xml文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| <?xml version="1.0" encoding="UTF-8"?> <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>top.jasonkayzk</groupId> <artifactId>quick-start</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging>
<modules> <module>dubbo-api</module> <module>dubbo-provider</module> <module>dubbo-consumer</module> </modules>
<properties> <dubbo.version>2.5.3</dubbo.version> <dubbox.version>2.8.4</dubbox.version> <spring.version>5.2.2.RELEASE</spring.version> <java.version>11</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency>
<dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.11</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.11</version> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <target>11</target> <source>11</source> </configuration> </plugin> </plugins> </build>
</project>
|
说明:
本案例中主要的依赖有:
- JDK 11
- dubbo: 2.5.3
- dubbox: 2.8.4
- spring: 5.2.2.RELEASE(目前最新)
- zkclient: 0.1
- aspectj: 1.6.11
一. dubbo-api模块
dubbo-api中定义服务接口
注意: (服务提供方和消费方都需要依赖这个项目)
模块结构如下:
1 2 3 4 5 6 7 8 9 10
| ├── pom.xml ├── src │ └── main │ ├── java │ │ └── top │ │ └── jasonkayzk │ │ └── service │ │ └── DemoService.java │ └── resources ...
|
① 在pom.xml中声明parent
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?xml version="1.0" encoding="UTF-8"?> <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>
<artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
<parent> <groupId>top.jasonkayzk</groupId> <artifactId>quick-start</artifactId> <version>1.0-SNAPSHOT</version> </parent>
</project>
|
② 定义服务接口DemoService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package top.jasonkayzk.service;
public interface DemoService {
String sayHello(String name); }
|
二. dubbo-provider 服务提供方模块
模块结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ├── pom.xml ├── src │ └── main │ ├── java │ │ └── top │ │ └── jasonkayzk │ │ ├── ProviderTest.java │ │ └── service │ │ └── DemoServiceImpl.java │ └── resources │ ├── dubbo-provider.xml │ ├── log4j.properties │ └── springmvc.xml ...
|
① 在pom.xml声明parent并引入dubbo-api模块依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?xml version="1.0" encoding="UTF-8"?> <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>
<artifactId>dubbo-provider</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
<parent> <groupId>top.jasonkayzk</groupId> <artifactId>quick-start</artifactId> <version>1.0-SNAPSHOT</version> </parent>
<dependencies> <dependency> <groupId>top.jasonkayzk</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
</project>
|
② 实现接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package top.jasonkayzk.service;
import org.springframework.stereotype.Service;
@Service("demoService") public class DemoServiceImpl implements DemoService {
@Override public String sayHello(String name) { return name; } }
|
③ 声明暴露服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?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://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo_provider" />
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<dubbo:protocol name="dubbo" path="20880" />
<dubbo:service interface="top.jasonkayzk.service.DemoService" ref="demoService" /> </beans>
|
④ 在springmvc.xml中扫描service注解并将dubbo-provider.xml中的相关的dubbo配置引入进来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd" default-autowire="byName">
<aop:aspectj-autoproxy /> <context:component-scan base-package="top.jasonkayzk" /> <import resource="classpath:dubbo-provider.xml" />
</beans>
|
⑤ 配置log4j
1 2 3 4 5 6
| log4j.rootLogger=INFO,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
|
⑥ 配置启动类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package top.jasonkayzk;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
public class ProviderTest {
public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:springmvc.xml"); context.start();
System.out.println("Dubbo provider start...");
try { System.in.read(); } catch (IOException e) { e.printStackTrace(); } } }
|
三. dubbo-consumer 服务消费者模块
模块结构:
1 2 3 4 5 6 7 8 9 10 11 12
| ├── pom.xml ├── src │ └── main │ ├── java │ │ └── top │ │ └── jasonkayzk │ │ └── ConsumerTest.java │ └── resources │ ├── dubbo-consumer.xml │ ├── log4j.properties │ └── springmvc.xml ...
|
① 在pom.xml声明parent并引入dubbo-api模块依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?xml version="1.0" encoding="UTF-8"?> <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>
<artifactId>dubbo-consumer</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
<parent> <groupId>top.jasonkayzk</groupId> <artifactId>quick-start</artifactId> <version>1.0-SNAPSHOT</version> </parent>
<dependencies> <dependency> <groupId>top.jasonkayzk</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies>
</project>
|
② 在dubbo-consumer.xml中声明所需要消费的服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?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://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<dubbo:application name="dubbo_consumer" />
<dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />
<dubbo:reference interface="top.jasonkayzk.service.DemoService" id="demoService" />
</beans>
|
③ 在springmvc.xml中扫描service注解并将dubbo-consumer.xml中的相关的dubbo配置引入进来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd" default-autowire="byName">
<aop:aspectj-autoproxy /> <context:component-scan base-package="top.jasonkayzk" /> <import resource="classpath:/dubbo-consumer.xml" /> </beans>
|
④ 配置log4j
1 2 3 4 5 6
| log4j.rootLogger=INFO,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
|
⑤ 创建启动类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package top.jasonkayzk;
import org.springframework.context.support.ClassPathXmlApplicationContext; import top.jasonkayzk.service.DemoService;
import java.io.IOException;
public class ConsumerTest {
public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"classpath:springmvc.xml"});
context.start();
DemoService demoService = (DemoService) context.getBean("demoService");
System.out.println(demoService.sayHello("Hello World!"));
try { System.in.read(); } catch (IOException e) { e.printStackTrace(); } } }
|
测试
首先保证Zookeeper是启动的
注: 本案例使用Docker部署Zookeeper, 直接在主机本地部署Zookeeper的方法见官方文档
然后先启动dubbo-provider, 再启动dubbo-consumer, 控制台输出:
则调用成功