Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

“看看星空,会觉得自己很渺小,可能我们在宇宙中从来就是一个偶然。所以,无论什么事情,仔细想一想,都没有什么大不了的。这能帮助自己在遇到挫折时稳定心态,想得更开。”  – 《腾讯传》

本文提纲

一、为啥整合 Dubbo 实现 SOA

二、运行 springboot-dubbo-server 和 springboot-dubbo-client 工程

三、springboot-dubbo-server 和 springboot-dubbo-client 工程配置详解

一、为啥整合 Dubbo 实现 SOA

Dubbo 不单单只是高性能的 RPC 调用框架,更是 SOA 服务治理的一种方案。

核心

1. 远程通信,向本地调用一样调用远程方法。

2. 集群容错

3. 服务自动发现和注册,可平滑添加或者删除服务提供者。

我们常常使用 Springboot 暴露 HTTP 服务,并走 JSON 模式。但慢慢量大了,一种 SOA 的治理方案。这样可以暴露出 Dubbo 服务接口,提供给 Dubbo 消费者进行 RPC 调用。下面我们详解下如何集成 Dubbo。

二、运行 springboot-dubbo-server 和 springboot-dubbo-client 工程

运行环境:JDK 7 或 8,Maven 3.0+

技术栈:SpringBoot 1.5+、Dubbo 2.5+、ZooKeeper 3.3+

1.ZooKeeper 服务注册中心

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

下载 ZooKeeper ,地址 http://www.apache.org/dyn/closer.cgi/zookeeper

解压 ZooKeeper


1

tar zxvf zookeeper-3.4.8.tar.gz

在 conf 目录新建 zoo.cfg ,照着该目录的 zoo_sample.cfg 配置如下。


1

2

cd zookeeper-3.3.6/conf

vim zoo.cfg

zoo.cfg 代码如下(自己指定 log 文件目录):


1

2

3

4

tickTime=2000

dataDir=/javaee/zookeeper/data 

dataLogDir=/javaee/zookeeper/log

clientPort=2181

在 bin 目录下,启动 ZooKeeper:


1

2

cd zookeeper-3.3.6/bin

./zkServer.sh start

2. git clone 下载工程 springboot-learning-example

项目地址见 GitHub – https://github.com/JeffLi1993/springboot-learning-example

git clone git@github.com:JeffLi1993/springboot-learning-example.git

然后,Maven 编译安装这个工程:


1

2

cd springboot-learning-example

mvn clean install

3.运行 springboot-dubbo-server Dubbo 服务提供者工程

右键运行 springboot-dubbo-server 工程 ServerApplication 应用启动类的 main 函数。Console 中出现如下表示项目启动成功:

这里表示 Dubbo 服务已经启动成功,并注册到 ZK (ZooKeeper)中。

4.运行 springboot-dubbo-client Dubbo 服务消费者工程

右键运行 springboot-dubbo-client 工程 ClientApplication 应用启动类的 main 函数。Console 中出现如下:


1

2

3

4

5

...

2017-03-01 16:31:38.473  INFO 9896 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup

2017-03-01 16:31:38.538  INFO 9896 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)

2017-03-01 16:31:38.547  INFO 9896 --- [           main] org.spring.springboot.ClientApplication  : Started ClientApplication in 6.055 seconds (JVM running for 7.026)

City{id=1, provinceId=2, cityName='温岭', description='是我的故乡'}

最后打印的城市信息,就是通过 Dubbo 服务接口调用获取的。顺利运行成功,下面详解下各个代码及配置。

三、springboot-dubbo-server 和 springboot-dubbo-client 工程配置详解

代码都在 GitHub 上, https://github.com/JeffLi1993/springboot-learning-example

1.详解 springboot-dubbo-server Dubbo 服务提供者工程

springboot-dubbo-server 工程目录结构


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

├── pom.xml

└── src

    └── main

        ├── java

        │   └── org

        │       └── spring

        │           └── springboot

        │               ├── ServerApplication.java

        │               ├── domain

        │               │   └── City.java

        │               └── dubbo

        │                   ├── CityDubboService.java

        │                   └── impl

        │                       └── CityDubboServiceImpl.java

        └── resources

            └── application.properties

a.pom.xml 配置

pom.xml 中依赖了 spring-boot-starter-dubbo 工程,该项目地址是 https://github.com/teaey/spring-boot-starter-dubbo。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

<?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>springboot</groupId>

    <artifactId>springboot-dubbo-server</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <name>springboot-dubbo 服务端:: 整合 Dubbo/ZooKeeper 详解 SOA 案例</name>

 

    <!-- Spring Boot 启动父依赖 -->

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.1.RELEASE</version>

    </parent>

 

    <properties>

        <dubbo-spring-boot>1.0.0</dubbo-spring-boot>

    </properties>

 

    <dependencies>

 

        <!-- Spring Boot Dubbo 依赖 -->

        <dependency>

            <groupId>io.dubbo.springboot</groupId>

            <artifactId>spring-boot-starter-dubbo</artifactId>

            <version>${dubbo-spring-boot}</version>

        </dependency>

 

        <!-- Spring Boot Web 依赖 -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

 

        <!-- Spring Boot Test 依赖 -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

 

        <!-- Junit -->

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.12</version>

        </dependency>

    </dependencies>

</project>

b.application.properties 配置


1

2

3

4

5

6

## Dubbo 服务提供者配置

spring.dubbo.application.name=provider

spring.dubbo.registry.address=zookeeper://127.0.0.1:2181

spring.dubbo.protocol.name=dubbo

spring.dubbo.protocol.port=20880

spring.dubbo.scan=org.spring.springboot.dubbo

这里 ZK 配置的地址和端口,就是上面本机搭建的 ZK 。如果有自己的 ZK 可以修改下面的配置。配置解释如下:

spring.dubbo.application.name 应用名称

spring.dubbo.registry.address 注册中心地址

spring.dubbo.protocol.name 协议名称

spring.dubbo.protocol.port 协议端口

spring.dubbo.scan dubbo 服务类包目录

c.CityDubboServiceImpl.java 城市业务 Dubbo 服务层实现层类


1

2

3

4

5

6

7

8

// 注册为 Dubbo 服务

@Service(version = "1.0.0")

public class CityDubboServiceImpl implements CityDubboService {

 

    public City findCityByName(String cityName) {

        return new City(1L,2L,"温岭","是我的故乡");

    }

}

@Service 注解标识为 Dubbo 服务,并通过 version 指定了版本号。

d.City.java 城市实体类

实体类通过 Dubbo 服务之间 RPC 调用,则需要实现序列化接口。最好指定下 serialVersionUID 值。

2.详解 springboot-dubbo-client Dubbo 服务消费者工程

springboot-dubbo-client 工程目录结构


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

├── pom.xml

└── src

    └── main

        ├── java

        │   └── org

        │       └── spring

        │           └── springboot

        │               ├── ClientApplication.java

        │               ├── domain

        │               │   └── City.java

        │               └── dubbo

        │                   ├── CityDubboConsumerService.java

        │                   └── CityDubboService.java

        └── resources

            └── application.properties

pom.xml 、 CityDubboService.java、City.java 没有改动。Dubbo 消费者通过引入接口实现 Dubbo 接口的调用。

a.application.properties 配置


1

2

3

4

5

6

7

## 避免和 server 工程端口冲突

server.port=8081

 

## Dubbo 服务消费者配置

spring.dubbo.application.name=consumer

spring.dubbo.registry.address=zookeeper://127.0.0.1:2181

spring.dubbo.scan=org.spring.springboot.dubbo

因为 springboot-dubbo-server 工程启动占用了 8080 端口,所以这边设置端口为 8081。

b.CityDubboConsumerService.java 城市 Dubbo 服务消费者


1

2

3

4

5

6

7

8

9

10

11

12

@Component

public class CityDubboConsumerService {

 

    @Reference(version = "1.0.0")

    CityDubboService cityDubboService;

 

    public void printCity() {

        String cityName="温岭";

        City city = cityDubboService.findCityByName(cityName);

        System.out.println(city.toString());

    }

}

@Reference(version = “1.0.0”) 通过该注解,订阅该接口版本为 1.0.0 的 Dubbo 服务。

这里将 CityDubboConsumerService 注入 Spring 容器,是为了更方便的获取该 Bean,然后验证这个 Dubbo 调用是否成功。

c.ClientApplication.java 客户端启动类


1

2

3

4

5

6

7

8

9

10

11

@SpringBootApplication

public class ClientApplication {

 

    public static void main(String[] args) {

        // 程序启动入口

        // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件

        ConfigurableApplicationContext run = SpringApplication.run(ClientApplication.class, args);

        CityDubboConsumerService cityService = run.getBean(CityDubboConsumerService.class);

        cityService.printCity();

    }

}

解释下这段逻辑,就是启动后从 Bean 容器中获取城市 Dubbo 服务消费者 Bean。然后调用该 Bean 方法去验证 Dubbo 调用是否成功。

四、小结

还有涉及到服务的监控,治理。这本质上和 SpringBoot 无关,所以这边不做一一介绍。感谢阿里 teaey 提供的 starter-dubbo 项目。

推荐《》

欢迎扫一扫我的公众号关注 — 及时得到博客订阅哦!

— http://www.bysocket.com/ —

— https://github.com/JeffLi1993 —

时间: 2024-11-18 16:08:02

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例的相关文章

Ajax详解及其案例分析_AJAX相关

1 获得Ajax对象 1.1 问题 如何获得XmlHttpRequest对象. 1.2 方案 区分浏览器,使用不同的获取方式. 1.3 步骤 步骤一: 新建ajax01.html页面 新建一个Web工程,在WebRoot下新建ajax01.html页面.在<script>标记内编写JavaScript代码实现获取Ajax对象. <script type="text/javascript"> /*获取Ajax对象*/ function getXhr(){ var

Flume环境部署和配置详解及案例大全_Linux

一.什么是Flume? flume 作为 cloudera 开发的实时日志收集系统受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OGoriginal generation属于 cloudera.但随着 FLume 功能的扩展Flume OG 代码工程臃肿.核心组件设计不合理.核心配置不标准等缺点暴露出来尤其是在 Flume OG 的最后一个发行版本 0.94.0 中日志传输不稳定的现象尤为严重为了解决这些问题2011 年 10 月 22 号cloudera 完成

【DUBBO】dubbo架构详解(转载)

转载地址:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦 合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方 (Provider)和服务消费方(Consumer)两个角色.关于注册中心.协议支持.服务监控等内容,详见后面描述. 总体架构

CI框架整合smarty步骤详解_php实例

本文详细讲述了CI框架整合smarty步骤.分享给大家供大家参考,具体如下: Ci结合smarty的配置步骤: 1. 第一步配置ci和下载smarty的模板个人喜欢用(Smarty-3.1.8)这个版本. 2. 第二部把下载到的smarty版本解压然后把里面的libs文件改名为smarty然后把这个文件拷到ci\application\libraries目录下面 3. 在ci\application\libraries这个目录下面建立一个文件,文件名可以自定义,例如见一个tp.php的文档. 4

CI框架整合smarty步骤详解

本文详细讲述了CI框架整合smarty步骤.分享给大家供大家参考,具体如下: Ci结合smarty的配置步骤: 1. 第一步配置ci和下载smarty的模板个人喜欢用(Smarty-3.1.8)这个版本. 2. 第二部把下载到的smarty版本解压然后把里面的libs文件改名为smarty然后把这个文件拷到ci\application\libraries目录下面 3. 在ci\application\libraries这个目录下面建立一个文件,文件名可以自定义,例如见一个tp.php的文档. 4

springboot(八):RabbitMQ详解

RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apache,当然了今天的主角还是讲RabbitMQ.消息中间件最主要的作用是解耦,中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到解耦的目的.在分布式的系统中,消息队列也会被用在很多其它的方面,比如:分布式事务的支

thinkphp整合kindeditor编辑器详解

具体方法 本人使用 的是@version 4.1.2 现在应该有更新了KindEditor 4.1.4 已经发布 KindEditor主要特点 快速:体积小,加载速度快 开源:开放源代码,高水平,高品质 底层:内置自定义 DOM 类库,精确操作 DOM 扩展:基于插件的设计,所有功能都是插件,可根据需求增减功能 风格:修改编辑器风格非常容易,只需修改一个 CSS 文件 兼容:支持大部分主流浏览器,比如 IE.Firefox.Safari.Chrome.Opera 下面说一下kindeditor在

Ajax详解及其案例分析

1 获得Ajax对象 1.1 问题 如何获得XmlHttpRequest对象. 1.2 方案 区分浏览器,使用不同的获取方式. 1.3 步骤 步骤一: 新建ajax01.html页面 新建一个Web工程,在WebRoot下新建ajax01.html页面.在<script>标记内编写JavaScript代码实现获取Ajax对象. <script type="text/javascript"> /*获取Ajax对象*/ function getXhr(){ var

《LoadRunner性能测试巧匠训练营》——1.4 性能测试分类详解

1.4 性能测试分类详解 小白在学习过程中发现性能测试的种类繁多,但是实际执行起来又很难严格区分,所以小白觉得理解各种分类的特点和概念即可,没必要咬文嚼字. 1.基准测试 基准最简单的理解就是有基础的标准,这样能通过对比发现系统的不同点与变化.一般情况下,基准测试有以下几种应用场景. 1)可以在制定的标准下通过基准测试建立一个性能基准,这样以后当系统的环境.参数发生变化之后,再进行一次相同标准下的测试,即可看出变化对性能的影响.例如,数据库的基准性能测试. 2)系统进行基准测试可以在较早的阶段发