<七>spring-cloud Hoxton.SR2 网关组件gateway搭建使用
文章目录
本地项目的基础环境
环境 | 版本 |
---|---|
jdk | 1.8.0_201 |
maven | 3.6.0 |
Spring-boot | 2.2.4.RELEASE |
Spring-cloud | Hoxton.SR2 |
本次例子是基于上一次构建的badger-spring-cloud-api
项目的基础上,使用的;
《<一>spring-cloud Hoxton.SR2版 服务注册与发现–eureka搭建以及集群搭建》
《<二>spring-cloud Hoxton.SR2 负载均衡ribbon搭建使用》
《<三>spring-cloud Hoxton.SR2 负载均衡openfeign搭建使用》
《<四>spring-cloud Hoxton.SR2 断路器hystrix搭建使用》
《<五>spring-cloud Hoxton.SR2 hystrix Dashboard监控搭建使用》
《<六>spring-cloud Hoxton.SR2 网关组件zuul搭建使用》
具体代码信息,可以查看《码云》
1、gateway简介
1.1、简介
gateway是在spring生态系统之上构建的API网关服务,基于spring5、spring-boot 2和Project Reactor等技术。
Springcloud gateway 的目标提供统一的路由方式基于Filter链的方式提供网关基本的功能,例如:安全、监控\指标,限流;
springcloud gateway具有如下特性:
-
基于spring framework 5 ,Project Reactor 和spring boot 2.0 进行构建;
-
动态路由:能够匹配任何请求属性;
-
可以对路由指定Predicate(断言)和Filter(过滤器);
-
集成Hystrix的断路器功能;
-
集成spring-cloud服务发现功能;
-
易于编写的Predicate(断言)和Filter(过滤器);
-
请求限流功能;
-
支持路径重写;
1.2、词汇表
路由:路由网关的基本构建块。它由ID,目标URI,谓词集合和过滤器集合定义。如果聚合谓词为true,则匹配路由。
谓词:这是 Java 8 Function谓词。输入类型为 Spring Framework ServerWebExchange。这使开发人员可以匹配HTTP请求中的任何内容,例如标头或参数。
过滤器:这些是使用特定工厂构造的实例 Spring Framework GatewayFilter。在此,可以在发送下游请求之前或之后修改请求和响应。
1.3、工作原理
客户端向Spring Cloud网关发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序运行通过特定于请求的筛选器链发送请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前或之后执行逻辑。执行所有“前置”过滤器逻辑,然后发出代理请求。发出代理请求后,将执行“后”过滤器逻辑。
1.4、详细参考
2、项目搭建
2.1、搭建新的项目badger-spring-cloud-gateway
,pom文件如下
主要是新增注册中心eureka的包spring-cloud-starter-netflix-eureka-client
,网关gateway的包spring-cloud-starter-netflix-gateway
<?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 https://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.2.8.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.badger</groupId>
<artifactId>badger-spring-cloud-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>badger-spring-cloud-gateway</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-cloud.version>Hoxton.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<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>
</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>
2.2、主启动类,加eureka的注解@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
2.3、yaml的配置文件
server:
port: 9000
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
spring:
application:
name: badger-spring-cloud-gateway
cloud:
gateway:
routes:
- id: badger-api1 #路由的id,主要是为了区分微服务的业务而命名的
uri: http://localhost:7001 #转发的服务的地址
predicates:
- Path=/demo/** #断言的规则,目前设置的根据请求路径(path)来判断
- id: csdn
uri: https://blog.csdn.net
predicates:
- Path=/qq*/**
更多关于gateway的属性配置,可以查看org.springframework.cloud.gateway.config.GatewayProperties.class
配置类;
关于predicates
断言的更多配置,可以参考《spring-cloud中文网》
也可以查看spring的官网,对于spring-cloud-gateway的文档;
https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/
也可以使用代码形式对转发路由进行配置,spring-cloud-gateway的文档中,也可以看到
https://spring.io/projects/spring-cloud-gateway#overview
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggcqlokyzuj312j0u0ail.jpg)
3、项目启动,测试使用
3.1、启动步骤
- 启动eureka的服务,端口8761;
- 修改yaml的配置文件,启动端口为7001,启动服务的提供者badger-spring-cloud-api;
- 启动服务的消费者badger-spring-cloud-gateway,端口为9000;
3.2、测试
当前网关转发的路由有两个:
1、一个转发本地的 服务的提供者badger-spring-cloud-api;访问http://localhost:7001/demo的结果
访问地址 http://localhost:9000/demo
可以看到如下图结果,网关转发成功了;
2、转发路由中,另外一个配置了csdn
博客主页的地址;
访问地址http://localhost:9000/qq_28410283
如下图所示:网关也转发成功了;
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggcqtujy4hj313m0och00.jpg)
3、负载均衡调用服务提供者badger-spring-cloud-api
3.1、负载均衡调用的问题
上述的测试只是转发了单个地址的请求,如果服务的提供者badger-spring-cloud-api应用,部署了多个,并且注册到同一个注册中心中,根据具体地址转发的配置,不能调用使用负载均衡的形式调用badger-spring-cloud-api应用的;
3.2、新的yml配置
server:
port: 9000
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
spring:
application:
name: badger-spring-cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心获取转发的服务路由,默认为false
routes:
- id: badger-api #路由的id,主要是为了区分微服务的业务而命名的
uri: lb://badger-spring-cloud-api #转发的服务的地址
predicates:
- Path=/demo/** #断言的规则,目前设置的根据请求路径(path)来判断
主要是开启了spring.cloud.gateway.discovery.locator.enabled
属性为true;
然后把routes
的url属性配置成lb://'+serviceId'
的形式;
具体可以参看配置类org.springframework.cloud.gateway.discovery.DiscoveryLocatorProperties.class
![](https://tva1.sinaimg.cn/large/007S8ZIlgy1ggcrn58am1j315u0t4thn.jpg)
3.3、再测试;
启动服务的提供者badger-spring-cloud-api;启动端口为7000;
启动服务的提供者badger-spring-cloud-api;启动端口为7001;
启动服务的消费者badger-spring-cloud-gateway,端口为9000;
再次调用地址http://localhost:9000/demo就可以发现,两个端口,轮训调用了;
我的地址是-->172.16.2.54:7001
我的地址是-->172.16.2.54:7000
具体代码信息,可以查看《码云》