服务网关
Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
服务网关充当服务客户端和被调用的服务之间的中介,服务网关从服务客户端调用中分离出路径,并确定服务客户端正在尝试调用哪个服务。服务网关充当应用程序内所有微服务调用的入站流量的守门人,有了服务网关,服务客户端永远不会直接调用单个服务的URL,而是将所有调用都放到服务网关上面了。
服务网关的关注点:
- 静态路由:服务网关将所有的服务调用放置在单个URL和API路由的后面
- 动态路由:服务网关可以检查传入的服务请求,根据来自传入的数据和服务调用者的身份执行职能的动态路由
- 验证和授权:由于所有的服务都要经过服务网关进行路由,所以服务网关是验证和授权的自然场所
- 数据收集和日志记录:与验证和授权是同样的道理
搭建zuul服务
- 创建zuul服务,添加maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
- 在spring boot启动类添加
@EnableZuulProxy
注解,表示使用zuul反向代理功能
@SpringBootApplication
@EnableZuulProxy
public class ZuulAppllication {
public static void main(String[] args) {
SpringApplication.run(ZuulAppllication.class, args);
}
}
- 整合eureka,配置application配置文件
spring:
application:
name: zuul-server
server:
port: 8822
#整合eureka
eureka:
instance:
prefer-ip-address: true #注册服务的IP
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka
register-with-eureka: true
fetch-registry: true
- 启动服务,访问
http://<zuul server>/routes
,可以得到服务路由
{
"/api/provider-server/**": "provider"
}
这里我仅仅提供了一个服务,所有就只有一个条路由信息
- 这里说明一下,除了使用eureka的服务路由关系外,还可以自己手动设置路由,使用
zuul.routes
属性,例如
zuul:
routes:
provider: /provider-server/** #手动定义路由映射
这样就手动的构造了一条路由信息,访问http://<zuul server>/routes
结果为:
{
"/provider-server/**": "provider",
"/consumer-server/**": "consumer-server"
}
这里"/provider-server/**": "provider",
就是刚才手动设置的路由信息,还可以设置服务的前缀,例如设置服务前缀为api
zuul:
prefix: /api #设置服务前缀
ignored-services: '*' # 排除所有eureka的路由
routes:
provider: /provider-server/** #手动添加路由
这个时候访问http://<zuul server>/routes
结果为:
{
"/api/provider-server/**": "provider"
}
- 使用静态URL手动设置路由
zuul:
routes:
licensestatis:
path: /baidu/**
url: http://www.baidu.com #配置静态路由
访问http://<zuul server>/routes
结果为:
{
"/baidu/**": "http://www.baidu.com",
"/provider-server/**": "provider",
"/consumer-server/**": "consumer-server",
}
"/baidu/**": "http://www.baidu.com"
就是设置的静态路由
- 关于zuul和服务超时
zuul使用netflix的Hystrix和Ribbon库,来帮助防止长时间的服务调用影响服务网关的性能。在默认情况下,对于任何超过1s时间的请求调用,zuul将终止并返回一个HTTP 500错误,使用hystrix.commad.defult.execution.isolation.thread.timeoutInMillseconds
属性来设置zuul的默认超时时间。如果需要为特定的服务设置超时时间,只需要将defult
换成服务ID名称就行,例如修改调用provider-server
的时间,只需要在application配置文件中添加hystrix.commad.provider-server.execution.isolation.thread.timeoutInMillseconds=3000
即可。
对于Ribbon也有一个默认超时时间为5s,通过设置servername.ribbon.ReadTimeout
来修改默认值。
网友评论