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

news2024/10/6 2:28:28

这里写目录标题

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

在前文中我们实现了微服务的注册参考此文:
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: 9001
  tomcat:
    uri-encoding: UTF-8

spring:
  application:
    name: nacos-call

  cloud:
    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接口提供的调用方式
    @Autowired
    FeignInterface 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;

    @Override
    public void setEnvironment(Environment environment) {
        if(StringUtils.isBlank(System.getProperty("project.name"))){
            System.setProperty("project.name",applicationName);
        }
    }
}

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

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

相关文章

3.表格-常用属性:th、align、valign布局方式

常用属性:th/align/valign 1、th 标签 定义表格内的表头单元格。 HTML 表单中有两种类型的单元格&#xff1a; 表头单元格 - 包含表头信息&#xff08;由 th 元素创建&#xff09; 标准单元格 - 包含数据&#xff08;由 td 元素创建&#xff09; th 定义表头内容&#xff0c;元…

年底赶项目?买核心板送开发板!T113核心板2款芯片6种配置选择

全志T113系列芯片是目前比较受欢迎的国产入门级嵌入式工业芯片。米尔是基于T113芯片开发较早、提供配置最全的厂家&#xff0c;是目前唯一一家提供T113-S和T113-i两种芯片核心板的厂家。更好的消息是&#xff0c;T113-i的核心板兼容T113-S的核心板&#xff0c;同一个硬件设计&a…

BUUCTF FLAG 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 注意&#xff1a;请将 hctf 替换为 flag 提交&#xff0c;格式 flag{} 密文&#xff1a; 下载附件&#xff0c;得到一张.png图片。 解题思路&#xff1a; 1、因为附件是一张图片&#xff0c;先放到StegSolve中&…

Dual Personalization on Federated Recommendation

联合推荐的双重个性化 代码链接 论文链接 主要创新 文章的主要创新是提出了一种双重个性化机制&#xff0c;用于增强联邦推荐系统的性能。这种机制能够在联邦学习框架中为每个本地模型学习用户特定的物品嵌入&#xff0c;从而显著提升推荐系统的效果。通过在四个数据集上进行…

搜维尔科技:网球运动员使用Xsens寻求精确的动作捕捉

就像其他一些运动一样,近年来网球迷们没有机会去参加许多真正优秀的模拟游戏,所以当一个人出现并承诺有这种体验时,很难不激动。开发者圆环游戏 匹配点:网球锦标赛 现在,我们承诺在单一支付者和多人组成部分的球场上有一个坚实的经验,我们对游戏和游戏的内部和外部都很好奇,我…

C#知识总结 基础篇(上)

本篇内容参考C#图解教程 本篇内容偏向基础&#xff0c;适合0基础的朋友快速上手&#xff0c;也适合有一定C语言&#xff08;或其他语言如C,java&#xff09;基础的人快速上手C#。同时适合unity引擎的初学者&#xff0c;更加详细的了解C#语言。 本文内容基本涵盖C#基础内容&am…

UG\NX二次开发 超长的对象属性值,怎么设置

文章作者:里海 来源网站:里海NX二次开发3000例专栏 感谢粉丝订阅 感谢 Dr. Lin 订阅本专栏,非常感谢。 简介 使用UF_ATTR_assign设置对象属性,如果属性值超过UF_ATTR_MAX_STRING_LEN则会报错。 #define UF_ATTR_MAX_STRING_LEN 132 怎么办呢?下面这种方法可以解决: 效果 …

从 Java 到 Rust,Substrate 优秀学员亲述 Web3 入门之路

你知道如何从 0 到 1 转行 Web3&#xff0c;找到技术开发岗位的一席之地吗&#xff1f;从后端核心开发到 Web3 测试&#xff0c;Substrate 课程优秀学员的区块链探索之路有哪些心得体会&#xff1f;10 月 26 日晚 20:00&#xff0c;第二期 Block Space 成长路径系列主题 AMA 活…

【el-cascader-panel】组件el-cascader-panel使用踩坑

需求背景&#xff1a;角色管理资源&#xff0c;资源返回树形结构数据&#xff0c;左侧树形展示列表可查询&#xff0c;右侧勾选资源权限平铺。 本身组件不支持全选&#xff0c;所以增加了全选按钮。覆写了级联面板宽度。可传只勾选code或者顺序当前节点二维数组列表。 效果 因…

Web测试是什么,有何特点?

Web测试是指对Web应用程序进行验证和评估的过程&#xff0c;以确保其功能、性能和安全性符合预期。 Web测试具体包括以下几个方面的内容&#xff1a; 功能测试&#xff1a;验证Web应用程序是否按照需求规格说明书中定义的功能正常工作。功能测试包括输入验证、表单提交、页面导…

【Jmeter】自动化测试实施

前言&#xff1a; Jmeter是目前最流行的一种测试工具&#xff0c;基于此工具我们搭建了一整套的自动化方案&#xff0c;包括了脚本添加配置、本地配置和运行、服务器配置等内容&#xff0c;完成了自动化测试闭环&#xff0c;通过这种快捷简便高效的方式&#xff0c;希望可以解…

【算法 | 哈希表 No.2】leetcode 219. 存在重复元素II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

聊聊我对AI Agents技术的一些看法

小伙伴们&#xff01;我来兑现承诺啦&#xff5e; ps&#xff1a;接下来期待什么内容&#xff0c;欢迎在评论区留言&#xff01; 今天&#xff0c;我们就来聊聊大模型 Agent。 最近这几个月&#xff0c;Agent 这一概念可谓火出天际&#xff0c;从 AutoGPT 一周 6 万 star 刷新…

桥和割点,以及图的遍历树

目录 什么是桥 寻找桥的算法 代码实现 什么是割点 ​寻找割点的算法 代码实现 什么是桥 寻找桥的算法 代码实现 import java.util.ArrayList;public class FindBridges {private Graph G;private boolean[] visited;private int ord[];private int low[];private int cnt…

在钣金加工领域,迅镭激光切割机广泛使用的原因和优点何在?

激光切割工艺和激光切割设备正在被广泛的板材加工企业逐渐理解并接受&#xff0c;凭借其高效率的加工、高精度的加工、优质的切割断面、三维切割能力等诸多优势&#xff0c;逐步取代了传统的钣金切割设备。 苏州迅镭激光科技有限公司推出的激光切割设备的柔性化程度高&#xff…

Vue3 如何在<script setup>里设置组件name属性

Vue3 如何在<script setup>里设置组件name属性 文章目录 Vue3 如何在\<script setup>里设置组件name属性一、Vue组件中 name 的用处二、难看但实用的方法三、使用第三方插件支持安装插件插件基本配置插件基本使用 四、Vue官方解决方法4.1 Vue3.3版本之前安装插件插…

世界坐标系的正方体投影到二维视角【python实验】

为了更进一步理解相机内外参数对应的几何意义&#xff0c;特意设计了一个Python实验。希望对相关初学者有帮助。 实验思路&#xff1a;在世界坐标系上构建一个正方体&#xff0c;然后通过相机内外参数矩阵映射到屏幕坐标系上&#xff0c;观察映射结果。 实验素材&#xff1a;两…

[创业之路-85]:创业公司如何办理云服务器(PaaS)

目录 一、云服务 1.1 云服务器类型 1.2 云服务案例 二、搭建云服务器的基本步骤 二、云服务的架构&#xff08;架构&#xff09; 2.1 层次架构 2.2 云平台统一管理功能 2.3 管理工具 一、云服务 1.1 云服务器类型 云服务&#xff08;Cloud Services&#xff09;是一种…

Notes/Domino中的JVM版本

大家好&#xff0c;才是真的好。 这篇内容主要写给同时关注Domino和Java的技术人员。 很多人都知道&#xff0c;从Notes/Domino R5&#xff08;1999年&#xff09;版本&#xff0c;开始自带一个Java虚拟机&#xff0c;用来支持Java应用运行。但很多人不知道&#xff0c;这个J…