springcloud zuul
Zuul 作为路由网关组件,在微服务架构中有着非常重要的作用,主要体现在以下 6 个方面。 D Zuul、 Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够 将请求流量按某种策略分发到集群状态的多个服务实例。 口 网关将所有服务的 API 接口统一聚合,并统一对外暴露。外界系统调用 API 接口时, 都是由网关对外暴露的 API 接口,外界系统不需要知道微服务系统中各服务相互调 用的复杂性。微服务系统也保护了其内部微服务单元的 API 接口 , 防止其被外界直 接调用,导致服务的敏感信息对外暴露。 口 网关服务可以做用户身份认证和权限认证,防止非法请求操作 API 接口,对服务器 起到保护作用。 口 网关可以实现监控功能,实时日志输出,对请求进行记录。 口 网关可以用来实现流量监控, 在高流量的情况下,对服务进行降级。 口 API 接口从内部服务分离出来, 方便做测试。
1.pom依赖
父pom dependencyManagement
<dependencyManagement>
<dependencies>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-dependencies
</artifactId>
<version>
Greenwich.RELEASE
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencyManagement>
zuul pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
2. application.properties
spring.application.name=cloud5
server.port=8092
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/
zuul.routes.cloud1.path=/a/*/*
zuul.routes.cloud1.service-id=cloud3
zuul.routes.cloud2.path=/b/*/*
zuul.routes.cloud2.service-id=cloud4
#HTTP连接超时要比Hystrix的大
zuul.host.connect-timeout-millis=150000
#socket超时
zuul.host.socket-timeout-millis=600000
#设置ribbon超时时间
ribbon.ReadTimeout=5000
ribbon.ConnectTimeout=5000
3.代码部分
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class SpringCloud5Application {
public static void main(String[] args) {
SpringApplication.run(SpringCloud5Application.class,args);
}
}
配置熔断器
return * 代表为所有服务加上熔断器
@Component
public class MyFallbackProvider implements FallbackProvider {
@Override
public String getRoute() {
return "*";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return 200;
}
@Override
public String getStatusText() throws IOException {
return "OK";
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
return new ByteArrayInputStream("{\"status\":500,\"message\":\"sorry,the system goes to sleep,please try again later!\"}".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
配置过滤器
filterType方法 ----- 返回过滤器类型
Zuul有一下四种过滤器
“pre”:是在请求路由到具体的服务之前执行,这种类型的过滤器可以做安全校验,例如身份校验,参数校验等
“routing”:它用于将请求路由到具体的微服务实例,在默认情况下,它使用Http Client进行网络请求
“post”:它是在请求已被路由到微服务后执行,一般情况下,用作收集统计信息,指标,以及将响应传输到客户端
“error”:它是在其他过滤器发生错误时执行
filterOrder ----- 方法执行顺序 越小越早
shouldFilter ----- 方法表示该过滤器是否过滤逻辑,如果是ture,则执行run()方法;如果是false,则不执行run()方法.
run方法 ----- 具体过滤逻辑
@Component
public class MyZuulFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
System.out.println("run method ......");
return null;
}
}