SpringBoot整合Dubbo+Zookeeper

文章目录

    • 实践前知识储备
      • Dubbo概述
      • 安装zk
      • Dubbo在zk中的存储结构
      • Dubbo的注册中心有哪些
      • Dubbo支持的协议
    • Dubbo整合SpringBoot
      • 本案例工程结构
      • 具体实现
      • 开发两个接口进行测试
      • 实现步骤
      • 测试

实践前知识储备

Dubbo概述

学习Dubbo前你要了解这些

安装zk

Zookeeper概述与安装

Dubbo在zk中的存储结构

在这里插入图片描述

Dubbo的注册中心有哪些

1、Multicast:Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。

2、Zookeeper是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用;

3、Nacos 是 Dubbo 生态系统中重要的注册中心实现,其中 dubbo-registry-nacos 则是 Dubbo 融合 Nacos 注册中心的实现。

4、基于 Redis 实现的注册中心 。

5、Simple注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。

Dubbo支持的协议

dubbo、rmi、hessian、http、webservice、rest、thrift、memcached、redis、grpc

Dubbo官方推荐使用 dubbo协议

Dubbo整合SpringBoot

本案例工程结构

dubbo-boot pom父工程
dubbo-boot-bean java bean
dubbo-boot-interface 接口服务
dubbo-boot-user-service 服务提供者
dubbo-boot-consumer 服务消费者、

具体实现

创建dubbo-boot 父工程

引入maven依赖

 <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <!-- 导入spring-boot-dependencies所管理的maven依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Dubbo -->
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>0.2.0</version>
            </dependency>

            <!-- mybatis -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.2</version>
            </dependency>

            <!-- pagehelper -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.2.10</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

在dubbo-boot 父工程下创建bean工程

maven依赖

 <artifactId>dubbo-boot-bean</artifactId>

  <dependencies>
        <dependency>
            <artifactId>dubbo-boot-bean</artifactId>
            <groupId>com.etoak.et2001.dubbo</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

在dubbo-boot 父工程下创建interface工程

maven依赖

    <artifactId>dubbo-boot-interface</artifactId>

    <dependencies>
        <dependency>
            <artifactId>dubbo-boot-bean</artifactId>
            <groupId>com.etoak.et2001.dubbo</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

在dubbo-boot 父工程下创建consumer工程

maven依赖

   <artifactId>dubbo-boot-consumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.etoak.et2001.dubbo</groupId>
            <artifactId>dubbo-boot-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

消费者注册到zookeeper

application.yml文件

server:
  port: 8080

dubbo:
  application:
    name: user-service-consumer
  registry:
    address: zookeeper://192.168.149.128:2181

启动类

@SpringBootApplication
@EnableDubbo
public class ConsumerApp {
    public static void main(String[] args) {
         SpringApplication.run(ConsumerApp.class, args);
    }
}

在dubbo-boot 父工程下创建user-service工程

maven依赖

配置数据源整合mybatis

  <artifactId>dubbo-boot-user-service</artifactId>
    <dependencies>
        <!-- interface -->
        <dependency>
            <artifactId>dubbo-boot-interface</artifactId>
            <groupId>com.etoak.et2001.dubbo</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- spring-boot-starter-jdbc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <!-- pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>

        <!-- dubbo -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

服务提供方user-service注册到zookeeper 并声明使用Dubbo协议端口为20080

application.yml文件

server:
  port: 9090

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/user?serverTimezone=GMT
    username: root
    password: etoak

mybatis:
  type-aliases-package: com.etoak.bean
  mapper-locations: classpath:mappers/*.xml

pagehelper:
  reasonable: true

# Dubbo配置
dubbo:
  application:
    name: user-service
  registry:
    address: zookeeper://192.168.149.128:2181
  protocol:
    name: dubbo
    port: 20880

启动类

@SpringBootApplication
@MapperScan(basePackages = "com.etoak.mapper")
@EnableDubbo
public class UserServiceApp {
     public static void main(String[] args) {
         SpringApplication.run(UserServiceApp.class, args);
     }
}

开发两个接口进行测试

根据id查询用户

查询用户列表

实现步骤

在dubbo-boot-bean中开发User.java

@Data
public class User implements Serializable {
    private Integer id;
    private String name;
    private Integer age;
    private Integer status;
    private String createTime;
}

在dubbo-boot-bean中开发PageVo.java 分页查询时使用

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageVo<T> implements Serializable {

    private int pageNum;
    private int pageSize;
    private List<T> rows;
    private long total;
    private int pageCount;

}

在dubbo-boot-interface中开发UserService接口

/**
 * 服务接口
 */
public interface UserService {

    /**
     * 根据id查询用户
     * @param id
     * @return
     */
    User getById(int id);

    /**
     * 分页查询
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageVo<User> queryList(int pageNum, int pageSize);

}

在dubbo-boot-user-service中开发UserMapper接口

public interface UserMapper {

    User getById(int id);

    List<User> queryList();

}

在dubbo-boot-user-service中开发UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.etoak.mapper.UserMapper">

    <sql id="base_sql">
        id, name, age, status, create_time AS createTime
    </sql>

    <select id="getById" parameterType="int" resultType="user">
        SELECT
            <include refid="base_sql"></include>
            FROM user
           WHERE id = #{value}
    </select>

    <select id="queryList" resultType="user">
        SELECT
            <include refid="base_sql"></include>
            FROM user
    </select>


</mapper>

在dubbo-boot-user-servcie中开发UserService接口

//注意这里的@Service注解为Dubbo包下的
import com.alibaba.dubbo.config.annotation.Service;
@Service // 发布Dubbo服务
@Slf4j     // 实现   dubbo-boot-interface工程下的 UserService 
public class UserServiceImpl implements UserService {

    @Resource
    UserMapper userMapper;

    @Override
    public User getById(int id) {
        log.info("getById param id - {}", id);
        return userMapper.getById(id);
    }

    @Override
    public PageVo<User> queryList(int pageNum, int pageSize) {
        log.info("queryList param paegNum - {}, pageSize - {}",
                pageNum, pageSize);
        // 设置分页条件
        PageHelper.startPage(pageNum, pageSize);
        // 查询用户列表
        List<User> userList = userMapper.queryList();
        // 创建PageInfo
        PageInfo<User> pageInfo = new PageInfo(userList);
        // 返回结果
        return new PageVo<User>(pageInfo.getPageNum(),
                pageInfo.getPageSize(),
                userList,
                pageInfo.getTotal(),
                pageInfo.getPages());
    }
}

在dubbo-boot-consumer开发两个接口

也可以单独建个Controller 我这里直接写在启动类了

@SpringBootApplication
@EnableDubbo
@RestController
@RequestMapping("/user")
public class ConsumerApp {

    public static void main(String[] args) {
         SpringApplication.run(ConsumerApp.class, args);
    }

    // 订阅远程服务
    @Reference(timeout = 3000)
    UserService userService;

    @GetMapping("/{id}")
    public User getUser(@PathVariable int id) {
        return userService.getById(id);
    }

    @GetMapping("/list")
    public PageVo<User> queryList(
    @RequestParam(required = false, defaultValue = "1") int pageNum,
    @RequestParam(required = false, defaultValue = "10") int pageSize) {
        return userService.queryList(pageNum, pageSize);
    }

}

测试

  • 先启动zookeeper,dubbo控制台

  • 再启动服务提供者(dubbo-user-service)

  • 再启动服务消费者(dubbo-mvc-consumer)

  • 最后调用

    http://localhost:8080/user/{id}

    http://localhost:8080/user/list

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/45197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频的音频提取怎么做?这样提取很简单

提取视频中的音频通常在需要从视频中独立使用音频或需要对音频进行编辑时使用。例如&#xff0c;当我们需要将音频上传到音乐流媒体平台或将其用于播客或其他音频项目时&#xff0c;就可能需要从视频中提取音频。问题是该怎么提取呢&#xff1f;教给大家几种简单的提取方法&…

Nodejs 安装之后cmd 输入npm -v 提示error的问题解决

1.问题现象&#xff1a; 安装时候选择&#xff1a; 2. 解决问题 卸载nodejs 删除安装路径下的node_modules, 重新安装 按照下面的选择

科技与人元宇宙论坛跨界对话

近来&#xff0c;“元宇宙”成为热门话题&#xff0c;越来越频繁地出现在人们的视野里。大家都在谈论它&#xff0c;但似 乎还没有一个被所有人认同的定义。元宇宙究竟是什么&#xff1f;未来它会对我们的工作和生活带来什么样 的改变&#xff1f;当谈论虚拟现实&#xff08;VR…

磁场强度单位和磁感应强度单位转换

磁学量常用单位换算 、磁场强度单位和磁感应强度单位转换。 磁场单位 Oe&#xff08;奥斯特&#xff09;,A/m,T&#xff08;特斯拉&#xff09;三种. 1T1000mT 1mT10Gs 1Gs79.6A/m 1T(特斯拉)10000Gs(高斯)1Wb/M2 1Gs(高斯)1Oe(奥斯特)

DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

1.手动实现登录框&#xff1b; ---mychat.h---头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> //打印信息 #include <QIcon> //图标 #include <QPushButton> //按钮 #include <QLineEdit> //行编辑器类 #in…

Fiddler学习笔记

Fiddler简介 学习Fiddler的基础前置知识 请求行又包括请求方法&#xff0c;统一资源定位符、请求协议及版本号 统一资源定位符就是资源的绝对路径 请求体里写服务器需要的参数 304是服务器没有变化&#xff0c;根据请求头发现请求的内容和本地一样&#xff0c;就不再发回来了 …

day02_springboot综合案例

day02_springboot综合案例 订单操作 查询所有订单 查询所有订单流程 查询订单&#xff0c;要把订单对应的产品也要查出来 Orders实体类 Data public class Orders {private String id;private String orderNum;DateTimeFormat(pattern"yyyy-MM-dd HH:mm")privat…

【前端知识】React 基础巩固(三十三)——Redux的使用详解

React 基础巩固(三十三)——Redux的使用详解 Redux的使用详解 针对React 基础巩固&#xff08;三十二&#xff09;中的案例&#xff0c;我们希望抽取页面中共有的代码&#xff08;例如下方的代码&#xff09;&#xff0c;使用高阶组件统一拦截。 constructor() {super();this.…

华为数通HCIP-ISIS高级

isis区域间的互访 1、L2区域 to L1区域 在L1区域发布的路由会以L1-LSP在L1区域内传递&#xff0c;到达L1-2路由器时&#xff0c;L1-2路由器会将该L1-LSP转换为L2-LSP在L2区域内传递&#xff1b; 因此L2区域的设备可以学习到L1区域的明细路由&#xff0c;进行访问&#xff1b;…

离多态更近一步

在面向对象的语言里面,封装,继承,多态可谓是在熟悉不过了,当我们每次再去重新认识它们的时候总会有新的发现,为此我也经常感到疑惑,所以在这里和大家一起探讨三个问题,让我们在向多态靠近一点点。 虚表是否真的存在静态区 经常我们都会看见一个问题&#xff0c;虚表到底是存放…

Cisco学习笔记(CCNA)——Equipment Infrastructure Management

Equipment infrastructure management 路由器组件 路由器的组成及功能 CPU&#xff1a;执行操作系统的指令 随机访问存储器&#xff08;RAM内存&#xff09;&#xff1a;RAM中内容断电丢失 只读存储器&#xff08;ROM&#xff09;&#xff1a;开机自检软件&#xff0c;路由…

Jmeter 压测实战:Jmeter 二次开发之自定义函数

目录 1 前言 2 开发准备 3 自定义函数核心实现 3.1 新建项目 3.2 继承实现 AbstractFunction 类 3.3 最终项目结构 4 Jmeter 加载扩展包 4.1 maven 构建配置 4.2 项目打包 4.3 Jmeter 加载扩展包 5 自定义函数调用调试 5.1 打开 Jmeter 函数助手&#xff0c;选择自…

vue+Element项目中v-for循环+表单验证

如果在Form 表单里有通过v-for动态生成&#xff0c;如何设置验证呢&#xff1f; <el-form ref"ruleFormRef" :model"ruleForm" status-icon :rules"rules" label-width"120px"class"demo-ruleForm" hide-required-aster…

Zabbix-server监控mysql及httpd服务

目录 一、Zabbix监控mysql数据库 1、为server.Zabbix.com添加服务模板 2、创建mysql服务图形 二、server.zabbix.com服务器操作 编辑chk_mysql.sh脚本 三、server.Zabbix.com测试 四、查看web效果 五、Zabbix监控apache&#xff08;httpd服务&#xff09; 安装master 六、…

改进的北方苍鹰算法优化BP神经网络---回归+分类两种案例

今天采用前作者自行改进的一个算法---融合正余弦和折射反向学习的北方苍鹰(SCNGO)优化算法优化BP神经网络。 文章一次性讲解两种案例&#xff0c;回归与分类。回归案例中&#xff0c;作者选用了一个经典的股票数据。分类案例中&#xff0c;选用的是公用的UCI数据集。 BP神经网络…

Cesium态势标绘专题-多边形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

Redis追本溯源(三)内核:线程模型、网络IO模型、过期策略与淘汰机制、持久化

文章目录 一、Redis线程模型演化1.Redis4.0之前2.Redis4.0之后单线程、多线程对比3.redis 6.0之后 二、Redis的网络IO模型1.基于事件驱动的Reactor模型2.什么是事件驱动&#xff0c;事件驱动的Reactor模型和Java中的AIO有什么区别3.异步非阻塞底层实现原理 三、Redis过期策略1.…

【数字信号处理】带通采样定理及其MATLAB仿真

目录 一、带通采样定理1.1 内容1.2 公式推导 二、MATLAB信号仿真2.1 信号仿真实验2.2 MATLAB代码 三、总结参考 一、带通采样定理 按照奈奎斯特采样定理(低通采样)&#xff0c;采样频率 f s f_{s} fs​ 要大于等于信号中最高频率 f m a x f_{max} fmax​ 的2倍&#xff0c;才…

28.1 kibana

Kibana 是一个免费且开放的用户界面&#xff0c;能够对 Elasticsearch 数据进行可视化操作&#xff0c;从跟踪查询负载&#xff0c;到理解请求如何流经整个应用&#xff0c;都能轻松完成。 1.Kibana安装 注意要与ES版本保持一致 https://www.elastic.co/downloads/past-relea…

C# 目标平台为x64,自定义控件不可用,显示控件未能加载,错误解决方法

由于项目加载第三方的dll需要编译成x64&#xff0c;设置编译目标为x64 结果打开窗口设计器时&#xff0c;自定义的控件不能显示及加载 错误消息&#xff1a;未能找到类型“XXX”。请确保已引用包含此类型的程序集。如果此类型为开发项目的一部分&#xff0c;请确保已使用针对当…