开发公司SpringCloud 网关 Gateway

 哈喽~大家好,开发公司这篇来看看SpringCloud 网关 Gateway。

 🥇个人主页:             

🥈 系列专栏:       

🥉开发公司与这篇相关的文章:            

SpringCloud Sentinel 使用
将Nacos注册到springboot使用以及Feign开发公司实现服务调用
开发公司微服务介绍与 SpringCloud Eureka

目录


一、前言

1、开发公司什么是网关?

spring-cloud-gateway 是一个库,可以在spring webflux开发公司之上建立一个,开发公司它的目的是提供一个简单,开发公司有效的方式去路由到APIS并且提供:安全、开发公司监控和弹性。gateway构建于spring boot2.x,spring webFlux,and Project Reactor,所以,开发公司许多同步库如spring Data和spring security不适用于gateway项目中。因为gateway开发公司是异步非阻塞的。 gateway要求spring boot和spring webFlux提供Netty运行环境。开发公司它不能工作在传统的servlet开发公司容器或打成一个War包。

简称:Gateway开发公司网关是我们服务的守门神,开发公司所有微服务的统一入口。

二、gateway快速入门

1、开发公司基本步骤如下

创建SpringBoot工程gateway,开发公司引入网关依赖

  1. <!--网关-->
  2. <dependency>
  3.    <groupId>org.springframework.cloud</groupId>
  4.    <artifactId>spring-cloud-starter-gateway</artifactId>
  5. </dependency>
  6. <!--nacos开发公司服务发现依赖-->
  7. <dependency>
  8.    <groupId>com.alibaba.cloud</groupId>
  9.    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  10. </dependency>

2、开发公司编写启动类

  1. @SpringBootApplication
  2. public class GatewayApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(GatewayApplication.class, args);
  5. }
  6. }

3、开发公司编写基础配置和路由规则

  1. server:
  2. port: 10010 # 网关端口
  3. spring:
  4. application:
  5.   name: gateway # 服务名称
  6. cloud:
  7.   nacos:
  8.     server-addr: localhost:8848 # nacos地址
  9.   gateway:
  10.     routes: # 开发公司网关路由配置
  11.       - id: user-service # 路由id,自定义,只要唯一即可
  12.          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
  13.         uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
  14.         predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
  15.           - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求

我们将符合Path 规则的一切请求,都代理到 uri参数指定的地址。

例子中,我们将 /user/**开头的请求,代理到lb://userserver,lb是负载均衡,根据服务名拉取服务列表,实现负载均衡。

4、启动网关服务进行测试

输入网址

效果

注:gateway报There was an unexpected error (type=Service Unavailable, status=503).

新版本的nacos一定要在客户端加上<artifactId>spring-cloud-starter-loadbalancer</artifactId>,用于替换ribbon

5、并且注释测试环境

6、总结

网关搭建步骤:

  1. 创建项目,引入nacos服务发现和gateway依赖

  2. 配置application.yml,包括服务基本信息、nacos地址、路由

路由配置包括:

  1. 路由id:路由的唯一标示

  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

  3. 路由断言(predicates):判断路由的规则,

  4. 路由过滤器(filters):对请求或响应做处理

三、工厂

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件

例如Path=/user/**是按照路径匹配,这个规则是由

org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来

处理的,像这样的断言工厂在SpringCloudGateway还有十几个,见下表:

名称说明示例
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权重处理

我们只需要掌握Path这种路由工程就可以了。

过滤器工厂

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

1、路由过滤器的种类

Spring提供了31种不同的路由过滤器工厂。例如:

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量

比如:给所有进入userservice的请求添加一个请求头:Truth=heiheihei

只需要修改gateway服务的application.yml文件,添加路由过滤即可:

  1. spring:
  2. cloud:
  3.   gateway:
  4.     routes:
  5.     - id: user-service
  6.       uri: lb://userservice
  7.       predicates:
  8.       - Path=/user/**
  9.       filters: # 过滤器
  10.       - AddRequestHeader=Truth, heiheihei # 添加请求头,键值对形式

当前过滤器写在userservice路由下,因此仅仅对访问userservice的请求有效。

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

  1. spring:
  2. cloud:
  3.   gateway:
  4.     routes:
  5.     - id: user-service
  6.       uri: lb://userservice
  7.       predicates:
  8.       - Path=/user/**
  9.     default-filters: # 默认过滤项
  10.     - AddRequestHeader=Truth, heiheihei

2、自定义全局过滤器

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:

1、参数中是否有test,

2、test参数值是否为test

如果同时满足则放行,否则拦截

代码

  1. package com.itcast.gateway;
  2. import org.apache.http.HttpStatus;
  3. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  4. import org.springframework.cloud.gateway.filter.GlobalFilter;
  5. import org.springframework.core.annotation.Order;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.util.MultiValueMap;
  8. import org.springframework.web.server.ServerWebExchange;
  9. import reactor.core.publisher.Mono;
  10. @Order(-1)
  11. @Component
  12. public class AuthorizeFilter implements GlobalFilter {
  13.    @Override
  14.    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  15. //       1、获取请求参数
  16.        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
  17. //       2、获取test参数
  18.        String test = params.getFirst("test");
  19. //       3、校验判断
  20.        if ("test".equals(test)){
  21. //           放行
  22.            return chain.filter(exchange);
  23.       }
  24. //       拦截,静止访问,设置状态码
  25.        exchange.getResponse().setStatusCode(org.springframework.http.HttpStatus.valueOf(HttpStatus.SC_UNAUTHORIZED));
  26. //       结束处理
  27.        return exchange.getResponse().setComplete();
  28.   }
  29. }

执行顺序:请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。

排序的规则是什么呢?

1、每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前

2、GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定

3、路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。

4、当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

详细内容,可以查看源码:

org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加载defaultFilters,然后再加载某个route的filters,然后合并。

org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法会加载全局过滤器,与前面的过滤器合并后根据order排序,组织过滤器链

四、跨域问题

1、什么是跨域问题?

跨域:域名不一致就是跨域,主要包括:

1、域名不同: 和 和 和 miaosha.jd.com1、2、域名相同,端口不同:localhost:8080和localhost8081

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

2、如何解决?

在gateway服务的application.yml文件中,添加下面的配置:

  1. spring:
  2.  cloud:
  3.    gateway:
  4.      # 。。。
  5.      globalcors: # 全局的跨域处理
  6.        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
  7.        corsConfigurations:
  8.          '[/**]':
  9.            allowedOrigins: # 允许哪些网站的跨域请求
  10.              - "http://localhost:8090"
  11.            allowedMethods: # 允许的跨域ajax的请求方式
  12.              - "GET"
  13.              - "POST"
  14.              - "DELETE"
  15.              - "PUT"
  16.              - "OPTIONS"
  17.            allowedHeaders: "*" # 允许在请求中携带的头信息
  18.            allowCredentials: true # 是否允许携带cookie
  19.            maxAge: 360000 # 这次跨域检测的有效期

eg:

  1. server:
  2.  port: 10010
  3. spring:
  4.  application:
  5.    name: gateway
  6.  cloud:
  7.    nacos:
  8.      server-addr: localhost:8848
  9.    gateway:
  10.      routes:
  11.        - id: userserver # 路由标识,就是你的路由名,且唯一
  12.          uri: lb://userserver # 路由的目标地址,lb就是负载均衡
  13.          predicates: #路由断言,判断路径是否以/user 开头,其实就是布尔判断
  14.            - Path=/user/**
  15. #         filters: # 过滤器
  16. #           - AddRequestHeader=Truth, Itxzw is freaking awesome! # 添加请求头
  17.        - id: orderserver # 路由标识,就是你的路由名,且唯一
  18.          uri: lb://orderserver # 路由的目标地址,lb就是负载均衡
  19.          predicates: #路由断言,判断路径是否以/user 开头,其实就是布尔判断
  20.            - Path=/order/**
  21.      default-filters: # 默认过滤项
  22.        - AddRequestHeader=Truth, Itcast is freaking awesome!
  23.      globalcors: # 全局的跨域处理
  24.        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
  25.        corsConfigurations:
  26.          '[/**]':
  27.            allowedOrigins: # 允许哪些网站的跨域请求
  28.              - "http://localhost:8090"
  29.            allowedMethods: # 允许的跨域ajax的请求方式
  30.              - "GET"
  31.              - "POST"
  32.              - "DELETE"
  33.              - "PUT"
  34.              - "OPTIONS"
  35.            allowedHeaders: "*" # 允许在请求中携带的头信息
  36.            allowCredentials: true # 是否允许携带cookie
  37.            maxAge: 360000 # 这次跨域检测的有效期

不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!向着明天更好的自己前进吧!

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发