Spring Cloud(六):效劳网关zuul
经过过程前面几篇文章的引见,Spring Cloud微效劳架构可经过过程Eureka完成效劳注册与发明,经过过程Ribbon或Feign来完成效劳间的负载平衡挪用,经过过程Hystrix来为效劳挪用供应效劳降级、熔断机制防止雪崩效应,经过过程Spring Cloud Config完成效劳设置的集中化治理。微效劳架构内部治理的基础组件差不多都已涵盖了,然则我们的效劳最终是须要供应给客户端接见的,客户端怎样来接见这些微效劳,就须要引入一个叫效劳网关的组件了。
zuul
zuul是netflix供应的一个基于JVM的路由与效劳端负载平衡器。它在客户端与后端效劳之间建立了一道关卡,客户端一切要求必需经过zuul转发到后端对应的微效劳,返回效果再经过zuul返回给客户端。zuul与Eureka,Config组合的基础构造如图
zuul作为Eureka Client从Eureka Server猎取别的微效劳的设置信息,从而能够将客户端要求经过过程Service ID来负载平衡地转发到后端的效劳实例,同时也作为Config Client从Config Server猎取本身所需的设置信息。
在netflix内部,zuul被用来完成平安认证、动态路由、反向代办、效劳迁徙、效劳削峰、压力测试、金丝雀测试(灰度宣布测试)等功用。本文引见zuul的基础运用与路由划定规矩。
基础运用
建立maven项目 springcloud-zuul
1.pom.xml中引入依靠 spring-cloud-starter-netflix-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-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2.application.yml设置文件中增加必要的设置,主假如eureka客户端设置
spring:
application:
name: zuul-server
server:
port: 8765
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
3.启动类增加注解 @EnableZuulProxy
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
自始自终的简朴,Spring Cloud之所以盛行就是由于它基于Spring Boot将一些通用的功用举行了开箱即用的封装,使得开发者简朴几步就可以疾速集成一个微效劳框架。
顺次启动前文所建立的springcloud-eureka, springcloud-config, springcloud-eureka-client, springcloud-zuul,http://localhost:8765/hello-service/hello 返回 Hello, welcome to spring cloud. env: hello-service-dev, value: hello-service-dev
可见经过过程zuul的要求转发到了hello-service。
为了考证zuul转发要求具有负载平衡的才能,能够将springcloud-eureka-client 中的hello接口返回值做一些调解,并转变端口重启一个实例,再次要求http://localhost:8765/hello-service/hello 将能看到返回效果在两者之间切换。
以上设置文件中并没有加任何路由设置,zuul是怎样将要求准确转发到对应的微效劳的呢? 请看下面的路由划定规矩。
路由划定规矩
1.默许路由划定规矩
zuul供应了默许的路由划定规矩,不须要任何设置就会默许将注册的效劳举行途径映照。我们能够经过过程actuator供应的接口来检察,在application.yml中增加设置
management:
endpoints:
web:
exposure:
include: "*"
摊开actuator的别的接口接见(默许只摊开了/info 与/health接口), 浏览器中接见 http://localhost:8765/actuator/routes, 能够看到返回的zuul默许的路由映照关联
zuul默许将 /service-id/** 的要求路由到Service ID(即spring.application.name的值)为 service-id的效劳,如 /hello-service/hello,将转发到hello-service效劳的/hello接口。
2.自定义路由划定规矩
我们看到zuul的默许路由划定规矩将config-server也映照出来了,关于这类内部效劳我们不愿望暴露,则能够经过过程 zuul.ignoredServices
来举行屏障,在application.yml设置文件中增加
zuul:
ignored-services: "config-server"
重启,再次检察http://localhost:8765/actuator/routes , config-server已被屏障了。
经过过程zuul.routes可增加自定义路由,能够有 zuul.routes.{route-name}.path
+ zuul.routes.{route-name}.serviceId或url
或 zuul.routes.{service-id}: path
两个花样, 以下
zuul:
ignored-services: "config-server"
routes:
hello:
path: /hi/**
serviceId: hello-service
hello-service: /hi2/**
jboost:
path: /jboost/**
url: http://blog.jboost.cn
接见 http://localhost:8765/hi/hello 或 http://localhost:8765/hi2/hello 都将路由到 hello-service的hello接口,接见 http://localhost:8765/jboost/ 将接见到jboost博客首页。增加自定义路由后,默许路由依然存在, 你依然能够经过过程 http://localhost:8765/hello-service/hello 来接见 hello-service的hello接口。
默许的路由划定规矩将Service ID作为婚配途径,看起来有点长,我们想将婚配途径收缩一点,比方hello-service的婚配途径想改成 /hello/**
, 而不是/hello-service/**
, 假如像上面设置,一个微效劳体系大概触及几十以至上百个效劳,那设置起来将是一场恶梦。别急, zuul供应了 ServiceRouteMapper 接口来处理这一问题,个中 PatternServiceRouteMapper 能够基于正则表达式来举行路由抽取。
建立一个设置类,注入一个 PatternServiceRouteMapper 的bean,以下
@Configuration
public class ZuulConfiguration {
@Bean
public PatternServiceRouteMapper serviceRouteMapper() {
return new PatternServiceRouteMapper(
"(?<name>^.+)-(?<postfix>.+$)",
"${name}");
}
}
该完成将会对一切效劳的路由举行调解,service id 形如 name-postfix的婚配途径为 /name/**
, 如hello-service 婚配 /hello/**
。 假如正则表达式婚配失利,则还是以默许划定规矩举行路由,假如婚配胜利,则默许划定规矩失效,但在设置文件中定义的路由依然有用。上述考证中,你都能够经过过程 http://localhost:8765/actuator/routes 来检察当前见效的路由。
别的设置
zuul运用Ribbon来定位效劳实例,一切要求都在hystrix command里实行,所以在zuul中能够增加Ribbon, Hystrix相干设置(详细参考前面Ribbon、Hystrix相干文章)
- zuul.ignoredPatterns 对某些途径举行屏障,如
/**/admin/**
将会屏障一切途径中包含admin的接口接见 - zuul.sensitiveHeaders 对一些header举行过滤,不传递给后端效劳,默许包含Cookie,Set-Cookie,Authorization, 假如要让zuul发送一切header,则须要显式地将sensitiveHeaders置空值
- zuul.prefix 为一切映照增加前缀,如/api, 如许route里配的
/myusers/**
就可以婚配客户端要求的/api/myusers/**
。默许zuul代办在转发时,前缀会被移除,经过过程设置zuul.stripPrefix=false
可不移除
总结
本文简朴引见了zuul的基础运用与路由划定规矩,更高阶的运用我们背面继承。
仔细生活,快活分享