网关Zuul

概念

微服务一般都是在内网中,一般不会给外部(用户)暴露,不会直接让app或者页面进行访问,通常都会进行内外隔离,页面到微服务中间会有一个中间层,在这个中间层进行统一的路由,控制等。这个就是网关。

处理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能。它将"1对N"问题转换成了"1对1”问题。

微服务没有网关,会有下面的问题:

  1. 客户端请求多个微服务,增加了客户端复杂性,每个微服务都要做用户认证,限流等,避免和多个微服务打交道的复杂性。

  2. 有跨域问题,不在同一个域。

  3. 认证复杂,每个服务都要独立认证,服务要求的权限不一致。

  4. 难以重构。因为微服务被客户端调用着,重构难以实施。

 

 

工作原理

zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。

 

Zuul是Netflix开源的微服务网关,核心是一系列过滤器。这些过滤器可以完成以下功能。

  1. 是所有微服务入口,进行分发。

  2. 身份认证与安全。识别合法的请求,拦截不合法的请求。

  3. 监控。在入口处监控,更全面。

  4. 动态路由。动态将请求分发到不同的后端集群。

  5. 压力测试。可以逐渐增加对后端服务的流量,进行测试。

  6. 负载均衡。也是用ribbon。

  7. 限流(望京超市)。比如我每秒只要1000次,10001次就不让访问了。

  8. 服务熔断

 

 

网关zuul

zuul默认集成了:ribbon和hystrix。

  • 创建一个zuul项目
  • 依赖包
        <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-netflix-zuul</artifactId>
        </dependency>
  • 启动类

@EnableZuulProxy

  • 配置文件
#需要将zuul注册到eureka注册中心
eureka.client.service-url.defaultZone=http://tzw:123@localhost:7001/eureka/
#zuul网关名称
spring.application.name=ZuulService
#端口
server.port=83
  • 初步验证

1. 启动一个微服务,通过浏览器发一个请求

http://localhost:81/helloFour

2. 通过网关主动调用

http://localhost:83/consumer/helloFour

3. 解释:

第一次是模拟一个请求直接调用微服务,

第二次是通过网关去调用 http://网关ip+网关端口/需要调用的微服务id/调用的url

第二次调用如果能和第一次调用一样则代表配置成功,且通过网关服务调用的。

 

  • 验证负载均衡

zuul默认继承了Ribbon 和 Hystrix

http://localhost:83/consumer/helloFour

consumer:81---------->provider:9999用户名称:张三-----用户id:1

consumer:82---------->provider:9999用户名称:张三-----用户id:1

consumer:81---------->provider:8888用户名称:张三-----用户id:1

发现都在进行轮询,实现负载均衡

 

路由端点

如果有发现错误,通过配置找错误。这个就是actuator端点配置

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.endpoint.health.enabled=true
management.endpoint.routes.enabled=true

http://localhost:83/actuator/health

http://localhost:83/actuator/routes

 

配置指定微服务的访问路径

1. 服务名称配置,可以将真正的服务名称隐藏,

zuul.routes.consumer=/qwer/**

#通过服务名配置(虚拟主机名)

#http://localhost:83/consumer/helloFour

#http://localhost:83/qwer/helloFour 

这两种方式都能访问成功。

 2. 自定映射,映射配置

#自定义映射
zuul.routes.aaaaaa.path=/aaa/**

zuul.routes.aaaaaa.url=http://localhost:9999

这样搭配也可以。 

#自定义映射
zuul.routes.aaaaaa.path=/aaa/**

zuul.routes.aaaaaa.service-id=provider

 

 

其中aaaaaa是自定义的。

 

http://localhost:83/aaa/helloOne 访问变成     http://localhost:9999/helloOne

3. 自定义负载均衡

zuul.routes.xx.path=/xx/**
zuul.routes.xx.service-id=cuid

cuid.ribbon.listOfServers=localhost:82,localhost:83
ribbon.eureka.enabled=false

 

忽略微服务

从网关不能调用该服务

zuul.ignored-services=provider

配置前

http://localhost:83/provider/helloOne,可以访问

配置后

http://localhost:83/provider/helloOne,不能够访问

前缀

配置前缀

 

zuul.prefix=/api/v1

配置前,

http://localhost:83/provider/helloOne 可以访问通

配置后

http://localhost:83/provider/helloOne 不可以访问通

http://localhost:83/api/v1/provider/helloOne ,加上前缀 /api/v1可以访问通

strip-prefix :代理前缀默认会从请求路径中移除,通过该设置关闭移除功能,

是否带上前缀请求

zuul.strip-prefix=false

也就是说,当网关访问provider时,通过这个配置开关,默认是开的,也就是默认移除。true

默认zuul.strip-prefix=true,这是当网关代理到provide时,默认会将前缀移除,访问时http://provider/helloOne

如果配置false,关闭移除功能,这是当网关代理到provide时,不会将前缀移除,访问时http://provider/api/v1/helloOne

 

设计上的构想

隧道模式也叫,代理模式

一个高可用的框架

用户------>LVS(负载均衡网关)-------->(隧道模式)多个业务网关zuul------->后台微服务

 

读写分离

 

网关分层

分析业务请求:

流量网关:AWF防火墙

业务网关(业务网关集群):熔断,缓存等

所有的拒绝策略,尽量的前置。

 

基于四层网络的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值