使用Gateway配置路由以及動態路由


1. 新建module cloud-gateway-gateway9527

 

 

 2. pom.xml

<!--注意不需要web模塊依賴,否則報錯-->
<?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.atguigu.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>
        
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--引入自定義的api通用包,可使用Payment支付Entity-->
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
 
3. application.yml
server:
  port: 9527

spring:
  application:
    name: cloud-gateway
eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
4. 主啟動類
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class GatewayMain9527 {
    public static void main(String[] args) {
        SpringApplication.run(GatewayMain9527.class,args);
    }
}

 

9527 網關如何做路由映射?
先來看看cloud-provider-payment8001 controller的訪問地址

 

 

 現在不想暴露8001端口,希望在8001外面套一層9527,這樣如果有人攻擊8001,有一層9527擋着

5. yml 新增網關配置
spring:
  cloud:
    gateway:
      routes:
        - id: payment_routh #payment_routh    #路由的ID,沒有固定規則但要求唯一,簡易配合服務名
          uri: http://localhost:8001         #匹配后提供服務的路由地址
          predicates:
            - Path=/payment/get/**          #斷言,路徑相匹配的進行路由

        - id: payment_routh2 #payment_routh   #路由的ID,沒有固定規則但要求唯一,簡易配合服務名
          uri: http://localhost:8001          #匹配后提供服務的路由地址
          predicates:
            - Path=/payment/lb/**             #斷言,路徑相匹配的進行路由
 

 

 

 

6. 測試

啟動7001、8001、9527,將8001、9527都注冊進eureka7001

 

 

 添加網關前訪問:

 

 

 添加網關后:

 

 

 

 

 

 9527套在最外面,有一個地址 localhost:8001 能被訪問到,predicates 斷言判斷 8001下面有一個 /payment/get/** 地址匹配,如果路由上 predicates 為true 訪問成功,false 訪問失敗。
Gateway網關路由有兩種配置方式

    在配置文件yml 中配置
    代碼中注入RouteLocator 的Bean
    官網案例:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#route-metadata-configuration
 

 

 

 

package com.atguigu.springcloud.config;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GateWayConfig {
    /**
     * 配置一個id為route-name的路由規則,
     * 當訪問地址http://localhost:9527/guonei時會自動轉發到地址:http://news.baidu.com/guonei
     * @param routeLocatorBuilder
     * @return
     */
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();

        routes.route("path_route_atguigu",
                r -> r.path("/guonei")
                        .uri("http://news.baidu.com/guonei")).build();
        return routes.build();
    }
}
 

測試

 

 這個就是用編碼的方式實現gateway網關進行路由映射配置的方法

動態路由

上面訪問的路由地址我們是寫死的,在微服務架構中,微服務提供者不可能只有一台服務器,就需要動態路由

 

 之前80客戶端發送請求訪問8001/8002,通過ribbon負載均衡,將請求分散,現在服務提供者如果是多台,就需要將ribbon替換為gateway,只暴露gateway,客戶端請求統一發到gateway,gateway將請求轉發給8001/8002。

默認情況下Gateway會根據注冊中心注冊的服務列表,以注冊中心上微服務名為路徑創建動態路由進行轉發,從而實現動態路由的功能。

現在啟動一個eureka7001,兩個服務提供者8001/8002

修改pom.xml,將9527注冊進eureka
 

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
 

修改yml
需要注意的是uri的協議為lb,表示啟用Gateway的負載均衡功能。
lb://serviceName是springcloud gateway在微服務中自動為我們創建的負載均衡uri

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-provider-service   #匹配后提供服務的路由地址,lb后跟提供服務的微服務的名,不要寫錯
          predicates:
            - Path=/payment/get/**          #斷言,路徑相匹配的進行路由

        - id: payment_routh2 #payment_routh   #路由的ID,沒有固定規則但要求唯一,簡易配合服務名
          #uri: http://localhost:8001          #匹配后提供服務的路由地址
          uri: lb://cloud-provider-service     #匹配后提供服務的路由地址,lb后跟提供服務的微服務的名,不要寫錯
          predicates:
            - Path=/payment/lb/**             #斷言,路徑相匹配的進行路由
 /104874932

啟動9527,測試

 

 兩個微服務注冊進來,微服務名一定要對應,別寫錯。現在再來看通過9527 訪問服務,也是可以的,並且多次刷新,8001/8002交替出現。

 


免責聲明!

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



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