微服务网关Gateway

偏执的太偏执、 2021-12-10 21:01 475阅读 0赞

使用场景

不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:

  • 客户端会多次请求不同的微服务,增加了客户端的复杂性
  • 存在跨域请求,在一定场景下处理相对复杂
  • 认证复杂,每个服务都需要独立认证
  • 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施
  • 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难
    以上这些问题可以借助网关解决。
    网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做,这样既提高业务灵活性又不缺安全性

一、引入依赖、目录结构

在这里插入图片描述

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-test</artifactId>
  16. <scope>test</scope>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
  21. </dependency>

二、GatewayApplication

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. public class GatewayApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(GatewayApplication.class, args);
  6. }
  7. }

三、application.yml

  1. spring:
  2. application:
  3. name: sysgateway
  4. cloud:
  5. gateway:
  6. globalcors:
  7. cors-configurations:
  8. '[/**]': # 匹配所有请求
  9. allowedOrigins: "*" #跨域处理 允许所有的域
  10. allowedMethods: # 支持的方法
  11. - GET
  12. - POST
  13. - PUT
  14. - DELETE
  15. routes:
  16. - id: goods
  17. uri: lb://goods
  18. predicates:
  19. - Path=/goods/**
  20. filters:
  21. - StripPrefix= 1
  22. server:
  23. port: 9101
  24. eureka:
  25. client:
  26. service-url:
  27. defaultZone: http://127.0.0.1:6868/eureka
  28. instance:
  29. prefer-ip-address: true

四、自定义微服务网关过滤器filter

1、Ipfilter

  1. package com.william.filter;
  2. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  3. import org.springframework.cloud.gateway.filter.GlobalFilter;
  4. import org.springframework.core.Ordered;
  5. import org.springframework.http.server.reactive.ServerHttpRequest;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.web.server.ServerWebExchange;
  8. import reactor.core.publisher.Mono;
  9. import java.net.InetSocketAddress;
  10. /**
  11. * @author :lijunxuan
  12. * @date :Created in 2019/7/11 9:24
  13. * @description :
  14. * @version: 1.0
  15. */
  16. /**
  17. * 自定义过滤器
  18. * 在这里可以记录访问者的IP
  19. */
  20. @Component
  21. public class Ipfilter implements GlobalFilter, Ordered {
  22. @Override
  23. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  24. System.out.println("第一个过滤器的Ipfilter");
  25. //获取请求
  26. ServerHttpRequest request = exchange.getRequest();
  27. InetSocketAddress remoteAddress = request.getRemoteAddress();
  28. String id = request.getId();
  29. //通过请求获取访问者的ip地址
  30. String hostStringAddress = remoteAddress.getHostString();
  31. System.out.println("访问者的Ip地址为:"+hostStringAddress);
  32. System.out.println("请求的id为:"+id);
  33. return chain.filter(exchange);
  34. }
  35. @Override
  36. public int getOrder() {
  37. return 1;
  38. }
  39. }

2、UrlFilter

  1. package com.william.filter;
  2. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  3. import org.springframework.cloud.gateway.filter.GlobalFilter;
  4. import org.springframework.core.Ordered;
  5. import org.springframework.http.server.reactive.ServerHttpRequest;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.web.server.ServerWebExchange;
  8. import reactor.core.publisher.Mono;
  9. import java.net.InetSocketAddress;
  10. /**
  11. * @author :lijunxuan
  12. * @date :Created in 2019/7/11 9:24
  13. * @description :
  14. * @version: 1.0
  15. */
  16. /**
  17. * 自定义过滤器
  18. * 在这里可以记录访问者访问的url地址
  19. */
  20. @Component
  21. public class UrlFilter implements GlobalFilter, Ordered {
  22. @Override
  23. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  24. System.out.println("第二个过滤器的Ipfilter");
  25. //获取请求
  26. ServerHttpRequest request = exchange.getRequest();
  27. InetSocketAddress remoteAddress = request.getRemoteAddress();
  28. String id = request.getId();
  29. //通过请求获取访问者访问的url的地址
  30. String path = request.getURI().getPath();
  31. System.out.println("访问者的访问地址为:"+path);
  32. System.out.println("请求的id为:"+id);
  33. return chain.filter(exchange);
  34. }
  35. @Override
  36. public int getOrder() {
  37. return 2;
  38. }
  39. }

五、测试结果

在这里插入图片描述

发表评论

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

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

相关阅读

    相关 服务网Gateway

    API 网关是一个服务,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API 网关封装了系统内部架构,为每个客户端提供一个定制的 API 。它可能还具有其它职责,

    相关 服务网Gateway

    使用场景 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户