SpringCloud微服务中gateway网关的使用(一)——(介绍+gateway与zuul的区别+gateway实现的两种方式)
前言:springcloud全家桶中国有个很重要的组件就是网关,在1.x版本中都是采用的zuul网关;zuul是netfix开发的一个网关组件,但在2.x版本中,zuul由于更新迭代的速度过慢,于是springcloud就自己推出了一个新的网关组件,那就是gateway。一。gateway概念1.gateway是什么?gateway是在spring生态系统之上构建的API网关服务,基于Spring
前言:
springcloud全家桶中国有个很重要的组件就是网关,在1.x版本中都是采用的zuul网关;zuul是netfix开发的一个网关组件,但在2.x版本中,zuul由于更新迭代的速度过慢,于是springcloud就自己推出了一个新的网关组件,那就是gateway。
文章目录
一。gateway概念
1.gateway是什么?
gateway是在spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot2和Project Reactor等技术。gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:反向代理、熔断、限流、重试等。
微服务架构中网关所处位置:
2.gateway的特性
- 动态路由,能够匹配任何请求属性;
- 可以对路由指定Predicate(断言)和Filter(过滤器),且易于编写;
- 集成Hystrix的断路器功能;
- 集成SpringCloud服务发现功能;
- 请求限流功能;
- 支持路径重写。
3.三大核心概念
Route(路由)
:路由是构建网关的基本模块,它有ID,目标URI,一系列的断言和过滤器组成,如果请求与断言相匹配则进行路由Predicate(断言)
:参考的是java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由Filter(过滤)
:指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
总结:
predicate就是我们发的匹配条件;而filter,就可以理解为一个无所不能的拦截器,有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。
4.gateway工作方式
我们可以在gateway官网:https://spring.io/projects/spring-cloud-gateway得知它的工作方式:
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序通过特定于请求的过滤器链运行请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“后”过滤器逻辑。
二。gateway与zuul的区别
zuul模型:
gateway模型:
webFlux是什么?
三。编码实现
1.application.yml配置文件方式实现
首先第一步新建一个子模块,在该模块的pom.xml文件中导入gateway依赖:
<!--gateway网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
在application.yml配置类文件中添加以下配置:
eureka:
client:
serviceUrl:
#服务注册地址
defaultZone: http://localhost:8088/eureka/
instance:
#服务实例名称
instance-id: getway-9527
#是否暴露服务ip地址
prefer-ip-address: true
server:
#运行端口
port: 9527
spring:
application:
#服务注册名称
name: service-getway
cloud:
gateway:
routes:
- id: service-provider-getNumber # 路由的id,没有规定规则但要求唯一,建议配合服务名
#匹配后提供服务的路由地址
uri: http://localhost:8001
predicates:
- Path=/provider/getNumber/** # 断言,路径相匹配的进行路由(注意**为通配符)
- id: service-provider-getInfo
uri: http://localhost:8001
predicates:
- Path=/provider/getInfo #断言,路径相匹配的进行路由
其中,标注部分为gateway新增网关配置部分:
最后在启动类上加上@EnableEurekaClient注解,注册服务到eureka上:
注意:
这里还需要剔除spring-boot-starter-web依赖:,否则会启动失败:
服务提供端8001控制器代码如下:
剔除后重新启动,访问服务提供端端口8001服务:
之后用网关服务9527端口访问:
均成功访问,说明网关服务已经配置成功!
2.GateWay配置类方式实现
新建一个GatewayConfig配置类,代码如下:
/**
* @Description:以配置文件的方式来配置gateway网关转发
* @Author :zks
* @Date :16:53 2020/10/28
*/
@Configuration
public class GatewayConfig {
/**
* 访问外网淘宝网
* @param builder
* @return
*/
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("gateway_baidu", r -> r.path("/gateway/toTaobao")
.uri("http://www.taobao.com"))
.build();//id,访问配置path,以及真正访问地址
}
}
重新启动访问localhost:9527/gateway/toTaobao,跳转到淘宝网页面:
更多推荐
所有评论(0)