01 基础环境准备
02 一文读懂Eureka
03 Zookeeper注册中心
04 Consule注册中心
05 Ribbon
06 OpenFegin
07 Hystrix全面解析
08 Gateway全面解析
09 Config配置中心
10 Bus消息总线
Spring Cloud Gateway是 Spring Cloud的个全新项目,基于 Spring5.0+ Spring Boot2.0和 Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。
Spring Cloud Gateway作为 Spring Cloud生态系统中的网关,目标是替代Zuul,在 Spring Cloud2.0以上版本中,没有对新版本的Zuul2.0以上最新高性能版本进行集成,仍然还是使用的Zu1x非 Reactor模式的老版本。而为了提升网关的性能, Spring Cloud Gateway是基于 Webfluxi框架实现的,而 Nebflux框架底层则使用了高性能的 Reactor模式通信框架Netty。Spring Cloud Gatewayf的目标提供统一的路由方式目基于 Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
路由:路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配。
断言:Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。
过滤器:一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。
(1) pom
org.springframework.cloud
spring-cloud-starter-gateway
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.projectlombok
lombok
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
junit
junit
org.apache.commons
commons-lang3
org.springframework.boot
spring-boot-starter-test
com.zrs.springcloud
commons
1.0-SNAPSHOT
(2) application.yml
server:
port: 9002
spring:
application:
name: gateway-cloud
cloud:
gateway:
routes:
#id:实例唯一ID;uri:真实服务地址;predicates:断言匹配;
- id: provider-route
uri: http://localhost:9000
predicates:
- Path=/ribbon/**
eureka:
instance:
#服务名称
hostname: gateway-cloud
client:
serviceUrl:
#eureka注册中心地址
defaultZone: http://localhost:7000/eureka/ #配置URL
#是否将自己注册到EurekaServer
register-with-eureka: true
#是否从EurekaServer获取已有的注册服务
fetch-registry: true
(3) 启动类
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class);
}
}
(4) 启动 Eureka、payment、paymentSlave、gateway
(5) 测试
创建GatewayConfig配置文件,实现访问跳转腾讯Nba
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customerRouteLocator(RouteLocatorBuilder builder){
RouteLocatorBuilder.Builder routes = builder.routes();
routes.route("nba",r->r.path("/nba").uri("https://sports.qq.com/nba/")).build();
return routes.build();
}
}
server:
port: 9002
spring:
application:
name: gateway-cloud
cloud:
#从注册中心动态创建路由
gateway:
discovery:
locator:
enabled: true
routes:
#id:实例唯一ID;uri:真实服务地址;predicates:断言匹配;
- id: provider-route
uri: lb://PROVIDER-PAYMENT-SERVICE
predicates:
- Path=/ribbon/**
eureka:
instance:
#服务名称
hostname: gateway-cloud
client:
serviceUrl:
#eureka注册中心地址
defaultZone: http://localhost:7000/eureka/ #配置URL
#是否将自己注册到EurekaServer
register-with-eureka: true
#是否从EurekaServer获取已有的注册服务
fetch-registry: true
5.2 启动provider-slave、gateway服务
(1) 配置解析
-After : 之后访问 例:- After=2017-01-20T17:42:47.789-07:00[America/Denver]
-Before: 之前访问 例:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
-Between: 之间访问 例:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
(2) 编写中文获取时间测试类
public class TimeTest {
public static void main(String[] args) {
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
}
}
(3) 测试Before
修改application.yml配置文件
predicates:
- Path=/ribbon/**
- Before=2020-03-15T14:06:31.701+08:00[Asia/Shanghai]
6.2 Cookie
(1) 配置,此规则会根据Cookie name的值和正则表达式去匹配,匹配上执行路由,匹配不上不执行。
(2) 修改application.yml
predicates:
- Path=/ribbon/**
- Cookie=username,zrs
(3) 测试
curl http://localhost:9002/ribbon/server --cookie "username=zrs"
curl http://localhost:9002/ribbon/server
6.3 Header
(1) 如果请求有一个名为X-request-Id的头,并且该头的值与\d+正则表达式匹配
(2) 修改application.yml
predicates:
- Path=/ribbon/**
- Header=X-Request-Id, \d+
(3) 测试
curl http://localhost:9002/ribbon/server -H "X-Request-Id:1234"
curl http://localhost:9002/ribbon/server
7 过滤器
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滅器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由 Gateway Filterf的工厂类来产生。
7.1 创建配置文件@Component
public class GatewayFilterConfig implements GlobalFilter, Ordered {
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String username = exchange.getRequest().getQueryParams().getFirst("username");
if (StringUtils.isBlank(username)){
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
7.2 重启测试
#分支Gateway-enviroment-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-hoxton