• Gateway环境搭建,通过YML文件配置


    概述简介

    了解地址官网

    1.上一代zuul1.x :https://github.com/Netflix/zull/wiki

    2.gatway https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/

    是什么

    cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用zuul网关,但是2.x版本中,zuul一直处于维护中,后来springcloud自己研发了一个网关代替zuul。

    就是springcloud gateway一句话:gateway是原来zuul1.x版本的替代。

    springcloud gateway是基于webflux框架实现的,而webflux框架底层则是使用了高性能的Reactor模式通信框架Netty

    springcloud gateway的目标是提供统一的路由方式且基于Fileter链的方式提供了网关基本的功能,例如:安全,监控/指标和限流。

    一句话:springcloud gateway使用的时Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。在高并发、非阻塞式响应式通讯中非常有优势。

    能干啥

    1.反向代理

    2.鉴权

    3.流量控制

    4.熔断

    5.日志监控

    6.。。。

    为什么选择gateway?

    1.zuul迟迟不发布新版本。

    比zuul更简单,而且是springcloud团队研发,亲儿子值得信赖;gateway是基于异步非阻塞模型上进行研发,性能方面不需要担心,虽然zuul2.x早就发布了,但是springcloud模式没有整合计划。

    2.springcloud gateway具有如下特性:

    (1)基于spring framework 5,project reactor和springboot2.0进行构建。

    (2)动态路由,能够匹配任何请求属性

    (3)可以对路由进行Predicate(断言)和Filter(过滤)

    (4)集成springcloud服务发现功能

    (5)集成Hystrix的断路由器功能

    (6)易于编写Predicate(断言)和Filter(过滤)

    (7)请求限流功能

    (8)支持路径重新。

    三大核心概念

    1.Route(路由)

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

    2.Predicate(断言)

    参考java8的java.util.function.Predicate

    开发人员可以再匹配HTTP请求中的所有内容(例如请求头、请求参数),如果请求与断言相匹配,则进行路由。

    3.Filter(过滤)

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

    4.总体

    web请求,通过一些匹配条件,定位到真正的服务节点,并在这个转发过程的前后,进行一些精细化的控制。

    predicate就是我们的匹配条件;

    filter就可以理解为一个无所不能的拦截器,有了这两个元素,再加上目标uri,就可以实现一个具体的路由了

    环境搭建

    (1)创建名为cloud-gateway-gateway9527的module  

    (2)修改POM文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>cloud2020</artifactId>
            <groupId>com.seegot.springcloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-gateway-gateway9527</artifactId>
    
        <dependencies>
            <!--引入gateway-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
            <!--gateway也是需要注册到服务中心的-->
            <!--注入eureka client 依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency> 
            <!--网关依赖中,不需要这些配置-->
            <!--<dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>-->
            <!--引入热部署-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.12</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies> 
    </project>

    (2)编写application.yml

    server:
      port: 9527
    spring:
      application:
        name: cloud-gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由
          routes:
            - id: payment_routh #payment_routh #路由的ID,没有固定规则,但要求唯一,建议配合服务名
              #uri: http://localhost:8001  #匹配后提供服务的路由地址 没有进行负载均衡
              uri: lb://cloud-payment-service #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/get/** #断言,路径相匹配的进行路由
    
            - id: payment_routh2 #payment_routh #路由的ID,没有固定规则,但要求唯一,建议配合服务名
              #uri: http://localhost:8001  #匹配后提供服务的路由地址
              uri: lb://cloud-payment-service #匹配后提供服务的路由地址
              predicates:
                - Path=/payment/lb/** #断言,路径相匹配的进行路由
    
    eureka:
      instance:
        hostname: cloud-gateway-service
      client: # 服务提供者provider注册金eureka服务列表内
        service-url:
          register-with-eureka: true
          fetch-registry: true
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

    (3)修改主入口程序

    package com.atguigu.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    /**
     * @program: cloud2020
     * @description:
     * @author: PP Zhang
     * @create: 2020-06-18 13:19
     */
    @SpringBootApplication
    @EnableEurekaClient
    public class GatewayMain9527 {
        public static void main(String[] args) {
            SpringApplication.run(GatewayMain9527.class,args);
        }
    }

    (4)测试

    需要注意的是,我提前已经创建了注册中心模块和服务生产者模块。

    http://localhost:9527/payment/lb

     

  • 相关阅读:
    第二十三篇 函数的调用和函数参数的应用
    第二十四篇 可变长参数
    第二十二篇 定义函数的三种形式以及函数的返回值
    <面试题>面试题整理(1-100)
    算法通关面试40讲
    <Django>部署项目
    <Django>天天生鲜项目(三)
    <Django>天天生鲜项目(三)
    <Django>天天生鲜项目(二)
    <mysql>mysql日志文件
  • 原文地址:https://www.cnblogs.com/pengpengzhang/p/13157204.html
Copyright © 2020-2023  润新知