1.gateway和zuul
Spring Cloud Finchley版本的gateway比zuul 1.x系列的性能和功能整体要好,且使用 Gateway 做跨域相比应用本身或是 Nginx 的好处是规则可以配置的更加灵活.
这两者相同的地方就是都是作为网关,处理前段的请求,可以进行路由到对应的服务或者url,也可以针对权限做过滤处理,也可以对其他服务响应的结果做处理
截至目前SpringCloud gateway最新版本是2.1.0 RC3,可见官方网站SpringCloud gateway,每个版本增加的功能都比较多,改动的地方也比较多,前几个版本有比较坑的地方,建议使用最新版本
2.使用gateway的路由功能
1. 搭载springcloud gateway
准备一个spring cloud工程,包括eureka-server注册中心,service-client服务提供者,端口8090
service-client提供一个接口:
@RestController
@Slf4j
public class ProducerController {
@RequestMapping("/hi")
public String hi(@RequestParam String name) {
log.info("[client服务] [hi方法]收到请求");
return "hi " + name + ",i am from service-client";
}
}
再建一个spring cloud工程,service-gateway网关,端口8088
pom的依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<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>
application启动类:
package com.zgd.springcloud.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
这样基本的框架就搭好了,先启动eureka-server注册中心,再启动service-client和service-gateway
直接调用 localhost:8090/hi?name=zgd,可以收到
hi zgd,i am from service-client
2.简单使用gateway
GateWay大体可以分为路由工厂Route Predicate Factories,网关过滤器工厂GatewayFilter Factories,全局过滤器工厂Global Filters处理请求。
对于路由转发,Spring Cloud gateway内置了很多校验条件谓语(predicate)来实现路由功能。
比如
- 根据时间来路由: After Route Predicate Factory某个时间点之后请求路由,Before Route Predicate Factory某个时间点之前请求路由,Between Route Predicate Factory两者时间之间
- 通过请求路径来路由: Path Route Predicate Factory
- 根据请求头来路由
- 根据cookie来路由
- 根据域名来路由
有两种方式配置,一种是配置文件application的方式,一种是代码配置
1.application配置
a. 路由到其他地址
spring:
cloud:
gateway:
#可以根据请求参数,cookie,host,请求时间,请求头等进行校验判断路由, 下面根据先后顺序转发
routes:
- id: host_route
uri: http://httpbin.org:80/get
predicates:
- Path=/zzzgd*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close",
"Cookie": "SL_G_WPT_TO=zh; SL_GWPT_Show_Hide_tmp=undefined; SL_wptGlobTipTmp=undefined",
"Forwarded": "proto=http;host=\"localhost:8088\";for=\"0:0:0:0:0:0:0:1:55782\"",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
"X-Forwarded-Host": "localhost:8088"
},
"origin": "0:0:0:0:0:0:0:1, 119.147.213.42",
"url": "http://localhost:8088/get?name=zgd"
}
上面的是根据地址来路由,还有下面多种路由配置:
根据域名来转发路由:
routes:
- id: host_route
uri: http://httpbin.org:80/get
predicates:
- Host=**.csdn.** # 请求域名携带csdn的,则转发
- id: query_route
uri: http://httpbin.org:80/get
predicates:
- Query=username, zzz* # 请求参数含有username,且值满足zzz开头的,则转发(对值的匹配可以省略)
- id: header_route
uri: http://httpbin.org:80/get
predicates:
- Header=request, \d+ # 如果请求头含有request,且为数字,则转发
- id: cookie_route
uri: http://httpbin.org:80/get
predicates:
- Cookie=name, zzzgd # 如果携带cookie,参数名为name,值为zzzgd,则转发
- id: path_route
uri: http://httpbin.org:80/get
predicates:
- Path=/zzzgd
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/fluent/**").and().query("name")
.uri("http://httpbin.org:80/get"))
.build();
}
}
启动,访问
http://localhost:8088/fluent/1/?name=bb
成功!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。