SpringBoot2.3.4整合Dubbo和Zookeeper实现分布式架构搭建

导读:本篇文章讲解 SpringBoot2.3.4整合Dubbo和Zookeeper实现分布式架构搭建,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

概述

随着互联网的发展,分布式服务架构越来越受到开发人员的青睐,常用的分布式架构有阿里的Dubbo和SpringCloud,本文将主要介绍SpringBoot整合Dubbo实现分布式架构的搭建。
大家都知道Dubbo是阿里开源的一个高性能优秀的服务框架,使得应用可以通过高性能的RPC实现服务的输出和输入功能。主要提供三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册和发现。
Dubbo架构如下图:
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最新压缩包
zookeeper官网下载
点击进入下载页面
zookeeper下载页面
下载完成后解压即可
解压
在此目录下新建data和log文件夹

修改配置

先复制conf目录下zoo_sample.cfg配置文件,修改文件名为zoo.cfg
配置文件
修改配置文件zoo.cfg
修改配置文件
dataDir路径如果配置错误,服务启动时会报连接不上的错误
dataLogDir如果不配置路径,系统会默认logs目录下

启动zookeeper

bin路径下双击zkServer.cmd启动zookeeper
启动zookeeper
zookeeper启动窗口

Dubbo环境搭建

下载dubbo-admin源码

github上下载dubbo-admin源码
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管理端界面
dubbo首页
输入访问地址后默认进入首页,点击退出会报错,点击菜单列表会跳到登录页面
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
swagger页面
输入用户名和密码,查看返回结果
swagger测试
至此完成SpringBoot整合Dubbo和Zookeeper

致谢

由于本人知识有限,文中难免会存在错误和不足,还请大家多多指正,如果有疑问,欢迎在评论区留言;如果觉得本文对你有帮助,多谢点赞!

完整代码详见
码云
Github

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76828.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!