SpringCloud Gateway

  • Post author:
  • Post category:其他


SpringCloud Gateway中文官方文档:

https://cloud.tencent.com/developer/article/1403887

SpringCloud Gateway官方文档:

https://spring.io/projects/spring-cloud-gateway#overview

为什么要有网关

什么是网关?

API网关是一个服务器,是系统对外的唯一入口。API网关封装了系统内部架构,为每个客户端提供一个定制的API。API网关方式的核心要点是:所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也提供REST/HTTP的访问API。服务端通过API网关注册和管理服务。网关的具体的职责有:身份认证、监控、负载均衡、缓存、请求分片和管理、静态响应处理。当然,最主要的职责还是和客户端联系。

在一个成熟的微服务系统中。假如没有网关的角色,让客户端直接和各个服务直接通信,也许会存在这些弊端:

1、一个成熟系统,服务少则数十,多则上百,如果让前端管理这些地址,增加开发难度,针对web前端,还有各种跨域问题,前端开发人员有连续跑路风险;

2、加大身份认证难度,每个服务都需要单独进行安全校验。

那么。如果存在客户端和各服务之间加入一层网关,优势就很明显:

1、所有客户端请求通过网关,再由网关转发请求到目标服务,既方便管理又方便监控;

2、针对服务调用的安全性,统一由网关认证即可;

3、合并请求,以达到减少客户端与各服务之间的网络请求。比如某个页面需要调用10个服务的接口,客户端直接访问就需要发起10次远程http请求,有了网关,客户端就可以直接请求网关,由网关层去聚集这10个服务数据,再返给前端。正常情况下,网关去获取这个10个服务的数据必然远小于客户端直接去获取这个10个服务的数据所带来的通信时间。

目前市面上能作为网关角色的产品很多,比如Nginx+Lua、Zuul(闭源了)、Traefik等,还有这里要说的SpringCloud Gateway。当前,也可以根据网关的一些特性去自行实现。

体验小demo

在创建网关项目之前,先准备1个eureka项目以及2个微服务项目(注册到eureka中),可以在后面尝试做一些整合测试,也可以不创建这额外的3个项目。在其中2个服务项目中,提供以下接口:

@Controller
public class GateWayController {
	
	@Value("${server.port}")
	private String port;
	
	@PostMapping("/gateWay/noArguments")
	@ResponseBody
	public String methodA() {
		
		return "我是没有参数的接口。端口是:" + port;
	}
	
	@PostMapping("/gateWay/hasArguments")
	@ResponseBody
	public String methodB(String arg) {
		
		return "我是有参数的接口。端口是:" + port + ";接收到的参数是 : " + arg;
	}

    @PostMapping("/gateWay/fallback")
	@ResponseBody
	public String methodC() {
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "这里测试熔断";
	}
	
}

创建好网关项目之后,引入如下jar包:

<!-- eureka依赖 注意:不要引入eureka-server,否则网关项目会启动失败 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<!-- hystrix:配合实现熔断 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

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



注意


:不要在项目中引入”spring-boot-starter-web”依赖,springcloud gateway基于webflux实现,会与spring-boot-starter-web冲突,导致项目无法启动。如果引入了”spring-boot-starter-web”,会出现如下异常:

是不是第一次觉得异常描述这么让人容易理解?英语渣。

网关项目配置:

# 服务端口
server.port=9007
# 注册eureka:根据自己的eureka项目配置相应信息
eureka.client.service-url.defaultZone=http://zepal:123456@localhost:9999/eureka/
# 服务名称
spring.application.name=cloud-server7-gateway

# gateway配置
# 如果应用了该starter,但由于某种原因不希望启用网关,可以设置为false,默认为true
# spring.cloud.gateway.enabled=false
# 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务
spring.cloud.gateway.discovery.locator.enabled=true
#  自定义的路由 ID,保持唯一(支持多组路由配置)
spring.cloud.gateway.routes[0].id=url-proxy-1
#  目标服务地址(请求转发后的地址,支持http形式、服务名形式lb、websocket形式wb)
spring.cloud.gateway.routes[0].uri=https://www.csdn.net
# 路由条件(这里指定路由/csdn接口。即客户端请求/csdn接口,转发到上面的目标地址)
spring.cloud.gateway.routes[0].predicates[0]=Path=/csdn

依次启动eureka项目和网关项目(这里可以暂时不用启动eureka)。在浏览器中访问localhost:9007/csdn。会发现直接跳转到



版权声明:本文为weixin_41381863原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。