栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Cloud Gateway--用GlobalFilter实现动态路由--实例/方案

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Cloud Gateway--用GlobalFilter实现动态路由--实例/方案

原文网址:Spring Cloud Gateway--用GlobalFilter实现动态路由--实例/方案_IT利刃出鞘的博客-CSDN博客

简介

        本文用示例介绍Spring Cloud Gateway的动态路由(强制路由)的方案。

为什么需要动态路由

场景1:开发环境:提高调试效率

        在开发软件(例如Idea)上打断点调试是最快的调试方法。如果是与前端联调,前端一般将请求地址设置为网关,这样会负载均衡到不同的机器上,不能指定到自己的电脑。

        如果有了动态路由,那么可以指定某个url直接路由到自己电脑。

场景2:线上环境:可以快速将请求切到某个服务器

        如果没有动态路由,代码上线时如果出了问题,需要回滚代码,重新部署,很慢。

        如果有了动态路由,代码上线时,只更新部分实例,然后将流量切过去,如果有问题,立马切到其他未更新的实例即可。

实例 gateway项目 自定义GlobalFilter(核心)
package com.knife.dynamic;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.util.UriComponentsBuilder;
import reactor.core.publisher.Mono;

import java.net.URI;


@Slf4j
@Component
public class Router4jClientFilter implements GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest originalRequest = exchange.getRequest();

        // 可获得所有请求参数
        // Map cachedRequestBody = exchange
        // .getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR);

        //获取域名+端口后的path
        String rawPath = originalRequest.getURI().getRawPath();

        // todo 从redis中取出所有url,然后用rawPath去匹配

        String host = "localhost";
        int port = 9012;

        URI originUri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);

        URI newUri = UriComponentsBuilder.fromUri(originUri)
                .host(host)
                .port(port)
                .build()
                .toUri();

        //重新封装request对象
        ServerHttpRequest newRequest = originalRequest.mutate().uri(newUri).build();

        // NettyRoutingFilter 最终从GATEWAY_REQUEST_URL_ATTR 取出uri对象进行http请求
        // 所以这里要将新的对象覆盖进去
        exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, newUri);

        return chain.filter(exchange.mutate().request(newRequest).build());

        // 也可以加回调方法
        // return chain.filter(exchange.mutate().request(newRequest).build())
        //         .then(Mono.fromRunnable(() -> {
        //             //请求完成回调方法 可以在此完成计算请求耗时等操作
        //         }));
    }

    
    @Override
    public int getOrder() {
        return 15000;
    }
}
配置文件
server:
  port: 6001

spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          # 解析微服务名称为主机名和端口,实现动态路由
          enabled: true
          # 服务名使用小写
          lower-case-service-id: true
    nacos:
      discovery:
        server-addr: localhost:8848

# 配置Gateway日志等级,输出转发细节信息
logging:
  level:
    org.springframework.cloud.gateway: debug

依赖


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        
        2.4.13
         
    
    com.knife
    gateway
    0.0.1-SNAPSHOT
    gateway
    Demo project for Spring Boot

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        

        
            org.springframework.cloud
            spring-cloud-starter-gateway
        

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
            org.springframework.cloud
            spring-cloud-loadbalancer
        

        
            org.projectlombok
            lombok
            1.18.24
            provided
        

        
            com.knife
            router4j-client
            0.0.1-SNAPSHOT
        

    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                2020.0.1
                pom
                import
            

            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2021.1
                pom
                import
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                2.4.13
            
        
    


nacos项目

nacos直接从官方下载,然后运行即可。

见:Nacos 快速开始

业务项目

Controller

package com.knife.order.controller;

import com.knife.common.entity.Result;
import com.knife.order.entity.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController
@RequestMapping("order")
public class OrderController {
    // 正常流程
    @PostMapping("create")
    public Result create(Order order) {
        log.info("订单服务:创建订单:{}", order);

        return new Result().message("创建订单成功");
    }

}
配置文件

bootstrap.yml

spring:
  application:
    name: order
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848

application.yml

server:
  port: 9012

spring:
  application:
    name: order
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
依赖


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.4.13
    
    4.0.0
    pom
    com.knife
    parent
    0.0.1-SNAPSHOT

    
        1.8
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                2020.0.1
                pom
                import
            

            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2021.1
                pom
                import
            
        
    

    
        1.8
    

    


        
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2021.1
                pom
                import
            
        
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

        
            org.projectlombok
            lombok
            1.18.24
            provided
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
            
                
                     springframework.cloud
                    spring-cloud-starter-netflix-ribbon
                
            
        

        
            org.springframework.cloud
            spring-cloud-loadbalancer
        

        
            com.knife
            common
            0.0.1-SNAPSHOT
        

    

    
        

            
                org.springframework.boot
                spring-boot-maven-plugin
                2.4.13
            

        
    


测试 启动程序

1.启动nacos服务

执行:startup.cmd -m standalone

2.启动gateway服务

3.启动两个业务服务(order)

分别以不同的端口号启动。

先以上边的配置启动,再修改application.yml里的端口号,然后启动。修改后的为:

​server:
  port: 9013

spring:
  application:
    name: order
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

Idea同一个服务启动两个实例的方法见:Intellij IDEA--项目设置--导入项目/导入包/乱码/JDK版本_IT利刃出鞘的博客-CSDN博客​​​​​​

搜索关键字“同一服务启动多个实例”

测试

POST方式请求:http://localhost:6001/order/order/create/?userId=1&productId=1&count=10&money=100

请求10次,结果:请求全部到了指定的服务:9012端口

9012端口的服务:

9013端口的服务:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/852431.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号