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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM