美文网首页
SpringCloud系列之网关gateway-7.利用Afte

SpringCloud系列之网关gateway-7.利用Afte

作者: 那钱有着落吗 | 来源:发表于2021-09-15 09:28 被阅读0次
image.png

测试需要,所以我们首先创建一个模仿查询订单和下订单的两个接口:

package com.example.springcloud;


import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@RestController
@Slf4j
@RequestMapping("/gateway")
public class GatewayController {

    public static final Map<Long,Product> items = new ConcurrentHashMap<Long, Product>();

    @GetMapping("details")
    @ResponseBody
    public Product get(@RequestParam("pid") Long pid){
        if(!items.containsKey(pid)){
            Product prod = Product.builder().productId(pid).description("好吃不贵").stock(100L).build();
            items.putIfAbsent(pid,prod);
        }
        return items.get(pid);
    }

    @PostMapping("/喷脸aceOrder")
    @ResponseBody
    public String placeOrder(@RequestParam("pid") Long pid){
        Product prod = items.get(pid);

        if(prod==null){
            return "product not found!";
        }else if(prod.getStock()<=0L){
            return "sold out";
        }
        synchronized (prod){
            if(prod.getStock()<=0L){
                return "sold out";
            }
            prod.setStock(prod.getStock()-1);
        }
        return "order placed";
    }
}

下面配置一个路由规则,规则在服务启动一分钟之后才能开启这个秒杀的接口:

 @Bean
    @Order
    public RouteLocator customizedRoutes(RouteLocatorBuilder routeLocatorBuilder){
        return routeLocatorBuilder.routes()
                .route(r->r.path("/java/**")
                        .and().method(HttpMethod.GET)
                        .and().header("name")
                        .filters(f->f.stripPrefix(1)
                                .addResponseHeader("java-param","gateway-config")
                        )
                        .uri("lb://feign-client")
                )
                .route(r->r.path("[表情]ckill/**")
                        .and().after(ZonedDateTime.now().plusMinutes(1))
                        .filters(f->f.stripPrefix(1))
                        .uri("lb://feign-client")
                )
                .build();
    }

下面是接口调用的截图,可以看到我们直接调用服务是没有问题的,但是在1分钟之内通过gateway来调用就会出现404的报错,而在1分钟之后调用则可以正常转发到相应的接口:

image.png image.png image.png

最后需要注意的是:gateway作为网关组件,我们应尽量保证这个组件的单纯性,秒杀特性仅仅作为他具有的功能,在实际开发中,业务功能的实现尽量放在业务层,而不是网关较好。

相关文章

网友评论

      本文标题:SpringCloud系列之网关gateway-7.利用Afte

      本文链接:https://www.haomeiwen.com/subject/ufpfgltx.html