【SpringBoot集成Nacos+Dubbo】企业级项目集成微服务组件,实现RPC远程调用

news2024/11/18 17:43:37

文章目录

  • 一、需求
    • 环境/版本
  • 二、须知
    • 2.1、什么是RPC?
    • 2.2、什么是Dubbo?
    • 2.3、什么是Nacos?
  • 三、普通的SpringBoot项目集成微服务组件方案(笔者给出两种)
    • 方案一(推荐)
      • 1、导入maven依赖(消费者和提供者都是一样的)
      • 2、配置application.yml文件(消费者)
      • 配置application.yml文件(提供者)
      • 3、统一接口类(注意看包名,因为消费者和提供者的包名要一致)
      • 4、提供者的接口(接口上添加@DubboService注解)
      • 5、消费者调用接口
      • 6、调用成功
    • **温馨提示:**
    • 方案二
    • interface模块
  • 祝您开发愉快!

一、需求

在日益增长的业务需求中,一开始使用的是每个项目独立开发,虽然都是前后端分离的项目,但是每一个项目之间互不干扰。后来,因为某种需求,需要几个项目的数据相互交错获取。

最开始的想法就是集成多个数据源。

举例

有A、B、C三个项目,对应着数据库DBa、DBb、DBc、,现在A项目需要同时操作DBa、DBc数据库。

这时,最理想就是调用RPC框架了。

环境/版本

IDEA2022.3.2
java11
SpringBoot 2.7.12-SNAPSHOT
Nacos 2.2.2

注意:如果使用SpringBoot3.x以上的要使用jdk17以上的,否则会启动报错。

二、须知

2.1、什么是RPC?

RPC全称为Remote Procedure Call,翻译为远程过程调用。它是一种计算机网络通信协议,用于在不同的进程或计算机之间进行通信,让它们像调用本地方法一样调用远程方法。

假设你有一个应用程序,它需要调用另外一个计算机上的函数或方法,通常情况下,你需要通过网络编程,手动发送请求和接收响应。而RPC则可以让你像调用本地函数一样,直接调用远程函数,简化了网络编程的复杂度。

具体来说,RPC通信过程中,调用方会像调用本地方法一样,发送请求到远程服务器,请求中包含了要调用的方法名和参数列表。远程服务器接收到请求后,会解析请求,调用对应的方法,并将执行结果返回给调用方。调用方收到响应后,就可以像处理本地函数一样,对结果进行处理。

通俗来说,RPC就像是你在打电话时,向远程的对方说出你需要做的事情,对方完成后告诉你结果。这样,你就不需要亲自去完成任务了,这个过程中,你只需要关心需要完成的任务和结果,不需要关心具体的实现方式。

RPC在分布式系统中的应用非常广泛,比如微服务架构中的服务调用,Hadoop中的远程过程调用等。它可以让分布式系统更加简单、灵活和可扩展。

2.2、什么是Dubbo?

背景
Dubbo的诞生背景可以追溯到2011年,当时阿里巴巴内部的分布式架构和服务治理已经比较成熟,但面对日益增长的业务规模和复杂性,分布式服务之间的调用和管理成为了一个巨大的挑战。在这样的背景下,Dubbo应运而生。

Dubbo最初由阿里巴巴公司的工程师提出并开发,旨在为阿里巴巴内部的分布式系统提供一种高性能、可靠、可扩展的RPC框架,帮助阿里巴巴更好地构建分布式服务架构和实现服务治理。

后来,随着Dubbo逐渐成熟并在阿里巴巴内部广泛应用,阿里巴巴决定将其开源,于2011年底正式发布第一个版本,随后在2012年和2015年分别发布了2.0和2.5版本,以及2019年发布的2.7版本。Dubbo的开源以及不断更新迭代,吸引了越来越多的用户和开发者参与,逐渐成为了Java生态系统中最受欢迎的RPC框架之一。

如今,Dubbo已经广泛应用于阿里巴巴、华为、网易等企业的分布式系统中,并得到了国内外各大互联网公司和社区的广泛认可和支持。

2018年11月,Apache Dubbo 成为了 Apache 的顶级项目,这意味着 Dubbo 已经发展成为一个非常成熟、高质量、社区活跃的开源项目。Dubbo 的加入也进一步加强了 Apache 在分布式系统领域的地位,为分布式系统的发展和推广做出了巨大贡献。

作用

Dubbo主要包括三个核心模块:

Provider(服务提供者):暴露服务的应用,提供服务的方法。

Consumer(服务消费者):调用远程服务的应用,消费服务的方法。

Registry(服务注册中心):服务注册与发现的管理中心。

Dubbo框架的工作流程如下:

1、服务提供者启动,向注册中心注册自己提供的服务。

2、服务消费者启动,向注册中心订阅自己需要的服务。

3、注册中心返回可用的服务列表给服务消费者。

4、服务消费者调用远程服务。

5、远程服务提供者响应请求,返回结果给服务消费者。

6、服务消费者收到响应,完成调用。

2.3、什么是Nacos?

Nacos是一种基于云原生理念构建的动态服务发现、配置管理和服务治理平台,由阿里巴巴开源团队于2018年开源。它主要解决了分布式系统中服务注册、发现、配置管理和DNS服务等问题。

Nacos提供了以下核心功能:

1、服务注册和发现:Nacos可以帮助服务提供者自动注册服务并向Nacos Server汇报服务实例的健康状况,服务消费者可以通过Nacos查询可用服务实例。

2、配置管理:Nacos提供了集中式的配置管理功能,支持动态配置、版本管理、灰度发布、监听等功能,可以方便地管理分布式系统中的配置信息。

3、服务路由和负载均衡:Nacos支持服务提供者和消费者之间的流量管理和路由规则的动态更新,以及多种负载均衡策略。

4、DNS服务:Nacos支持提供DNS服务,可以在无需其他服务发现组件的情况下使用DNS方式进行服务发现。


温馨提示:Dubbo官网上默认的注册中心是Zookeeper,本文注册中心使用的是Nacos。

三、普通的SpringBoot项目集成微服务组件方案(笔者给出两种)

方案一(推荐)

像笔者这种的项目(看 需求),就是因为发展而演变成要使用微服务组件,而不是一开始就选好微服务架构的。就看这个部分就好了。否则请看方案二。

1、导入maven依赖(消费者和提供者都是一样的)

		<!--nacos-->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.2.0-beta.6</version>
        </dependency>

启动类加上注解@EnableDubbo
在这里插入图片描述

2、配置application.yml文件(消费者)

server:
  port: 8102
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
dubbo:
  consumer:
    check: false
  application:
    name: dubbo-springboot-demo-consumer
  protocol:
    name: dubbo
    # 设置为-1表示自动配置可用端口
    port: -1
  registry:
    address: nacos://127.0.0.1:8848

配置application.yml文件(提供者)

server:
  port: 8105
spring:
  cloud:
    nacos:
      server-addr: localhost:8848
dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://127.0.0.1:8848
    

3、统一接口类(注意看包名,因为消费者和提供者的包名要一致)

package com.example.astar.component;

public interface DemoService {

    String sayHello(String name);
}

4、提供者的接口(接口上添加@DubboService注解)

package com.example.astar.service.Impl;

import com.example.astar.component.DemoService;// 注意包名
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class AstarServiceImpl implements DemoService {

    private static int flag = 0;

    @Override
    public String sayHello(String name) {
        String message = "你好啊! " + name + " =========》 " + flag++;
        return message;
    }
}

5、消费者调用接口

package com.example.astar.controller;

import com.example.astar.component.DemoService;//注意包名
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @DubboReference
    private DemoService demoService;

    @GetMapping("/1")
    public String hello() {

        String result = demoService.sayHello("Astar");
        String re = "Receive result ======> " + result;
        System.out.println(re);
        return re;
    }
}

6、调用成功

启动这两个项目(消费者和提供者),因为消费者配置了check: false,所以先启动哪一个项目都是可以的。消费者的端口是8102,我们访问一下

http://localhost:8102/user/1

看到如下
在这里插入图片描述

温馨提示:

DemoService的全限定包名是import com.example.astar.component.DemoService,也就是说消费者和提供者之间的桥梁就是来自同一个接口,我们需要在项目中分别创建一模一样的接口才可以,实现类不用管。如果提供者和消费者的接口的包名不一样就会导致调用失败。

说人话:就是两个项目都不在一个文件下,怎么可能用同一个类?这里只要这个类本身、包名一样就可以了,Dubbo就会认为是一样的。

方案二

此方案是在一开始就决定用微服务这个框架的项目来说的,通常我们会分为类似以下几个子模块:

在这里插入图片描述

interface模块

在这里插入图片描述
步骤我就懒得说了,大致和方案一一样,不同的地方是公共模块interface的导入:
在消费者和提供者上添加子模块即可:

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-samples-spring-boot-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

温馨提示:打包的时候会把子模块的引入部分一起打包,不用担心,正常使用即可,其余部分不变。

END


茫茫人海路漫漫,
潜心修炼方有颜。
踏实走好每一步,
静待花开见真章。

祝您开发愉快!

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

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

相关文章

rocketmq4.9.4 docker安装

rocketmq4.9.4 给对应的路径赋权 chmod -R 777 文件名 不然启动可能报错后者看不到容器日志 systemctl status firewalld 查看防火墙状态 https://www.jianshu.com/p/0c1c3c679ef8 Docker部署RocketMQ&#xff08;4.9.4&#xff09;官方镜像和控制台windows、mac、linux全平…

20230508在Ubuntu22.04下使用python3批量转换DOCX文档为TXT

20230508在Ubuntu22.04下使用python3批量转换DOCX文档为TXT 2023/5/8 16:27 在WIN10下请参考本文&#xff0c;在Ubuntu22.04下需要不通的插件&#xff01; https://blog.csdn.net/weixin_46255747/article/details/129961988 python实现批量docx转txt docx文档放到input目录中。…

Origin如何绘制二维图形?

文章目录 0.引言1.函数绘图2.线图3.符号图4.点线符号图5.柱状/条形/饼图6.多面板/多轴图7.面积图8.专业图9.主题绘图 0.引言 因科研等多场景需要绘制专业的图表&#xff0c;笔者对Origin进行了学习&#xff0c;本文通过《Origin 2022科学绘图与数据》及其配套素材结合网上相关资…

stable diffusion模型讲解

AI模型最新展现出的图像生成能力远远超出人们的预期&#xff0c;直接根据文字描述就能创造出具有惊人视觉效果的图像&#xff0c;其背后的运行机制显得十分神秘与神奇&#xff0c;但确实影响了人类创造艺术的方式。 AI模型最新展现出的图像生成能力远远超出人们的预期&#xf…

PyCharm使用 Anaconda安装TensorFlow

1.安装python全家桶Anaconda 1.1 官网 https://www.anaconda.com/ 进入官网后如下图所示&#xff0c;点击Download即可开始下载&#xff08;若无法下载&#xff0c;请转至清华源下载&#xff09; 1.2 清华 https://repo.anaconda.com/archive/ 2.Anaconda安装 点击Next -…

libssh2交叉编译和测试

目录 官方地址&#xff1a;https://www.libssh2.org/ 1.源码下载 2.交叉编译 3.测试代码 官方地址&#xff1a;https://www.libssh2.org/ 正常来说&#xff0c;看官网说明和例子都能正常编译和使用&#xff0c;想偷个懒的就参考以下步骤。 1.源码下载 我当前看到的版本是li…

【二分查找】求解单调方程的解 C++实现

目录 1 问题2 想法3 二分查找4 实现4-1 伪代码说明4-2 C11 1 问题 有函数 f ( x ) a x ( a > 1 ) f(x)a^x(a>1) f(x)ax(a>1) ,单调递增&#xff0c;现在给一个正整数 N N N&#xff0c;求使得 f ( x ) N f(x)N f(x)N的正整数解 x x x。    2 想法 x l o g a N xl…

Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46

一、前言 在前面我们通过以下章节对ShardingSphere的AutoTable 有了基础的了解&#xff1a; Spring Boot集成ShardingSphere分片利器 AutoTable &#xff08;一&#xff09;—— 简单体验 | Spring Cloud 45 书接上回&#xff0c;本章进行对AutoTable 支持的自动分片算法进行…

【JAVAEE】使用wait()方法和notify()方法解决线程不安全中的有序性问题

目录 1.wait()方法 2.notify()方法 3.notifyAll()方法 4.wait()和sleep()方法的区别 由于线程之间是抢占式执行的&#xff0c;因此线程之间执行的先后顺序难以预知。但是在实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序。 完成这个协调工作&#xff0c;主…

QML之HTML5画布移植(Porting from HTML5 Canvas)

移植一个HTML5画布图像到QML画布非常简单。在成百上千的例子中&#xff0c;我们选择了一个来移植。 螺旋图形&#xff08;Spiro Graph&#xff09; 我们使用一个来自Mozila项目的螺旋图形例子来作为我们的基础示例。原始的HTML5代码被作为画布教程发布。 下面是我们需要修改…

OpenGL(十)——基础光照

目录 一、前言 二、环境光照 三、漫反射光照 3.1 法向量 3.2顶点着色器 3.3 VAO属性解释 3.4 片段着色器 四、镜面光照 4.1 片段着色器 一、前言 现实世界光照十分复杂&#xff0c;冯氏光照模型是对现实世界光照的抽象&#xff0c;主要由3部分组成&#xff0c;环境amb…

【JAVAEE】使用synchronized关键字和volatile关键字解决线程安全问题中的原子性,内存可见性和有序性问题

目录 1.synchronized关键字---监视器锁monitor lock 1.1synchronized的特性 互斥 刷新内存 可重入 1.3synchronized使用注意事项 2.volatile关键字 2.1volatile保证内存可见性问题 MESI缓存一致性协议 内存屏障 2.2volatile解决有序性问题 3.总结synchronized和vola…

ELK -- kibana 用nginx代理后无法访问

背景&#xff1a; 本地搭建好elk后&#xff0c;一切正常&#xff0c;后面改成用nginx代理kibana的5601端口&#xff0c;发现代理后无法正常访问&#xff08;未代理的地址可正常访问&#xff09;&#xff0c;花了很多时间去查问题&#xff0c;报错基本都是http://ip:port/spaces…

Leetcode刷题之复制带随机指针的链表

生命不是安排&#xff0c;而是追求&#xff0c;人生的意义也许永远没有答案&#xff0c;但也要尽情感受这种没有答案的人生。 --弗吉尼亚. 伍尔芙 目录 前言&#xff1a; &#x1f338;一.复制带随机指针的链表 &#x1f305;1.复制结点链接到原本链表每一个结点的…

24个强大的HTML属性,每个资深Web工程师都应该掌握!

HTML 属性非常多&#xff0c;除了基本的一些属性外&#xff0c;还有很多很有用的功能性特别强大的属性&#xff1b; 本文将介绍24个强大的HTML属性&#xff0c;这些属性可以让你的网站更加动态和交互&#xff0c;让用户感到更加舒适和愉悦。 让我们一起来探索这24个强大的HTML…

进程优先级+环境变量++地址空间+虚拟地址空间

索引 一.进程优先级二.环境变量1.通过代码如何获取环境1.通过第三个命令行参数获得2.根据第三方变量environ获取3.通过系统调用获取环境变量 2.验证环境变量可以被子进程继承下去 三.验证地址空间1.验证程序地址空间2.证明地址空间不是物理地址 四.虚拟地址空间虚拟地址空间存在…

BI财务智能分析,让企业管理更上一层楼

智能财务建设既可以看作是财务管理工作在经济社会数字化转型的全面开启&#xff0c;也可以看作是财务职能在以数字化技术为支撑&#xff0c;形成对内提升单位管理水平和风险管控能力、对外服务财政管理和宏观经济治理的会计职能拓展&#xff0c;究其本质则是在财务数字化转型升…

简单介绍之隔离级别与分布式事务

一&#xff0c;分布式系统与环境问题 概念 系统可以笼统分为集中式系统和分布式系统。 集中式系统就是由一台或多台主计算机组成中心节点&#xff0c;系统所有功能均由其集中处理。 分布式系统是硬件和软件组件分布不同的网络计算机上&#xff0c;彼此之间仅仅通过消息传递进…

植被参数光学遥感反演方法(Python)及遥感与生态模型数据同化算法技术应用

传统的地面实测方法能够得到比较准确的植被参数&#xff08;如叶面积指数、覆盖度、生物量、叶绿素、干物质、叶片含水量、FPAR等&#xff09;&#xff0c;但其获取信息有限&#xff0c;难以满足大范围提取植被参数的需求&#xff0c;尤其在异质地表区域。遥感技术的发展为植被…

C++学习day--07 字符串

1、黑客攻击系统-用户输入的优化 第 1 节 项目需求 1. 用户登录时&#xff0c;用户可能输入很长的用户名。 2. 使用 char 类型和 int 类型&#xff0c;表示用户名和密码&#xff0c;不安全。 第 2 节 项目实现 #include <iostream> #include <Windows.h> …