Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
简单来说,Dubbo 用于分布式的场景。
GitHub地址:https://github.com/intomylife/SpringBoot
注:这是两个库:base_db 和 user_db
USE base_db;
DROP TABLE IF EXISTS `springboot_base` ;
CREATE TABLE `springboot_base` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`parent_id` bigint(20) unsigned DEFAULT '0' COMMENT '父 id',
`region_name` varchar(20) DEFAULT NULL COMMENT '地区名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='地区表';
INSERT INTO springboot_base ( parent_id , region_name )
VALUES ('0','上海市'),('1','嘉定区'),('1','松江区'),('1','黄浦区');
USE user_db;
DROP TABLE IF EXISTS `springboot_user` ;
CREATE TABLE `springboot_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`regoin_id` bigint(20) unsigned DEFAULT '0' COMMENT '地区 id',
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='用户表';
INSERT INTO springboot_user ( regoin_id , name )
VALUES (3,'cdy'),(4,'zwc'),(2,'ergouzi');
4.0.0
com.zwc
springboot-dubbo-commons
0.0.1-SNAPSHOT
springboot-dubbo-commons
公用工程
jar
UTF-8
1.8
Cairo-SR3
1.1.9
1.2.47
1.9.9
3.0-RELEASE
1.3.2
1.1.0
0.2.0
com.alibaba
druid-spring-boot-starter
${druid.version}
mysql
mysql-connector-java
com.alibaba
fastjson
${fastjson.version}
org.codehaus.jackson
jackson-mapper-asl
${jackson.mapper.asl.version}
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis-spring-boot-starter.version}
com.baomidou
mybatis-plus-boot-starter
${mybatis-plus-boot-starter.version}
org.mybatis.caches
mybatis-ehcache
${mybatis.ehcache.version}
com.alibaba.boot
dubbo-spring-boot-starter
${dubbo-spring-boot-starter.version}
io.spring.platform
platform-bom
${platform-bom.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
# mybatis-plus
## 扫描 mapper 文件
mybatis-plus.mapper-locations=classpath*:com/zwc/*/mapper/xml/*.xml
## 扫描实体类
mybatis-plus.type-aliases-package=com.zwc.*.domain
package com.zwc.core.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/*
* @ClassName MyBatisPlusConfig
* @Desc TODO mybatis-plus 配置
* @Date 2019/4/6 10:21
* @Version 1.0
*/
@Configuration
@PropertySource("classpath:system.properties")
public class MyBatisPlusConfig {
/*
* @ClassName MyBatisPlusConfig
* @Desc TODO mybatis-plus 配置拦截
* @Date 2019/4/6 10:21
* @Version 1.0
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置方言
paginationInterceptor.setDialectType("mysql");
return paginationInterceptor;
}
}
service 工程是一个父工程,里面包含 基础模块,用户模块,每个模块中又会分为 core 和 api
Dubbo 核心角色有:Provider(提供者),Consumer(消费者),Registry(注册中心)
Monitor(监控中心)和 Container(运行容器)
此工程中 base-service 作为 Provider(提供者),user-service 作为 Consumer(消费者)
每个模块的 api(base-service-api / user-service-api)工程中写对外暴露的接口
每个模块的 core (base-service-core / user-service-core)工程中有自己的服务和实现 api 接口的服务
# 端口
server.port=8081
# 数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/base_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
# 打印 sql 日志
logging.level.com.zwc.base.mapper=debug
# dubbo 配置
## 注册中心
### 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
## 提供方
### 提供方的项目名称
dubbo.application.name=springboot-dubbo-base-service
## 超时时间
dubbo.consumer.timeout=100000
## dubbo
### dubbo 的名称
dubbo.protocol.name=dubbo
### dubbo 的端口(-1 表示随机端口号)
dubbo.protocol.port=-1
api 接口
package com.zwc.base.api;
import com.zwc.base.dto.response.SpringbootBaseResponseDTO;
import java.util.List;
/**
* @ClassName SpringbootBaseApi
* @Desc TODO 地区表 服务类
* @Date 2019/4/6 14:19
* @Version 1.0
*/
public interface SpringbootBaseApi {
// 获取全部地区
List getAllBase();
}
api 接口实现类
package com.zwc.base.api.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.zwc.base.api.SpringbootBaseApi;
import com.zwc.base.dto.response.SpringbootBaseResponseDTO;
import com.zwc.base.service.SpringbootBaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @ClassName SpringbootBaseApiImpl
* @Desc TODO 地区表 服务实现类
* @Date 2019/4/6 14:25
* @Version 1.0
*/
@Service(interfaceClass = SpringbootBaseApi.class)
public class SpringbootBaseApiImpl implements SpringbootBaseApi {
@Autowired
private SpringbootBaseService springbootBaseService;
/*
* @ClassName SpringbootBaseApiImpl
* @Desc TODO 获取全部地区
* @Date 2019/4/6 14:28
* @Version 1.0
*/
@Override
public List getAllBase() {
return springbootBaseService.getAllBase();
}
}
service (自己的服务 )
package com.zwc.base.service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zwc.base.domain.SpringbootBase;
import com.zwc.base.dto.response.SpringbootBaseResponseDTO;
import com.zwc.base.mapper.SpringbootBaseMapper;
import com.zwc.user.api.SpringbootUserApi;
import com.zwc.user.dto.response.SpringbootUserResponseDTO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName SpringbootBaseService
* @Desc TODO 地区表 实现服务类
* @Date 2019/4/6 14:04
* @Version 1.0
*/
@Service
public class SpringbootBaseService extends ServiceImpl {
@Resource
private SpringbootBaseMapper springbootBaseMapper;
/*
* @ClassName SpringbootBaseService
* @Desc TODO 获取全部地区
* @Date 2019/4/6 14:31
* @Version 1.0
*/
public List getAllBase(){
// 返回
List result = new ArrayList<>();
// 调用查询
List list = super.list(new QueryWrapper<>());
// 遍历结果
list.forEach(base -> {
SpringbootBaseResponseDTO springbootBaseResponseDTO = new SpringbootBaseResponseDTO();
// 复值
BeanUtils.copyProperties(base,springbootBaseResponseDTO);
// 添加到返回集合中
result.add(springbootBaseResponseDTO);
});
// 返回
return result;
}
}
controller(前端控制器)
package com.zwc.base.controller;
import com.zwc.base.dto.response.SpringbootBaseResponseDTO;
import com.zwc.base.service.SpringbootBaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @ClassName SpringbootBaseController
* @Desc TODO 地区表 前端控制器
* @Date 2019/4/6 14:41
* @Version 1.0
*/
@RestController
@RequestMapping("base")
public class SpringbootBaseController {
@Autowired
private SpringbootBaseService springbootBaseService;
/*
* @ClassName SpringbootBaseController
* @Desc TODO 获取全部地区
* @Date 2019/4/6 14:43
* @Version 1.0
*/
@RequestMapping("/getAllBase")
@ResponseBody
public List getAllBase(){
return springbootBaseService.getAllBase();
}
}
SpringBoot 启动类
package com.zwc;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/*
* @ClassName SpringbootDubboBaseServiceCoreApplication
* @Desc TODO 启动类
* @Date 2019/4/6 15:12
* @Version 1.0
*/
@SpringBootApplication(scanBasePackages = "com.zwc")
@MapperScan("com.zwc.base.mapper")
@EnableDubbo
public class SpringbootDubboBaseServiceCoreApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDubboBaseServiceCoreApplication.class, args);
}
}
注:1. 项目启动前需要启动 zookeeper
2. 这里简单的体现了 Dubbo 的优势之一,非入侵式 ,高度解耦,不管消费者有没有启动,
提供者也可以启动起来,调用自己的服务
4.0.0
com.zwc
springboot-dubbo-user-service
0.0.1-SNAPSHOT
com.zwc
springboot-dubbo-user-service-core
0.0.1-SNAPSHOT
springboot-dubbo-user-service-core
用户服务工程 - 核心
jar
${project.artifactId}
com.zwc
springboot-dubbo-commons
0.0.1-SNAPSHOT
com.zwc
springboot-dubbo-user-service-api
0.0.1-SNAPSHOT
com.zwc
springboot-dubbo-base-service-api
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-maven-plugin
# 端口
server.port=8082
# 数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/user_db?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
# 打印 sql 日志
logging.level.com.zwc.user.mapper=debug
# dubbo 配置
## 注册中心
### 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
## 提供方
### 提供方的项目名称
dubbo.application.name=springboot-dubbo-user-service
## 超时时间
dubbo.consumer.timeout=100000
## dubbo
### dubbo 的名称
dubbo.protocol.name=dubbo
### dubbo 的端口(-1 表示随机端口号)
dubbo.protocol.port=-1
service (自己的服务 )
package com.zwc.user.service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zwc.base.api.SpringbootBaseApi;
import com.zwc.base.dto.response.SpringbootBaseResponseDTO;
import com.zwc.user.domain.SpringbootUser;
import com.zwc.user.dto.response.SpringbootUserResponseDTO;
import com.zwc.user.mapper.SpringbootUserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName SpringbootUserService
* @Desc TODO 用户表 实现服务类
* @Date 2019/4/6 15:16
* @Version 1.0
*/
@Service
public class SpringbootUserService extends ServiceImpl {
@Resource
private SpringbootUserMapper springbootUserMapper;
// 引入 base - service 工程的接口
@Reference
private SpringbootBaseApi springbootBaseApi;
/*
* @ClassName SpringbootUserService
* @Desc TODO 获取全部用户
* @Date 2019/4/6 15:18
* @Version 1.0
*/
public List getAllUser(){
// 返回
List result = new ArrayList<>();
// 调用查询
List list = super.list(new QueryWrapper<>());
// 遍历结果
list.forEach(user -> {
SpringbootUserResponseDTO springbootUserResponseDTO = new SpringbootUserResponseDTO();
// 复值
BeanUtils.copyProperties(user,springbootUserResponseDTO);
// 添加到返回集合中
result.add(springbootUserResponseDTO);
});
// 返回
return result;
}
/*
* @ClassName SpringbootUserService
* @Desc TODO 获取全部地区(调用 base - service 接口)
* @Date 2019/4/6 15:36
* @Version 1.0
*/
public List getAllBase(){
// 调用 base - service 工程的接口
List result = springbootBaseApi.getAllBase();
// 返回
return result;
}
/*
* @ClassName SpringbootUserService
* @Desc TODO 获取全部用户详情信息
* @Date 2019/4/6 23:11
* @Version 1.0
*/
public List
controller(前端控制器)
package com.zwc.user.controller;
import com.zwc.base.dto.response.SpringbootBaseResponseDTO;
import com.zwc.user.dto.response.SpringbootUserResponseDTO;
import com.zwc.user.service.SpringbootUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* @ClassName SpringbootUserController
* @Desc TODO 用户表 前端控制器
* @Date 2019/4/6 15:22
* @Version 1.0
*/
@RestController
@RequestMapping("user")
public class SpringbootUserController {
@Autowired
private SpringbootUserService springbootUserService;
/*
* @ClassName SpringbootUserController
* @Desc TODO 获取全部用户
* @Date 2019/4/6 15:24
* @Version 1.0
*/
@RequestMapping("/getAllUser")
@ResponseBody
public List getAllUser(){
return springbootUserService.getAllUser();
}
/*
* @ClassName SpringbootUserController
* @Desc TODO 获取全部地区(调用 base - service 接口)
* @Date 2019/4/6 15:37
* @Version 1.0
*/
@RequestMapping("/getAllBaseInUser")
@ResponseBody
public List getAllBase(){
return springbootUserService.getAllBase();
}
/*
* @ClassName SpringbootUserController
* @Desc TODO 获取全部用户详情信息
* @Date 2019/4/6 23:18
* @Version 1.0
*/
@RequestMapping("/getDetailInfo")
@ResponseBody
public List> getDetailInfo(){
return springbootUserService.getDetailInfo();
}
}
SpringBoot 启动类
package com.zwc;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/*
* @ClassName SpringbootDubboUserServiceCoreApplication
* @Desc TODO 启动类
* @Date 2019/4/6 15:12
* @Version 1.0
*/
@SpringBootApplication(scanBasePackages = "com.zwc")
@MapperScan("com.zwc.user.mapper")
@EnableDubbo
public class SpringbootDubboUserServiceCoreApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDubboUserServiceCoreApplication.class, args);
}
}
注:1. 项目启动前需要启动 zookeeper
2. 这里简单的体现了 Dubbo 的优势之一,非入侵式 ,高度解耦,不管提供者有没有启动,
消费者也可以启动起来,调用自己的服务
注:项目启动前需要启动 zookeeper
1. 启动 SpringbootDubboBaseServiceCoreApplication
端口:8081
接口:http://localhost:8081/base/getAllBase (查询全部地区信息接口,可单独调用)
2. 启动 SpringbootDubboUserServiceCoreApplication
端口:8082
接口:http://localhost:8082/user/getAllUser(查询全部用户信息接口,可单独调用)
3. 接口:http://localhost:8082/user/getAllBaseInUser(获取全部地区信息,注意端口为 8082,
在 user-service 工程中调用了 base-service 工程的接口,体现了 Dubbo 的作用)
dubbo-admin:查看服务调用情况(本文文末处有扩展介绍如何在本地启动 dubbo-admin)
当启动了 base-service 后可在 Dubbo Admin 服务中看到一个服务接口,状态为:没有消费者
当再启动 user-service 后可在 Dubbo Admin 服务中看到上面的服务接口被调用了,状态为:正常
如何在本地启动 dubbo-admin
dubbo-admin 可把注册到 Zookeeper 中的服务更友好的展示出来,可以清楚的观察服务接口的使用情况和状态
1. 前往 GitHub 中获取源码:https://github.com/apache/incubator-dubbo
2. 版本有很多,这里选择 2.6.0 版本的(点击 Branch:master -> Tags -> dubbo-2.6.0)
3. 点击 Clone or download -> Download ZIP,保存到本地
4. 解压刚刚下载压缩包(incubator-dubbo-dubbo-2.6.0.zip)
5. 下载 maven 并配置环境变量
6. 打开 cmd,进入到解压文件 dubbo-admin 目录
假如把文件解压到了 D 盘更目录,步骤为
a) 输入指令 D: ,回车
b) 输入指令 cd incubator-dubbo-dubbo-2.6.0\dubbo-admin,回车
7. 输入指令 mvn package,如果出现 BUILD SUCCESS 就证明打包成功
8. 本地打开 此电脑 -> D 盘 -> incubator-dubbo-dubbo-2.6.0 -> dubbo-admin,会看到一个 target 文件夹
9. 打开 target 文件夹,会看到一个 dubbo-admin-2.6.0.war 文件
10. 下载或者解压一个新的 Tomcat8,重命名为 tomcat-dubbo
11. 把步骤 9 中的 dubbo-admin-2.6.0.war 文件复制到步骤 10 中的 tomcat-dubbo/webapps 文件夹中
12. 打开步骤 10 中的 tomcat-dubbo/bin,双击 startup.bat 文件启动 tomcat(执行此步骤时最好启动 zookeeper)
13. tomcat 启动成功后,访问地址:http://localhost:8080/dubbo-admin-2.6.0/
14. 进入时需要输入用户名密码,默认都为 root
15. 成功进入 Dubbo Admin 的界面如下
到此 SpringBoot 整合 Dubbo 就结束了,注意几个关键的点,多多尝试,一定会成功的!
希望能够帮助到你
over