spring cloud網關gateway


spring gateway使用基於netty異步io,第二代網關;
zuul 1使用servlet 3,第一代網關,每個請求一個線程,同步Servlet,多線程阻塞模型。
而spring貌似不想在支持zuul 2了

API網關作為后端服務的統一入口,可提供請求路由、協議轉換、安全認證、服務鑒權、流量控制、日志監控等服務。

1.搭一個簡單的網關

idea中file-new-project

pom.xml文件(引入eureka)

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>gatewaytest2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gatewaytest2</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

applicaton.yml文件配置

spring:
  application:
    name: gateway8710
  cloud:
    gateway:
      default-filter:
      routes:
      - id: user-server
        predicates:
          - Path=/java/**
        filters:
          - StripPrefix=1
        uri: lb://service-helloword
        #  uri: "http://192.168.111.133:8708/project/hello"
server:
  port: 8710
eureka:
  client:
    serviceUrl:
      #指向注冊中心
      defaultZone: http://192.168.111.133:8888/eureka/
  instance:
    # 每間隔1s,向服務端發送一次心跳,證明自己依然”存活“
    lease-renewal-interval-in-seconds: 1
    # 告訴服務端,如果我2s之內沒有給你發心跳,就代表我“死”了,將我踢出掉。
    lease-expiration-duration-in-seconds: 2

注意:uri項中的lb第一個字母L的小寫,配置這個表示要去eureka中查找相關的服務

StripPrefix=1表示去掉url中的前綴,如http://localhost:8710/java/project/hello,經過網關轉后變成http://192.168.111.133:8708/project/hello,即去掉前綴/java,后面的不變,去注冊中心找service-helloword服務的地址和端口

當配置uri使用絕對路徑時寫了項目路徑(/project/hello)uri: "http://192.168.111.133:8708/project/hello",不管請求的是路徑是什么(http://localhost:8710/java/xxx/xxx),都直接訪問配置的地址http://192.168.111.133:8708/project/hello

當配置uri使用絕對路徑時沒寫項目路徑(/project/hello)如uri: "http://192.168.111.133:8708",請求http://localhost:8710/java/xxx/xxx轉發后變為http://192.168.111.133:8708/xxx/xxx

 

啟動類Gatewaytest2Application.java

package com.example.gatewaytest2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class Gatewaytest2Application {

    public static void main(String[] args) {
        SpringApplication.run(Gatewaytest2Application.class, args);
    }

}

目錄結構

2.啟動測試

注冊中心已經有我們的網關服務了

 

 

測試

返回

 

 
        

 3.附service-helloword

controller

package com.pu.helloworld;

import com.pu.common.ExcelUtil;
import com.pu.ioctest.IocTest;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;


@RestController
@RequestMapping("/project")
public class helloController {
    private static Logger log = LoggerFactory.getLogger(helloController.class);

    @RequestMapping(value = "/hello")
    //required=false 表示url中可以不傳入id參數,此時就使用默認參數
    public String say(@RequestParam(value = "id", required = false, defaultValue = "hello world") String input) {
        log.debug("your input :" + input);
        return "your input :" + input;
    }
}

 


免責聲明!

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



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