概述
随着互联网的发展,分布式服务架构越来越受到开发人员的青睐,常用的分布式架构有阿里的Dubbo和SpringCloud,本文将主要介绍SpringBoot整合Dubbo实现分布式架构的搭建。
大家都知道Dubbo是阿里开源的一个高性能优秀的服务框架,使得应用可以通过高性能的RPC实现服务的输出和输入功能。主要提供三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册和发现。
Dubbo架构如下图:
Provider:暴露服务的服务提供方
Consumer:调用远程服务的服务消费方
Registry:服务注册与发现的注册中心
Monitor:统计服务的调用次数和调用时间的监控中心
Container:服务运行容器
调用关系说明
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
更多Dubbo知识,请阅读dubbo官网
在使用Dubbo之前,需要引入注册中心,常用的注册中心有zookeeper、nacos、consul以及eureka,dubbo推荐使用zookeeper作为其注册中心
zookeeper是Apache公司的一个开源项目,用于维护配置信息,命名,提供分布式同步以及提供集群服务的集中式服务,更多详情,请阅读zookeeper官网
技术栈
SpringBoot2.3.4
Dubbo2.7.7
Zookeeper3.6.2
MyBatis-Plus3.4.0
Swagger3.0
Zookeeper环境搭建
下载源码
从官网下载zookeeper最新压缩包
点击进入下载页面
下载完成后解压即可
在此目录下新建data和log文件夹
修改配置
先复制conf目录下zoo_sample.cfg配置文件,修改文件名为zoo.cfg
修改配置文件zoo.cfg
dataDir路径如果配置错误,服务启动时会报连接不上的错误
dataLogDir如果不配置路径,系统会默认logs目录下
启动zookeeper
bin路径下双击zkServer.cmd启动zookeeper
Dubbo环境搭建
下载dubbo-admin源码
从github上下载dubbo-admin源码
dubbo-admin是前后端分离项目,默认develop分支,dubbo-admin下有4个模块,需要使用的是dubbo-admin-server和dubbo-admin-ui。将下载的dubbo-admin文件解压后导入IDEA开发工具,加载相关依赖
修改配置
因为zookeeper启动的时候已经使用了8080端口,dubbo-admin-server默认的端口也是8080,所以需要修改dubbo-admin-server配置文件application.properties,增加端口配置
运行主启动类,启动项目
修改前端项目文件
因为后端项目修改了访问端口,前端项目也需要同步修改端口,配置文件vue.config.js
右键dubbo-admin-ui项目,点击Open in Terminal打开终端
执行npm install安装依赖
执行npm run dev命令启动项目
看到访问地址后,表示启动成功
浏览器输入地址http://localhost:8082/进入dubbo管理端界面
输入访问地址后默认进入首页,点击退出会报错,点击菜单列表会跳到登录页面
输入用户名和密码root/root,登录系统后菜单列表可以正常访问
dubbo-admin提供详细的环境搭建步骤,详情可参阅dubbo-admin环境搭建
至此zookeeper和dubbo环境搭建完成,下面介绍SpringBoot整合Dubbo和Zookeeper
SpringBoot整合Dubbo和Zookeeper
新建springboot-dubbo模块作为dubbo整合的父工程,在其下新建3个模块,springboot-dubbo-api用于调用接口,springboot-dubbo-provider服务提供者,springboot-dubbo-consumer服务消费者
springboot-dubbo-api
新建服务接口
public interface UserApiService {
/**
* 根据用户名和密码查询用户信息
* @param username
* @param password
* @return
*/
UserVo selectUserByUserNameAndPassword(String username, String password);
}
springboot-dubbo-provider
pom.xml中引入核心依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.7</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.xlhj</groupId>
<artifactId>springboot-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
application.yml配置
server:
port: 8304
spring:
application:
name: springboot-dubbo-provider
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: qaz123456
hikari:
minimum-idle: 10 #最小空闲连接,默认10
maximum-pool-size: 20 #最大连接数
idle-timeout: 600000 #空闲连接超时时间,默认600000(10分钟)
max-lifetime: 540000 #连接最大存活时间,默认30分钟
connection-timeout: 60000 #连接超时时间,默认30秒
connection-test-query: SELECT 1 #测试连接是否可用查询语句
mybatis-plus:
mapper-locations: classpath:mapper/**/*Mapper.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-aliases-package: com.xlhj.dubbo.entity
logging:
config: classpath:logback-spring.xml
level:
com.xlhj.dubbo: debug
dubbo:
scan:
base-packages: com.xlhj.dubbo.api
protocol:
name: dubbo #协议
port: 20880 #端口
registry:
address: zookeeper://127.0.0.1:2181
provider:
service:
version: 1.0.0 #版本
接口实现类
实现springboot-dubbo-api模块中的业务接口
@Service
@DubboService(version = "${provider.service.version}")
public class UserApiServiceImpl implements UserApiService {
@Autowired
private SysUserService userService;
/**
* 根据用户名和密码查询用户信息
* @param username
* @param password
* @return
*/
@Override
public UserVo selectUserByUserNameAndPassword(String username, String password) {
QueryWrapper<SysUser> wrapper = new QueryWrapper<SysUser>();
wrapper.eq("user_name", username);
wrapper.eq("password", password);
SysUser user = userService.getOne(wrapper);
UserVo vo = new UserVo();
vo.setId(user.getId());
vo.setUserName(user.getUserName());
vo.setRealName(user.getRealName());
vo.setPassword(user.getPassword());
vo.setSex(user.getSex());
vo.setAvatar(user.getAvatar());
return vo;
}
}
@Service注解是org.springframework.stereotype.Service下面的,用于注入Spring容器
@DubboService注解是Dubbo提供的,用于对外提供接口的,老版本是@Service,注入Spring容器时需要用到@Component注解,新版本已经改为@DubboService了
springboot-dubbo-consumer
pom.xml中引入依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.7</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.xlhj</groupId>
<artifactId>springboot-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
application.yml配置
server:
port: 8305
spring:
application:
name: springboot-dubbo-consumer
dubbo:
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20881
consumer:
service:
version: 1.0.0
logging:
config: classpath:logback-spring.xml
level:
com.xlhj.dubbo: debug
业务调用控制器
@RestController
@RequestMapping("/user")
public class SysUserController {
@DubboReference(version = "${consumer.service.version}")
UserApiService userService;
/**
* 根据用户名和密码查询用户信息
* @param username
* @param password
* @return
*/
@ApiOperation(value = "根据用户ID查询用户信息")
@PostMapping("/selectUserByUserNameAndPassword/{username}/{password}")
public ResultData selectUserByUserNameAndPassword(@PathVariable String username, @PathVariable String password) {
UserVo user = userService.selectUserByUserNameAndPassword(username, password);
if (user != null) {
return ResultData.ok().data("user", user);
} else {
return ResultData.error();
}
}
}
@DubboReference注解用于远程调用,老版本是@Reference
测试
依次启动zookeeper,dubbo-admin-server,dubbo-admin-ui,springboot-dubbo-provider,springboot-dubbo-consumer
dubbo-admin管理端
查看dubbo-admin服务查询服务是否注册成功
Swagger测试
浏览器输入http://localhost:8305/swagger-ui/index.html
输入用户名和密码,查看返回结果
至此完成SpringBoot整合Dubbo和Zookeeper
致谢
由于本人知识有限,文中难免会存在错误和不足,还请大家多多指正,如果有疑问,欢迎在评论区留言;如果觉得本文对你有帮助,多谢点赞!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76828.html