SpringCloud(六)Gateway网关

梦里梦外; 2022-01-30 01:37 413阅读 0赞

目录

一.Gateway网关说明

1.Gateway配置

2.Gateway拦截器


一.Gateway网关说明

spring-cloud-Gateway是spring-cloud的一个子项目。而zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已。
还有一种说法是因为zuul2连续跳票和zuul1的性能表现不是很理想,所以催生了spring孵化Gateway项目。
总的来说,gateway性能大大强于zuul。

1.Gateway配置

首先在pom.xml文件中导入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>
  5. server:
  6. port: 8999
  7. spring:
  8. application:
  9. name: gateway
  10. cloud:
  11. gateway:
  12. discovery:
  13. locator:
  14. enabled: true
  15. routes:
  16. - id: feign-customer
  17. #lb://feign-customer
  18. uri: lb://feign-customer
  19. order: 0
  20. predicates:
  21. - Path=/foo/**
  22. filters:
  23. - StripPrefix=1
  24. logging:
  25. level:
  26. org.springframework.cloud.gateway: debug

表示注册中心生效,我们可以通过注册中心的服务名进行路由转发
discovery.locator.enabled=true;
表示路由ID
- id: feign-customer
指向注册中心的服务。lb://服务ID或者http://localhost:8080完整的url
uri: lb://feign-customer
表示要进行的断言
predicates:
表示path地址,根据url,以foo开头的会被转发到feign-customer服务,可以使用通配符地址
- Path= /foo/**
过滤器
filters:
从前面截取一个,忽略第一个/foo,其他路径进行转发
- StripPrefix= 1

2.Gateway拦截器

  1. /**
  2. * @Author wangyu
  3. * @Description: Copyright 2019 yiYuan Networks 上海义援网络科技有限公司. All rights reserved.
  4. * @Date 2019/5/16
  5. */
  6. @Component
  7. public class WrapperResponseFilter implements GlobalFilter, Ordered {
  8. @Override
  9. public int getOrder() {
  10. // -1 is response write filter, must be called before that
  11. return -2;
  12. }
  13. @Override
  14. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  15. //前置拦截器
  16. ServerHttpResponse originalResponse = exchange.getResponse();
  17. DataBufferFactory bufferFactory = originalResponse.bufferFactory();
  18. ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {
  19. @Override
  20. public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
  21. //后置拦截器
  22. if (body instanceof Flux) {
  23. Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
  24. return super.writeWith(fluxBody.map(dataBuffer -> {
  25. // probably should reuse buffers
  26. byte[] content = new byte[dataBuffer.readableByteCount()];
  27. dataBuffer.read(content);
  28. // 释放掉内存
  29. DataBufferUtils.release(dataBuffer);
  30. String rs = new String(content, Charset.forName("UTF-8"));
  31. Map<String,Object> response = new HashMap<>();
  32. response.put("code","1");
  33. response.put("message","请求成功");
  34. response.put("data",rs);
  35. // byte[] newRs = JSON.toJSONString(response).getBytes(Charset.forName("UTF-8"));
  36. // originalResponse.getHeaders().setContentLength(newRs.length);//如果不重新设置长度则收不到消息。
  37. //请求的返回结果
  38. return bufferFactory.wrap(rs.getBytes());
  39. }));
  40. }
  41. return super.writeWith(body);
  42. }
  43. };
  44. return chain.filter(exchange.mutate().response(decoratedResponse).build());
  45. }
  46. }

发表评论

表情:
评论列表 (有 0 条评论,413人围观)

还没有评论,来说两句吧...

相关阅读