Dubbo基于springboot学习笔记

本文参考:【优极限】最透彻的Dubbo教程(dubbo经典之作完整版),阿里分布式框架dubbo零基础实战教学_手把手地啊你读懂底层源码【完整版】_哔哩哔哩_bilibili

1、 互联网架构演变

(1)单一应用架构

把系统中所有的功能、模块耦合在一个应用中的架构方式。程序在一个服务器上。

优点:项目易于管理、部署简单

缺点:测试成本高、可伸缩性差、可靠性差、迭代困难、跨语言程度差、团队协作

(2)RPC架构

远程过程调用。通过网络从远程计算机程序上请求服务,比如Thrift,程序可能分布在两个以上服务器上。

优点:应用直接调用服务,服务之间是隔离的

缺点:服务过多时,管理成本高昂。服务治理,服务注册、发现,服务容错,服务跟踪,服务网关,IP暴露等都是此架构无法避免的问题。

(3)SOA架构

面向服务架构。就是在RPC基础上增加了ESB服务中介,主要提供了一个服务与服务之间的交互。

如上图所示,应用如果调用用户、购物车等服务,则直接跟ESB打交道,ESB再跟用户、购物车、订单等服务打交道。

ESB包含的功能:负载均衡,流量控制,加密处理,服务的监控,监控告急等。

(4)微服务架构

一个大型的复杂软件应用,由一个或多个微服务组成。系统中各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好的完成该任务。对比SOA架构,使用注册中心代替ESB服务总线。注册中心相比服务总线来说,更加轻量级。

如上图所示,用户、购物车、订单等服务均注册到注册中心,假如应用访问订单服务,则从注册中心发现服务,然后再调用订单服务。如果订单需要购物车的服务,则从注册中心发现服务,然后再调用购物车服务。

2、Dubbo服务

dubbo和spring cloud都是微服务的具体实现,dubbo是RPC的框架。

角色:Provider、Consumer、Registry、Monitor

启动时,Provider会把提供的所有服务都放到Registry(注册到注册中心)

消费时,Consumer从Registry中找服务,因为Provider不止一个,Consumer不可能一个个的去找。找到后,订阅想要的服务。消费时,调用Provider的远程服务。所以,找服务从注册中心找,消费时找对应的Provider。

监控中心,监控Dubbo运行过程中的参数。

打个比方,注册中心相当于手机中的通讯录,存的是名字。然后拨打号码时,就是拨打11位的号码,这个就是provider的具体服务。

3、Multicast注册中心

它是dubbo自带的注册中心,只使用demo测试,实际开发需要使用Zookeeper注册中心。

步骤如下:

(1)提供方启动时广播自己的地址

(2)消费方启动时广播订阅请求

(3)提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了unicast=false,则广播给订阅者(提供方和消费方在同一台服务器需要该设置)

(4)消费方收到提供方地址时,连接该地址进行RPC调用。

4、Zookeeper注册中心

(1)zookeeper说明

Zookeeper是一个分布式的应用程序协调服务,它是一个为分布式应用提供一致性服务的软件,包括:配置维护、域名服务、分布式同步、组服务等。它的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

本次我们将Zookeeper作为Dubbo服务的注册中心。

(2)windows版本下载使用

下载地址:官网下Apache Downloads

修改conf/zoo_sample.cfg为zoo.cfg

其中:

dataDir=D:\\programs\\apache-zookeeper-3.8.2\\data

logDir=D:\\programs\\apache-zookeeper-3.8.2\\logs

启动命令:

直接zkServer.cmd,不需要带start参数

Zookeeper使用,参考:

zookeeper:简介及常用命令_zookeeper常用命令_LazyKing-qi的博客-CSDN博客

5、Dubbo使用示例

(1)maven工程说明

dubbo-demo是最外层的主工程。

dubbo-api是接口定义层,定义了服务提供者的服务接口

dubbo-provider是服务提供层,负责将服务注册到注册中心(zk),然后对外提供RPC服务。

dubbo-consumer是服务消费层,负责从注册中心拿到服务列表,然后调用相应的RPC服务。

 (2)dubbo-demo工程

最外层工程。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><modules><module>dubbo-api</module><module>dubbo-provider</module><module>dubbo-consumer</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>dubbo-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>dubbo-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><dubbo.version>2.7.3</dubbo.version></properties><dependencyManagement><dependencies><!-- dubbo依赖 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- zookeeper注册中心引入curator客户端  --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><version>${dubbo.version}</version><type>pom</type></dependency></dependencies></dependencyManagement></project>

(3)dubbo-api工程

接口定义层。

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbo-demo</artifactId><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>dubbo-api</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- dubbo依赖 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper</artifactId><type>pom</type></dependency></dependencies></project>

 

  •          User.java
package com.example.api;import java.io.Serializable;
import lombok.Data;
import lombok.ToString;@Data
@ToString
public class User implements Serializable {private Integer id;private String name;
}
  • UserServiceI.java
package com.example.api;public interface UserServiceI {User selectUserById(Integer id);
}

(4)dubbo-provider工程

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbo-demo</artifactId><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>dubbo-provider</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>com.example</groupId><artifactId>dubbo-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>
  • application.yml
# 防止端口冲突
server:port: 8081dubbo:application:# 应用名称name: providerregistry:# 注册中心地址address: zookeeper://172.25.36.203:2181# 超时时间,单位毫秒timeout: 6000# 元中心地址metadata-report:address: zookeeper://172.25.36.203:2181protocol:# 协议名称name: dubbo# 协议端口port: 20880scan:# 扫描包的位置base-packages: com.example.provider.service
  • 将172.25.36.203替换成本机地址。
  • UserServiceImpl.java
package com.example.provider.service;import com.example.api.User;
import com.example.api.UserServiceI;
import org.apache.dubbo.config.annotation.Service;@Service
public class UserServiceImpl implements UserServiceI {@Overridepublic User selectUserById(Integer id) {User user = new User();user.setId(id);user.setName("张三");return user;}
}

使用dubbo的Service注解。

 

  • ProviderApplication.java
  • package com.example.provider;import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
    public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
    }
    

    (5)dubbo-consumer工程

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>dubbo-demo</artifactId><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>dubbo-consumer</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>com.example</groupId><artifactId>dubbo-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>
  • application.yml
# 防止端口冲突
server:port: 8082dubbo:application:# 应用名称name: consumerregistry:# 注册中心地址address: zookeeper://172.25.36.203:2181

将172.25.36.203替换成本机地址。

 

  • UserInit.java

借用@PostConstruct注解,使得consumer工程启动时调用RPC服务。

package com.example.consumer;import com.example.api.UserServiceI;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class UserInit  {// 会拉去注册中心的服务缓存在本地,即使注册中心宕机,之前的服务也能用,但是新的服务无法发现@Reference(parameters = {"unicast", "false"})  // 同一台机器使用广播private UserServiceI userService;@PostConstructpublic void init(){System.out.println(userService.selectUserById(2));}
}
  • ConsumerApplication.java
package com.example.consumer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}

 (6)工程运行

  • 打开zookeeper服务(windows下直接)

 

  • 运行dubbo-provider工程

  • 运行dubbo-consumer工程

此时查看zk上的信息,

 

6、总结

(1)dubbo使用的架构

最基本的使用需要3个角色

注册中心提供服务注册服务,

provider将服务注册到注册中心,

consumer从注册中心获取服务,并且通过RPC调用provider上的服务

(2)调用RPC服务注解

在需要调用的服务接口上使用@Reference即可直接调用远程服务,它和@Autowired类似均实现了自动注入的过程。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门)

AWS——03篇&#xff08;AWS之Amazon S3&#xff08;云中可扩展存储&#xff09;-01入门&#xff09; 1. 前言2. 关于 Amazon S32.1 介绍2.1.1 简述2.1.2 详细介绍 2.2 Amazon S3 好处和功能2.3 3. 创建S3存储桶3.1 创建存储桶3.2 修改访问权限 4. 简单实用4.1 上传图片文件4.2…

2023年深度学习最新研究成果

LLMs领域 AGI领域 无剑芯片设计平台 三级标题 四级标题 五级标题 六级标题

电脑选购:6000元左右买到性价比超高的笔记本电脑,准大学生的购机指南

目录 一、ThinkBook 14 二、华硕灵耀14 2023 四、宏碁掠夺者擎Neo 五、惠普&#xff08;HP&#xff09;暗影精灵9 六、联想拯救者R7000P 2023 每年高考毕业季&#xff0c;许多即将进入大学的毕业生都会面临新电脑的选择&#xff0c;而对于喜欢玩游戏的同学&#xff0c;一般…

vscode extension 怎么区分dev prod

开发模式注入环境变量 使用vsode 提供的api

实现跨域的几种方式

原理 前后端的分离导致了跨域的产生 跨域的三要素&#xff1a;协议 域名 端口 三者有一个不同即产生跨域 例如&#xff1a; http://www.csdn.com https://www.csdn.com 由于协议不同&#xff0c;端口不同而产生跨域 注&#xff1a;http的默认端口80&#xff0c;https的默…

【云原生】kubernetes在Pod中init容器的作用和使用

目录 Pod 中 init 容器 1 init 容器特点 2 使用 init 容器 Pod 中 init 容器 Init 容器是一种特殊容器&#xff0c;在Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。 1 init 容器特点 init 容器与普通的容器非常像&#xf…

ffmpeg 4.4版本对MP4文件进行AES-CTR加密,和流式加密

对于ffmpeg的AES-CTR加密有两种方式&#xff0c;一个是普通的整个视频做加密&#xff0c;另一个是对视频做切片处理&#xff0c;然后进行加密。 一、对于普通的加密方式 直接使用下面的命令就行 ffmpeg -i animal.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes…

本地 shell无法连接centos 7 ?

1、首先检查是否安装ssh服务&#xff1b; yum list installed | grep openssh-server# 没有安装尝试安装下 yum install openssh-server 2、检查ssh服务是否开启 systemctl status sshd.service# 未开启&#xff0c;开启下 systemctl start sshd.service # 将sshd 服务添…

STM32F103——GPIO八种工作模式

目录 1、GPIO 基本结构分析 2、GPIO 八种工作模式 2.1 输入浮空 2.2 输入上拉 2.3 输入下拉 2.4 模拟功能 2.5 开漏输出 2.6 开漏式复用功能 2.7 推挽输出 2.8 推挽式复用功能 3、GPIO 八种工作模式特点及应用 1、GPIO 基本结构分析 STM32F103的 GPIO 工作有八种…

24届近5年南京理工大学自动化考研院校分析

今天学长给大家带来的是南京理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、南京理工大学 ​ 学校简介 南京理工大学是隶属于工业和信息化部的全国重点大学&#xff0c;学校由创建于1953年的新中国军工科技最高学府——中国人民解放军军事工程学院&#xf…

Android OkHttp源码分析--分发器

OkHttp是当下Android使用最频繁的网络请求框架&#xff0c;由Square公司开源。Google在Android4.4以后开始将源码中 的HttpURLConnection底层实现替换为OKHttp&#xff0c;同时现在流行的Retrofit框架底层同样是使用OKHttp的。 OKHttp优点: 1、支持Http1、Http2、Quic以及Web…

华秋亮相2023世界汽车制造技术暨智能装备博览会,推动汽车产业快速发展

洞悉全球汽车产业格局&#xff0c;前瞻业界未来趋势。2023年7月27日-30日&#xff0c;时隔三年&#xff0c;重聚武汉国际博览中心&#xff0c;2023世界汽车制造技术暨智能装备博览会盛大开幕。深耕汽车行业多年的世界汽车制造技术暨智能装备博览会&#xff0c;掀起行业热点新高…

boost beast http server 测试

boost beast http client boost http server boost beast 是一个非常好用的库&#xff0c;带上boost的协程&#xff0c;好很多东西是比较好用的&#xff0c;以下程序使用四个线程开启协程处理进入http协议处理。协议支持http get 和 http post #include <boost/beast/cor…

比较研发项目管理系统:哪个更适合您的需求?

项目管理系统对于保持项目进度、提高效率和确保质量至关重要。然而&#xff0c;市场上众多的研发项目管理系统让许多团队陷入选择困难。本文将对几个主流的研发项目管理系统进行深入分析&#xff0c;以帮助您找到最适合您团队的解决方案。 “哪个研发项目管理系统好用好&#x…

【Linux】常用的文本处理命令详解 + 实例 [⭐实操常用,建议收藏!!⭐]

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

【iPhone】手机还有容量,拍视频却提示 iPhone 储存空间已满

文章目录 前言解决方案 结语 前言 今天在用 iPhone 录像的时候突然提醒我 iPhone储存空间已满 你没有足够的储存空间来录制视频” 可我明明还有 20G 的容量 我非常疑惑&#xff0c;因为我之前还剩1个G都能录像&#xff0c;现在20G反而不行了&#xff0c;于是重启了手机&#…

怎么在JMeter中的实现关联

我们一直用的phpwind这个系统做为演示系统, 如果没有配置好的同学, 请快速配置之后接着往下看哦. phpwind发贴时由于随着登陆用户的改变, verifycode是动态变化的, 因此需要用到关联. LoadRunner的关联函数是reg_save_param, Jmeter的关联则是利用后置处理器来完成. 在需要查…

在线高精地图生成算法调研

1.HDMapNet 整体的网络架构如图所示&#xff0c;最终的Decoder输出三个分支&#xff0c;一个语义分割&#xff0c;一个embedding嵌入分支&#xff0c;一个方向预测。然后通过后处理将这些信息处理成向量化的道路表示。 img2bev的方式之前有IPM&#xff0c;通过假设地面的高度都…

vue新学习 05vue的创建运行原理(vue的生命周期)

01.vue的创建过程 原理解释&#xff1a; 1.定义&#xff1a; 1.Vue的生命周期是指Vue实例从创建到销毁的整个过程中经历的一系列阶段&#xff0c;Vue在关键时刻帮我们调用的一些特殊名称的函数。 2.生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求…

Linux线程同步(条件变量)

文章目录 前言一、条件变量概念二、条件变量相关的函数三、条件变量模拟生产者消费者模型四、使用条件变量的好处总结 前言 本篇文章来讲解一下条件变量的使用。 一、条件变量概念 条件变量&#xff08;Condition Variable&#xff09;是并发编程中一种线程同步机制&#xf…