Gateway 路由网关
一般情况下,并不是所有的微服务都需要直接暴露给外部调用,这时就可以使用路由机制,添加一层防护,让所有的请求全部通过路由来转发到各个微服务,并且转发给多个相同微服务实例时还也可以实现负载均衡。为此SpringCloud官方推出了Gateway路由
部署网关
创建一个新的项目,作为网关服务,并添加两个依赖
<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>
第一个依赖就是网关的依赖,而第二个则跟其他微服务一样,需要注册到Eureka才能生效,注意别添加Web依赖
修改配置文件
server:
port: 8500
eureka:
client:
service-url:
defaultZone: http://localhost:8801/eureka, http://localhost:8802/eureka
spring:
application:
name: gateway
接着将路由功能进行配置
spring:
cloud:
gateway:
# 配置路由,注意这里是个列表,每一项都包含了很多信息
routes:
- id: borrow-service # 路由名称
uri: lb://borrowservice # 路由的地址,lb表示使用负载均衡到微服务,也可以使用http正常转发
predicates: # 路由规则,断言什么请求会被路由
- Path=/borrow/** # 只要是访问的这个路径,一律都被路由到上面指定的服务
路由规则的详细列表(断言工厂列表)
可以指定多种类型,包括指定时间段、Cookie携带情况、Header携带情况、访问的域名地址、访问的方法、路径、参数、访问者IP等。也可以使用配置类进行配置,推荐直接配置文件
现在可以直接通过路由来访问服务了
这样就可以将不需要外网直接访问的微服务全部放到内网环境下,而只依靠网关来对外进行交涉。
路由过滤器
路由过滤器支持修改传入的 HTTP 请求或传出的 HTTP 响应,路由过滤器的范围是某一个路由,跟之前的断言一样,Spring Cloud Gateway 也包含许多内置的路由过滤器工厂,详细列表:Spring Cloud Gateway
样例
比如我们现在希望在请求到达时,在请求头中添加一些信息再转发给相关的服务
只需要对配置文件进行修改
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: borrow-service
uri: lb://borrowservice
predicates:
- Path=/borrow/**
# 继续添加新的路由配置,这里就以书籍管理服务为例
- id: book-service
uri: lb://bookservice
predicates:
- Path=/book/**
filters: # 添加过滤器
- AddRequestHeader=test, HelloWorld
# AddRequestHeader 就是添加请求头信息,其他工厂查阅官网
接着可以在bookservice的controller中获取一下
-
-
public class BookController {
-
-
-
BookService service;
-
-
-
Book findBookById(int bid,
-
HttpServletRequest request){
-
System.out.println(request.getHeader("test"));
-
return service.getBookById(bid);
-
}
-
}
除了针对于某一个路由配置过滤器之外,也可以自定义全局过滤器,它能够作用于全局
此时需要实现globalFilter接口并实现它唯一的方法,再将该类注册为bean
-
//需要注册为Bean
-
public class TestFilter implements GlobalFilter {
-
-
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-
//先获取ServerHttpRequest对象,注意不是HttpServletRequest
-
ServerHttpRequest request = exchange.getRequest();
-
//打印一下所有的请求参数
-
System.out.println(request.getQueryParams());
-
//判断是否包含test参数,且参数值为1
-
List<String> value = request.getQueryParams().get("test");
-
if(value != null && value.contains("1")) {
-
//将ServerWebExchange向过滤链的下一级传递
-
return chain.filter(exchange);
-
}else {
-
//直接在这里不再向下传递,然后返回响应
-
return exchange.getResponse().setComplete();
-
}
-
}
-
}
当过滤器存在很多个时,可以手动指定过滤器之间的顺序,实现Ordered接口,方法返回数值越小,过滤器越靠前
-
-
public class TestFilter implements GlobalFilter, Ordered { //实现Ordered接口
-
-
-
public int getOrder() {
-
return 0;
-
}
-
}
无论是在配置文件中编写的单个路由过滤器还是全局路由过滤器,都会受到Order值影响(单个路由的过滤器Order值按从上往下的顺序从1开始递增),最终是按照Order值决定哪个过滤器优先执行,当Order值一样时 全局路由过滤器执行优于单独的路由过滤器执行
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfjaegi
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13