引言
代码已提交至Github,有兴趣的同学可以下载看看:https://github.com/ylw-github/SpringBoot-Dubbo-Demo
本文目录结构:
l________1.2 Zookeeper作为Dubbo的注册中心
l________2.3 创建Maven SpringBoot项目
l________________2.3.1 Parent及公有项目
之前在《分布式电商项目》里有讲过Dubbo,本文大致的介绍下Dubbo。
- 《分布式电商项目 - Dubbox 简介》
- 《分布式电商项目 - 注册中心 Zookeeper》
- 《分布式电商项目 - Dubbox 本地 JAR 包部署与安装》
- 《分布式电商项目 - 管理中心的部署》
之前写过的文章也可以不看,直接往下看,下面也将会讲到。
1. Dubbo
Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目 Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在 Dubbo 基础上进行优化,并继续维护,为了与原有的 Dubbo 区分,故将其命名为 Dubbox。
Dubbox 致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。简单的说,dubbox 是一个分布式服务框架。
优点:
- 透明化的远程方法调用
- 像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。 软负载均衡及容错机制 可在内网替代nginx lvs等硬件负载均衡器。 服务注册中心自动注册 & 配置管理
- 不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。 使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。 服务接口监控与治理
- Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。
缺点: 只支持JAVA语言
1.1 Dubbo原理
节点介绍:
- Provider: 暴露服务的服务提供方。
- Consumer: 调用远程服务的服务消费方。
- Registry: 服务注册与发现的注册中心。
- Monitor: 统计服务的调用次调和调用时间的监控中心。
- Container: 服务运行容器。
调用流程:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
1.2 Zookeeper作为Dubbo的注册中心
官方推荐使用 zookeeper 作为Dubbo的注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbox 服务的注册中心,工业强度较高,可用于生产环境。
2. Dubbo项目搭建
环境步骤:
- 安装Zookeepr
- 安装DubboAdmin平台,实现监控
- 创建Maven项目搭建生产者和消费者
2.1 安装Zookeeper
之前已经有讲解过,此处不再详述,安装步骤《Zookeeper安装》
启动Zookeeper:
/usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper1/bin/zkServer.sh start /usr/local/zookeeper2/bin/zkServer.sh start
2.2 安装DubboAdmin平台
安装包已经上传到百度网盘(链接:https://pan.baidu.com/s/1ilBbupi6rh5JGeTcmRzS6w 密码: 47kn
)
1.进入dubbo-2.8.4.jar目录,安装dubbo-2.8.4.jar到本地maven仓库
mvn install:install-file -Dfile=dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar
2.修改/dubbox-master/dubbo-admin/src/main/webapp/WEB-INF/dubbo.properties
文件:(如果没有集群,?后面的两个ip地址不用写)
dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
3.进入/dubbox-master/dubbo-admin
打包:
mvn package -Dmaven.skip.test=true
4.进入/dubbox-master/dubbo-admin/target
目录修改dubbo-admin-2.8.4.war名字为dubbo.war
5.上传dubbo.war到tomcat的webapps目录
6.启动tomcat,dubbo.war自动解压。
./startup.sh
7.浏览器访问:
8.登录,账号密码均为root
2.3 创建Maven SpringBoot项目
新建项目SpringBoot-Dubbo-Demo项目,其中有3个字项目:
- 公共模块(Dubbo-Service)
- 提供者(Provider-Demo)
- 消费者(Consumer-Demo)
2.3.1 Parent及公有项目
1.新建SpringBoot-Dubbo-Demo父项目,并添加maven依赖:
<modules> <module>Dubbo-Service</module> <module>Provider-Demo</module> <module>Consumer-Demo</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <dependencies> <!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- dubbo --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> </dependencies>
2.新建公用项目Dubbo-Service,并添加实体类及Service接口:
实体类:----------------------------------------- package com.ylw.dubbo.service.entity; import java.io.Serializable; public class User implements Serializable { private String userId; private String userName; private String sex; private int age; private String blog; //getter and setter..... } 接口类:----------------------------------------- package com.ylw.dubbo.service; import com.ylw.dubbo.service.entity.User; public interface UserApi { String addUser(User user); String deleteUser(String userId); String updateUser(User user); User getUser(String userId); }
2.3.2 提供者项目
1.新建提供者项目(Provider-Demo)
2.提供者新增maven依赖:
<parent> <groupId>ylw</groupId> <artifactId>com.ylw.dubbo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>ylw</groupId> <artifactId>com.ylw.dubbo.service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
3.接口实现类:
@Service(version = "${application.version}") public class UserApiImpl implements UserApi { @Override public String addUser(User user) { return "添加用户成功"; } @Override public String deleteUser(String userId) { return "删除用户成功"; } @Override public String updateUser(User user) { return "更新用户成功"; } @Override public User getUser(String userId) { User user = new User(); user.setUserId(userId); user.setUserName("ylw"); user.setAge(10000); user.setSex("male"); user.setBlog("https://blog.csdn.net/qq_20042935"); return user; } }
4.application.yml配置:
server: port: 8081 application: #版本号 version: 1.0.0 dubbo: application: #应用名称,每个dubbo应用的名称都是唯一的 name: producer-demo registry: #注册中心 address: zookeeper://192.168.162.131:2181 protocol: #协议名称 name: dubbo #服务暴露端口 port: 20880 scan: #扫描服务注册bean,即service实现类所在的包 basePackages: com.ylw.dubbo.service.impl名
5.启动提供者,注册中心可以看到,提供者服务已经注册上去:
2.3.3 消费者项目
1.新建消费者项目(Consumer-Demo)
2.提供者新增maven依赖:
<parent> <groupId>ylw</groupId> <artifactId>com.ylw.dubbo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>ylw</groupId> <artifactId>com.ylw.dubbo.service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
3.Controller:
@RestController public class ConsumerController { @Reference(version = "${application.version}") UserApi userApi; @RequestMapping("/addUser") public String addUser(User user) { return userApi.addUser(user); } @RequestMapping("/deleteUser") public String deleteUser(String userId) { return userApi.deleteUser(userId); } @RequestMapping("/updateUser") public String updateUser(User user) { return userApi.updateUser(user); } @RequestMapping("/getUser") public User getUser(String userId) { return userApi.getUser(userId); } }
4.application.yml:
server: port: 8082 application: #版本号 version: 1.0.0 dubbo: application: #应用名称,每个dubbo应用的名称都是唯一的 name: consumer-demo registry: #注册中心 address: zookeeper://192.168.162.131:2181
5.启动消费者,注册中心可以看到,消费者服务已经注册上去:
2.3.4 测试
消费者远程调用提供者,浏览器输入:http://localhost:8082/getUser?userId=666,可以看到远程调用成功:
总结
代码已提交至Github,有兴趣的同学可以下载看看:https://github.com/ylw-github/SpringBoot-Dubbo-Demo