- SpringCloud系列之网关gateway-7.利用Afte
- SpringCloud技术指南系列(十二)API网关之Gatew
- SpringCloud技术指南系列(十一)API网关之Zuul使
- 跟我学SpringCloud | 第九篇:服务网关Zuul初探
- 【SpringCloud-Alibaba系列教程】13.gate
- SpringCloud(第 018 篇)Zuul 服务 API
- SpringCloud 之 Zuul(网关)
- 20. SpringCloud之Zuul源码解析
- SpringCloud技术指南系列(三)服务注册发现之Eurek
- SpringCloud技术指南系列(四)服务注册发现之Consu
测试需要,所以我们首先创建一个模仿查询订单和下订单的两个接口:
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作为网关组件,我们应尽量保证这个组件的单纯性,秒杀特性仅仅作为他具有的功能,在实际开发中,业务功能的实现尽量放在业务层,而不是网关较好。
网友评论