搭建网关

导入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越小,优先级越高,越先执行)

  • 路由过滤器defaultFilterorderSpring指定,默认是按照声明顺序从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网关服务的更多相关文章

  1. spring cloud 入门系列六:使用Zuul 实现API网关服务

    通过前面几次的分享,我们了解了微服务架构的几个核心设施,通过这些组件我们可以搭建简单的微服务架构系统.比如通过Spring Cloud Eureka搭建高可用的服务注册中心并实现服务的注册和发现: 通 ...

  2. Spring Cloud API网关服务 5.2

    为什么需要API网关 通过前面内容的学习,我们已经可以构建一个简单的微服务架构系统.这个系统可以使用Spring Boot实现微服务的开发,使用Spring Cloud Eureka实现注册中心以及服 ...

  3. 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul

    通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...

  4. springcloud中的API网关服务Zuul

    到目前为止,我们Spring Cloud中的内容已经介绍了很多了,Ribbon.Hystrix.Feign这些知识点大家都耳熟能详了,我们在前文也提到过微服务就是把一个大的项目拆分成很多小的独立模块, ...

  5. SpringCloud微服务负载均衡与网关

    1.使用ribbon实现负载均衡ribbon是一个负载均衡客户端 类似nginx反向代理,可以很好的控制htt和tcp的一些行为.Feign默认集成了ribbon. 启动两个会员服务工程,端口号分别为 ...

  6. SpringCloud开发学习总结(八)—— API网关服务Zuul(一)

    大多数情况下,为了保证对外服务的安全性,我们在服务端实现的为服务接口时往往都会有一定的权限校验机制,比如对用户登录状态的校验等:同时为了防止客户端在发起请求时被篡改等安全方面的考虑,还会有一些签名校验 ...

  7. SpringCloud微服务笔记-Nginx实现网关反向代理

    背景 当前在SpringCloud微服务架构下,网关作为服务的入口尤为重要,一旦网关发生单点故障会导致整个服务集群瘫痪,为了保证网关的高可用可以通过Nginx的反向代理功能实现网关的高可用. 项目源码 ...

  8. 网关服务自定义路由规则(springcloud+nacos)

    1. 场景描述 需要给各个网关服务类提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现,动态加载自定义路由文件,动态加载路由文件中的路由规则,只需在规则文件中配置下规则就可以了 ...

  9. 线上SpringCloud网关调用微服务跨机房了,咋整?

    1.前言 公司内考虑到服务器资源成本的问题,目前业务上还在进行服务的容器化改造和迁移,计划将容器化后的服务,以及一些中间件(MQ.DB.ES.Redis等)尽量都迁移到其他机房. 那你们为什么不用阿里 ...

  10. SpringCloud微服务项目实战 - API网关Gateway详解实现

    前面讲过zuul的网关实现,那为什么今天又要讲Spring Cloud Gateway呢?原因很简单.就是Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用 ...

随机推荐

  1. Git 便捷操作

    虽然现在有很多图形化的 Git 工具,但是命令行依然 yyds.本文记录了工作中很有用的一些 Git 操作. 1.Fork出来的Git仓库同步代码 背景:有的时候从原仓库fork出了一个新仓库,这个新 ...

  2. day42-反射01

    Java反射01 1.反射(reflection)机制 1.1反射机制问题 一个需求引出反射 请看下面问题: 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi clas ...

  3. 【疫情动态条形图】用Python开发全球疫情排名动态条形图bar_chart_race

    一.开发背景 你好,我是 @马哥python说 ,这是我用Python开发的全球疫情动态条形图,演示效果: https://www.zhihu.com/zvideo/15603276220259696 ...

  4. 如何使用 Yolov4 训练人脸口罩检测模型

    前言 疫情当下,出入医院等公共场所都被要求佩戴口罩.这篇博客将会介绍如何使用 Yolov4,训练一个人脸口罩检测模型(使用 Yolov4 的原因是目前只复现到了 v4 ),代码地址为 https:// ...

  5. 华为路由器RIP路由协议配置命令

    RIP路由协议配置 rip 创建开启协议进程 network + ip 对指定网段接口使能RIP功能IP地址是与路由器直连的网段 debugging rip 1 查看RIP定期更新情况 termina ...

  6. Linux实战笔记__Ubuntu20.04上搭建Vulhub漏洞环境

    安装python3和pip3 安装docker 安装docker-compose 上传解压vulhub-master.zip 启动漏洞环境 进入某漏洞目录,执行docker-compose up -d ...

  7. java实现单链表的创建、增、删、改、查

    文章目录 单链表的创建.增.删.改.查 1.增加一个节点 2.删除一个节点 3.修改某一个节点 5.遍历单链表 单链表的创建.增.删.改.查 双向链表的增删改查:https://blog.csdn.n ...

  8. Vue学习之--------监视属性(2022/7/10)

    文章目录 1.监视属性 1.1 监视属性--天气案例 1.1.1 基础知识 1.1.2 代码实例 1.1.2 测试效果 1.2 深度监视-天气案例 1.2.1 基础知识 1.2.2 代码实例 1.2. ...

  9. 十九、Service Ingress

    Service Ingress Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx Ingress-Nginx 官方 ...

  10. iptables综合实验: 两个私有网络的互相通迅

    环境准备: 主机A IP:192.168.0.6/24 网关改为192.168.0.8 firewallA IP:eth1 192.168.0.8/24 eth0 10.0.0.8/24 删除默认路由 ...