续 Eureka+Hystrix+Zuul(Zuul API网关)
概述:
服务的合并,转发,验证,异构协议。将上百个请求融为一个发送到后台,返回大的JSON返回处理;
作用:这减少了客户端与应用程序间的交互次数,还简化了客户端代码。
Zuul可以通过加载动态过滤机制,从而实现以下各项功能:
l 验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
l 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
l 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
l 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
l 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
l 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
l 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
除此之外,Netflix公司还利用Zuul的功能通过金丝雀版本实现精确路由与压力测试。
具体实现:Eureka整合Zuul,并实现断路器
1.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>client.Zuul</groupId> <artifactId>client-Zuul</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- Hystrix,Feign是基于Hystrix的 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
2.启动项 ZuulRunApp
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy public class ZuulRunApp { public static void main(String[] args) { SpringApplication.run(ZuulRunApp.class, args); } }
application.yml
server:
port: 8050
spring:
application:
name: client-Zuul
eureka:
client:
serviceUrl:
defaultZone: http://user:password123@localhost:8761/eureka
zuul:
routes:
app-a:
path: /user/**
serviceId: consumer-Hystrix
ZuulFallBack.java
package cn.hz.fallback; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; @Component public class ZuulFallBack implements ZuulFallbackProvider{ @Override public String getRoute() { //为了通用,写了个* return "*"; } @Override public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON_UTF8); return headers; } @Override public InputStream getBody() throws IOException { String msg = "This is responseContext!"; return new ByteArrayInputStream(msg.getBytes()); } @Override public String getStatusText() throws IOException { return HttpStatus.BAD_REQUEST.getReasonPhrase(); } @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.BAD_REQUEST; } @Override public int getRawStatusCode() throws IOException { return HttpStatus.BAD_REQUEST.value(); } @Override public void close() { } }; } }
执行:
依次启动:eurekaserver, provider , consumer , Zuul
确保访问正常后,关闭provider;
执行结果:http://localhost:8050/user/hello/82