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

 

原文地址:https://www.cnblogs.com/pengpengzhang/p/13157204.html