首页 > 其他分享 >Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

时间:2023-01-02 21:00:43浏览次数:64  
标签:SOA Dubbo java springboot dubbo spring org Springboot

一、为啥整合 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​​

 

 

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

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

git clone [email protected]:JeffLi1993/springboot-learning-example.git

 

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

​​cd​​​ ​​springboot-learning-example​​
​​mvn clean ​​​​install​​

 

 

 

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

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

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例_ci

这里表示 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 项目。

标签:SOA,Dubbo,java,springboot,dubbo,spring,org,Springboot
From: https://blog.51cto.com/u_15147537/5984093

相关文章