构建SpringCloud网关服务
搭建网关
导入maven包:
<!--网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
他们的版本由父项目中的管理依赖提供:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
配置文件:
spring:
application:
name: gateway-api
cloud:
nacos:
server-addr: localhost:8848 # 配置nacos
gateway:
routes:
- id: user-service # 路由的id,需要唯一
# uri: http://127.0.0.1:8080 # 可直接指定服务地址,不会负载均衡
uri: lb://userservice # 使用服务名称进行负载均衡
predicates: # 断言,制定路由规则
- Path=/user/** # 按照路径进行匹配,需要以 /user/开头
server:
port: 9000
路由断言工厂 Route Predict Factory
名称 | 说明 | 示例 |
---|---|---|
After | 是某个时间点后的请求 | - After=2037-01-20T17:42:47.789-07:00[America/Denver] |
Before | 是某个时间点之前的请求 | - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
Between | 是某两个时间点之前的请求 | - Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | 请求必须包含某些cookie | - Cookie=chocolate, ch.p |
Header | 请求必须包含某些header | - Header=X-Request-Id, \d+ |
Host | 请求必须是访问某个host(域名) | - Host=**.somehost.org,**.anotherhost.org |
Method | 请求方式必须是指定方式 | - Method=GET,POST |
Path | 请求路径必须符合指定规则 | - Path=/red/{segment},/blue/** |
Query | 请求参数必须包含指定参数 | - Query=name, Jack或者- Query=name |
RemoteAddr | 请求者的ip必须是指定范围 | - RemoteAddr=192.168.1.1/24 |
Weight | 权重处理 | `` |
路由过滤器 GatewayFilter
有31中不同的路由过滤器工厂(GatewayFilterFactory)。 Spring Cloud 提供了多种网关过滤器工厂(GatewayFilterFactory):网关过滤器工厂。 常见的过滤器工厂如下:
名称 | 说明 |
---|---|
AddRequestHeader | 给当前请求添加一个请求头 |
AddRequestParameter | 给当前请求添加一个参数 |
RemoveRequestHeader | 移除请求中的一个请求头 |
RemoveRequestParameter | 移除请求中的一个参数 |
AddResponseHeader | 给响应结果中添加一个响应头 |
RemoveResponseHeader | 从响应结果中移除有一个响应头 |
RequestRateLimiter | 限制请求的流量 |
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: https://example.org
filters:
- AddRequestHeader=X-Request-red, blue # 将在header中添加 X-Request-red=blue
默认过滤器
对所有路由生效,需要写到 default-filters
中。
spring:
application:
name: gateway-api
cloud:
nacos:
server-addr: localhost:8848 # 配置nacos
gateway:
routes:
- id: user-service # 路由的id,需要唯一
# uri: http://127.0.0.1:8080 # 可直接指定服务地址,不会负载均衡
uri: lb://userservice # 使用服务名称进行负载均衡
predicates: # 断言,制定路由规则
- Path=/user/** # 按照路径进行匹配,需要以 /user/开头
filters:
- AddRequestParameter=name, tom # 只对user-service生效
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
# 默认配置对上面的所有routes生效
default-filters:
- AddRequestParameter=age,20
全局过滤器
GlobalFilter
的逻辑需要自己写代码实现,需要实现 GlobalFilter
接口。 使用 @Order
或者 Ordered
接口制定过滤器的优先级。(Order越小,优先级越高,越先执行)
- 路由过滤器和
defaultFilter
的order
由Spring
指定,默认是按照声明顺序从1递增 - 当过滤器的order值一样时,会按照
defaultFilter > 路由过滤器 > GlobalFilter
的顺序执行
//@Order(-1)
@Component
public class GatewayGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
MultiValueMap<String, String> queryParams = request.getQueryParams();
String username = queryParams.getFirst("username");
if("admin".equals(username)){
// 放行
return chain.filter(exchange);
}
// 添加 401 错误
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
@Override
public int getOrder() {
return -1;
}
}
跨域问题处理
域名不同、端口不同时会发生跨域问题。需要是浏览器发起的请求,如果是各个服务之间的互相转发并不会涉及到跨域问题。
添加以下配置开放针对某些网站的跨域请求:
spring:
application:
name: gateway-api
cloud:
nacos:
server-addr: localhost:8848 # 配置nacos
gateway:
# 跨域处理
globalcors:
add-to-simple-url-handler-mapping: true # 不拦截options请求
cors-configurations:
'[/**]':
allowed-origins: # 允许跨域的网站
- "http://localhost:8090"
allowed-methods:
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowed-headers: "*" # 允许请求头中携带的头信息
allow-credentials : true # 允许携带cookie
maxAge: 360000 # 本次跨域检测的有效期
构建SpringCloud网关服务的更多相关文章
- spring cloud 入门系列六:使用Zuul 实现API网关服务
通过前面几次的分享,我们了解了微服务架构的几个核心设施,通过这些组件我们可以搭建简单的微服务架构系统.比如通过Spring Cloud Eureka搭建高可用的服务注册中心并实现服务的注册和发现: 通 ...
- Spring Cloud API网关服务 5.2
为什么需要API网关 通过前面内容的学习,我们已经可以构建一个简单的微服务架构系统.这个系统可以使用Spring Boot实现微服务的开发,使用Spring Cloud Eureka实现注册中心以及服 ...
- 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul
通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...
- springcloud中的API网关服务Zuul
到目前为止,我们Spring Cloud中的内容已经介绍了很多了,Ribbon.Hystrix.Feign这些知识点大家都耳熟能详了,我们在前文也提到过微服务就是把一个大的项目拆分成很多小的独立模块, ...
- SpringCloud微服务负载均衡与网关
1.使用ribbon实现负载均衡ribbon是一个负载均衡客户端 类似nginx反向代理,可以很好的控制htt和tcp的一些行为.Feign默认集成了ribbon. 启动两个会员服务工程,端口号分别为 ...
- SpringCloud开发学习总结(八)—— API网关服务Zuul(一)
大多数情况下,为了保证对外服务的安全性,我们在服务端实现的为服务接口时往往都会有一定的权限校验机制,比如对用户登录状态的校验等:同时为了防止客户端在发起请求时被篡改等安全方面的考虑,还会有一些签名校验 ...
- SpringCloud微服务笔记-Nginx实现网关反向代理
背景 当前在SpringCloud微服务架构下,网关作为服务的入口尤为重要,一旦网关发生单点故障会导致整个服务集群瘫痪,为了保证网关的高可用可以通过Nginx的反向代理功能实现网关的高可用. 项目源码 ...
- 网关服务自定义路由规则(springcloud+nacos)
1. 场景描述 需要给各个网关服务类提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现,动态加载自定义路由文件,动态加载路由文件中的路由规则,只需在规则文件中配置下规则就可以了 ...
- 线上SpringCloud网关调用微服务跨机房了,咋整?
1.前言 公司内考虑到服务器资源成本的问题,目前业务上还在进行服务的容器化改造和迁移,计划将容器化后的服务,以及一些中间件(MQ.DB.ES.Redis等)尽量都迁移到其他机房. 那你们为什么不用阿里 ...
- SpringCloud微服务项目实战 - API网关Gateway详解实现
前面讲过zuul的网关实现,那为什么今天又要讲Spring Cloud Gateway呢?原因很简单.就是Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用 ...
随机推荐
- 修改NodePort的范围
在 Kubernetes 集群中,NodePort 默认范围是 30000-32767,某些情况下,因为您所在公司的网络策略限制,您可能需要修改 NodePort 的端口范围 修改kube-apise ...
- 某宝抢购taobaosnap开发与实现
某宝抢购脚本 Taobaosnap Taobaosnap is a completely open tool, which is used to buy goods in seconds on Tao ...
- 2_CSS
1. 什么是CSS 1.1 什么是CSS Cascading Style Sheet 层叠样式表 是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的 ...
- 基于electron+vue+element构建项目模板之【打包篇】
1.概述 开发平台OS:windows 开发平台IDE:vs code 本项目使用了一款Vue-CLI插件(vue-cli-plugin-electron-builder) 来构建 electron ...
- java基础之常用类1
java基础 以下内容为本人的学习笔记,如需要转载,请声明原文链接 java常用类: 1.内部类 2.Object类 3.Object类常用方法 4.包装类 5.String类 6.BigDeci ...
- Css3中自适应布局单位vh、vw
视口单位(Viewport units) 什么是视口? 在桌面端,视口指的是在桌面端,指的是浏览器的可视区域:而在移动端,它涉及3个视口:Layout Viewport(布局视口),Visual Vi ...
- MySQL精华笔记
1.mysql分为 server 层和存储引擎: server 层: 1.连接器:管理连接权限验证 2.查询缓存:命中缓存直接换回查询结果 3.分析器:分析语法 4.优化器:生成执行计划,选择索引 5 ...
- Java注解(1):码农的小秘
很多码农在写代码的时候不太爱写注释,结果任务一多,时间一长,需求一改,就完全不知道当初自己都干了些啥了.好在现在大多数编程语言都有注释功能,能够在代码里面做一些备注,不至于时间长了忘掉.但这些注释只是 ...
- if、where、trim、choose、when、otherwise、foreach
1.if if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行:反之标签中 的内容不会执行 <!--List<Emp> getEmpListBy ...
- laravel config()获取null
常规开发获取config值的是否发现获取值为null找了下文档,发现laravel是要把config注册到$app里面. 找到这个目录.加入这一行.就可以了