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,一经查实,立即删除!

相关文章

【深度学习】图形模型基础(7):机器学习优化中的方差减少方法(2)

4.高级算法 本节将探讨基本变分减少&#xff08;VR&#xff09;方法的几种拓展。这些拓展旨在处理更广泛的应用场景&#xff0c;包括非光滑问题和/或非强凸问题。此外&#xff0c;一些拓展利用算法技巧或问题结构的特性&#xff0c;设计出比基础方法更高效的算法。 4.1. SGD与…

LabVIEW中使用 DAQmx Connect Terminals作用意义

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

Windows下终端Kafka指令常用操作

1、创建Topic kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test 2、查看Topic列表 kafka-topics.bat --list --bootstrap-server localhost:9092 3、设置Topic最大消息大小 kafka-topics.bat --bootstrap-s…

在Spring Boot中集成单元测试框架

在Spring Boot中集成单元测试框架 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 单元测试概述 在软件开发中&#xff0c;单元测试是保证代码质量和功能正确性的重要手段。Spring Boot框架支持…

redis相关知识记录

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

python为什么慢?(自用)

《Cython系列》1. Cython 是什么&#xff1f;为什么要有 Cython&#xff1f;为什么我们要用 Cython&#xff1f; - 古明地盆 - 博客园 (cnblogs.com) 古明地盆的主页 - 博客园 (cnblogs.com) 我原本认为&#xff0c;python慢的原因是“逐行解释程序并执行”&#xff0c;那么我…

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在过去八个月中取得了“重大进展…

代码随想录算法训练营第三十一天 |1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

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

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

C++各种类型转换

string转为float #include <iostream> #include <string>int main() {std::string str "3.14";float num std::stof(str);std::cout << num << std::endl;return 0; } int转string to_string&#xff08;C11&#xff09; #include <…

python程序打包.exe文件

python程序打包.exe文件 1. cxfreeze# 1.1 安装cxfreeze1.2 创建setup.py文件1.3 生成.exe 当我们开发完一个深度学习程序时&#xff0c;往往在另一台电脑上运行代码&#xff0c;还得继续安装深度学习环境这些依赖&#xff0c;但是将整个代码程序打包成.exe文件就会同时将程序所…

nginx 中no live upstreams while connecting to upstream错误的解决

将netcore的站点服务器从IIS切换到linux的nginx站点之后&#xff0c;站点错误日志里一直报下面这样一个错误&#xff1a; 2024/07/11 10:17:19 [error] 477#0: *70 no live upstreams while connecting to upstream, client: 120.78.72.223, server: tahm.域名.com, request: …

回归树模型

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

Java中的多线程是如何实现的?

Java中的多线程实现主要通过以下几种方式&#xff1a; 1. 继承Thread类 这是实现多线程的一种基本方式。你需要创建一个类来继承java.lang.Thread类&#xff0c;然后重写其run()方法。run()方法包含了线程执行的任务代码。创建该类的实例后&#xff0c;通过调用该实例的start…

c++ learn five five day

1.A-B数对 二分法 http://t.csdnimg.cn/2GNeH 将A-BC转化成ABC&#xff0c;然后遍历数组&#xff0c;让数组的每个元素加C&#xff0c;再查找原数组中是否存在对应数组元素C之后的值。&#xff08;数据量比较大&#xff0c;所以我们就用二分在查找过程中提高效率&#xff0c…