先看概念:
本人翻译:构建一套分布式系统不一定是复杂和容易出问题的。Spring Cloud为分布式系统提供了一套简单且具有高可用性的编程模版。帮助开发者能够快速构建具有扩展性的,可靠的,协调的分布式应用。Spring Cloud 是基于SpringBoot的基础上构建的,这使得开发者们能够更容易更快速地进行生产工作。
大概就是这个意思,本人英语水平有限。从图中来看,Gateway是横穿在客户端和服务端中间的,它虽然叫网关,但是它其实也是一个SpringBoot项目,一个关卡口,所有请求都必须过了它这关才能往下走。
作用:
(1)可做网关级别的安全校验和权限校验。
(2)强制规范请求方式和请求参数。
(3)定时限流和定时熔断,配合HystrixCommand做熔断后的服务降级。Hystrix服务熔断和Hystrix DashBoard仪表盘
三大核心概念:
(1)路由Route
(2)断言
(3)过滤器
简单来说,就是一个不断过滤的过程,请求进来之后,我们会指定部分请求路径映射到对应的Server Name (ServerName下会有服务集群,但是这层调用我们可以用Ribbon+Feign做),然后断言规则会进行一些Header的参数校验,Cookies的参数校验,接口可用的时间判断,最后通过过滤器的过滤链再做一层判断。全部校验都通过之后,才会允许发起调用。
怎么用?(默认已经有服务注册中心和消费端生产端的基础)
(1)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>jojo.springcloud</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-gateway</artifactId>
<dependencies>
<!--GateWay网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--熔断器-->
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>cloud-commons-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-metrics-event-stream</artifactId>
</dependency>
</dependencies>
</project>
(2)修改properties或者yml配置文件(注意缩进):
server:
port: 9500
spring:
application:
name: cloud-gateway-service
# 配置网关信息
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由功能,利用微服务名进行路由
routes:
- id: circulate_route
uri: lb://CLOUD-CIRCULATE-SERVICE
# 断言
predicates:
- Path=/demo/testBreaker # 这个表示指定路由路径,如果是/demo/*就表示只需要判断匹配 /demo
# 配置路由的生效时间
# - After=2020-09-23T14:40:32.874+08:00[Asia/Shanghai]
# - Before=XXXXXXXX (在XXXX时间段之前生效的路由)
# - Between=XXXXXXXXXX,XXXXXXXXX (在XXXXX和XXXXXXX时间段内生效的路由)
# 更高级别的权限与接口安全配置
# - Cookie=username,jojo # 这里表示请求testBreaker接口必须携带cookie,username = jojo的信息
# - Header=X-Request-Id, \d+ # 这里表示Header请求头必须携带X-Request-Id属性,并且值必须是整数的正则表达式。
# - Query=id, \d+ # 这里表示必须携带参数,并且参数叫做id,并且参数必须是正整数
- id: circulate_route1
uri: lb://CLOUD-CIRCULATE-SERVICE
predicates:
- Path=/demo/test
eureka:
client:
# 是否注册进eureka
register-with-eureka: true
fetchRegistry: true
service-url:
# 集群版注册中心
defaultZone: http://eureka7000.com:7000/eureka,http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
(3)主启动类:
@SpringBootApplication(exclude= {
DataSourceAutoConfiguration.class})
@EnableEurekaClient
public class GateWayMain {
public static void main(String[] args) {
SpringApplication.run(GateWayMain.class, args);
}
}
注意由于yml文件不配数据源,这个网关服务也不需要查数据库,所以一定要排除DataSource的自动扫描配置类,不然启动不起来。
测试一下:
现在时间是:
因为指定的是40分,所以该路由还未开放,显示404也很正常,我们等一分钟后:
成功~!从此微服务的网关就配好了,剩下的就是根据每个服务集群配好Server Name,然后把网关这个服务套上个域名即可。
更多玩法配置看官网:https://spring.io/projects/spring-cloud-gateway
学习视频支持B站的尚硅谷我阳哥!!!
尚硅谷2020最新版SpringCloud(H版&alibaba)框架开发教程全套完整版从入门到精通(大牛讲授spring cloud)