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

 

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

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

spring官网下载spring cloud项目

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

 

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

打开刚下载的项目

 

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

 

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

git init

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

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

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

 

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

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

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

2.2 选择maven项目,下一步。

创建一个子模块eureka

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文件夹已经不见了删除了。

EurekaApplication.java的内容: 
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:

spring.application.name=eureka
server.port=8761
#自己本身就是注册中心,无需获取注册信息 和 注册到注册中心
eureka.client.fetch-registry=false
eureka.client.register-with-eureka=false

logback.xml: 

<?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文件中新增依赖。

<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:

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中拷贝,唯一修改的地方是:

<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,具体内容如下。

@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模块,具体代码如下。

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路由功能。

server.servlet.context-path=/system

 

3.6 提交代码到git(可选)

 

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

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

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

<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

spring.application.name=gateway
server.port=9000
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

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

<property name="PATH" value="/Users/zp/Desktop/personal/log/cn/itcats/gateway"></property>

 

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

@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文件中增加以下内容即可

#路由转发 如果有多个,则修改数组下标
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项目的所有步骤已经介绍完毕。

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐