当前位置:   article > 正文

SpringCloud学习(十六):Gateway网关的基本介绍与搭建_springcloud gateway搭建

springcloud gateway搭建

目录

一、Gateway是什么

二、Gateway能做什么 

三、Gateway三大核心概念

        1、路由(Route)

        2、断言(Predicate)

        3、过滤(Filter)

        4、总而言之

四、Gateway工作流程

五、入门配置

        1、创建模块

        2、修改pom文件

        3、编写yml文件

        4、编写主启动类

        5、9527如何做路由映射呢?

        6、运行测试


一、Gateway是什么

        Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。
        Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能, 例如:熔断、限流、重试等。

二、Gateway能做什么 

        反向代理、鉴权、流量控制、熔断、日志监控……

        微服务架构中网关的位置(相当于给微服务看大门的):

三、Gateway三大核心概念

        1、路由(Route)

        路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。 

        2、断言(Predicate

        参考的是Java8的java.util.function.Predicate
        开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。

        3、过滤(Filter)

        指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

        4、总而言之

        web请求通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。
        predicate就是我们的匹配条件;
        filter可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。

四、Gateway工作流程

         核心逻辑是:路由转发+执行过滤器链

五、入门配置

        1、创建模块

        新建普通maven模块cloud-gateway-gateway9527

        

        2、修改pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>mscloud03</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-gateway-gateway9527</artifactId>
  12. <dependencies>
  13. <!--gateway-->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-gateway</artifactId>
  17. </dependency>
  18. <!--eureka-client-->
  19. <dependency>
  20. <groupId>org.springframework.cloud</groupId>
  21. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  22. </dependency>
  23. <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  24. <dependency>
  25. <groupId>com.shang.cloud</groupId>
  26. <artifactId>cloud-api-commons</artifactId>
  27. <version>${project.version}</version>
  28. </dependency>
  29. <!--一般基础配置类-->
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-devtools</artifactId>
  33. <scope>runtime</scope>
  34. <optional>true</optional>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.projectlombok</groupId>
  38. <artifactId>lombok</artifactId>
  39. <optional>true</optional>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-test</artifactId>
  44. <scope>test</scope>
  45. </dependency>
  46. </dependencies>
  47. </project>

        3、编写yml文件

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. eureka:
  7. instance:
  8. hostname: cloud-gateway-service
  9. client: #服务提供者provider注册进eureka服务列表内
  10. service-url:
  11. register-with-eureka: true
  12. fetch-registry: true
  13. defaultZone: http://eureka7001.com:7001/eureka

         使用eureka、zookeeper或者consul都可以。

        4、编写主启动类

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

        5、9527如何做路由映射呢?

        通过以上的配置之后,基本配置已经完成。那么现在需要思考9527如何做路由映射。

        以cloud-provider-payment8001为例

        我们不想直接暴露8001,想在8001外面套一层9527,让9527为8001看家护院。

        于是,我们需要在yml文件上做一些配置

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. cloud:
  7. gateway:
  8. routes:
  9. - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  10. uri: http://localhost:8001 #匹配后提供服务的路由地址
  11. predicates:
  12. - Path=/payment/get/** # 断言,路径相匹配的进行路由
  13. - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  14. uri: http://localhost:8001 #匹配后提供服务的路由地址
  15. predicates:
  16. - Path=/payment/lb/** # 断言,路径相匹配的进行路由
  17. eureka:
  18. instance:
  19. hostname: cloud-gateway-service
  20. client: #服务提供者provider注册进eureka服务列表内
  21. service-url:
  22. register-with-eureka: true
  23. fetch-registry: true
  24. defaultZone: http://eureka7001.com:7001/eureka

        对应关系如下: 

        6、运行测试

        http://eureka7001.com:7001/

        9527已经注册进了eureka

        http://localhost:8001/payment/get/1 

        http://localhost:9527/payment/get/1       

         9527也能访问到。

六、实现动态路由

        我们现在服务模块是写死的,只能通过8001来提供服务,假如我们后面有8002、8003……改该怎么办呢?

        这就需要配置动态路由, 以服务名为路径。通过网关来实现负载均衡。

        1、修改yml

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. cloud:
  7. gateway:
  8. discovery:
  9. locator:
  10. enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
  11. routes:
  12. - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  13. # uri: http://localhost:8001 #匹配后提供服务的路由地址
  14. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  15. predicates:
  16. - Path=/payment/get/** # 断言,路径相匹配的进行路由
  17. - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  18. # uri: http://localhost:8001 #匹配后提供服务的路由地址
  19. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  20. predicates:
  21. - Path=/payment/lb/** # 断言,路径相匹配的进行路由
  22. eureka:
  23. instance:
  24. hostname: cloud-gateway-service
  25. client: #服务提供者provider注册进eureka服务列表内
  26. service-url:
  27. register-with-eureka: true
  28. fetch-registry: true
  29. defaultZone: http://eureka7001.com:7001/eureka

        2、运行测试

        http://localhost:9527/payment/lb 

 

可以看到8001和8002轮询,负载均衡实现了。 

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号