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
// 生产者
// 消费者
第四步:创建公用的接口和实体类
// 公用接口public interface UserService {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@Componentpublic 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@EnableDubbopublic 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;@Servicepublic class ConsumerServiceImpl implements ConsumerService {private static Logger logger = LoggerFactory.getLogger(ConsumerServiceImpl.class);@ReferenceUserService userService;@Overridepublic 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的模块
@RestControllerpublic class Publish {@AutowiredConsumerService 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,开箱即用