本文提纲
一、为啥整合 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
tar zxvf zookeeper-3.4.8.tar.gz
在 conf 目录新建 zoo.cfg ,照着该目录的 zoo_sample.cfg 配置如下。

cd zookeeper-3.3.6/conf
vim zoo.cfg

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

tickTime=2000
dataDir=/javaee/zookeeper/data
dataLogDir=/javaee/zookeeper/log
clientPort=2181

在 bin 目录下,启动 ZooKeeper:

cd zookeeper-3.3.6/bin
./zkServer.sh start
  1. git clone 下载工程 springboot-learning-example
    项目地址见 GitHub – https://github.com/JeffLi1993/springboot-learning-example:
    git clone git@github.com:JeffLi1993/springboot-learning-example.git
    然后,Maven 编译安装这个工程:

    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 中出现如下:

...
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 工程目录结构

├── 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 配置如下

<?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 配置

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 服务层实现层类

// 注册为 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 工程目录结构

├── 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 配置

避免和 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 服务消费者

@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 客户端启动类

@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 项目。

dubbo实现SOA架构相关推荐

  1. 基于SOA架构集成spring-boot+mybatis+dubbo+Druid+zookeeper

    2019独角兽企业重金招聘Python工程师标准>>> 本来是给公司搭建的一个基础框架,但公司因为开发时间问题不用了,所以就个记录. 总结下在搭建这个基础框架 首先,整个系统架构是S ...

  2. (五)springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven构建根项目

    上一篇我们介绍<springmvc+mybatis+dubbo+zookeeper分布式架构 整合 - maven模块规划>,从今天开始,我们将对代码的每一个构建做详细的记录,能够帮助大家 ...

  3. 论SOA架构的几种主要开发方式

    论SOA架构的几种主要开发方式 面向服务架构soa以其独特的优势越来越受到企业的重视,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使用.服务层是SOA的基础,可以直接被应用调 ...

  4. [转]论SOA架构的几种主要开发方式

    面向服务架构soa以其独特的优势越来越受到企业的重视,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使用.服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理 ...

  5. 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式

    文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...

  6. java技术--SOA架构

    1.对于垂直架构,虽然有了明确的分层,但是前后端开发仍然藕合在一起 2.针对垂直架构的不足,又提出了SOA架构 3. SOA:(Service Oriented Architecture) 面向服务的 ...

  7. 软件工程课程设计·SOA架构搭建SSM框架的网上商城系统

    软件工程课程设计·SOA架构搭建SSM框架的网上商城系统 项目简介 本系统利用SSM框架.Dubbo框架.Maven模块化开发等技术开发的一个网上商城项目,主要包括订单系统模块.购物车系统模块.搜索系 ...

  8. 系统架构的演变过程(单体应用架构、垂直应用架构、分布式SOA架构、微服务架构)

    文章目录 系统架构演变 单体应用架构 垂直应用架构 分布式SOA架构 什么是SOA 微服务架构 分布式SOA架构和微服务架构对比 系统架构演变 随着互联网的发展,网站应用的规模不断扩大,常规的应用架构 ...

  9. SOA架构和微服务架构的区别(转载)

    文章目录 1.SOA架构和微服务架构的区别 2.ESB和微服务API网关 1.ESB(企业服务总线) 2.API网关: 3.SOA架构特点: 4.微服务架构特点: 1.通过服务实现组件化 2.按业务能 ...

最新文章

  1. Django进阶之session
  2. 基于混合储能的并网光伏发电系统仿真
  3. 【BZOJ1043】下落的圆盘 [计算几何]
  4. 用c语言编程计算10,计算方法c语言编程.doc
  5. 机器学习(十五)隐马尔科夫模型-未完待续
  6. 女孩!自重!上海出租车司机的话
  7. 【酷熊科技】工作积累 ----------- Unity3D 读取 图片
  8. [转载] python hex转字符串_Python hexstring-list-str之间的转换方法
  9. SpringBoot整合RabbitMQ之Topic Exchange通配符交换机(学习总结)
  10. PMP试题 | 每日一练,快速提分 9.8
  11. 编辑器Sublime Text安装配置
  12. Logback使用总结
  13. html格式如何转换mp4视频,html怎样用格式工厂转换成mp4
  14. 查询个人电脑当前公网IP地址
  15. 修复 j-link the connected j-link is defective 警告
  16. Docker容器无法解析域名
  17. Python-练习 5 更多变量和打印
  18. 用户访问我计算机不用凭据,如何进行凭据管理实现自动登录网络
  19. java面条对折问题
  20. The Singularity Is Near(奇点临近)阅读笔记----六大纪元

热门文章

  1. 拉链法解决哈希冲突的方式和几种常见的散列函数
  2. python电脑定时关机_Python实现Windows定时关机
  3. 【踩坑记录】jenkins 远程部署 publish over ssh
  4. 转载一个正则表达式学习的好文章
  5. cesium 默认展示2d_向世界展示2D可以做什么
  6. 电动车控制器电路图,PCB和源程序,学习无刷电机控制器好资料
  7. 性能提升100倍,GaussDB(for MySQL)近数据处理(NDP)解锁查询新姿势
  8. 使用Google云服务器搭建在线vscode
  9. 区块链带来第四次技术革命 融入生产大幅提高企业收入
  10. webpack-dev-server实现静态资源加载和proxy代理