项目github地址:https://github.com/Netflix/zuul
。
zuul是netflix开源的一个API网关服务,本质上也是一个HTTP服务器。zuul已经整合到SpringCloud生态中,作为SpringCloudNetflix的一个组件,在微服务架构中从当API网关角色。
由上图可以看出,在微服务架构中,zuul作为整个系统访问的统一入口,具备了身份认证鉴权、动态路由、负载均衡、服务容错等一系列功能,在整个系统中至关重要。
详细演示代码:https://gitee.com/micro_service_xk/netflix-cloud-demo.git zuul模块
1、导入zuul依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-zuulartifactId>
dependency>
2、开启zuul网关功能
@EnableDiscoveryClient //开启Eureka客户端
@EnableZuulProxy // 开启Zuul的网关功能
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
application.yml配置文件
server:
port: 10010 # 服务端口
spring:
application:
name: zuul-service # 服务名,将注册到eureka-server中
eureka:
client:
service-url: # eureka-server的地址信息,多个使用英文逗号分割
defaultZone: http://127.0.0.1:10086/eureka
3、演示zuul路由
注册到eureka服务端的服务实例列表:
携带服务名访问zuul,zuul将动态路由到指定服务。例如访问http://localhost:10010/order-service/order/1
,且zuul已集成robbin、hystix,已实现多实例路由负载均衡及熔断。
其它配置信息:
zuul:
retryable: true #zuul开启重试
prefix: /api #zuul网关访问前缀
ribbon:
ConnectTimeout: 250 # Ribbon的连接超时时间(创建会话的连接时间,不是服务的响应时间,而是本机与服务建立会话的时间。)
ReadTimeout: 1000 # Ribbon的数据读取超时时间(当请求发出之后,如果对方服务没有在规定时间内返回)
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数(默认1)
MaxAutoRetries: 0 # 对当前实例的重试次数(默认0)
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000 # 设置hystrix的降级超时时间为3000ms,对所有远程服务调用生效
使用重试机制需要引入spring-retry依赖
<dependency>
<groupId>org.springframework.retrygroupId>
<artifactId>spring-retryartifactId>
dependency>
使用zuul降级操作,需要编写降级类(示例:)
@Component
public class OrderServiceFallBack implements FallbackProvider {
@Override
public String getRoute() {
/**
* 指定对哪个服务进行降级操作,* 代表对所有服务进行降级
*/
return "order-service";
}
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.BAD_GATEWAY;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.BAD_REQUEST.value();
}
@Override
public String getStatusText() throws IOException {
return HttpStatus.BAD_REQUEST.getReasonPhrase();
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
String msg = "{\"code\":-1,\"msg\":\"远程服务调用失败\"}";
return new ByteArrayInputStream(msg.getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
4、演示zuul过滤器