Dubbo基于springboot学习笔记

news2024/11/24 22:50:47

本文参考:【优极限】最透彻的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: 8081

dubbo:
  application:
    # 应用名称
    name: provider

  registry:
    # 注册中心地址
    address: zookeeper://172.25.36.203:2181
    # 超时时间,单位毫秒
    timeout: 6000
  # 元中心地址
  metadata-report:
    address: zookeeper://172.25.36.203:2181
  protocol:
    # 协议名称
    name: dubbo
    # 协议端口
    port: 20880

  scan:
    # 扫描包的位置
    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 {

    @Override
    public 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: 8082

dubbo:
  application:
    # 应用名称
    name: consumer
  registry:
    # 注册中心地址
    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;

    @PostConstruct
    public 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、公司开发dubbo说明

比如某个团队开发了用户中心服务,会把服务的接口(类似于dubbo-api工程)打包成jar包,放到公司的maven库中。

另一个团队开发用到用户中心服务,则在pom文件中依赖该工程,配置注册中心的地址,然后通过@Reference进行自动注入,开启RPC远程调用。

7、总结

(1)dubbo使用的架构

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

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

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

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

(2)调用RPC服务注解

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 8 非编译方式 yum 安装 FFmpeg

FFmpeg 是一套免费的开源计算机程序&#xff0c;它提供了录制、转换以及流化音视频的完整解决方案。FFmpeg 在 Linux 平台下开发&#xff0c;但它同样也可以在其它操作系统环境中编译运行&#xff0c;包括 Windows、Mac OS X 等。大多数文章都是说的ubuntu上如何安装&#xff0…

测试架构师如何落地性能测试方案(一)

背景描述&#xff1a; 最近刚接手一个新项目&#xff0c;在最开始的时候要求对这个项目做性能测试&#xff0c;产品经理也给不出性能需求&#xff0c;只因为这个项目是电商项目&#xff0c;可能会有高并发&#xff0c;秒杀的场景&#xff0c;所以产品经理要求我们对这个项目必…

亿发创新中医药信息化解决方案,自动化煎煮+调剂,打造智能中药房

传统中医药行业逐步复兴&#xff0c;同时互联网科技和人工智能等信息科技助力中医药行业逐步实现数字化转型。利用互联网、物联网、大数据等科技&#xff0c;实现现代科学与传统中医药的结合&#xff0c;提供智能配方颗粒调配系统、中药自动化调剂系统、中药煎配智能管理系统、…

前后端分离------后端创建笔记(05)用户列表查询接口(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

2023年国赛数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

类对象数组抽取对象指定属性重新组成新的类对象数组

原本后台返回数据是这样&#xff1a; 我只想要每条数据对象的jianyanneirong和jianyannneirong1两个属性的信息&#xff1a; 1.使用map方法 //contentList是原本类对象数组let a contentList.map((val)>{return {jianyanneirong: val.jianyanneirong,jianyanneirong1: val.…

【EI/SCOPUS检索】第三届计算机视觉、应用与算法国际学术会议(CVAA 2023)

第三届计算机视觉、应用与算法国际学术会议&#xff08;CVAA 2023) The 3rd International Conference on Computer Vision, Application and Algorithm 2023年第三届计算机视觉、应用与算法国际学术会议&#xff08;CVAA 2023&#xff09;主要围绕计算机视觉、计算机应用、计…

展会邀请 | 虹科诚邀您参加8月16日深圳视觉系统设计技术会议

VisionCon视觉系统设计技术会议 将于8月16日在深圳深铁皇冠假日酒店隆重举行&#xff01; 人力成本的提高、国际关系的不确定性等众多因素&#xff0c;都在促使中国制造业采用更先进的自动化及智能化技术&#xff0c;同时也在加速核心技术的国产化。作为智能制造不可或缺的关…

机器学习笔记 - 在 Vision Transformer 中可视化注意力

2022 年,视觉变换器(ViT) 成为卷积神经网络(CNN) 的有力竞争对手,后者现已成为计算机视觉领域的最先进技术,并广泛应用于许多图像识别应用中。在计算效率和准确性方面,ViT 模型超过了当前最先进的 (CNN) 几乎四倍。 一、视觉转换器 (ViT) 如何工作? 视觉转换器模型的性能…

VictoriaMetrics部署及vmalert集成钉钉告警

1、部署VictoriaMetrics cd /usr/local wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.65.0/victoria-metrics-amd64-v1.65.0.tar.gz mkdir victoria-metrics && tar -xvzf victoria-metrics-amd64-v1.65.0.tar.gz && \ mv …

python_PyQt5运行股票研究python方法工具V1.1_增加表格展示控件

承接 【python_PyQt5运行股票研究python方法工具V1.0】 地址 python_PyQt5运行股票研究python方法工具V1.0_程序猿与金融与科技的博客-CSDN博客 目录 结果展示&#xff1a; 代码&#xff1a; 示例py文件代码&#xff08;计算股票日横截面数据&#xff09; 参数json文件 表…

Java SPI机制

Java SPI机制 java的spi就是一种服务提供发现机制&#xff0c;在一方制定好接口规范后&#xff0c;通过spi的机制可以它的子实现类进行服务发现&#xff0c;以及加载它的子实现类&#xff0c;通过这种机制&#xff0c;让我们在引入第三方库时&#xff0c;不用讲第三方库中的类…

Dubbo 核心概念和架构

以上是 Dubbo 的工作原理图&#xff0c;从抽象架构上分为两层&#xff1a;服务治理抽象控制面 和 Dubbo 数据面 。 服务治理控制面。服务治理控制面不是特指如注册中心类的单个具体组件&#xff0c;而是对 Dubbo 治理体系的抽象表达。控制面包含协调服务发现的注册中心、流量管…

如何批量上传截图

转载&#xff1a;如何批量上传截图 目前用的截图是把iphone上的宣传图改大了分辨率而已&#xff0c;并不是真正ipad上的效果&#xff0c;举例&#xff0c;假设目前在做一个项目是 uniapp开发的&#xff0c;可以通过浏览器运行&#xff0c;运行的分辨率改成ipad截图就可以了&a…

ATRank: An Attention-Based User Behavior Modeling Framework for Recommendation

Abstract 异构用户行为 我们的模型考虑了【异构用户行为】,我们将所有类型的行为投射到多个潜在的语义空间中,在这些语义空间中,行为之间可以通过自关注产生影响。 异构用户行为(Heterogeneous User Behavior)指的是在一个系统、平台或社交网络中,不同用户在行为模式、兴…

利用windows服务器自带的IIS搭建网站并发布公网访问【内网穿透】

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如…

前端CSS居中布局

在前端开发中&#xff0c;实现居中布局是一项必备技能&#xff0c;无论是垂直居中、水平居中&#xff0c;还是同时实现垂直和水平居中。这不仅对于构建响应式网页至关重要&#xff0c;还在设计弹窗、创建导航菜单和设计登录界面时都能派上用场。精通居中布局将为你的前端技能提…

C++初阶之模板深化讲解

模板深化讲解 非类型模板模板的特化1.函数模板特化2.类模板特化 模板分离编译1.什么是分离编译2.模板的分离编译 模板总结 非类型模板 非类型模板&#xff08;Non-Type Template&#xff09;是 C 中的一种模板形式&#xff0c;它允许你在模板中传递除了类型以外的其他值&#x…

BLE 学习小结

GAP 和 GATT https://www.youtube.com/watch?vyKJtnkEjPFI GAP: Generic Access Profile. 定义的是Scanner跟Advertiser的角色。负责连接相关的服务 (设备的搜寻&#xff0c;用来建立连接&#xff0c;连接的管理&#xff0c;等)。 GATT: Generic Attribute Profile. 定义的是…

Java实现DTLS之技术背景原理(一)

文章目录 前言一、DTLS是什么&#xff1f;二、RFC6347标准定义DTLS1.中文翻译 总结感谢 前言 需求&#xff1a;升级服务侧SDK&#xff0c;实现与灯控器之间DTLS加密通信&#xff0c;代替SM4国密。目前通信是采用UDP协议并实现SM4国密加密&#xff0c;为了提升产品竞争力需要实…