一、Zuul組件簡介 1、基礎概念 Zuul 網關主要提供動態路由,監控,彈性,安全管控等功能。在分散式的微服務系統中,系統被拆為了多個微服務模塊,通過zuul網關對用戶的請求進行路由,轉發到具體的後微服務模塊中。 2、Zuul的作用 1)按照不同策略,將請求轉發到不同的服務上去; 2)聚合API接 ...
一、Zuul組件簡介
1、基礎概念
Zuul 網關主要提供動態路由,監控,彈性,安全管控等功能。在分散式的微服務系統中,系統被拆為了多個微服務模塊,通過zuul網關對用戶的請求進行路由,轉發到具體的後微服務模塊中。
2、Zuul的作用
1)按照不同策略,將請求轉發到不同的服務上去;
2)聚合API介面,統一對外暴露,提高系統的安全性;
3)實現請求統一的過濾,以及服務的熔斷降級;
3、案例結構
啟動順序如下:
# 註冊中心
node05-eureka-7001
# 兩個服務提供者
node05-provider-6001
node05-provider-6002
# 網關控制
node05-zuul-7002
啟動成功後,註冊中心展示如下:
二、Zuul使用詳解
1、核心依賴
<!-- 路由網關 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
2、核心配置文件
server:
port: 7002
spring:
application:
name: cloud-node05-parent
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://registry01.com:7001/eureka/
zuul:
# 首碼,可以用來做版本控制
prefix: /v1
# 禁用預設路由,執行配置的路由
ignored-services: "*"
routes:
# 配置6001介面微服務
pro6001:
serviceId: node05-provider-6001
path: /api-6001/**
# 配置6002介面微服務
pro6002:
serviceId: node05-provider-6002
path: /api-6002/**
- 啟動類註解:@EnableZuulProxy
3、統一服務降級
實現FallbackProvider介面,自定義響應提示。
@Component
public class FallBackConfig implements FallbackProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(FallBackConfig.class) ;
@Override
public ClientHttpResponse fallbackResponse(Throwable cause) {
// 捕獲超時異常,返回自定義信息
if (cause instanceof HystrixTimeoutException) {
return response(HttpStatus.GATEWAY_TIMEOUT);
} else {
return fallbackResponse();
}
}
private ClientHttpResponse response(final HttpStatus status) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() {
return status;
}
@Override
public int getRawStatusCode() {
return status.value();
}
@Override
public String getStatusText() {
return status.getReasonPhrase();
}
@Override
public void close() {
LOGGER.info("close");
}
@Override
public InputStream getBody() {
String message =
"{\n" +
"\"code\": 200,\n" +
"\"message\": \"微服務飛出了地球\"\n" +
"}";
return new ByteArrayInputStream(message.getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
@Override
public String getRoute() {
return "*";
}
@Override
public ClientHttpResponse fallbackResponse() {
return response(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
4、統一過濾器
繼承ZuulFilter類,自定義過濾動作。
@Component
public class FilterConfig extends ZuulFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(FilterConfig.class) ;
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext requestContext = RequestContext.getCurrentContext() ;
try {
doBizProcess(requestContext);
} catch (Exception e){
LOGGER.info("異常:{}",e.getMessage());
}
return null;
}
public void doBizProcess (RequestContext requestContext) throws Exception {
HttpServletRequest request = requestContext.getRequest() ;
String reqUri = request.getRequestURI() ;
if (!reqUri.contains("getAuthorInfo")){
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(401);
requestContext.getResponse().getWriter().print("Path Is Error...");
}
}
}
5、測試流程
1)測試網關配置
訪問如下介面,響應正常,說明網關配置生效:
http://localhost:7002/v1/api-6001/getAuthorInfo/1
http://localhost:7002/v1/api-6002/getAuthorInfo/2
2)測試服務降級
關閉6001服務,再次訪問介面,提示信息如下,說明服務降級策略生效:
{
"code": 200,
"message": "微服務飛出了地球"
}
3)測試過濾器
因為請求URI不匹配getAuthorInfo,所以被攔截,說明過濾器略生效:
http://localhost:7002/v1/api-6001/
響應提示:
Path Is Error...
三、源代碼地址
GitHub地址:知了一笑
https://github.com/cicadasmile
碼雲地址:知了一笑
https://gitee.com/cicadasmile