Apache Dubbo与Nacos整合过程

Dubbo服务发现
Dubbo 提供的是一种 Client-Based 的服务发现机制,依赖第三方注册中心组件来协调服务发现过程,支持常用的注册中心如 Nacos、Consul、Zookeeper 等。
以下是 Dubbo 服务发现机制的基本工作原理图:
在这里插入图片描述
服务发现包含提供者、消费者和注册中心三个参与角色,其中,Dubbo 提供者实例注册 URL 地址到注册中心,注册中心负责对数据进行聚合,Dubbo 消费者从注册中心读取地址列表并订阅变更,每当地址列表发生变化,注册中心将最新的列表通知到所有订阅的消费者实例。
在这里插入图片描述
Dubbo与Nacos整合
前置条件

● 当Dubbo使用3.0.0及以上版本时,需要使用Nacos 2.0.0及以上版本。
● 注意:目前最新版本Dubbo 3.1.8不支持Spring Boot 3,因此开发环境必须基于Spring Boot 2.x + JDK17/8,对应的Spring Cloud与Spring Cloud Alibaba也要调整为2021.x

<properties>
    <java.version>17</java.version>
    <spring-cloud.version>2021.0.3</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
</properties>

生产者服务provider-service-dubbo

<dependency>
  <groupId>org.apache.dubbo</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId>
  <version>3.1.8</version>
</dependency>

配置文件application.yaml

server:
  port: 8001
spring:
  application:
    name: provider-service
  cloud:
    nacos:
      server-addr: 192.168.31.231:8848
      username: nacos
      password: nacos
dubbo:
  application:
    name: provider-service-dubbo
  registry:
    address: nacos://192.168.31.231:8848
    username: nacos
    password: nacos
  protocol:
    name: dubbo
    port: 20880
logging:
  level:
    root: info

应用入口增加两个注解,启用Dubbo
● @EnableDubbo
@EnableDubbo是一个注解,用于启用Dubbo的自动配置,将Dubbo服务注册到注册中心。它可以放置在Spring Boot应用程序的主类上。通过使用@EnableDubbo注解,可以避免手动配置Dubbo服务的繁琐工作,只需添加相应的注解和配置参数即可自动配置Dubbo。
● @DubboComponentScan
@DubboComponentScan是一个注解,用于扫描Dubbo服务的实现类。它可以放置在Spring Boot应用程序的主类上。通过使用@DubboComponentScan注解,可以自动扫描指定包及其子包中的Dubbo服务实现类,将它们注册为Dubbo服务。这样,Dubbo框架就能够自动发现和管理Dubbo服务,方便使用和维护。

package com.itlaoqi.providerservicedubbo;

import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
@DubboComponentScan
public class ProviderServiceDubboApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderServiceDubboApplication.class, args);
    }

}

实现业务接口
接口

package com.itlaoqi.providerservicedubbo.dubbo;

import com.itlaoqi.providerservicedubbo.entity.User;
import org.springframework.http.ResponseEntity;

import java.util.List;
import java.util.Map;

public interface ProviderService {
    public Map hello();

    public User createUser(String uid, String username, String password, String nickname);

    public ResponseEntity<List<User>> query(int page, int rows);
}

实现
@DubboService是一个注解,用于标注Dubbo服务的实现类。在Dubbo框架中,服务提供者需要将服务注册到注册中心,以便服务消费者能够发现和调用服务。@DubboService注解可以将标注的服务实现类注册为Dubbo服务,使其能够被Dubbo框架自动管理和发布。

package com.itlaoqi.providerservicedubbo.dubbo.impl;

import com.itlaoqi.providerservicedubbo.dubbo.ProviderService;
import com.itlaoqi.providerservicedubbo.dto.User;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@DubboService
public class ProviderServiceImpl implements ProviderService {
    public Map hello() {
        Map result = new HashMap();
        result.put("code", "0");
        result.put("message", "hello world~");
        return result;
    }

    public User createUser(String uid, String username , String password , String nickname) {
        return new User(uid,username,password,nickname);
    }

    public ResponseEntity<List<User>> query(int page, int rows) {
        List<User> users = new ArrayList<>();
        for (int i = rows * (page - 1); i < rows * page; i++) {
            String uid = "uid:" + i;
            String username = "username-" + i;
            String password = "password-" + i;
            String nickname = "nickname-" + i;
            User user = new User(uid, username, password, nickname);
            users.add(user);
        }
        return new ResponseEntity<>(users, HttpStatus.OK);
    }
}

注意,需要依赖的DTO对象,必须实现序列化接口Serializable

package com.itlaoqi.providerservicedubbo.dto;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;

@Data
@AllArgsConstructor
public class User implements Serializable {

    private String uid;
    private String username;
    private String password;
    private String nickname;
}

启动时要万分注意,JDK17与Dubbo 3.1.8有兼容问题,需要在启动项增加,官方说3.2版本会修正这个问题

--add-opens java.base/java.lang=ALL-UNNAMED

在这里插入图片描述
消费者服务consumer-service-dubbo

  <dependency>
      <groupId>org.apache.dubbo</groupId>
      <artifactId>dubbo-spring-boot-starter</artifactId>
      <version>3.1.8</version>
  </dependency>

配置消费者接口

server:
  port: 8002
spring:
  application:
    name: consumer-service
  cloud:
    nacos:
      server-addr: 192.168.31.231:8848
      username: nacos
      password: nacos
dubbo:
  application:
    name: consumer-service-dubbo
  registry:
    address: nacos://192.168.31.231:8848
    username: nacos
    password: nacos
logging:
  level:
    root: info

启用Dubbo

package com.itlaoqi.consumerservicedubbo;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ConsumerServiceDubboApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerServiceDubboApplication.class, args);
    }

}

将服务端接口与依赖的类加载到本地
● 复制源代码
● Maven依赖
注意包名是com.itlaoqi.providerservicedubbo.dubbo

package com.itlaoqi.providerservicedubbo.dubbo;

import com.itlaoqi.providerservicedubbo.dto.User;

import java.util.List;
import java.util.Map;

public interface ProviderService {
    public Map hello();

    public User createUser(String uid, String username, String password, String nickname);

    public List<User> query(int page, int rows);
}

package com.itlaoqi.providerservicedubbo.dto;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;

@Data
@AllArgsConstructor
public class User implements Serializable {

    private String uid;
    private String username;
    private String password;
    private String nickname;
}

依赖并远程访问
● @DubboReference
通过在 Spring 容器中标记 @DubboReference 注解,可以让 Dubbo 自动为该属性注入一个代理对象,该对象可以调用远程 Dubbo 服务的方法,使得在使用 Dubbo 服务时可以像调用本地服务一样方便。

package com.itlaoqi.consumerservicedubbo.controller;

import com.itlaoqi.providerservicedubbo.dubbo.ProviderService;
import com.itlaoqi.providerservicedubbo.dto.User;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class ConsumerController {
    @DubboReference
    private ProviderService providerService;
    @GetMapping("/list")
    public List<User> list(int page, int rows) {
        return providerService.query(page, rows);
    }
}

执行结果

###
GET http://localhost:8002/list?page=2&rows=10

[
  {
    "uid": "uid:10",
    "username": "username-10",
    "password": "password-10",
    "nickname": "nickname-10"
  },
  {
    "uid": "uid:11",
    "username": "username-11",
    "password": "password-11",
    "nickname": "nickname-11"
  },
  {
    "uid": "uid:12",
    "username": "username-12",
    "password": "password-12",
    "nickname": "nickname-12"
  },
  {
    "uid": "uid:13",
    "username": "username-13",
    "password": "password-13",
    "nickname": "nickname-13"
  },
  {
    "uid": "uid:14",
    "username": "username-14",
    "password": "password-14",
    "nickname": "nickname-14"
  },
  {
    "uid": "uid:15",
    "username": "username-15",
    "password": "password-15",
    "nickname": "nickname-15"
  },
  {
    "uid": "uid:16",
    "username": "username-16",
    "password": "password-16",
    "nickname": "nickname-16"
  },
  {
    "uid": "uid:17",
    "username": "username-17",
    "password": "password-17",
    "nickname": "nickname-17"
  },
  {
    "uid": "uid:18",
    "username": "username-18",
    "password": "password-18",
    "nickname": "nickname-18"
  },
  {
    "uid": "uid:19",
    "username": "username-19",
    "password": "password-19",
    "nickname": "nickname-19"
  }
]

启动时要万分注意,JDK17与Dubbo 3.1.8有兼容问题,需要在启动项增加,官方说3.2版本会修正这个问题

--add-opens java.base/java.lang=ALL-UNNAMED

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++:重定义

派生类和基类的同名成员问题 派生类中再实现一个基类中的方法会怎样 (1)代码实验&#xff1a;派生类和基类中各自实现一个内容不同但函数原型完全相同的方法&#xff0c;会怎么样 (2)结论&#xff1a;基类对象调用的是基类的方法&#xff0c;派生类对象调用执行的是派生类中重…

AWS认证考试流程:从准备到通过

AWS认证是IT行业中备受推崇的专业资格认证之一&#xff0c;它不仅可以验证您的AWS技能&#xff0c;还能提升您的职业竞争力。本文将为您详细介绍AWS认证考试的完整流程&#xff0c;从初步准备到最终通过认证。 选择适合的认证级别 AWS提供多个级别的认证&#xff0c;包括&…

OWASP ZAP

OWASP ZAP简介 开放式Web应用程序安全项目&#xff08;OWASP&#xff0c;Open Web Application Security Project&#xff09;是一个组织&#xff0c;它提供有关计算机和互联网应用程序的公正、实际、有成本效益的信息。ZAP则是OWASP里的工具类项目&#xff0c;也是旗舰项目&a…

DP(2) | Java | LeetCode 62, 63, 343, 96 做题总结(96 未完)

62.不同路径 我的代码&#xff08;报错&#xff09; 写的过程中感到很迷惑的点&#xff1a;①二维数组和这道题目的对应弄不清除&#xff0c;m n的初始化 是 dp[m][n] 还是 dp[n][m] ② class Solution {public int uniquePaths(int m, int n) {int[][]dp new int[m1][n1];d…

JavaScript(9)——作用域的一些问题

如果在函数内部&#xff0c;变量没有声明直接赋值&#xff0c;也会当做全局变量看。强烈不推荐&#xff01;&#xff01; function op() {num 80}op()console.log(num) 在不同作用域下&#xff0c;可能存在变量命名冲突的情况&#xff1a; let num 10 function fn(){let num…

【PTA天梯赛】L1-003 个位数统计(15分)

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法刷题 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录 题目题解总结 题目 题目链接 题解 使用string把长度达1000位的数字存起来开一个代表个位数的数组 a[11]倒序计算最后一位&#xff0c;…

SQL基础-DQL 小结

SQL基础-DQL 小结 学习目标&#xff1a;学习内容&#xff1a;SELECTFROMWHEREGROUP BYHAVINGORDER BY运算符ASC 和 DESC 总结 学习目标&#xff1a; 1.理解DQL&#xff08;Data Query Language&#xff09;的基本概念和作用。 2.掌握SQL查询的基本语法结构&#xff0c;包括SEL…

PHP 安装Memcached 扩展 PHP使用Memcache

memcache扩展下载 访问官网&#xff1a;https://pecl.php.net/package/memcache&#xff0c;下载合适的memcache版本的安装包&#xff0c;注意要与php版本相匹配。 1、查看运行环境php版本,可以运行以下代码 <?php phpinfo(); ?>2、查看版本信息以及是否支持多线程…

Google登录时人机身份验证的图片类型和通过的经验建议,以及一些常见问题

很多朋友在登录谷歌账号时&#xff0c;都遇到过要求人机身份验证的步骤&#xff0c;而且有一些时候人机身份验证这个步骤很让人纠结&#xff0c;甚至压根就出不来具体的验证图片&#xff0c;或者花了十几分钟、几十分钟都过不去。 所以今天GG账号服务就来为您解析一下谷歌登录…

论文学习_An Empirical Study of Deep Learning Models for Vulnerability Detection

1. 引言 研究背景:近年来,深度学习漏洞检测工具取得了可喜的成果。最先进的模型报告了 0.9 的 F1 分数,并且优于静态分析器。结果令人兴奋,因为深度学习可能会给软件保障带来革命性的变化。因此,IBM、谷歌和亚马逊等行业公司非常感兴趣,并投入巨资开发此类工具和数据集。…

【Ubuntu-18.04.6 LTS (Bionic Beaver)】串口无法root登录解决方案

root用户无法再窗口登录 用户界面登录提示 soory that didnot work 解决方案 GDM 配置 /etc/gdm3/custom.conf 中增加或删除注释 [security] AllowRoottrue重启服务 service gdm restart确认 PAM 配置 GDM 使用 PAM 进行认证&#xff0c;可能 PAM 配置中限制了 root 登录…

网络基础:Vlan原理与配置

VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种将一个物理网络划分为多个逻辑子网的技术。它通过在网络交换机上配置&#xff0c;使得不同VLAN中的设备即使连接在同一个物理交换机上&#xff0c;也不能直接进行通信&#xff0c;从而实现…

【JavaScript 报错】未定义的变量或函数:Uncaught ReferenceError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 变量未定义2. 函数未定义3. 块级作用域问题 二、解决方案1. 确保变量已定义2. 确保函数已定义3. 正确使用块级作用域 三、实例讲解四、总结 在JavaScript开发中&#xff0c;Uncaught ReferenceError 是一…

改变Ubuntu的Tab没有缩进4格(Makefile)

1.vim里的Tab 用vi指令打开这个文件&#xff0c;没有的话就新创建一个 vi ~/.vimrc在打开的文件中输入以下两行 1 set tabstop42 set shiftwidth4 ~ Esc &#xff1a; x&#xff0c;保存并退出即可 资料来源&#xff1a; 2024年5月21日-vi/vim …

9.4 栅格图层符号化山体阴影渲染

文章目录 前言山体阴影渲染QGis设置为山体阴影二次开发代码实现山体阴影 总结 前言 介绍栅格图层数据渲染之山体阴影渲染说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 山体阴影渲染 以“3420C_2010_327_RGB_LATLNG.tif”数据为例&#xff0c;在QGis中加…

Typescript 模块小知识-global scope

问题表现 在编写ts代码的时候遇到一个问题, 表现为, 如果在某个ts工程中, 如果多个文件里面没有任何导出export或者是export default, 那么这些文件如果有const或者是let定义相同的声明都会报错如下 无法重新声明块范围变量 a/a.ts 和 index.ts 和 index2.ts 都没有进行expor…

视频监控接入汇聚平台的接入和汇聚,在应急管理场景的应用和解决方案

目录 一、视频监控接入汇聚平台是什么&#xff1f; 1、概述 2、结构图 3、视频接入能力 4、视频汇聚能力 二、功能 1. 视频接入与汇聚 2. 视频存储与回放 3. 实时监控与预警 4. 信息共享与联动 5. 远程管理与控制 三、视频接入方式 1、直接设备接入 2、标准协议接…

2024最新FL Studio21.2.8.92破解中文版下载

&#x1f389; 大家好&#xff0c;我是你们的安利小能手&#xff01;今天要给大家种草一个神器——FL Studio21中文版&#xff0c;让你的音乐创作如虎添翼&#xff01; &#x1f31f; FL Studio21中文版是一款功能强大的音乐制作软件。它提供了丰富的音色库和效果器&#xff0…

还不懂 OOM ?详解内存溢出与内存泄漏区别!

内存溢出与内存泄漏 1. 内存溢出&#xff08;Out Of Memory&#xff0c;OOM&#xff09; 概念&#xff1a; 内存溢出是指程序在运行过程中&#xff0c;尝试申请的内存超过了系统所能提供的最大内存限制&#xff0c;并且垃圾收集器也无法提供更多的内存&#xff0c;导致程序无…

[C++] 模拟实现list(二)

标题&#xff1a;[C] 模拟实现list&#xff08;二&#xff09; 水墨不写bug 目录 &#xff08;一&#xff09;回顾 &#xff08;二&#xff09;迭代器类的封装设计 &#xff08;1&#xff09;成员函数简要分析 &#xff08;2&#xff09;const迭代器类的设计 &#xff08;…