SpringBoot+Dubbo+Nacos 开发实战教程
本文来写个详细的例子来说下dubbo+nacos+springboot
开发实战。本文不会讲述太多的理论的知识,会写一个最简单的例子来说明dubbo如何与nacos整合,快速搭建开发环境。
文章目录
环境准备
dubbo简介
Nacos环境准备
Nacos与dubbo整合
项目管理规范
dubbo整合nacos案例
创建公共接口模块
创建服务提供者模块
创建服务消费者模块
服务调用测试
本文小结
环境准备
dubbo简介
dubbo核心节点之间的调用关系
节点说明
调用关系说明
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Nacos环境准备
启动nacos,本文使用的是nacos1.4.3版本
打开nacos的控制面板
Nacos与dubbo整合
为了方便大家理解,这里写出对应的生产方、消费方 Demo 代码,以及使用的注册中心。
项目管理规范
springboot,netflix和cloud alibaba之间有版本之间的对应关系,本文选择的版本如下
dubbo和cloud alibaba之间有版本之间的对应关系,本文选择的版本如下
为了后续方便使用SpringCloud Alibaba
进行开发,首先创建一个pom类型的父项目,主要用于项目技术栈版本管理,创建一个maven项目,名称为spring-cloud-alibaba-example
,去除src文件,修改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>ah.wideth</groupId><artifactId>spring-cloud-alibaba-example</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><packaging>pom</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR12</spring-cloud.version><com-alibaba-cloud.version>2.2.7.RELEASE</com-alibaba-cloud.version></properties><!--对项目版本进行管理--><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${com-alibaba-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
</project>
后续创建的项目都放到此目录下,只需要声明groupId和artifactId,会自动引用父项目spring-cloud-alibaba-example
的版本。与其说是父项目,不如说是根项目: 因为下面每学习一个新的技术,就会新建一个真正的父项目,而在对应的父项目下面又会创建许多的子项目
dubbo整合nacos案例
本文的案例是在上文nacos开发实例的基础之上继续编写的。下面开始创建我们的项目,贴上我的目录结构。
模块说明
public-api
公共接口模块(接口),供服务消费者和服务提供者调用。dubbo-provider
服务提供者模块(接口实现类),引入了public-api
模块dubbo-consumer
服务消费者模块(controller
),引入了public-api
模块消费者和提供者通过公共接口模块进行rpc远程调用
父工程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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>spring-cloud-alibaba-example</artifactId><groupId>ah.wideth</groupId><version>1.0-SNAPSHOT</version></parent><modules><module>public-api</module><module>dubbo-provider</module><module>dubbo-consumer</module></modules><artifactId>dubbo-nacos-example</artifactId><name>dubbo-nacos-example</name><description>duboo与nacos整合的父工程</description><packaging>pom</packaging><properties><java.version>1.8</java.version><project.build.sourceEncoding>utf-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><dubbo.version>2.7.13</dubbo.version><nacos.version>1.4.1</nacos.version></properties><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><!--解决nacos-client2.0报错的问题--><exclusions><exclusion><artifactId>nacos-client</artifactId><groupId>com.alibaba.nacos</groupId></exclusion></exclusions></dependency><!--dubbo相关--><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>${nacos.version}</version></dependency><!-- 解决dubbo2.7.13jar包冲突问题--><dependency><groupId>com.alibaba.spring</groupId><artifactId>spring-context-support</artifactId><version>1.0.11</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring</artifactId></exclusion><exclusion><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency></dependencies></project>
创建公共接口模块
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>dubbo-nacos-example</artifactId><groupId>ah.wideth</groupId><version>1.0-SNAPSHOT</version></parent><artifactId>public-api</artifactId><name>public-api</name><description>api公用接口</description><packaging>jar</packaging><properties><java.version>1.8</java.version><project.build.sourceEncoding>utf-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
公共接口模块里面只有一个接口,没有配置文件,打jar包
package ah.wideth.api;/*** 让生产者和服务消* 费者来使用这个接口*/
public interface InfoService {String getInfo();
}
创建服务提供者模块
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>dubbo-nacos-example</artifactId><groupId>ah.wideth</groupId><version>1.0-SNAPSHOT</version></parent><artifactId>dubbo-provider</artifactId><name>dubbo-provider</name><description>dubbo的服务提供者模块</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>utf-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--引入公共接口模块--><dependency><groupId>${project.groupId}</groupId><artifactId>public-api</artifactId><version>${project.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yml配置文件
server:port: 8180spring:application:name: dubbo-providerdubbo:registry:address: nacos://127.0.0.1:8848 #注册地址application:name: dubbo-provider #应用名protocol:name: dubbo #dubbo协议port: 20880 #协议端口scan:base-packages: ah.wideth.impl #扫包范围provider:timeout: 30000 #超时时间
接口实现类,该类实现了上面我们在公共接口模块创建的接口
package ah.wideth.impl;import ah.wideth.api.InfoService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;// dubbo提供的Service注解,用于声明对外暴露服务
// Service引入的是org.apache.dubbo.config.annotation.Service包
@Component
@DubboService
public class InfoServiceImpl implements InfoService {@Overridepublic String getInfo() {return "hello,这里是dubbo-provider模块!";}
}
服务提供者启动类
package ah.wideth;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDubbo
@EnableDiscoveryClient
@SpringBootApplication
public class DubboProviderApplication {public static void main(String[] args) {SpringApplication.run(DubboProviderApplication.class, args);System.out.println("dubbo服务提供者8180启动了");}}
创建服务消费者模块
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>dubbo-nacos-example</artifactId><groupId>ah.wideth</groupId><version>1.0-SNAPSHOT</version></parent><artifactId>dubbo-consumer</artifactId><name>dubbo-consumer</name><description>dubbo的服务消费者模块</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>utf-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--引入公共接口模块--><dependency><groupId>${project.groupId}</groupId><artifactId>public-api</artifactId><version>${project.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
application.yml配置文件
server:port: 8181spring:application:name: dubbo-consumerdubbo:registry:address: nacos://127.0.0.1:8848 #注册地址application:name: dubbo-consumer #应用名consumer:timeout: 30000 #超时时间
controller,调用公共接口模块创建的接口
package ah.wideth.controller;import ah.wideth.api.InfoService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class InfoController {//dumbo提供的Reference注解,用于调用远程服务@DubboReference(check = false)private InfoService infoService;@GetMapping("/getInfo")public String getInfo(){return infoService.getInfo();}
}
服务消费者启动类
package ah.wideth;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDubbo
@EnableDiscoveryClient
@SpringBootApplication
public class DubboConsumerApplication {public static void main(String[] args) {SpringApplication.run(DubboConsumerApplication.class, args);System.out.println("dubbo服务消费者8181启动了");}}
服务调用测试
打开Nacos控制面板查看注册中心中的服务
启动nacos,启动服务提供者和服务消费者,调用服务消费者的getInfo方法,服务提供者会返回结果
SpringBoot+Dubbo+Nacos 开发实战教程相关推荐
- springboot+dubbo+nacos开发实战
本文来写个详细的例子来说下dubbo+nacos+springboot开发实战.本文不会讲述太多的理论的知识,会写一个最简单的例子来说明dubbo如何与nacos整合.快速搭建开发环境. 文章目录 环 ...
- springboot+openFeign+nacos开发实战
前面说了dubbo+nocas开发实战,现在来说下springboot+openFeign+nacos开发实战. 文章目录 什么是Feign Nacos环境准备 Nacos与openFegin整合 项 ...
- Swift游戏开发实战教程(大学霸内部资料)
Swift游戏开发实战教程(大学霸内部资料) 试读下载地址:http://pan.baidu.com/s/1sj7DvQH 介绍:本教程是国内第一本Swift游戏开发专向资料. 本教程详细讲解记忆配对 ...
- dubbo consumer 端口_基于Springboot+Dubbo+Nacos 注解方式实现微服务调用
今天跟大家分享基于Springboot+Dubbo+Nacos 注解方式实现微服务调用的知识. 1 项目结构 |-- spring-boot-dubbo-demo (父级工程) |-- spring- ...
- vue 拖动 datatransfer 问题_electron-vue跨平台桌面应用开发实战教程(四)——窗口样式amp;打开新窗口...
> 本文我们讲解下怎么修改窗口样式,系统默认的窗口非常普通,通常与设计不符,所以我们要自定义,接下来我们讲解下怎么去掉原有样式,怎么实现实现窗口的最小化,最大化和关闭按钮.还有怎么打开一个新页 ...
- 大数据开发实战教程目录
大数据开发实战教程目录 一. 课程性质.目的和任务 本课程目的是让学生了解并掌握四个领域 (1)大数据系统的起源及系统特征 (2)大数据系统的架构设计及功能目标设计 (3)大数据系统程序开发.企业大数 ...
- 《崔庆才Python3网络爬虫开发实战教程》学习笔记(3):抓取猫眼电影榜单TOP100电影,并存入Excel表格
本篇博文是自己在学习崔庆才的<Python3网络爬虫开发实战教程>的学习笔记系列,如果你也要这套视频教程的话,关注我公众号[小众技术],关注后回复[PYTHON],无套路免费送你一个学习大 ...
- 《崔庆才Python3网络爬虫开发实战教程》学习笔记(5):将爬虫爬取到的数据存储到TXT,Word,Excel,Json等文件中
本篇博文是自己在学习崔庆才的<Python3网络爬虫开发实战教程>的学习笔记系列,此套教程共5章,加起来共有34节课,内容非常详细丰富!如果你也要这套视频教程的话,关注我公众号[小众技术] ...
- 嵌入式linux驱动开发实战教程,嵌入式Linux驱动开发实战视频教程
嵌入式Linux驱动开发实战教程(内核驱动.看门狗技术.触摸屏.视频采集系统) 适合人群:高级 课时数量:109课时 用到技术:嵌入式 Linux 涉及项目:驱动开发.看门狗技术.触摸屏.视频采集 咨 ...
最新文章
- springboot之@ConfigurationProperties加载配置文件
- 06.Spring 资源加载 - ResourceLoader
- python语言:烟花效果实现
- python程序开子进程打包成exe文件运行炸内存原因剖析
- Shell的 for 循环小例子
- 合数分解质数c语言算法,合数分解成质数之和问题探究
- Android studio IllegalArgumentException: couldn't make a guess
- linux文本编辑器字体大小,怎样将Linux中gcc文本编辑器的字体放大
- Tapestry中listener监听方法传递参数的方式
- 九针串口定义(公口、母口图解)
- 从学生宿舍到全球舞台: 米哈游的成长故事
- js-table2excel 导出带图片的excel
- Java中抽象类和接口的区别
- 基于 DolphinDB 的行情中心解决方案
- 基于哈夫曼编码的文件压缩解压
- 使用uCommand执行复杂的任务
- scikit-learn 机器学习:sklearn.neighbors 的k近邻算法使用
- Excel如何删除指定区域中重复值只保留一个
- 深度学习巨头—杨立昆
- linux服务器配置磁盘阵列,linux 磁盘阵列 raid1搭建教程