没有网关的问题
微服务没有网关,会有下面的问题:
-
客户端请求多个微服务,增加了客户端复杂性,每个微服务都要做用户认证,限流等,避免和多个微服务打交道的复杂性。
-
有跨域问题,不在同一个域。
-
认证复杂,每个服务都要独立认证,服务要求的权限不一致。
-
难以重构。因为微服务被客户端调用着,重构难以实施。
网关是介于客户端(外部调用方比如app,h5)和微服务的中间层。
Zuul网关
(默认继承了ribbon和hystrix)
-
是所有微服务入口,进行分发。
-
身份认证与安全。识别合法的请求,拦截不合法的请求。
-
监控。在入口处监控,更全面。
-
动态路由。动态将请求分发到不同的后端集群。
-
压力测试。可以逐渐增加对后端服务的流量,进行测试。
-
负载均衡。也是用ribbon。
-
限流 。比如我每秒只要1000次,10001次就不让访问了。
简单使用
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--zuul -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
启动类
@EnableZuulProxy
访问网关
http://网关ip:网关端口/服务名/微服务路径
网关会将服务名转换成具体服务的ip和端口,实际进行访问。
网关命名
https://域名/v1/sms/路径
Zuul网关负载
集成了ribbon,同ribbon配置一样
路由端点
zuul.yml配置
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
##默认是never
show-details: ALWAYS
enabled: true
routes:
enabled: true
访问http://localhost:port/actuator/routes,可以查看路由策略。用于排错
过滤器策略
http://localhost:port/actuator/filters,查看过滤器。四种过滤器。
error: [],
post: [],
pre: [],
route: []
路由配置
1、通过服务名配置(虚拟主机名)
zuul:
routes:
servername: /zidingyi/**
2、自定义命名配置
zuul:
routes:
custom-zuul-name: #此处名字随便取
path: /zuul-custom-name/**
url: http://localhost:9002/ //服务地址
ribbon和hystrix都会失效
3、基于2,恢复ribbon和hystrix
zuul:
routes:
#此处名字随便取
custom-zuul-name:
path: /zuul-custom-name/**
service-id: no-eureka-api-driver
no-eureka-api-driver:
ribbon:
listOfServers: localhost:9003,localhost:9002
ribbon:
eureka:
enabled: false
4、执行serviceid
zuul:
routes:
#此处名字随便取
custom-zuul-name:
path: /zuul-custom-name/**
service-id: api-driver
忽略微服务
忽略服务
zuul:
routes:
api-driver: /zuul-api-driver/**
ignored-services:
- api-driver
忽略正则
zuul:
routes:
api-passenger: /zuul-api-passenger/**
api-driver: /zuul-api-driver/**
ignored-patterns:
- /*-driver/**
前缀
zuul:
prefix: /api
# 是否移除前缀,实际访问时会去掉
strip-prefix: true
敏感header
zuul:
#一下配置,表示忽略下面的值向微服务传播,以下配置为空表示:所有请求头都透传到后面微服务。
sensitive-headers: token
过滤器
zuu大部分功能由过滤器实现。
PRE: 在请求被路由之前调用,可利用这种过滤器实现身份验证。选择微服务,记录日志。
ROUTING:在将请求路由到微服务调用,用于构建发送给微服务的请求,并用http clinet(或者ribbon)请求微服务。
POST:在调用微服务执行后。可用于添加header,记录日志,将响应发给客户端。
ERROR:在其他阶段发生错误是,走此过滤器。
pre-routing->调用微服务->post
自定义过滤器
filterType:pre,routing,post,error
filterOrder:执行顺序,在谁前,在谁后,可以+1,-1。越小越先生效
shouldFilter:此过滤器是否执行,返回true执行,false不执行,可以写过滤器是否执行的判断条件。
run:具体执行逻辑
接口容错
实现FallbackProvider结构,重写方法
限流
pre过滤器,使用令牌桶,设置网关最大接受多少流量。或者通过shouldFilter进行单独服务的限流策略
高可用
zuul作为普通的服务。对外访问。前面加一层(nginx+keepalived)