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.YAML 文件配置
- 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;
- /**
- * @Title:
- * @Auther: pujiahong
- * @Date: 2019/6/18 19:06
- * @Version: 1.0
- * @Description:
- */
- @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;
- }
- }
来源: http://www.bubuko.com/infodetail-3102229.html