首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Maven搭建SpringCloud项目(eureka、gateway、路由转发)【无敌详细图文】

Maven搭建SpringCloud项目(eureka、gateway、路由转发)【无敌详细图文】

作者头像
Java架构师必看
发布于 2021-05-14 09:40:03
发布于 2021-05-14 09:40:03
2K00
代码可运行
举报
文章被收录于专栏:Java架构师必看Java架构师必看
运行总次数:0
代码可运行

本文将向读者介绍如果使用Maven搭建SpringCloud项目,基于父子模块结构,搭建eureka注册中心模块/业务模块/路由网关gateway模块,图文并茂超级详细,傻瓜式教学。

一 、下载最基本的spring cloud项目

1.1 进入spring官网下载项目:https://start.spring.io/

选择项,如图所示,最后添加一个Eureka Server依赖,最后点击GENERATE按钮,下载到本地并解压

1.2 打开IDEA, 点击open按钮,选择刚才下载的项目,比如我的文件名就叫itcats,打开即可

1.3 打开IDEA后,项目还未初始化完成,点击右下角的import change导入相关依赖,直到项目初始化完成

1.4 先不着急写代码,把项目加入到git管理(可选步骤,需要电脑安装git),点击Terminal按钮,输入命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git init

提交(commit)代码到本地git,如图所示。

具体选项如图所示,最后点击提交。

此时我们的项目就托管给git管理了。

二、创建父子项目模块(Eureka)

2.1 此时我们已经完成了项目的初始化,现在创建父子模块,父模块不涉及业务逻辑,以创建eureka子模块为例。

基于本项目,新建一个Module。

2.2 选择maven项目,下一步。

2.3 输入模块的名称。

2.4 选择finish按钮,并将该模块添加到git管理。

点击Import Changes添加相关依赖。 

2.5 将原来父模块itcats中eureka相关的pom依赖,迁移到eureka子模块中。

父模块中的eureka-server删除,剪切到子模块eureka的pom.xml中,实现功能模块的分离。

2.6 在eureka模块的src/main/java下创建包cn.itcats.eureka,并创建启动类EurekaApplication,并且删除父模块itcats的src文件夹,如图所示,父模块的src文件夹已经不见了删除了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
EurekaApplication.java的内容: 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.Environment;

@SpringBootApplication
public class EurekaApplication {

	private static final Logger LOG = LoggerFactory.getLogger(EurekaApplication.class);

	public static void main(String[] args) {
		SpringApplication app = new SpringApplication(EurekaApplication.class);
		Environment env = app.run(args).getEnvironment();
		LOG.info("启动成功!!");
		LOG.info("Eureka地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));
	}
}

2.7 在eureka的resources目录下创建两个文件application.properties和logback.xml

内容如下:

application.properties:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.application.name=eureka
server.port=8761
#自己本身就是注册中心,无需获取注册信息 和 注册到注册中心
eureka.client.fetch-registry=false
eureka.client.register-with-eureka=false

logback.xml: 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 根据自己需求修改一下路径-->
    <property name="PATH" value="/Users/zp/Desktop/personal/log/cn/itcats/eureka"></property>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
<!--            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %blue(%-50logger{50}:%-4line) %msg%n</Pattern>-->
            <Pattern>%d{ss.SSS} %highlight(%-5level) %blue(%-30logger{30}:%-4line) %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/trace.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${PATH}/trace.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <layout>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-8X{UUID}) %msg%n</pattern>
        </layout>
    </appender>

    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${PATH}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${PATH}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <layout>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-8X{UUID}) %msg%n</pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <root level="ERROR">
        <appender-ref ref="ERROR_FILE" />
    </root>

    <root level="TRACE">
        <appender-ref ref="TRACE_FILE" />
    </root>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

2.8 在EurekaApplication.java中加入注解@EnableEurekaServer,表示启用Eureka注册中心服务

2.9 右键 'Run EurekaApplication.java',看到日志启动成功,打开http://127.0.0.1:8761,显示页面则表示eureka服务启动成功。

2.10 提交修改到git(可选)

三、新建一个子模块用于系统业务

3.1 步骤同2.1到2.4,module名称为system。

3.2 因为system模块需要注册到eureka中,所以它是一个eureka client,而不是一个eureka server,在system模块的pom文件中新增依赖。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

</dependencies>

3.3 与上文的2.7同理,在system的resources目录下创建两个文件application.properties和logback.xml,内容如下。

application.properties:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.application.name=system
server.port=9001
#表示将system模块注册到eureka server 
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
server.servlet.context-path=/system

logback.xml从eureka中拷贝,唯一修改的地方是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<property name="PATH" value="/Users/zp/Desktop/personal/log/cn/itcats/system"></property>

3.4 在system模块中新建包cn.itcats.system,并创建启动类SystemApplication.java,内容从EurekaApplication.java中拷贝。

唯一不同的是注解从@EnableEurekaServer改为了@EnableEurekaClient,具体内容如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
@EnableEurekaClient
public class SystemApplication {

	private static final Logger LOG = LoggerFactory.getLogger(SystemApplication.class);

	public static void main(String[] args) {
		SpringApplication app = new SpringApplication(SystemApplication.class);
		Environment env = app.run(args).getEnvironment();
		LOG.info("启动成功!!");
		LOG.info("System地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));
	}
}

右键 'Run SystemApplication',注意EurekaApplication不能停掉哦,不然会报错。

打开http://127.0.0.1:8761/,发现system已经注册到eureka server中了,如图所示。

3.5 在system模块中,创建测试类SuccessController,重启system模块,具体代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package cn.itcats.system.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SuccessController {
    @RequestMapping("/success")
    public String success(){
        return "success";
    }
}

打开浏览器输入:http://127.0.0.1:9001/system/success,页面返回success。之所以有/system,是因为我们在system模块的application.properties文件中设置了如下内容,表示该模块已/system开头,便于后面的gateway路由功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server.servlet.context-path=/system

3.6 提交代码到git(可选)

四、新建一个子模块用于网关gateway服务

4.1 步骤同2.1到2.4,module名称为gateway。

4.2 在gateway子模块的pom.xml文件中添加依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
</dependencies>

4.3 与上文的3.3同理,在gateway的resources目录下创建两个文件application.properties和logback.xml,将system中的文件拷贝,内容如下

application.properties

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.application.name=gateway
server.port=9000
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

logback.xml从system中拷贝,唯一修改的地方是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<property name="PATH" value="/Users/zp/Desktop/personal/log/cn/itcats/gateway"></property>

4.4 在gateway模块中新建包cn.itcats.gateway,并创建启动类GatewayApplication.java,内容从SystemApplication.java中拷贝。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {

	private static final Logger LOG = LoggerFactory.getLogger(GatewayApplication.class);

	public static void main(String[] args) {
		SpringApplication app = new SpringApplication(GatewayApplication.class);
		Environment env = app.run(args).getEnvironment();
		LOG.info("启动成功!!");
		LOG.info("Gateway地址: \thttp://127.0.0.1:{}", env.getProperty("server.port"));
	}
}

4.5 启动GatewayApplication.java,打开http://127.0.0.1:8761/,发现GATEWAY已注册。

4.6 提交代码到git(可选)

五、gateway模块设置路由转发

5.1 路由转发,仅需要在gateway的application.properties文件中增加以下内容即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#路由转发 如果有多个,则修改数组下标
spring.cloud.gateway.routes[0].id=system
spring.cloud.gateway.routes[0].uri=http://127.0.0.1:9001
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args[0]=/system/**
#spring.cloud.gateway.routes[0].filters[0].name=LoginAdmin
#spring.cloud.gateway.routes[0].filters[0].args[0]=true

5.2 验证路由转发

原来访问SuccessController通过访问:http://127.0.0.1:9001/system/success

如果引入路由转发,则只需要访问:http://127.0.0.1:9000/system/success

目的:将9001地址隐藏(生产环境下可能是公网地址),只暴露9000的gateway地址

至此,Maven搭建SpringCloud项目的所有步骤已经介绍完毕。

本文来源itcats_cn,由javajgs_com转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘「建议收藏」
成功解决AttributeError: ‘str’ object has no attribute ‘decode’
全栈程序员站长
2022/09/16
3.9K0
成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘「建议收藏」
【Python】已解决:AttributeError: ‘str‘ object has no attribute ‘decode‘
在Python 3的开发过程中,开发者可能会遇到AttributeError: ‘str‘ object has no attribute ‘decode‘的错误。这个错误通常发生在处理字符串编码和解码时,尤其是在将Python 2的代码迁移到Python 3时。Python 2和Python 3在字符串处理上的一些差异是导致该问题的根源。
屿小夏
2024/08/29
1.3K0
如何解决 Python 2 到 Python 3 的迁移过程中报错 AttributeError: ‘str‘ object has no attribute ‘decode‘ 问题的解决方案大全
在 Python 编程过程中,AttributeError: 'str' object has no attribute 'decode' 是一个常见的错误。这通常会在处理字符串时出现,尤其是在 Python 2 到 Python 3 的迁移过程中。本文将详细介绍该问题的根源,并提供解决方案。
猫头虎
2025/04/02
2190
解决方案:TypeError: a bytes-like object is required, not 'str'
在Python编程中,我们有时会遇到一个常见的错误:TypeError: a bytes-like object is required, not 'str'。这个错误通常在处理文件、网络传输或加密解密等场景中出现。本文将带您深入了解这个错误的原因,并提供解决方案。
大盘鸡拌面
2023/12/14
3.4K0
AttributeError: ‘bytes‘ object has no attribute ‘encode‘异常解决方案
AttributeError: 'bytes' object has no attribute 'encode'是:“字节”对象没有属性的编码的意思。
红目香薰
2022/11/30
3K0
AttributeError: ‘bytes‘ object has no attribute ‘encode‘异常解决方案
python--一文搞懂字符串的编解码
我们在使用python处理中文字符串时总会遇到一些问题,特别是一些老项目需要用到python2,中文显示乱码,文件读写异常等问题时常发生。
languageX
2023/05/04
1.8K0
彻底弄懂python编码
  在编写python程序的过程中,中英文混用经常会出现编码问题。围绕此问题,本文首先介绍编码的含义及常用编码,随后列举几个python经常遇到的编码异常及解决方法,接着列举笔者在实践中遇到的异常出现的情景及原因,最后针对编码问题提出最佳实践。
py3study
2020/01/19
8680
彻底弄懂python编码
Python3 大作战之 encode 与 decode 讲解
原文链接http://blog.csdn.net/qq_29053519/article/details/79170519 大家好,很久没更新了,也是年底了最近比较忙,同时也在研究python的其他内容,毕竟是python小白,自学道路艰难。 好了今天和大家一起探讨下python3编码过程中对的一些转码事宜。 python3中对文本和二进制做了比较清晰的区分。python3默认编码为unicode,由str类型进行表示。二进制数据使用byte类型表示,所以不会将str和byte混在一起。在实际应用中我们经常
CDA数据分析师
2018/02/08
9210
讲解TypeError: a bytes-like object is required, not 'str'
在 Python 编程中,当我们遇到以下错误消息时:TypeError: a bytes-like object is required, not 'str',意味着代码尝试将一个字符串传递给需要字节型对象的函数或方法。本文将详细解释这个错误的原因,并提供一些解决方法。
大盘鸡拌面
2023/12/14
1.5K0
python的str,unicode对象的encode和decode方法
python的str,unicode对象的encode和decode方法  python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byte[]。  而python中的unicode对象应该才是等同于java中的String对象,或本质上是java的char[]。  对于 
bear_fish
2018/09/20
2.1K0
有史以来最全的异常类讲解没有之一!第三部分爆肝4万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第三部分
下面的代码尝试通过修改 Python 的内部数据结构来模拟触发 SystemError 的场景。请注意,这种做法是非常危险和不推荐的,因为它可能导致 Python 解释器崩溃或行为异常。
小白的大数据之旅
2024/11/20
7430
有史以来最全的异常类讲解没有之一!第三部分爆肝4万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第三部分
TypeError: a bytes-like object is required, not ‘str‘ - 完美解决方法
在Python开发中,TypeError: a bytes-like object is required, not ‘str’ 是一个常见的错误,尤其在处理文件、网络通信、数据加密等需要字节操作的场景。本文将深入探讨该错误产生的原因,并提供多种解决方案,帮助开发者快速定位并解决此问题。本文适合新手和中级开发者阅读,并包含详细的代码示例与常见场景分析。通过本文,您将能够彻底掌握如何在Python中正确处理字节和字符串。
默 语
2024/11/22
8990
软件测试|深入理解Python的encode()和decode()方法
在Python中,字符串是不可变的序列对象,它由Unicode字符组成。当我们需要在字符串和字节之间进行转换时,Python提供了两个非常重要的方法:encode()和decode()。这两个方法允许我们在Unicode字符和字节之间进行相互转换,以便在处理文本和二进制数据时更加灵活。在本文中,我们将深入探讨Python中的encode()和decode()方法,并了解它们的用法和注意事项。
霍格沃兹测试开发Muller老师
2023/10/25
9250
Python encode和decode
今天在写一个StringIO.write(int)示例时思维那么一发散就拐到了字符集的问题上,顺手搜索一发,除了极少数以外,绝大多数中文博客都解释的惨不忍睹,再鉴于被此问题在oracle的字符集体系中蹂躏过,因此在过往笔记的基础上增删了几个示例贴出来。
py3study
2020/01/19
1.9K1
decode函数
在 Python 中,decode() 是字符串或字节序列的方法,通常用于将字节数据(bytes)转换成字符串(str)类型。具体来说,它的作用是将字节序列按照指定的字符编码格式解码为字符串。
用户3672714
2025/07/30
1730
python2.7 的中文编码处理,解决UnicodeEncodeError: 'ascii' codec can't encode character 问题
最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 为了解决问题,我花时间去研究了一下 Python 的字符编码处理。网上也有不少文章讲 Python 的字符编码,但是我看过一遍,觉得自己可以讲得
用户1214487
2018/05/28
16.5K0
python decode encode
为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。
py3study
2020/01/10
3K0
python字符串编码及乱码解决方案
http://blog.csdn.net/pipisorry/article/details/44136297
全栈程序员站长
2022/09/06
2.4K0
python字符串编码及乱码解决方案
str、bytes和bytearray编码
str是字符数据,bytes和bytearray是字节数据。它们都是序列,可以进行迭代遍历。str和bytes是不可变序列,bytearray是可变序列,可以原处修改字节。
狼啸风云
2019/12/10
1.5K0
str、bytes和bytearray编码
【详解】Python3.6SocketTypeError:abytes-likeobjectisrequired,not'str'
在使用Python进行网络编程时,​​socket​​模块是一个非常重要的工具。它提供了低级别的网络接口,用于实现客户端和服务器之间的通信。然而,在使用Python 3.6的​​socket​​模块时,你可能会遇到一个常见的错误:​​TypeError: a bytes-like object is required, not 'str'​​。本文将探讨这个错误的原因,并提供解决方法。
大盘鸡拌面
2025/05/11
2190
推荐阅读
相关推荐
成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档