【网络】gateway 可以提供的一些功能之二 “ 提供Restful服务器路由转发 ”

一、提供web静态资源服务

Web静态资源服务是指通过HTTP协议提供静态文件(如HTML、CSS、JavaScript、图片、字体等)的服务。这些静态资源文件不经过服务器端处理,直接由客户端(如浏览器)请求并加载。提供Web静态资源服务可以使客户端能够访问并展示网站的静态内容,如网页布局、样式、交互等。
详情参考【网络】gateway 可以提供的一些功能之一 “ 提供web静态资源服务 ”

二、提供Restful服务器路由转发

要在网关中提供RESTful服务的路由转发,你可以使用 Spring Cloud Gateway 或其他类似的网关工具来配置路由规则。

2.1、简单示例

以下是一个简单的示例,演示如何使用Spring Cloud Gateway进行RESTful服务的路由转发:

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("users_route", r -> r
                        .path("/users/**") // 匹配/users/**路径
                        .uri("http://user-service:8080")) // 转发到用户服务
                .route("products_route", r -> r
                        .path("/products/**") // 匹配/products/**路径
                        .uri("http://product-service:8080")) // 转发到产品服务
                .build();
    }
}

在这个示例中,假设有两个RESTful服务,分别是用户服务和产品服务,它们分别运行在 http://user-service:8080http://product-service:8080 。网关将会根据请求的路径,将匹配到的请求转发到相应的后端服务上。

这里的关键是配置路由规则,使用 path 方法匹配 RESTful API 的路径,并使用uri方法指定转发的目标URL。当客户端发送请求时,网关会根据路由规则将请求转发到相应的后端服务上进行处理。

你可以根据实际需求和项目结构,配置更多的路由规则和参数,以实现更复杂的RESTful服务路由转发。同时,还可以结合其他功能,如断路器、限流、日志记录等,来完善网关的功能。

2.2、动态配置的路由转发

对于需要动态配置的路由转发,你可以使用一些灵活的配置方式,例如基于配置文件、数据库、注册中心等。以下是一些常见的实现方法:

  • 基于配置文件:将路由规则配置在外部的配置文件中,例如YAML或properties文件。然后在网关启动时读取这些配置文件,并动态加载路由规则。这种方式适合静态路由规则,不需要频繁变更的情况。
  • 基于数据库:将路由规则存储在数据库中,网关启动时从数据库中读取路由配置信息,并动态加载路由规则。这种方式适合需要频繁变更路由规则的场景,可以通过数据库管理工具或API进行动态更新。
  • 基于注册中心:结合服务注册与发现功能,网关可以从注册中心(如Eureka、Consul等)获取服务实例信息和路由规则。当新的服务实例注册或注销时,网关可以自动更新路由配置。
  • 结合配置中心:使用配置中心(如Spring Cloud Config、Apollo等)来管理路由配置,网关从配置中心获取路由规则信息。可以通过配置中心的UI界面或API来动态更新路由规则。

以下是一个基于配置文件的示例,演示如何动态加载路由规则:

# gateway-routes.yml
routes:
  - id: users_route
    uri: http://user-service:8080
    predicates:
      - Path=/users/...
  - id: products_route
    uri: http://product-service:8080
    predicates:
      - Path=/products/...

然后在Spring Boot的配置类中加载这个配置文件:

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.util.FileCopyUtils;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
        Resource resource = resourceResolver.getResource("classpath:gateway-routes.yml");
        String routesContent = FileCopyUtils.copyToString(new InputStreamReader(resource.getInputStream()));
        
        return builder.routes()
                .route("dynamic_routes", r -> r
                        .order(0)
                        .uri("http://non-existing-service") // 这里设置一个不存在的URL,路由规则加载后会替换成真实的URI
                        .predicate(p -> p.readBody(String.class, requestBody -> {
                            // 从请求体中获取动态路由配置
                            return routesContent;
                        }))
                )
                .build();
    }
}

在这个示例中,gateway-routes.yml 是存放动态路由配置的文件。在customRouteLocator 方法中,通过读取这个配置文件的内容,并使用 predicate 方法将动态路由规则加载到网关中。当请求到来时,网关会根据请求体中的内容动态更新路由规则,实现动态路由转发。

上一篇:维修家政按摩到家上门小程序开源版开发


下一篇:GateWay具体的使用之全局token过滤器