在一个Gateway项目(配置了eureka等组件)中进行配置
server: port: 9006 spring: application: name: zhao-service-gateway cloud: gateway: routes: - id: service-autodeliver-router #uri: http://127.0.0.1:8091 uri: lb://zhao-service-autodeliver predicates: - Path= /autodeliver/** - id: service-resume-router #uri: http://127.0.0.1:8081 uri: lb://zhao-service-resume predicates: - Path=/resume/** filters: - StripPrefix=1
通过第一个服务hao-service-autodeliver的配置形式,使用固定ip和服务名均可正常通过网关项目访问到服务,但是固定ip的方式不太灵活,而 lb://zhao-service-autodeliver可以实现随机的负载均衡,且不用填写固定ip也避免了不要的麻烦
第二个服务配置中 filters:- StripPrefix=1这个配置会过滤掉第一个路径配置,所以我们在最后访问的时候,除了需要加上第一个过滤掉的配置,还需要加上原本的配置。访问形式如下
上述针对路径的配置即是断言predicates的配置,而Gateway还内置了以下几种断言
基本上上述断言都是基于请求携带的信息进行过滤的,在实际操作过程中可以综合使用这些信息来达到我们想要的操作
//www.fhadmin.cn @Component @Slf4j public class BlackListFilter implements GlobalFilter, Ordered{ private static final List<String> blackList=new ArrayList<>(); static { blackList.add("0:0:0:0:0:0:0:1");//模拟本机ip地址 } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response =exchange.getResponse(); String clientIp = request.getRemoteAddress().getHostString(); if (blackList.contains(clientIp)){ response.setStatusCode(HttpStatus.UNAUTHORIZED); log.error(clientIp+"在黑名单中,拒绝访问"); String data = "request be denied"; DataBuffer wrap = response.bufferFactory().wrap(data.getBytes()); return response.writeWith(Mono.just(wrap)); } return chain.filter(exchange); } @Override public int getOrder() { return 0; } }
通过该过滤器拦截了黑名单中的请求(该操作在实际中可借助mysql或redis等数据存储实现),实现效果
?关作为?常核?的?个部件,如果挂掉,那么所有请求都可能?法路由处理,因此我们需要做GateWay的?可?。GateWay的?可?很简单:可以启动多个GateWay实例来实现?可?,在GateWay的上游使?Nginx等负载均衡设备进?负载转发以达到?可?的?的。启动多个GateWay实例(假如说两个,?个端?9002,?个端?9003),剩下的就是使?Nginx等完成负载代理即可。
原文:https://www.cnblogs.com/teacher11/p/15029623.html