java Dubbo框架学习笔记

本文介绍Dubbo RPC框架的基础知识及应用案例,包括快速入门、环境搭建、案例实践等内容,帮助读者快速上手并理解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的代码,按照上面流程写就行了,日后开发,也是这样的流程
内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。
内容概要:本文系统研究了综合能源系统中的容量配置与运行调度问题,采用双层优化方法构建模型并通过Matlab代码实现求解。上层优化侧重于设备容量的科学配置,以降低投资成本并提升系统经济性;下层优化聚焦于多能源协同运行调度,综合考虑光伏、储能、电动汽车等多种能源形式的动态特性,旨在实现系统在不同运行工况下的能效最大化、运行可靠性与低碳化目标。研究融合智能优化算法(如遗传算法、粒子群算法)与电力系统建模技术,深入探讨了多能耦合、不确定性处理及复杂约束下的优化机制,并提供了完整的仿真案例与代码资源,涵盖微电网调度、风光储协同、电动汽车接入等典型应用场景,形成了具有较强实用价值的科研技术体系。; 适合人群:具备电力系统分析、优化算法理论及Matlab编程基础的研究生、科研人员和工程技术人员,特别适用于从事综合能源系统规划、微电网运行、智能调度与能源互联网等领域研究的专业人士。; 使用场景及目标:① 掌握双层优化在综合能源系统中的建模方法与求解流程;② 利用所提供Matlab代码进行科研复现、算法改进与系统仿真验证;③ 拓展应用于电动汽车集群调度、可再生能源消纳、多能互补系统优化等实际工程与学术研究场景; 阅读建议:建议结合文档中列出的相关研究方向与配套代码资源,按照主题分类循序渐进地学习,优先理解双层架构的设计逻辑与上下层耦合机制,并借助提供的网盘资料开展仿真实验与参数调试,以深化对优化模型与算法实现的理解,提升科研创新能力。
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
【重要提示】本资源设置为0积分下载,若非0积分请勿轻易下载 亲爱的CSDN用户: 首先感谢你点进这个资源页面。我需要提前说明一个重要情况: 本资源原本已设置为“0积分下载”,即作者希望完全免费共享。但CSDN平台有时会根据文件的下载热度、文件大小、用户权限等因素,自动将部分资源的积分调整为非0数值(如1积分、2积分、5积分等)。这是平台系统的自动行为,而非作者本人的设定。 因此,如果你当前看到该资源的下载所需积分不是0(例如显示为1、2、3……),请谨慎决定是否下载。 如果你按照非0积分支付并下载后发现资源内容不符合预期、链接失效,或者实际上该资源本应是免费的,作者无法为此承担积分损失或退还操作。强烈建议:仅在页面显示为0积分时进行下载。 另外,本资源描述中并未直接提供具体的下载地址或外部链接,因为它本身是一个通过CSDN官方上传通道提交的文件/内容包。如果你看到描述中没有外部网盘地址,这是正常的——资源文件应通过CSDN内置的“下载”按钮获取。若因平台积分显示异常导致你支付了积分,请优先联系CSDN客服咨询积分退还政策,作者没有权限修改平台自动设定的积分值。 感谢你的理解与支持。技术分享本应开放,但受限于平台规则,特此提醒如上。祝学习进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ydenergy_殷志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值