作者:年庚瑶 | 来源:互联网 | 2023-09-15 08:06
springgateway使用基于netty异步io,第二代网关;zuul1使用servlet3,第一代网关,每个请求一个线程,同步Servlet,多线程阻塞模型。而spring貌
spring gateway
使用基于netty异步io,第二代网关;
zuul 1
使用servlet 3,第一代网关,每个请求一个线程,同步Servlet,多线程阻塞模型。
而spring貌似不想在支持zuul 2了
API网关作为后端服务的统一入口,可提供请求路由、协议转换、安全认证、服务鉴权、流量控制、日志监控等服务。
1.搭一个简单的网关
idea中file-new-project
![技术分享图片](https://img7.php1.cn/3cdc5/c7bc/78c/e115b242f1c56671.jpeg)
![技术分享图片](https://img7.php1.cn/3cdc5/c7bc/78c/0270d291ed1609f6.jpeg)
![技术分享图片](https://img7.php1.cn/3cdc5/c7bc/78c/88f97aeb7d7b2c0c.jpeg)
![技术分享图片](https://img7.php1.cn/3cdc5/c7bc/78c/8becdba38466edfb.jpeg)
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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.6.RELEASEversion>
<relativePath/>
parent>
<groupId>com.examplegroupId>
<artifactId>gatewaytest2artifactId>
<version>0.0.1-SNAPSHOTversion>
<name>gatewaytest2name>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
<spring-cloud.version>Greenwich.SR1spring-cloud.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
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);
}
}
目录结构
![技术分享图片](https://img7.php1.cn/3cdc5/c7bc/78c/73618dcd7b3be124.jpeg)
2.启动测试
注册中心已经有我们的网关服务了
![技术分享图片](https://img7.php1.cn/3cdc5/c7bc/78c/829653ab2fbd37c0.jpeg)
测试
![技术分享图片](https://img7.php1.cn/3cdc5/c7bc/78c/52096c6c00777eb5.jpeg)
返回
![技术分享图片](https://img7.php1.cn/3cdc5/c7bc/78c/8c164741de529181.jpeg)
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;
}
}