項(xiàng)目示例 - 3.服務(wù)網(wǎng)關(guān) - 3.Gateway
關(guān)聯(lián)知識(shí):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-839634.html
- 分布式微服務(wù) - 3.服務(wù)網(wǎng)關(guān) - 4.Gateway
內(nèi)容提要:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-839634.html
- 基本使用
- 自定義斷言
- 自定義局部、全局過(guò)濾器
基本使用
- 建Module:微服務(wù)起名為gateway-server
- 改pom:引入以下依賴
<dependencies>
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--Nacos服務(wù)注冊(cè)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
- 寫yml:在resources目錄下創(chuàng)建application.yml文件,并做以下配置
server:
port: 80
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
# nacos的地址
server-addr: localhost:8848
gateway:
discovery:
locator:
# 從服務(wù)注冊(cè)中心根據(jù)別名來(lái)進(jìn)行路由
enabled: true
routes:
# 路由Id,自定義,唯一即可
- id: nacos-provider-test
# 成功匹配后,要轉(zhuǎn)換成的路由地址(配合服務(wù)注冊(cè)中心使用別名)
uri: lb://nacos-provider
# 成功匹配后,要轉(zhuǎn)換成的路由地址(不配合服務(wù)注冊(cè)中心)
#uri: http://localhost:8001
# 斷言
predicates:
# 路徑匹配的進(jìn)行路由
- Path=/**
- 主啟動(dòng):在src下創(chuàng)建如下主啟動(dòng)類
package learn.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayServer {
public static void main(String[] args) {
SpringApplication.run(GatewayServer.class, args);
}
}
- 測(cè)試:
- 啟動(dòng)nacos,能正常打開nacos首頁(yè)
- 啟動(dòng)nacos-provider微服務(wù),瀏覽器訪問(wèn)
localhost:8001/nacos/provider/test
接口,能正常返回信息,且在nacos服務(wù)列表中可看到成功注冊(cè) - 啟動(dòng)本微服務(wù)后,瀏覽器訪問(wèn)
localhost/nacos/provider/test
接口,能正常返回信息
自定義斷言
- 創(chuàng)建自定義斷言類:
package learn.demo.config;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
@Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> {
public CustomRoutePredicateFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("key", "value");
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return new Predicate<ServerWebExchange>() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
List<String> strings = serverWebExchange.getRequest().getHeaders().get(config.key);
if (strings==null || strings.isEmpty())
return false;
return config.value.equals(strings.get(0));
}
};
}
public static class Config {
private String key;
private String value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}
- application.yml中配置斷言:
server:
port: 80
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
# nacos的地址
server-addr: localhost:8848
gateway:
discovery:
locator:
# 從服務(wù)注冊(cè)中心根據(jù)別名來(lái)進(jìn)行路由
enabled: true
routes:
# 路由Id,自定義,唯一即可
- id: nacos-provider-test
# 成功匹配后,要轉(zhuǎn)換成的路由地址(配合服務(wù)注冊(cè)中心使用別名)
uri: lb://nacos-provider
# 成功匹配后,要轉(zhuǎn)換成的路由地址(不配合服務(wù)注冊(cè)中心)
#uri: http://localhost:8001
# 斷言
predicates:
# 路徑匹配的進(jìn)行路由
- Path=/**
- Custom=test, a
- 測(cè)試:
- 啟動(dòng)nacos,能正常打開nacos首頁(yè)
- 啟動(dòng)nacos-provider微服務(wù),瀏覽器訪問(wèn)
localhost:8001/nacos/provider/test
接口,能正常返回信息,且在nacos服務(wù)列表中可看到成功注冊(cè) - 啟動(dòng)本微服務(wù)后,API工具訪問(wèn)
localhost/nacos/provider/test
接口,返回404。在header中,攜帶key為test、value為a的參數(shù)后再次訪問(wèn),可以正常返回信息。
自定義過(guò)濾器
自定義局部過(guò)濾器
- 創(chuàng)建自定義過(guò)濾器類:
package learn.demo.config;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.List;
@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.Config> {
public CustomGatewayFilterFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("key", "value");
}
@Override
public GatewayFilter apply(Config config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// pre操作
String pre;
List<String> strings = exchange.getRequest().getHeaders().get("pre");
if (strings==null || strings.isEmpty())
pre="no args";
else
pre=strings.get(0);
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 異步post操作
exchange.getResponse().getHeaders().set(config.key, pre+" | "+config.value);
}));
}
};
}
public static class Config {
private String key;
private String value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}
- 添加配置:
server:
port: 80
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
# nacos的地址
server-addr: localhost:8848
gateway:
discovery:
locator:
# 從服務(wù)注冊(cè)中心根據(jù)別名來(lái)進(jìn)行路由
enabled: true
routes:
# 路由Id,自定義,唯一即可
- id: nacos-provider-test
# 成功匹配后,要轉(zhuǎn)換成的路由地址(配合服務(wù)注冊(cè)中心使用別名)
uri: lb://nacos-provider
# 成功匹配后,要轉(zhuǎn)換成的路由地址(不配合服務(wù)注冊(cè)中心)
#uri: http://localhost:8001
# 斷言
predicates:
# 路徑匹配的進(jìn)行路由
- Path=/**
- Custom=test, a
filters:
- Custom=post,test
- 測(cè)試:
- 啟動(dòng)nacos,能正常打開nacos首頁(yè)
- 啟動(dòng)nacos-provider微服務(wù),瀏覽器訪問(wèn)
localhost:8001/nacos/provider/test
接口,能正常返回信息,且在nacos服務(wù)列表中可看到成功注冊(cè) - 啟動(dòng)本微服務(wù)后,API工具訪問(wèn)
localhost/nacos/provider/test
接口,返回404。在header中,攜帶key為test、value為a的參數(shù)后再次訪問(wèn),可以正常返回信息,查看響應(yīng)頭中有key為post、value為no args | test的參數(shù)。
自定義全局過(guò)濾器
- 創(chuàng)建自定義過(guò)濾器類:
package learn.demo.config;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// pre操作
String pre;
List<String> strings = exchange.getRequest().getHeaders().get("pre");
if (strings==null || strings.isEmpty())
pre="no args";
else
pre=strings.get(0);
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 異步post操作
exchange.getResponse().getHeaders().set("post", pre+" | test");
}));
}
// 值越小,優(yōu)先級(jí)越高
@Override
public int getOrder() {
return 0;
}
}
- 修改配置文件:
server:
port: 80
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
# nacos的地址
server-addr: localhost:8848
gateway:
discovery:
locator:
# 從服務(wù)注冊(cè)中心根據(jù)別名來(lái)進(jìn)行路由
enabled: true
routes:
# 路由Id,自定義,唯一即可
- id: nacos-provider-test
# 成功匹配后,要轉(zhuǎn)換成的路由地址(配合服務(wù)注冊(cè)中心使用別名)
uri: lb://nacos-provider
# 成功匹配后,要轉(zhuǎn)換成的路由地址(不配合服務(wù)注冊(cè)中心)
#uri: http://localhost:8001
# 斷言
predicates:
# 路徑匹配的進(jìn)行路由
- Path=/**
- Custom=test, a
- 測(cè)試:
- 啟動(dòng)nacos,能正常打開nacos首頁(yè)
- 啟動(dòng)nacos-provider微服務(wù),瀏覽器訪問(wèn)
localhost:8001/nacos/provider/test
接口,能正常返回信息,且在nacos服務(wù)列表中可看到成功注冊(cè) - 啟動(dòng)本微服務(wù)后,API工具訪問(wèn)
localhost/nacos/provider/test
接口,返回404。在header中,攜帶key為test、value為a的參數(shù)后再次訪問(wèn),可以正常返回信息,查看響應(yīng)頭中有key為post、value為no args | test的參數(shù)。
到了這里,關(guān)于項(xiàng)目示例 - 3.服務(wù)網(wǎng)關(guān) - 3.Gateway的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!