上次搭建了一个eureka注册中心,也搭建其他的模块注册到中心去
搭建业务模块地址
简介
Sprincloud组件可以用Gateway或者zuul,最早使用的是Zuul,后面Spring自己出了Gateway
网关的主要功能
1.限流(流量控制)
2.重试(请求失败时重试,慎用)
3.跨域(前后端不在一个域)
4.路由(转发请求)
5.鉴权(登录校验,签名校验)等
开始搭建
步骤
1.新建一个gateway模块
2.在pom中加入依赖
4.新建启动类
4.在application.properties注册进去
5.修改下日志文件
新建一个普通的maven项目,取名为gateway,或者其他名字,建议见名知意
依赖
<!-- gateway依赖 -->
<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>
启动类
package club.adger.gateway;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.core.env.Environment;
/**
* Created with IntelliJ IDEA.
*
* @Auther: Adger
* @Date: 2020/07/22/20:08
*/
@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"));
}
}
application.properties
# 应用名字
spring.application.name=gateway
# 因为是路由模块比较重要 其他模块 按照 8001 8002 这样排下去
server.port=8000
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
修改一下路径 value 是日志输出的路径 不要使用绝对路径,不是每个电脑又D盘F盘什么的 日志输出根据你的项目路径输出的
如果你使用的时windows 就比如你的项目在 D盘 你的日志文件输出就在D盘开始
-->
<property name="PATH" value="/log/cource/gateway"></property>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--打印 年月日 时分秒%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>
<!-- 输出级别 TRACE_FILE 输出到文件里面去 -->
<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>
启动发现成功
配置路由转发
单配置一个gateway没有什么作用 在application.properties配置文件中配置
# 应用名字
spring.application.name=gateway
# 因为是路由模块比较重要 其他模块 按照 8001 8002 这样排下去
server.port=8000
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
# 路由转发 这是一种固定的配置 第一个是转发到哪个模块的地址
spring.cloud.gateway.routes[0].id=system
# 地址
spring.cloud.gateway.routes[0].uri=http://127.0.0.1:8001
# 路由路径配置 只要是 带 /system 的就转发到这个地址上面去
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args[0]=/system/**
# 如果是多个路由转发 这样排下去 routes[2] 等
#spring.cloud.gateway.routes[1].id=system
#spring.cloud.gateway.routes[1].uri=http://127.0.0.1:8001
#spring.cloud.gateway.routes[1].predicates[0].name=Path
#spring.cloud.gateway.routes[1].predicates[0].args[0]=/system/**
在业务模块写上控制层测试类
package club.adger.system.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created with IntelliJ IDEA.
*
* @Auther: Adger
* @Date: 2020/07/22/20:31
* @RestController 像Restul 风格API的请求
*/
@RestController
public class Test {
@RequestMapping("/test")
public String test(){
return "test";
}
}
访问测试
在配置路由转发的时候路径写的是system路径,我们可以加上@RequestMapping("/system")这样写,但是我是在配置文件中配置的
业务模块配置文件的改动
# 应用名字
spring.application.name=system
# 路劲配置 必须 / 开头 不能 / 结尾
server.servlet.context-path=/system
server.port=8001
# 指向注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
然后重启所有服务,看路由配置有没有成功
发现本身的系统模块成功 8001端口为业务模块端口
发现转发成功 8000端口