Dubbo是一款由阿里巴巴开发的远程服务调用框架(RPC),其可以透明化的调用远程服务,就像调用本地服务一样简单。截至目前,Dubbo发布了基于Spring Boot构建的版本,版本号为0.2.0,这使得其与Spring Boot项目整合变得更为简单方便。而Zookeeper在这里充当的是服务注册中心的角色,我们将各个微服务提供的服务通过Dubbo注册到Zookeeper中,然后服务消费者通过Dubbo从Zookeeper中获取相应服务并消费。本文案例的架构图可以简单用下图表示:

本文案例最终项目结构如下图所示:

项目采用Maven构建,各模块的作用:

模块 描述
common-api 统一定义接口,供其余子模块引用
server-provider 服务提供者,实现common-api模块中的接口,然后暴露到Zookeeper中,供服务消费者使用
server-consumer 服务消费者,通过Dubbo从Zookeeper中获取服务并消费

环境准备

Zookeeper安装

在搭建项目之前需要启动Zookeeper服务,Zookeeper下载地址:http://zookeeper.apache.org/releases.html#download

下载后解压,将config目录下的zoo_sample.cfg重命名为zoo.cfg(Zookeeper配置文件,默认端口为2181,可根据实际进行修改)。然后双击bin目录下的zkServer.cmd启动即可。

构建父模块

新建一个Maven项目,groupId为cc.mrbird,artifactId为dubbo-boot,packaging指定为pom。然后引入Spring Boot,dubbo-spring-boot-starter和Zookeeper相关依赖:

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
<?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>cc.mrbird</groupId>
<artifactId>dubbo-boot</artifactId>
<packaging>pom</packaging>
<version>1.0</version> <name>dubbo-boot</name>
<description>Spring Boot-Dubbo-ZooKeeper</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<project.version>1.0</project.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>

构建Common-api

新建一个Maven模块,artifactId为common-api,目录结构如下所示:

pom.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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">
<parent>
<artifactId>dubbo-boot</artifactId>
<groupId>cc.mrbird</groupId>
<version>1.0</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>common-api</artifactId>
</project>

项目只包含一个HelloService接口:

1
2
3
4
5
package cc.mrbird.common.api;

public interface HelloService {
String hello(String message);
}

至此我们可以开始构建服务提供者和服务消费者了。

构建Server-Provider

新建一个Maven模块,用于暴露Dubbo服务,artifactId为server-provider,目录结构如下所示:

pom内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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 大专栏  Springboot整合Dubbo和Zookeeper:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubbo-boot</artifactId>
<groupId>cc.mrbird</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>server-provider</artifactId> <dependencies>
<dependency>
<groupId>cc.mrbird</groupId>
<artifactId>common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

这里我们引入了common-api模块,用于后续实现相应的服务。

在Spring Boot启动类中我们加入@EnableDubbo注解,表示要开启dubbo功能:

1
2
3
4
5
6
7
8
9
10
11
12
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableDubbo
@SpringBootApplication
public class ProviderApplicaiton {
public static void main(String[] args) {
SpringApplication.run(ProviderApplicaiton.class, args);
System.out.println("complete");
}
}

接着在applicaiton.yml中配置Dubbo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
port: 8080 dubbo:
application:
# 服务名称,保持唯一
name: server-provider
# zookeeper地址,用于向其注册服务
registry:
address: zookeeper://127.0.0.1:2181
#暴露服务方式
protocol:
# dubbo协议,固定写法
name: dubbo
# 暴露服务端口 (默认是20880,不同的服务提供者端口不能重复)
port: 20880

如果Zookeeper是集群的话,spring.dubbo.registry.address配置为:

1
2
3
4
spring:
dubbo:
registry:
address: zookeeper://127.0.0.1:2181?backup=127.0.0.1:2180,127.0.0.1:2182

接下来我们在cc.mrbird.provider.service路径下创建一个HelloService接口的实现类:

1
2
3
4
5
6
7
8
9
10
11
12
import cc.mrbird.common.api.HelloService;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component; @Service(interfaceClass = HelloService.class)
@Component
public class HelloServiceImpl implements HelloService {
@Override
public String hello(String message) {
return "hello," + message;
}
}

值得注意的是@Service注解为Dubbo提供的com.alibaba.dubbo.config.annotation.Service,而非Spring的那个。其中interfaceClass是指要发布服务的接口。

通过上面的配置,我们已经将HelloService接口的实现暴露到Zookeeper中了,接下来我们继续创建一个服务消费者,来消费这个服务。

搭建Server-Consumer

新建一个Maven模块,用于消费Dubbo服务,artifactId为server-consumer,目录结构如下所示:

pom内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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">
<parent>
<artifactId>dubbo-boot</artifactId>
<groupId>cc.mrbird</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>server-consumer</artifactId> <dependencies>
<dependency>
<groupId>cc.mrbird</groupId>
<artifactId>common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

同样的,我们也在Spring Boot启动类中我们加入@EnableDubbo注解,表示要开启dubbo功能。

接着在applicaiton.yml中配置Dubbo:

1
2
3
4
5
6
7
8
9
10
11
12
13
server:
port: 8081 dubbo:
application:
# 服务名称,保持唯一
name: server-consumer
# zookeeper地址,用于从中获取注册的服务
registry:
address: zookeeper://127.0.0.1:2181
protocol:
# dubbo协议,固定写法
name: dubbo

同服务提供者,我们需要指定Zookeeper的地址,协议为dubbo。

接着我们定义一个TestController,演示服务消费:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cc.mrbird.common.api.HelloService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; @RestController
public class HelloController { @Reference
private HelloService helloService; @GetMapping("/hello/{message}")
public String hello(@PathVariable String message) {
return this.helloService.hello(message);
}
}

通过Dubbo的@Reference注解注入需要使用的interface,类似于Spring的@Autowired

测试

分别启动Server-Provider和Server-Consumer,访问http://localhost:8081/hello/mrbird

说明远程服务调用已经成功。

这里只是通过Spring Boot和Dubbo的整合来简单了解Dubbo的使用,仅作抛砖引玉,更为详细的Dubbo配置可以查看官方文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

Springboot整合Dubbo和Zookeeper的更多相关文章

  1. SpringBoot整合Dubbo配合ZooKeeper注册中心

    安装ZooKeeper 我这里使用zookeeper作为服务注册中心,版本3.4.9,下载地址: http://mirrors.hust.edu.cn/apache/zookeeper/zookeep ...

  2. springboot整合dubbo\zookeeper做注册中心

    springboot整合dubbo发布服务,zookeeper做注册中心.前期的安装zookeeper以及启动zookeeper集群就不说了. dubbo-admin-2.5.4.war:dubbo服 ...

  3. 【转】SpringBoot学习笔记(7) SpringBoot整合Dubbo(使用yml配置)

    http://blog.csdn.net/a67474506/article/details/61640548 Dubbo是什么东西我这里就不详细介绍了,自己可以去谷歌 SpringBoot整合Dub ...

  4. SpringBoot整合dubbo(yml格式配置)

    yml文件 如果只作为服务的消费者不用暴露端口号,扫描的包名根据自己service改 dubbo: application: name: springboot-dubbo-demo #应用名 regi ...

  5. Spring Boot 整合 Dubbo和Zookeeper

    Spring Boot 整合 Dubbo和Zookeeper Spring Boot 整合 Dubbo和Zookeeper 环境介绍 Zookeeper 安装 启动 Dubbo admin 搭建 创建 ...

  6. dubbo学习实践(4)之Springboot整合Dubbo及Hystrix服务熔断降级

    1. springboot整合dubbo 在provider端,添加maven引入,修改pom.xml文件 引入springboot,版本:2.3.2.RELEASE,dubbo(org.apache ...

  7. Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!   “看看星空,会觉得自己很渺小,可能我们在宇宙中从来就是一个偶然.所以,无论什么事情,仔细想一 ...

  8. springboot整合dubbo+zookeeper最新详细

    引入 最近和小伙伴做一个比赛,处于开发阶段,因为涉及的服务比较多,且服务需要分开部署在不同的服务器上,讨论之后,打算采用分布式来做,之前学习springboot的时候,部分章节涉及到了springbo ...

  9. SpringBoot整合dubbo

    Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成. 以上介绍来源于百度百科,具体dubbo相关可以自行查 ...

随机推荐

  1. 零相关|回归|相关|相关系数|回归解释相关|r判断相关性|相关系数的区间估计|数据类型|非线性回归

    零相关是什么? 零相关亦称“不相关”.相关的一种.两个变量的相关系数r=0时的相关.零相关表示两个变量非线性相关,这时两个变量可能相互独立,也可能曲线相关.对于正态变量,两个变量零相关与两个变量相互独 ...

  2. ZJNU 2135 - 小智的宝可梦

    因为成环 所以可以枚举第1只与第n只喂的次数 然后第1只和第2只的次数就固定了,以此类推,则所有宝可梦喂的次数都固定了 最后处理完检查是否全为0,不是则进行下一次枚举,是则直接输出Yes 如果所有枚举 ...

  3. Python opencv计算批量图片的BGR各自的均值

    #coding:utf-8 #第一种方式 很慢很慢 自己写的如何计算均值 ''' import cv2 import os def access_pixels(frame): print(frame. ...

  4. SVN解除与服务器的关联

    1.随便找个地方新建个文本文档 2.粘贴如下内容到文档里,建议使用notepad++ Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\ ...

  5. docker可视化工具

    介绍两款Docker可视化工具 DockerUI(特点:轻量) 下载镜像 docker pull abh1nav/dockerui 启动容器 docker run -d --privileged -- ...

  6. php面向对象理解(一)

    常用的继承过程,以及对public.private.protected修饰符的理解: /*****************************父类************************* ...

  7. 做成像的你不能不了解的真相7-两分钟测算相机增益(Gain)

    前几期真相文章得到了读者积极的反馈,其中提问最多的就是这个公式: 首先,大家觉得这个公式太有用了.以前只能定性地评价图像质量,现在一下子就能直接算出信噪比,瞬间高大上了许多有木有.然而,杯具的现实是, ...

  8. day13-面向对象

    #解决同一类问题,使用面向对象的思想.类是制造对象的模具,类是抽象的,我们能知道它有哪些属性(name,age,saraly),但不知道具体的属性值. #看下面代码:类Penson制造了实例化对象re ...

  9. AJAX数据传输(原生js)

    原生ajax写法 <!DOCTYPE html> <html lang=""> <head> <meta charset="UT ...

  10. pytorch源码解析-动态接口宏

    动态库接口定义: gcc: 定义在动态库的显示属性: 作用对象: 函数.变量.模板以及C++类 default: 表示在动态库内可见 hidden: 表示不可见 #define EXPORT __at ...