最新版的dubbo服务调用(用nacos做注册中心用)

embedded/2024/10/9 3:37:35/

一、介绍

nacos_1">1.1、什么是 nacos

  • Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

  • Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

nacos__7">1.2、nacos 特性

  • 服务发现和服务健康监测
    Nacos 支持基于 DNS 和基于 RPC 的服务发现
    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。

  • 动态配置服务
    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

  • 动态 DNS 服务
    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。

  • 服务及其元数据管理
    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

dubbo_20">1.3、什么是 dubbo

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。

Dubbo 的开源故事

Apache Dubbo 最初是为了解决阿里巴巴内部的微服务架构问题而设计并开发的,在十多年的时间里,它在阿里巴巴公司内部的很多业务系统得到了非常广泛的应用。最早在 2008 年,阿里巴巴就将 Dubbo 捐献到开源社区,它很快成为了国内开源服务框架选型的事实标准框架,得到了业界更广泛的应用。在 2017 年,Dubbo 被正式捐献 Apache 软件基金会并成为 Apache 顶级项目,开始了一段新的征程。

dubbo__27">1.4、dubbo 能做什么

  • 微服务编程范式和工具
    Dubbo 支持基于 IDL 或语言特定方式的服务定义,提供多种形式的服务调用形式(如同步、异步、流式等)
  • 高性能的 RPC 通信
    Dubbo 帮助解决微服务组件之间的通信问题,提供了基于 HTTP、HTTP/2、TCP 等的多种高性能通信协议实现,并支持序列化协议扩展,在实现上解决网络连接管理、数据传输等基础问题。
  • 微服务监控与治理
    Dubbo 官方提供的服务发现、动态配置、负载均衡、流量路由等基础组件可以很好的帮助解决微服务基础实践的问题。除此之外,您还可以用 Admin 控制台监控微服务状态,通过周边生态完成限流降级、数据一致性、链路追踪等能力。
  • 部署在多种环境
    Dubbo 服务可以直接部署在容器、Kubernetes、Service Mesh等多种架构下。
    (以上介绍均来自官方文档)

二、项目搭建

2.1、模块总体介绍

注意:在这里,我们搭建的项目只体现了 dubbonacos 做注册中心时,如何实现服务间调用,其他特性可自己探索
在这里插入图片描述

解释:

  • consumer(消费者) 其实就是一个spring boot 项目,在这里命名为消费者,是因为它调用 provider 的方法
  • provder (提供者) 其实也是一个spring boot 项目,在这里命名为提供者,是因为它提供了consumer需要调用的方法
    注意: 消费者和提供者是相对的,在以后的开发中也可能互相调用哦
  • dubbo-service 其实就是 consumer 和 provder 所共用的接口(通过 maven 坐标引入到 consumer 和 provider 中)

2.2、模块介绍

2.2.1 父工程介绍

父工程 pom:

<?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"><modelVersion>4.0.0</modelVersion><groupId>com.siyu</groupId><artifactId>dubbo-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>consumer</module><module>provider</module><module>dubbo-service</module></modules><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--spring boot web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.0.2</version></dependency><!--nacos config--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2022.0.0.0</version><exclusions><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><!--nacos discovery--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2022.0.0.0</version><exclusions><exclusion><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></exclusion></exclusions></dependency><!--nacos client--><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.3.2</version></dependency><!--dubbo spring boot 整合--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.0</version></dependency></dependencies>
</project>
2.2.2 consumer 介绍

在这里我先贴两张nacos的截图(nacos是有服务端的,需要部署),红色圈出的地方需要注意,下面配置中会用到

配置:
在这里插入图片描述
服务:

在这里插入图片描述
命名空间:
在这里插入图片描述

包结构:

在这里插入图片描述

pom:

<?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"><modelVersion>4.0.0</modelVersion><parent><groupId>com.siyu</groupId><artifactId>dubbo-demo</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>consumer</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- dubbo service 是共用接口 --><dependency><groupId>com.siyu</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version></dependency><!--这里需要加上这个依赖,不然 bootstrap.yml 可能不生效 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.2</version></dependency></dependencies>
</project>

bootstrap.yml :

server:port: 8080
spring:application:name: consumercloud:nacos:config:server-addr: ip:8848   #nacos地址extension-configs:- data-id: consumer # nacos 中创建配置文件时配的 data-idgroup: DEFAULT_GROUP #组refresh: truenamespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2 # nacos 命名空间 iddiscovery:server-addr: ip:8848 #nacos地址namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2  # nacos 命名空间 id
dubbo:application:name: consumer	#配置应用名是为了加以区分不同的服务提供者protocol:name: dubboport: -1 # 端口设置为-1 是让dubbo自动在[20880, 65535]之间找一个可用的端口registry:id: nacos-registryaddress: nacos://ip:8848	# 在此配置nacos服务的IP地址及端口

UserController (这里应该写成orderController)代码中有些不合适但不影响

@RestController
public class UserController {@Autowiredprotected OrderService orderService;@RequestMapping("user")public String getUser() {return orderService.getUser();}
}

OrderService

@RefreshScope   // 动态刷新(nacos中的配置改变时,要动态改变需要加这个注解,就是下面的 aa 变量)
@Service
public class OrderService {@Value("${aa}")  //此配置在nacos中,为了测试 nacos 的动态配置private String aa;@DubboReference(version = "1.0")  // 这个注解说明这是一个dubbo的远程调用,并不是本地调用private UserService userService;public String getUser(){return userService.getUser() + aa;}}

Application

@EnableDiscoveryClient  //启动服务发现nacos
@SpringBootApplication
@EnableDubbo  //启用dubbo
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
dubboservice__261">2.2.3 dubbo-service 介绍

结构图:

在这里插入图片描述
这里只有单纯的接口,没有其他的(当然后续可能会有实体什么的),pom目前也是空的

2.2.4 provider 介绍

结构图:

在这里插入图片描述
pom:

<?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"><modelVersion>4.0.0</modelVersion><parent><groupId>com.siyu</groupId><artifactId>dubbo-demo</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>provider</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.siyu</groupId><artifactId>dubbo-service</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.2</version></dependency></dependencies>
</project>

没有什么其他依赖

bootstrap.yml

server:port: 8081spring:application:name: providercloud:nacos:config:server-addr: ip:8848extension-configs:- data-id: providergroup: DEFAULT_GROUPrefresh: truenamespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2discovery:server-addr: ip:8848namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2dubbo:application:name: provider	#配置应用名是为了加以区分不同的服务提供者protocol:name: dubboport: -1 # 端口设置为-1 是让dubbo自动在[20880, 65535]之间找一个可用的端口registry:id: nacos-registryaddress: nacos://ip:8848	# 在此配置nacos服务的IP地址及端口

这些配置在 consumer 中都有详细介绍,在这里 UserController 并没有实质性的作用,和 Dubbo 调用无关,接下来直接看 UserServiceImpl

UserServiceImpl

@DubboService(version = "1.0")  // 这个注解就说明这是一个dubbo服务
public class UserServiceImpl implements UserService {@Overridepublic String getUser() {return "siyu";}
}

ProviderApplication

@EnableDiscoveryClient
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}

到这里,简单的 demo 搭建就完毕了(搭建时需要注意版本,避免冲突)

祝您遇见更好的自己


http://www.ppmy.cn/embedded/124865.html

相关文章

程序猿成长之路之设计模式篇——设计模式简介

无论是对于代码质量还是代码可维护性、可扩展性&#xff0c;使用合适的设计模式都能够起到促进提升的作用&#xff0c;此外在软考的软件工程师、系统架构师职称考试中&#xff0c;设计模式也是必考的一块内容&#xff0c;因此我打算开拓一个新的专栏简单介绍一下设计模式&#…

数据链路层(以太网简介)

一.以太网数据帧结构&#xff1a; 目的地址&#xff0c;源地址&#xff0c;类型这三个被称为帧头&#xff0c;数据则被称为载荷&#xff0c;CRC则被称为帧尾&#xff08;校验和&#xff09; 二.数据帧结构分析 1.目的地址和源地址 i.地址解释 这两个地址指的是mac地址&#x…

OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离

OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离 —— 2024-10-02 下午 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记之事件驱动设计将相机控制类和应用程序类分离1.代码图片2.分析3.UML4.代码 1.代码图片 运行 Mouse button 1 pressed at (1…

『网络游戏』窗口基类【06】

创建脚本&#xff1a;WindowRoot.cs 编写脚本&#xff1a; 修改脚本&#xff1a;LoginWnd.cs 修改脚本&#xff1a;LoadingWnd.cs 修改脚本&#xff1a;ResSvc.cs 修改脚本&#xff1a;LoginSys.cs 运行项目 - 功能不变 本章结束

pg if条件语句

1.语法&#xff1a; 2.区别 IF 语句&#xff1a; 只能在 PL/pgSQL 中使用&#xff0c;不适合在直接的 SQL 查询中使用。没有返回值&#xff0c;仅仅是控制逻辑流程。适合用在存储过程、函数和触发器中。 CASE 语句&#xff08;在 PL/pgSQL 中&#xff09;&#xff1a; 可以在 P…

命名管道Linux

管道是 毫不相关的进程进程间通信::命名管道 管道 首先自己要用用户层缓冲区&#xff0c;还得把用户层缓冲区拷贝到管道里&#xff0c;&#xff08;从键盘里输入数据到用户层缓冲区里面&#xff09;&#xff0c;然后用户层缓冲区通过系统调用&#xff08;write&#xff09;写…

【Web】portswigger 服务端原型污染 labs 全解

目录 服务端原型污染 为什么服务器端原型污染更难检测&#xff1f; 通过受污染的属性反射检测服务器端原型污染 lab1:通过服务器端原型污染进行权限提升 无需污染属性反射即可检测服务器端原型污染 状态代码覆盖 JSON 空格覆盖 字符集覆盖 lab2:检测没有污染属性反射的…

微信原生小程序

app.json 中配置project.config.json 中配置project.private.config.json 中配置sitemap.json 中配置index.json 中配置常用全局配置常用页面配置WXMLnavigator 组件 基本用法常用属性事件 scroll-view 组件 基本用法 1. 创建可垂直滚动的区域2. 创建可水平滚动的区域事件1. 事…