多模块项目的搭建以及Nacos服务的发现与调用

这里写目录标题

  • 多模块项目的搭建
    • 父项目的构建
    • 子模块的创建
    • 父子模块的意义
  • 将注册服务引入到父子模块中
  • 创建子模块用于发现服务和调用
    • 供调用的服务接口
    • 创建调用子模块
  • 测试
  • 一些小问题

在前文中我们实现了微服务的注册参考此文:
Spring Cloud Alibaba中Nacos的安装(Windows平台)以及服务的发现
现在我们需要创建另一个项目来发现服务以及调用注册的服务

多模块项目的搭建

为了方便之后的其他组件的引入,我这里就不再创建新的工程了,而是把之前的注册服务和接下来的nacos发现服务都放到同一个工程里。

也就是从之前的
在这里插入图片描述
转为以下这样
在这里插入图片描述

父项目的构建

在这里插入图片描述
得到的目录结构如图:
在这里插入图片描述
然后将src目录删除,因为父模块不需要运行,得到以下的目录结构
在这里插入图片描述

子模块的创建

然后我们再新建子模块,右键根目录,选择new -> module
在这里插入图片描述
这里的new module创建的照样是一个maven工程,不过此时它存在一个父模块,也就是我们上面的father_project
在这里插入图片描述
创建以后的目录这样的
在这里插入图片描述

父子模块的意义

大家可能会问了,父子模块的意义是什么?为什么不能再创建一个项目?而是使用父子模块

IntelliJ IDEA 中,父子模块的概念与 Maven 或 Gradle 等构建工具中的模块结构概念相关联。

父子模块的意义:

  1. 模块化管理:父子模块的设计有助于将项目分解为更小、更易管理的模块单元(听起来像微服务划分的方式)。这种模块化管理使得项目更易于开发和维护,有助于团队协作和复用。

  2. 依赖管理:父子模块可以有依赖关系,子模块可以依赖于父模块,同时子模块也可以互相依赖。

  3. 共享配置父模块中定义的配置可以被子模块继承和覆盖,比如版本管理、插件配置等。

  4. 独立构建:子模块可以独立构建、测试和运行,同时也可以依赖于其他子模块,最终打包成整个项目。

将注册服务引入到父子模块中

按照上述的方式,将之前的注册项目引入到父子模块结构的项目中,得到如下的项目
在这里插入图片描述
这里父项目的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>org.example</groupId><artifactId>SpringCloudAlibabaDemo</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!--    子模块的信息--><modules><module>nacos-project-registrant</module></modules><properties><!--        项目的源代码的Java版本--><maven.compiler.source>11</maven.compiler.source><!--        项目编译生成的字节码的目标Java版本--><maven.compiler.target>11</maven.compiler.target><!--        项目的源代码文件的字符编码--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--        spring boot的版本--><spring-boot.version>2.7.4</spring-boot.version><!--        spring cloud alibaba的版本--><spring-cloud-alibab.version>2021.0.5.0</spring-cloud-alibab.version><!--        nacos-discovery的版本--><spring-nacos.version>2021.0.5.0</spring-nacos.version><!--        spring cloud的版本--><spring-cloud.version>2021.0.5</spring-cloud.version></properties><!--    需要集中管理的依赖 子模块可以通过父模块引入而不需要自己导入--><dependencyManagement><dependencies><!--        Nacos服务注册和发现的集成--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>${spring-nacos.version}</version><type>pom</type><scope>import</scope></dependency><!--            引入spring boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--            引入spring cloud alibaba --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibab.version}</version><type>pom</type><scope>import</scope></dependency><!--            部分spring cloud功能使用时候需要引入这个--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!--    项目的构建配置,包括编译、打包、测试、部署等方面--><build><plugins><!--			spring-boot中用于支持maven打包的插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><packaging>war</packaging><parent><groupId>org.example</groupId><artifactId>SpringCloudAlibabaDemo</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>nacos-project-registrant</artifactId><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!--    由于父模块中已经引入了,所以这里不需要配置版本,项目会自动以父模块为准--><dependencies>
<!--        spring boot的引入--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--        Nacos服务注册和发现的集成--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies><!--    项目的构建配置,包括编译、打包、测试、部署等方面--><build><resources><!--			构建项目过程中被复制到输出目录中,以便它们可以在应用程序运行时访问--><resource><directory>src/main/java</directory><includes><!--					项目内mybatis的dao配置文件--><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><!--					资源文件--><include>**/*.*</include></includes></resource></resources><plugins><!--			spring-boot中用于支持maven打包的插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><!--        打包出来的名称 一般是项目的缩写外加版本号 --><finalName>npr</finalName></build></project>

我们再验证一下是否引入成功,启动注册服务
在这里插入图片描述
如果nacos中对应服务存在,则表示成功
在这里插入图片描述
如果运行失败,可能是nacos没启动导致的

创建子模块用于发现服务和调用

接下来我们再创建一个子模块用于发现注册的服务,以及调用该服务的接口

供调用的服务接口

这里我们先在注册服务中创建一些接口,供订阅者调用
在这里插入图片描述

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class NacosTest {@GetMapping("/echo/{string}")public String echo(@PathVariable String string) {return "成功调用注册服务的接口,代码为:" + string;}@GetMapping("/test")public String test() {return "调用服务的测试";}
}

在启动类上添加@EnableDiscoveryClient注解,启用Nacos客户端的发现
在这里插入图片描述

创建调用子模块

按照上面的方式创建一个名为nacos-discoverry-call子模块,并将其改为spring boot项目,如下图所示
在这里插入图片描述

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><packaging>war</packaging><parent><groupId>org.example</groupId><artifactId>SpringCloudAlibabaDemo</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>nacos-discoverry-call</artifactId><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!--    由于父模块中已经引入了,所以这里不需要配置版本,项目会自动以父模块为准--><dependencies><!--        spring boot的引入--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--        Nacos服务注册和发现的集成--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--        openfeign提供服务的远程调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--        open-feign在默认情况下依赖于负载均衡 新版本中已经不再强制依赖ribbon 而是推荐loadbalancer--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies><!--    项目的构建配置,包括编译、打包、测试、部署等方面--><build><resources><!--			构建项目过程中被复制到输出目录中,以便它们可以在应用程序运行时访问--><resource><directory>src/main/java</directory><includes><!--					项目内mybatis的dao配置文件--><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><!--					资源文件--><include>**/*.*</include></includes></resource></resources><plugins><!--			spring-boot中用于支持maven打包的插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins><!--        打包出来的名称 一般是项目的缩写外加版本号 --><finalName>ndc</finalName></build></project>

application.yml文件除了application.name以及port其他无变化:

server:port: 9001tomcat:uri-encoding: UTF-8spring:application:name: nacos-callcloud:nacos:discovery:server-addr: 192.168.2.102:8848
#        控制应用程序在启动时对配置中心的连接行为 如果没有连接到客户端则会立即启动失败fail-fast: true

启动类CallApplication中需要添加以下两个注解,启用服务的发现和调用
在这里插入图片描述
调用类相关的就以下两个
在这里插入图片描述
FeignInterface调用的接口,定义了某个服务调用的接口:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
//feign接口提供服务的调用 name为所调用服务的名称
@FeignClient(name="nacos-register")
public interface FeignInterface {@GetMapping("/echo/{str}")String echo(@PathVariable("str") String str);
}

NacosTest为测试的控制器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class NacosTest {private final static String SERVICE_ADDR = "http://192.168.2.102:9000";//Fegin接口提供的调用方式@AutowiredFeignInterface feignInterface;//直接使用Rest风格模板来实现调用 不推荐private RestTemplate template = new RestTemplate();@GetMapping("/echo/{string}")public String echo(@PathVariable String string) {//直接使用Rest风格模板来实现调用return template.getForObject(SERVICE_ADDR + "/echo/" + string , String.class);}@GetMapping("/test")public String test() {//直接使用Rest风格模板来实现调用return template.getForObject(SERVICE_ADDR+"/test" , String.class);}@GetMapping("/iecho/{string}")public String iecho(@PathVariable String string) {//Fegin接口提供的调用方式return feignInterface.echo(string);}}

测试

启动两个子模块,进入Nacos控制台
在这里插入图片描述
这里可以发现两个已经注册的服务,说明没问题,然后我们调用一下,检查是否调用服务(nacos-call)能否调用到注册服务(nacos-register)中的接口

地址栏输入http://localhost:9001/iecho/125 调用注册服务中的echo接口

有以下显示即为成功
在这里插入图片描述

此时点开订阅者列表可看到,nacos-call服务
在这里插入图片描述

还可以输入http://localhost:9001/test测试/test接口
在这里插入图片描述

一些小问题

订阅者有时候不显示应用名称而是显示为unknow
在这里插入图片描述
自己给环境设置一下即可
在这里插入图片描述

ProjectNameConfig代码为:

import com.alibaba.nacos.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;//用于设置订阅者一栏中的应用名称
@Configuration
public class ProjectNameConfig implements EnvironmentAware {@Value("${spring.application.name}")private  String applicationName;@Overridepublic void setEnvironment(Environment environment) {if(StringUtils.isBlank(System.getProperty("project.name"))){System.setProperty("project.name",applicationName);}}
}

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

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

相关文章

基于RK3568的新能源储能能量管理系统ems

新能源储能能量管理系统&#xff08;EMS&#xff09;是一种基于现代化技术的系统&#xff0c;旨在管理并优化新能源储能设备的能量使用。 该系统通过监测、调度和控制新能源储能设备来确保能源的高效利用和可持续发展。 本文将从不同的角度介绍新能源储能能量管理系统的原理、…

what?腾讯云3年轻量2核4G5M服务器566.6元哪去了?

what&#xff1f;腾讯云3年轻量2核4G5M服务器566.6元哪去了&#xff1f;腾讯云双11优惠活动3年轻量2核4G5M服务器从566.6元涨价到756元三年&#xff0c;3年轻量2核2G4M服务器从366.6元恢复到540元三年&#xff0c;大家抓紧吧&#xff0c;三年轻量已经库存已经不多了&#xff0c…

RHCSA --- 第二天

一、查看IP地址 [rootlocalhost ~] ip ad 对应四张网卡 第一张&#xff1a;环回网卡&#xff08;用于测试&#xff09; 第二张&#xff08;主要&#xff09;&#xff1a;以太网网卡&#xff08;ens160&#xff09; 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>…

若依分离版——配置多数据源(mysql和oracle),实现一个方法操作多个数据源

目录 一、若依平台配置 二、编写oracle数据库访问的各类文件 三. 一个方法操作多个数据源 一、若依平台配置 1、在ruoyi-admin的pom.xml添加依赖 <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version…

ElasticSearch 批量插入漏数据

项目场景&#xff1a; 项目中需要把Mysql数据同步到ElasticSearch中 问题描述 数据传输过程中数据不时出现丢失的情况&#xff0c;偶尔会丢失一部分数据&#xff0c;本地测试也无法复现&#xff0c;后台程序也没有报错&#xff0c;一到正式环境就有问题,很崩溃 这里是批量操…

mysql基于软件包升级

注意&#xff1a;无论是什么升级都是有风险的&#xff0c;升级前都需要做一次全备份。 mysql简单备份和恢复-CSDN博客 本文章以5.7升级为8.0为案例演示。 0、准备 1、安装mysql5.7&#xff0c;5.7版本mysql安装演示mysql-linux归档版安装-CSDN博客 2、在官网下载8.0压缩包M…

MySQL中表的增删改查

目录 一、CRUD 二、新增&#xff08;Create&#xff09; &#xff08;1&#xff09;语法 &#xff08;2&#xff09;单行数据全列插入 &#xff08;3&#xff09;多行数据指定列插入 三、查询&#xff08;Retrieve&#xff09; &#xff08;1&#xff09;语法 …

SortableJS:vuedraggable实现元素拖放排序

文档&#xff1a;https://sortablejs.github.io/Sortable/github&#xff1a;https://github.com/SortableJS/SortableVue2: https://github.com/SortableJS/Vue.DraggableVue3: https://github.com/SortableJS/vue.draggable.nextnpm https://www.npmjs.com/package/vuedragga…

k8s-服务网格实战-入门Istio

istio-01.png 背景 终于进入大家都比较感兴趣的服务网格系列了&#xff0c;在前面已经讲解了&#xff1a; 如何部署应用到 kubernetes服务之间如何调用如何通过域名访问我们的服务如何使用 kubernetes 自带的配置 ConfigMap 基本上已经够我们开发一般规模的 web 应用了&#xf…

c++-二叉树进阶

文章目录 前言一、二叉搜索树1、二叉搜索树介绍2、二叉搜索树循环实现3、二叉搜索树递归实现4、二叉搜索树的性能分析5、二叉搜索树的应用6、二叉树练习题6.1 根据二叉树创建字符串6.2 二叉树的层序遍历6.3 二叉树的层序遍历 II6.4 二叉树的最近公共祖先6.5 二叉搜索树与双向链…

ElasticSearch搜索技术深入与聚合查询实战

ES分词器详解 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 分词发生时…

R语言绘图-5-条形图(修改坐标轴以及图例等)

0. 说明&#xff1a; 1. 绘制条形图&#xff1b; 2. 添加文本并调整位置&#xff1b; 3. 调整x轴刻度的字体、角度及颜色&#xff1b; 4. 在导出pdf时&#xff0c;如果没有字体&#xff0c;该怎么解决问题&#xff1b; 1. 结果&#xff1a; 2. 代码&#xff1a; library(ggp…

文本批量处理,一键转换HTML文件编码,释放您的繁琐工作!

亲爱的用户&#xff0c;您是否曾经为需要手动转换HTML文件编码而耗费大量时间和精力而感到困扰&#xff1f;现在&#xff0c;我们为您提供了一款强大的文本批量处理工具&#xff01;让您一键将HTML文件编码进行转换&#xff0c;轻松释放您的繁琐工作&#xff01; 首先&#xf…

【带货案例】从美区十月带货达人身上寻找商品爆款秘诀!

2023只剩下最后两个月&#xff0c;年底也是各大商家冲刺卖货的黄金时期&#xff01; 带货过程中的一个重要环节即【达人营销】&#xff0c;背受跨境卖家关注。 下面选取美区十月带货达人TOP3&#xff0c;分析其带货秘诀。 据超店有数达人榜单显示&#xff1a;美区十月带货达人…

Qt中正确的设置窗体的背景图片的几种方式

Qt中正确的设置窗体的背景图片的几种方式 QLabel加载图片方式之一Chapter1 Qt中正确的设置窗体的背景图片的几种方式一、利用styleSheet设置窗体的背景图片 Chapter2 Qt的主窗口背景设置方法一&#xff1a;最简单的方式是通过ui界面来设置&#xff0c;例如设置背景图片方法二 &…

leetCode 198.打家劫舍 动态规划入门:从记忆化搜索到递推

leetCode 198.打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一…

LuaHttp库写的一个简单的爬虫

LuaHttp库是一个基于Lua语言的HTTP客户端库&#xff0c;可以用于爬取网站数据。与Python的Scrapy框架类似&#xff0c;LuaHttp库也可以实现网站数据的抓取&#xff0c;并且可以将抓取到的数据保存到数据库中。不过需要注意的是&#xff0c;LuaHttp库并不像Scrapy框架那样具有完…

3 数据库系统核心知识点

一、事务 先回顾一下事务的概念&#xff1a; 事务指的是满足 ACID 特性的一组操作&#xff0c;可以通过 Commit 提交一个事务&#xff0c;也可以使用 Rollback 进行回滚ACID 1. 原子性(Atomicity) 1.事务被视为不可分割的最小单元&#xff0c;事务的所有操作要么全部提交成…

pytorch dropout 置零 + 补偿性放缩

一句话概括&#xff1a;&#xff08;训练过程中&#xff09;Dropout 操作 随机置零 非置零元素进行后补偿性放缩。以保证dropout前后数据scale不变。 详细解释(来自chatgpt): 在 PyTorch 中&#xff0c;dropout 的操作不仅仅是将某些元素置零。为了确保期望输出在训练和测试…

Java NIO 编程

1. 简介 Java NIO 是 JDK 1.4 中引入的新的 IO 方式&#xff0c;它主要包含 Buffer、Channel、Selector 这三个核心的组件&#xff0c;它与传统 IO 的区别如下&#xff1a; NIO IO 面向缓冲 面向流 同步非阻塞 同步阻塞 多路复用&#xff08;选择器&#xff09; 无 1.1…