Apache Dubbo 是一款高性能、轻量级的开源服务框架,提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。是一款国内使用较多的SOA架构开发的中间件,其主要由三个部分组成:生产者,消费者,注册中心。注册中心一般使用的是zookeeper。
现在从头来捋一捋如何搭建一个springboot+dubbo项目。
首先,使用创建一个springboot项目,我这里使用的是SpringToolSuite4,这也是Eclipse工具不过整合了Springboot的常用的一些插件,跟IDEA类似。
由于dubbo的注册中心是用的zookeeper,所以首先需要去官网下载一个,这里用的是zookeeper-3.4.13,下载好了需要解压该文件,然后进入conf目录,将zoo_sample.cfg文件复制并重命名为zoo.cfg,在进入bin目录双击zkServer.cmd
第二步:构建Springboot项目,由于dubbo的生产者和消费者都会引用类的接口,为了方便会把接口抽成一个公用的模块,所以这里我用创建的是Maven project。结构图如下
第三步:引入Springboot集成dubbo的依赖,生产者和消费者模块都用引用
// 父级pom
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhouhx.dubbo</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-demo</name>
<description>入门</description>
<properties>
<dubbo.version>0.2.0</dubbo.version>
<hutool.version>5.7.9</hutool.version>
<spring-boot.version>2.5.3</spring-boot.version>
<project.version>0.0.1-SNAPSHOT</project.version>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencyManagement>
<dependencies>
<!-- SpringBoot 依赖配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.zhouhx.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<packaging>pom</packaging>
<modules>
<module>dubbo-common</module>
<module>dubbo-producer</module>
<module>dubbo-consumer</module>
</modules>
<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>
// 生产者
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhouhx.dubbo</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>dubbo-producer</artifactId>
<name>producer</name>
<description>生产者</description>
<dependencies>
<dependency>
<groupId>com.zhouhx.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
var foo = 'bar';
// 消费者
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhouhx.dubbo</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>dubbo-consumer</artifactId>
<name>consumer</name>
<description>消费者</description>
<dependencies>
<dependency>
<groupId>com.zhouhx.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
第四步:创建公用的接口和实体类
// 公用接口
public interface UserService {
/**
* 获取用户信息
* @return
*/
public User getUserInfo();
}
//实体类
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = -3304178237669079610L;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private int age;
/**
* 性别
*/
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public User(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public User() {
super();
}
第五步:实现其接口并发布服务
//实现接口并发布
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.zhouhx.api.UserService;
import com.zhouhx.entity.User;
@Service
@Component
public class UserServiceImpl implements UserService {
private static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
public User getUserInfo() {
logger.info("正在开始调用Dubbo服务。。。。。");
return new User("张三",15,"男");
}
注意:注解不是用spring的service注解,是 com.alibaba.dubbo.config.annotation.Service
// 在springboot程序入口出启用dubbo服务
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
@SpringBootApplication
@EnableDubbo
public class DubboApplication {
public static void main(String[] args) {
SpringApplication.run(DubboApplication.class, args);
}
}
第六步:修改application.properties配置文件,添加dubbo配置
server.port=8001
#应用名
dubbo.application.name=dubbo-producer
#zookeeper地址
dubbo.registry.address=127.0.0.1:2181
#指定注册中心类型
dubbo.registry.protocol=zookeeper
#传入协议的名称
dubbo.protocol.name=dubbo
#dubbo服务暴露的端口,可自定义
dubbo.protocol.port=20888
这里生产者模块就是实现完成,启动springboot,就能提供一个UserService的接口
第七步:消费者模块调用已经发布的服务
import org.springframework.stereotype.Service;
import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zhouhx.api.UserService;
import com.zhouhx.demo.service.ConsumerService;
import com.zhouhx.entity.User;
@Service
public class ConsumerServiceImpl implements ConsumerService {
private static Logger logger = LoggerFactory.getLogger(ConsumerServiceImpl.class);
/**远程调用*/
@Reference
UserService userService;
@Override
public String getUserInfo() {
logger.debug("dubbo远程调用开始。。。。");
User userInfo = userService.getUserInfo();
logger.debug("dubbo远程调用结束,res="+userInfo.toString());
return "当前用户信息"+userInfo == null ? "空":userInfo.toString();
}
dubbo的远程调用是用的@Reference注解,不是spring的@Autowired
第八步:测试
为了方便测试,这里我用了springboot的web的模块
@RestController
public class Publish {
@Autowired
ConsumerService consumerService;
@GetMapping("/demo")
public String getUserInfo() {
return consumerService.getUserInfo();
}
}
页面上输入http://127.0.0.1:8002/demo,页面上显示User [name=张三, age=15, sex=男]
再看消费者模块打印的日志
说明接口已经远程调用成功!
dubbo还提供了一个dubbo-admin控制台,将项目用maven打包成jar包
启用后如下图
项目gitee地址:dubbo-demo
打包好的dubbo-admin-0.4,开箱即用