SpringBoot Dubbo 实践 概述:
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
项目构建
注:项目构建通过: http://start.spring.io/ 快速构建web 项目,
具体操作可以参考《SpringBoot使用SpringDataJPA完成数据查询 -Demo》。
在基础环境确定好了之后,我们项目的目录结构如下:
**上图所示,我们项目主要分为了两个模块,
一部分是生产者:hdd-doorplate-dubbo-server ,
一部分是消费者:hdd-doorplate-dubbo-client。
hdd
父pom文件当中的配置信息
<?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>com.herbert.hdd</groupId>
<artifactId>hdd</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 引入项目子模块 -->
<modules>
<module>hdd-doorplate-dubbo-server</module>
<module>hdd-doorplate-dubbo-client</module>
</modules>
</project>
配置文件
由于我们底层使用的是Spring-Boot 进行开发,那么我们就应该善于利用Spring-Boot 给我们带来的优势,因此我们可以直接在Application.properties 文件中配置Dubbo 服务:
server.port=6660
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2182
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo
服务提供
在服务提供主要包括两部分,一个是暴露服务,一个是服务实现
暴露服务:即我们平常开发中所使用的的接口,这里我们创建一个 DoorplateServer 的接口,主要包括操作信息的方法。
package com.herbret.hdd.doorplate.dubbo;
import java.util.List;
/**
* Created by Herbert on 2018/11/7.
*
* 程序业务 Dubbo 服务层
*
*/
public interface DoorplateServer {
/**
* 查询信息
* @return
*/
List<String> list();
}
服务实现:
服务实现,与我们平常的服务一样,对接口进行实现,比较特别的是,我们这里需要使用到Dubbo 的 @Service 注解
package com.herbert.hdd.doorplate.dubbo.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Herbert on 2018/11/7.
*/
// 注册为 Dubbo 服务
@Service(version = "1.0.0")
public class DoorplateServerImpl implements DoorplateServer {
@Override
public List<String> list() {
List<String> list = new ArrayList<String>();
list.add("城市中心运动公园");
return list;
}
}
hdd-doorplate-dubbo-server
pom文件配置
<?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>com.herbert.hdd</groupId>
<artifactId>hdd-doorplate-dubbo-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hdd-doorplate-dubbo-server</name>
<description>Doorplate project for Spring Boot</description>
<!-- 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>
hdd-doorplate-dubbo-client
pom文件配置
<?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>com.herbert.hdd</groupId>
<artifactId>hdd-doorplate-dubbo-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hdd-doorplate-dubbo-server</name>
<description>Doorplate project for Spring Boot</description>
<!-- 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>
配置文件
配置文件与生产者稍有区别:
## 避免和 server 工程端口冲突
server.port=6661
## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2182
spring.dubbo.scan=com.herbert.hdd.doorplate.dubbo
服务实现
在这里,如果我们需要调用注册服务中的相关服务,则需要实现相关的接口。
package com.herbert.hdd.doorplate.dubbo;
import java.util.List;
/**
* Created by Herbert on 2018/11/7.
*/
public interface DoorplateServer {
List<String> list();
}
服务调用
我们需要实现一个RESTful 接口,提供给用户调用:
package com.herbert.hdd.doorplate.dubbo.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.herbert.hdd.doorplate.dubbo.DoorplateServer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Created by Herbert on 2018/11/7.
*/
@RestController
@RequestMapping("/user")
public class DoorpalteController {
@Reference(version = "1.0.0")
DoorplateServer doorplateServer;
@RequestMapping("/list")
public List<String> list(){
List<String> list =doorplateServer.list();
System.out.println(list.toString());
return list;
}
}
另外,我们还可以在需要使用到生产者中的方法,则需要创建一个接口,然后再调用时,使用 @Reference 注解进行引用也可以直接引用
测试
我们启动hdd-doorplate-dubbo-server 来注册服务,前提是已经启动ZooKeeper注册中心
启动hdd-doorplate-dubbo-server
package com.herbert.hdd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// Spring Boot 应用的标识
@SpringBootApplication
public class HddDoorplateDubboProviderApplication {
public static void main(String[] args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(HddDoorplateDubboProviderApplication.class, args);
}
}
启动完成
启动hdd-doorplate-dubbo-client
package com.herbert.hdd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HddDoorplateDubboClientApplication {
public static void main(String[] args) {
SpringApplication.run(HddDoorplateDubboClientApplication.class, args);
}
}
启动完成
接口访问
http://127.0.0.1:6661/user/list
返回值
["城市中心运动公园"]
欢迎关注公众号