java Dubbo框架学习笔记

网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容
如果右边没有就找找左边
Dubbo是RPC框架,学习Dubbo之前需要掌握的RPC相关知识
https://blog.csdn.net/grd_java/article/details/119212795
Dubbo框架
  1. 来自官方文档的介绍
    在这里插入图片描述
服务发现架构图

在这里插入图片描述

  1. 虚线和实线
    虚线表示异步,实线表示同步。异步不阻塞线程,性能高。同步阻塞线程必须等待响应结果才能继续执行,性能相对较低
  2. Provider
    提供者。编写持久层和事务代码
  3. Container
    容器(Spring容器),Dubbo完全基于Spring实现的
  4. Registry
    注册中心。放置所有Provider对外提供的信息。包含Provider的IP,访问端口,访问遵守的协议,对外提供的接口,接口中有哪些方法等相关信息。
  5. Consumer
    消费者(RPC调用者,SOA调用服务的项目)开发中也是一个项目,编写service和controller(还可以报页面等)。调用XXXXServiceImpl中的方法。
  6. Monitor
    监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发送给Monitor,有Monitor进行统计
Dubbo支持的协议
  1. Dubbo协议(官方推荐协议)
    优点:采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用)
    缺点:大文件上传时,可能出现问题(不使用Dubbo文件上传)
  2. RMI(Remote Method Invocation)协议
    优点:JDK自带的能力
    缺点:偶尔连接失败
  3. Hessian协议
    优点:可与Hessian互操作,基于HTTP协议
    缺点:需hessian.jar支持,http短连接开销大
Dubbo支持的注册中心
  1. Zookeeper(官方推荐)
    优点:支持分布式,有很多周边产品
    缺点:受限于Zookeeper软件的稳定性,Zookeeper专门分布式辅助软件,稳定较优
  2. Multicast
    优点:去中心化,不需要单独安装软件
    缺点:2.2.1Provider和Consumer和Registry不能跨机房(路由)
  3. Redis
    优点:支持集群,性能高
    缺点:要求服务器时间同步,否则可能出现集群失败问题
  4. Simple
    优点:标准RPC服务,没有兼容问题
    缺点:不支持集群

一、快速入门

先启动Zookeeper
不会请参考:https://blog.csdn.net/grd_java/article/details/119299318

在这里插入图片描述

1、Provider提供者

  1. 创建Maven项目,作为父工程,引入依赖(这张图片两个spring boot的依赖没加版本号,会影响后面子模块的继承,代码中补上了)
    在这里插入图片描述
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.3</version>
</parent>

<!--放到dependencyManagement,是因为这些依赖是给子项目用的,父项目不用-->
<dependencyManagement>
    <dependencies>
        <!--Spring boot不带web依赖,不会提供端口,因为一些-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.5.3</version>
        </dependency>
        <!--Spirng boot带web,会自动提供端口-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.3</version>
        </dependency>
        <!--Dubbo整合-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--Zookeeper整合-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.2.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>
  1. 创建子项目api,用于编写所以对外提供的接口,方便远程调用
    在这里插入图片描述
    注意看这里的包名,用dubbo区分一下,因为日后很多类,最好把和dubbo相关的都放到dubbo包中在这里插入图片描述> 3. 新建子模块provider提供者> 在这里插入图片描述
  1. 编写pom文件
    在这里插入图片描述
  2. 编写接口实现类
    在这里插入图片描述
import com.yzpnb.dubbo.service.DemoDubboService;
import org.apache.dubbo.config.annotation.Service;
@Service//标识这个类是Provider,这个注解,不是spirng boot的,而是apache.dubbo的,不要引错包
public class DemoDubboServiceImpl implements DemoDubboService {
    @Override
    public String demo(String param) {
        System.out.println("执行了demo");
        return param + " i'm demo";
    }
}
  1. 编写启动类
    在这里插入图片描述
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo//标识此子模块可以被Dubbo识别管理
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class,args);
    }
}
  1. 编写yaml配置文件
    在这里插入图片描述
dubbo:
  application:
    name: dubbo-provider # dubbo在注册中心的名字
  registry:
    address: zookeeper://192.168.10.105:2181 # zookeeper地址,用zookeeper协议
  protocol:
    port: 20884 #dubbo端口,可以不写,和Dubbo注册中心取到联系

2、Consumer消费者,这就是个spring boot模块,用于消费前面我们写的Dubbo代码的东西

  1. 创建子模块,引入依赖
    在这里插入图片描述
  2. 编写接口和实现类
    在这里插入图片描述
    在这里插入图片描述
import com.yzpnb.dubbo.service.DemoDubboService;
import com.yzpnb.service.DemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service
public class DemoServiceImpl implements DemoService {

    @Reference//这个注解用于自动装载,从Dubbo容器中取到对象。和spirng的@Autowired差不多,同样引包要引apache.dubbo的
    private DemoDubboService demoDubboService;//因为我们引入了api子模块,所以可以引用接口

    @Override
    public String demoConsumer() {
        return demoDubboService.demo("Hello,I'm Consumer!!!");
    }
}
  1. 编写启动类
    在这里插入图片描述
  2. 编写Controller
    在这里插入图片描述
  3. 配置文件
    在这里插入图片描述

3. 运行测试

  1. 启动provider然后启动consumer
    在这里插入图片描述在这里插入图片描述
  2. 浏览器访问
    在这里插入图片描述
    在这里插入图片描述
  3. 分析
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  4. 容易出错的地方
  1. 引错包,和dubbo有关的都是apace的包,不要引错,尤其是不要引成alibaba的包
  2. @Service注解,在provider中是dubbo的包中的,不是spring中的
  3. Zookeeper地址输入一定要正确,ip地址一定要能访问到,无论是你的云服务器还是虚拟机ip地址

5. 设置负载均衡策略以及权重

  1. 设置负载均衡策略为轮询,就是集群中每个机器都平均的处理请求
    在这里插入图片描述
@Reference(loadbalance = "roundrobin")
  1. 设置权重(数值越大,处理的请求越多)
@Service(weight = 4)

二、案例实践(上面的快速入门Demo直接拿来用)

1、环境搭建

  1. 创建数据库,数据表

在这里插入图片描述

create table dept(
	id int(11) primary key auto_increment,
	name varchar(20)
);

insert into dept values(default,'开发部');
insert into dept values(default,'产品部');

create table emp(
	id int(11) primary key auto_increment,
	name varchar(20),
	photo varchar(200),
	did int(11),-- dept_id
	Constraint fk_emp_dept Foreign key (did) References dept(id)
);
  1. 父工程依赖(先注释掉所有引用自己模块的依赖,等所有maven依赖引入完成,再解除注释)在这里插入图片描述
    在这里插入图片描述
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.3</version>
</parent>

<!--放到dependencyManagement,是因为这些依赖是给子项目用的,父项目不用-->
<dependencyManagement>
    <dependencies>
        <!--Spring boot不带web依赖,不会提供端口,因为一些-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.5.3</version>
        </dependency>
        <!--Spirng boot带web,会自动提供端口-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.3</version>
        </dependency>
        <!--thymeleaf 模板依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.5.3</version>
        </dependency>
        <!--myBatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
        <!--apace commons工具-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        <!--Dubbo整合-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--Zookeeper整合-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.2.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>
  1. 创建子模块pojo,用来存放所有实体类,对应数据库的实体类
    在这里插入图片描述
    在这里插入图片描述
  2. 创建mapper子模块操作数据库,引入依赖

在这里插入图片描述

  1. 创建service接口
    在这里插入图片描述
  2. mapper.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.yzpnb.mapper.DeptMapper">

</mapper>
  1. 配置文件
    在这里插入图片描述
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/dubbo_demo?serverTimezone=CST&useUnicode=true&characterEncoding=utf-8&useSSL=false #?后面参数表示时区,非常重要
    username: root
    password: 123456
# MyBatis
mybatis:
  # 搜索指定包别名
  type-handlers-package: com.yzpnb.pojo
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath:mybatis/*Mapper.xml
  1. api子项目 依赖

在这里插入图片描述

  1. provider子项目
  1. 依赖
    在这里插入图片描述
<dependencies>
    <dependency>
        <groupId>com.yzpnb</groupId>
        <artifactId>api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <!--Spring boot不带web依赖,不会提供端口,因为一些-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!--Dubbo整合-->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
    </dependency>
    <!--Zookeeper整合-->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
    </dependency>
</dependencies>
  1. 启动类
    在这里插入图片描述
  2. 配置文件
    在这里插入图片描述
spring:
  profiles:
    active: mybatis # 加载其它配置文件,加载的是 application-*.yaml,我们只要指定*所代表的即可
  1. dept子模块,专门提供对部门的操作,这个就是前面讲的Consumer消费者
    在这里插入图片描述
  1. 配置文件
    在这里插入图片描述
  2. 启动类(和快速入门consumer一样,就是注解中加一个取消扫描数据源的参数)在这里插入图片描述
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
  1. emp模块 和 dept模块相同,就不演示了,注意配置文件里,在dubbo注册的名字要改一下
    在这里插入图片描述

2. 部门dept模块业务代码(代码简单,就不贴出代码块了)

  1. mapper
    在这里插入图片描述在这里插入图片描述
  2. api中提供远程调用接口
    在这里插入图片描述
  3. provider中实现api远程调用接口
    在这里插入图片描述
  4. 编写dept代码,消费provider提供的接口
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
至于后面的功能大家自己实现吧,本文主要讲解Dubbo的代码,按照上面流程写就行了,日后开发,也是这样的流程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值