IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 构建SpringCloud网关服务 -> 正文阅读

[Java知识库]构建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越小,优先级越高,越先执行)

  • 路由过滤器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                          # 本次跨域检测的有效期

服务发现

可以通过spring.cloud.gateway.discovery.locator.enabled=true将网关上已经注册的服务添加到路由中。默认的路由是: http://localhost:port/service_name/path

例如:http://localhost:9000/user/1 -> http://localhost:9000/userservice/user/1

spring:
  application:
    name: gateway-api
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true                             # 自动配置路由
          lower-case-service-id: true               # 默认为大写

总结

  • 使用 @LoadBalanced 注解访问服务时,nacoseureka 可以通用。
  • 使用 Feign 的方式访问服务时,nacoseureka 可以通用。
  • nacos 的自动配置并不是针对所有包都生效,有时需要手动重新定义bean。
  • 网关的配置针对 eurekanacos 采用同一套代码,只需要将服务注册到 eureka 或者 nacos 上即可(所有服务、网关都要注册)
  • 使用网关后,可以不在使用 feign-api ,因为网关已经有了负载均衡的功能。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 10:52:39  更:2022-12-25 10:56:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年3日历 -2024/3/29 22:13:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码