SpringCoud(七、GateWay网关)
程序员文章站
2022-06-14 21:18:37
...
一、介绍
1 、网关选择
- 所有的微服务都需要网关,挡在微服务前,起到日志,限流,权鉴等作用;
- netflix公司的zuul,zuul2;zuul功能存在一定的缺陷,zuul2进行了一定的提升;
- Spring Cloud GataWay等网关组件: 由spring内部研发出了新的网关;
2 、zuul 1.x
- 基于Servlet2.5 阻塞架构,Zuul用Java实现;
- 采用非Reactor模式,基于阻塞I/O,性能较低;
3 、zuul 2.x
- 高性能的;
4 、Spring Cloud GataWay
- GataWay意欲取代zuul,SpringCloud 2.0以上版本中,没有对zuul2.x进行整合,只支持1.x;
- GataWay 以 Spring Boot 2.x, Spring WebFlux, Project Reactor为基础;
- Spring WebFlux底层 使用了高性能的Reactor模式通信框架Netty;
- netty可以支持高并发,异步式非阻塞式;
二、组件
1. 路由(Route)
- 构建网关的基本模块,包含ID,目标URL,一系列的断言和过滤器组成,如果断言为True则匹配该路由;
2. 断言(Predicate)
- 如果请求与断言相匹配,则进行路由,如果不匹配,则路径出错;
3. 过滤(Filter)
- 路由进行匹配后,通过过滤器来进行前面或者后面的过滤;
三、案列演示
1. 服务提供方
- 服务提供方必须注册到注册中心
controller
package com.zte.cloud.consumer.controller;
@RestController
public class PaymentController {
@GetMapping("/consumer/getname/{name}")
public String getName(@PathVariable("name") String name){
return name + "======consumer服务方";
}
@GetMapping("/consumer/getAge/{age}")
public String getName(@PathVariable("age") Integer age){
return "您的年龄为:" + age;
}
}
controller
server:
port: 8001
servlet:
context-path: /zte-payment-provider
# 向注册中心注册时候的服务的名字
spring:
application:
name: zte-payment-provider
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://firsteureka:7001/eureka/
访问路径
http://localhost:8001/zte-payment-provider/consumer/getname/Lucy
http://localhost:8001/zte-payment-provider/consumer/getAge/10
2. Spring_Cloud_Gateway网关
pom.xml
<?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>zte-cloud-shuzhan</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-cloud-gateway</artifactId>
<dependencies>
<!--eureka 服务端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--网关相关依赖,不能添加web的starter,否则报错-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
</project>
主启动类
package com.zte;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient // 网关也要注册进微服务
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
application.yaml
server:
port: 9527
# 向注册中心注册时候的服务的名字
spring:
application:
name: zte-cloud-gateway
cloud:
gateway:
# 可以配置多个路由的具体配置
routes:
- id: firstmethod_route # 路由的名字,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 # 匹配服务的ip及端口
predicates:
- Path=/zte-payment-provider/consumer/getname/** # 断言: 路径匹配 /consumer/getname/{name}
- id: secondmethod_route
uri: http://localhost:8001
predicates:
- Path=/zte-payment-provider/consumer/getage/** # 断言: 路径匹配 /consumer/getAge/{age}
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://firsteureka:7001/eureka/
访问路径
- 对于原来的工程,可以通过工程的对应的ip和端口及路径进行访问;
- 也可以将工程中的端口号进行替换后,也可以直接进行访问;
#这个localhost代表的是原来的工程的ip及端口
http://localhost:8001/zte-payment-provider/consumer/getname/Lucy
http://localhost:8001/zte-payment-provider/consumer/getAge/10
#这个localhost代表的是网关的ip及端口
http://localhost:9527/zte-payment-provider/consumer/getname/Lucy
http://localhost:9527/zte-payment-provider/consumer/getAge/10
访问过程
- http://localhost:9527进入到网关的工程;
- zte-payment-provider/consumer/getname/Lucy是通过断言匹配到了;
- 发送到uri指定的http://localhost:8001里面;
- 在http://localhost:8001里查找该zte-payment-provider/consumer/getname/Lucy;
四、路由规则
- 通过配置yaml的方式;
- 通过硬编码注入路由的方式;
1. 硬编码注入路由规则
package com.zte.cloud.config;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
RouteLocatorBuilder.Builder routes = routeBuilder.routes();
/**要访问的网址: http://news.baidu.com/guonei
* 参数一: 路由的id
* 参数二: 目标网站的路径,也即断言
* 参数三: 目标网站
* 如果访问 http:localhost:9527/guonei,将会转发到 http://news.baidu.com/guonei*/
routes.route("first_gateway_route",
r ->r.path("/guonei").
uri("http://news.baidu.com/guonei")).build();
return routes.build();
}
}
为什么没调通
五、动态路由
- 服务提供方进行集群;
- 路由匹配:动态路由根据服务名,而不是ip+端口方式匹配,实现负载均衡(默认轮询);
Gateway的application.yaml
server:
port: 9527
# 向注册中心注册时候的服务的名字
spring:
application:
name: zte-cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能,利用微服务进行路由
# 可以配置多个路由的具体配置
routes:
- id: firstmethod_route # 路由的名字,没有固定规则但要求唯一,建议配合服务名
uri: lb://ZTE-PAYMENT-PROVIDER # 匹配注册中心的微服务的名字,lb代表开启负载均衡
predicates:
- Path=/zte-payment-provider/consumer/getname/** # 断言: 路径匹配 /consumer/getname/{name}
- id: secondmethod_route
uri: lb://ZTE-PAYMENT-PROVIDER
predicates:
- Path=/zte-payment-provider/consumer/getage/** # 断言: 路径匹配 /consumer/getAge/{age}
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://firsteureka:7001/eureka/
六、常用断言
上一篇: php定时执行任务设置详解_PHP教程
下一篇: PHP调用控制台EXE程序的步骤