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-servicecloud:nacos:server-addr: 192.168.31.231:8848username: nacospassword: nacos
dubbo:application:name: provider-service-dubboregistry:address: nacos://192.168.31.231:8848username: nacospassword: nacosprotocol:name: dubboport: 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-servicecloud:nacos:server-addr: 192.168.31.231:8848username: nacospassword: nacos
dubbo:application:name: consumer-service-dubboregistry:address: nacos://192.168.31.231:8848username: nacospassword: 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 {@DubboReferenceprivate 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

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

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

相关文章

LabVIEW中使用 DAQmx Connect Terminals作用意义

该图展示了如何在LabVIEW中使用 DAQmx Connect Terminals.vi 将一个信号从一个源端口连接到一个目标端口。这种处理有以下几个主要目的和作用&#xff1a; 同步操作&#xff1a; 在多任务、多通道或多设备系统中&#xff0c;可能需要不同的组件在同一时刻执行某些操作。通过将触…

redis相关知识记录

redis基本数据类型 Redis⽀持五种主要数据结构&#xff1a;字符串&#xff08;Strings&#xff09;、列表&#xff08;Lists&#xff09;、哈希表&#xff08;Hashes&#xff09;、集合&#xff08;Sets&#xff09;和有序集合&#xff08;Sorted Sets&#xff09;。这些数据结…

winform4

json using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; //导入json第三方库 使用nuget搜索 …

断电的固态硬盘数据能放多久?

近日收到一个网友的提问&#xff0c;在这里粗浅表达一下见解&#xff1a; “网传固态硬盘断电后数据只能放一年&#xff0c;一年之后就会损坏。但是我有一个固态硬盘已经放了五六年了&#xff08;上次通电还是在2018年左右&#xff0c;我读初中的时候&#xff09;&#xff0c;…

《长相思》第二季回归:好剧质量,永恒的王牌

在万千剧迷的翘首以盼中&#xff0c;《长相思》第二季终于携着前作的辉煌与期待&#xff0c;缓缓拉开了序幕。这部自播出以来便以其精湛的剧情、出色的演员阵容以及独到的宣传策略&#xff0c;赢得了广泛好评与持续关注。如今&#xff0c;第二季的回归&#xff0c;无疑再次证明…

Linux 初识

目录 ​编辑 1.Linux发展史 1.1UNIX发展历史 1.2Linux发展历史 2.Linux的开源属性 2.1 开源软件的定义 2.2 Linux的开源许可证 2.3 开源社区与协作 3.Linux的企业应用现状 3.1 服务器 3.1.1 Web服务器 3.1.2 数据库服务器 3.1.3 文件服务器 3.1.4 电子邮件服务器 …

某客户管理系统Oracle RAC节点异常重启问题详细分析记录

一、故障概述 某日10:58分左右客户管理系统数据库节点1所有实例异常重启&#xff0c;重启后业务恢复正常。经过分析发现&#xff0c;此次实例异常重启的是数据库节点1。 二、故障原因分析 1、数据库日志分析 从节点1的数据库日志来看&#xff0c;10:58:49的时候数据库进程开始…

新火种AI|微软和苹果放弃OpenAI董事会观察员席位

作者&#xff1a;一号 编辑&#xff1a;美美 微软苹果双双不做OpenAI“观察员”&#xff0c;OpenAI能更自由吗&#xff1f; 7月10消息&#xff0c;微软当地时间周一宣布将放弃在OpenAI董事会的观察员席位&#xff0c;他们称&#xff0c;OpenAI在过去八个月中取得了“重大进展…

国内的几款强大的智能—AI语言模型

AI 绘图 链接&#xff1a;点我进入 1、国内百度研发的&#xff0c;文心一言&#xff1a; https://yiyan.baidu.com/welcome 大家如果像我的界面一样有【开始体验】就是可以使用的&#xff0c;否则就是说明在等待中&#xff01; 优点&#xff1a;会画画&#xff0c;暂无次数限…

回归树模型

目录 一、回归树模型vs决策树模型&#xff1a;二、回归树模型的叶结点&#xff1a;三、如何决定每个非叶结点上的特征类型&#xff1a; 本文只介绍回归树模型与决策树模型的区别。如需了解完整的理论&#xff0c;请看链接&#xff1a;决策树模型笔记 一、回归树模型vs决策树模…

Linux设备驱动的并发控制

一、概述 Linux设备驱动中必须解决的一个问题就是多个进程对共享资源(如全局变量、静态变量、硬件资源等)的并发访问&#xff0c;会导致竟态&#xff0c;如可能会出现以下情况&#xff1a;导致执行单元C独处的数据不符合预期 导致竟态发生有如下几种情况&#xff1a; 对称多处…

int类型变量表示范围的计算原理

文章目录 1. 了解2. 为什么通常情况下int类型整数的取值范围是-2147483648 ~ 21474836473. int类型究竟占几个字节4. 推荐 1. 了解 通常情况下int类型变量占4个字节&#xff0c;1个字节有8位&#xff0c;每位都有0和1两种状态&#xff0c;所以int类型变量一共可以表示 2^32 种状…

【全面介绍Oracle】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 目录 🎥前言🎥基本概念和安装🎥SQL语言🎥PL/SQL编程🎥数据库…

【计算机组成原理 | 第三篇】各个硬件的组成部分

前言&#xff1a; 在前面的文章中&#xff0c;我们介绍了计算机架构的基本组成。可以知道计算机的基本架构由“存储器”&#xff0c;“运算器”&#xff0c;“控制器”&#xff0c;“输入设备”&#xff0c;“输出设备”这五部分组成。 在这片文章中&#xff0c;我们来深入的了…

【斯坦福因果推断课程全集】2_无混淆和倾向分1

目录 Beyond a single randomized controlled trial Aggregating difference-in-means estimators Continuous X and the propensity score 随机试验的一个最简单的扩展是无约束下的干预效果估计。从定性上讲&#xff0c;当我们想估计一种并非随机的治疗效果&#xff0c;但一…

数列分块<2>

本期是数列分块入门<2>。该系列的所有题目来自hzwer在LOJ上提供的数列分块入门系列。 Blog:http://hzwer.com/8053.html sto hzwer orz %%% [转载] 好像上面的链接↑打不开&#xff0c;放一个转载:https://www.cnblogs.…

tensorflow卷积层操作

全连接NN&#xff1a; 每个神经元与前后相邻层的每一个神经元都有全连接关系。输入是特征&#xff0c;输出为预测结果。 参数个数(前层*后层后层&#xff09; 实际应用时&#xff0c;会先对原始图像进行特征提取&#xff0c;再把提取到的特征送给全连接网络 会先进行若干层提…

C嘎嘎类与对象上篇

类的定义 1. class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略 。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。 2. C中struct也可以…

【C语言】C语言-学生籍贯信息记录系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

泛微e-cology getFileViewUrl接口存在SSRF漏洞复现 [附POC]

文章目录 泛微e-cology getFileViewUrl接口存在SSRF漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议泛微e-cology getFileViewUrl接口存在SSRF漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章…