概念
微服务一般都是在内网中,一般不会给外部(用户)暴露,不会直接让app或者页面进行访问,通常都会进行内外隔离,页面到微服务中间会有一个中间层,在这个中间层进行统一的路由,控制等。这个就是网关。
处理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能。它将"1对N"问题转换成了"1对1”问题。
微服务没有网关,会有下面的问题:
-
客户端请求多个微服务,增加了客户端复杂性,每个微服务都要做用户认证,限流等,避免和多个微服务打交道的复杂性。
-
有跨域问题,不在同一个域。
-
认证复杂,每个服务都要独立认证,服务要求的权限不一致。
-
难以重构。因为微服务被客户端调用着,重构难以实施。
工作原理
zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。
Zuul是Netflix开源的微服务网关,核心是一系列过滤器。这些过滤器可以完成以下功能。
-
是所有微服务入口,进行分发。
-
身份认证与安全。识别合法的请求,拦截不合法的请求。
-
监控。在入口处监控,更全面。
-
动态路由。动态将请求分发到不同的后端集群。
-
压力测试。可以逐渐增加对后端服务的流量,进行测试。
-
负载均衡。也是用ribbon。
-
限流(望京超市)。比如我每秒只要1000次,10001次就不让访问了。
-
服务熔断
网关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. 启动一个微服务,通过浏览器发一个请求
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=cuidcuid.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防火墙
业务网关(业务网关集群):熔断,缓存等
所有的拒绝策略,尽量的前置。
基于四层网络的。