routing zuul_尚学堂0131之zuul的相关概念及如何性能调优
采用服務名稱指定路由方式
1.1使用服務名稱指定路由的規則是什么?
1.2需改配置文件,將路由規則修改為使用服務名稱路由。
通過服務名, service-id為服務名
zuul:
routes:
E-Book-Product-Provider:
path: /suibian/**
service-id: E-Book-Product-Provider
路由的排除方法
2.1什么是路由排除法?
2.2修改配置文件,將路由規則修改為添加前綴法。
排除知道服務。也可以排除所有服務/*,可以同routes添加不排除的服務
zuul:
ignored-services: #排除知道服務。也可以排除所有服務/*,可以同routes添加不排除的服務
- /* # E-Book-Product-Provider
ignored-patterns: #排除指定路徑 使用符號統配
- /*/findAll
自定義網關過濾器
3.1創建一個Maven的jar項目。
3.2 修改POM文件,添加Zuul啟動器。
3.3需改配置文件,添加服務相關配置。
spring:
application:
name: Zuul-Gateway-Filter
server:
port: 9999
eureka:
client:
serviceUrl:
defaultZone: http://admin:admin@eureka1:8761/eureka/,http://admin:admin@eureka2:8761/eureka/
# URL 匹配關鍵字,如果包含path就跳轉到指定的 URL中
zuul: #配置路由規則
routes:
E-Book-Product-Provider:
path: /E-Book-Product-Provider/**
url: http://localhost:8001/
過濾器類型講解
4.1 ZuulFilter的作用是什么?
4.2過濾器有哪些類型?有什么作用?
4.3在項目中創建一個登陸過濾器。
網關過濾器,過濾符合條件的url請求
PRE過濾器:是在請求路由到具體服務之前執行的,可以做安全驗證,如身份驗證,參數驗證。
ROUTING過濾器:它用于將請求 路由到具體的微服務實例。默認使用Http Client進行網絡請求。
POST過濾器:在請求已被路由到微服務后執行的。可用作收集統計信息、指標,以及將響應傳輸到客戶端。
ERROR過濾器:在其他過濾器發生錯誤時執行。
Zuul的請求生命周期
5.1闡述Zuul的請求生命周期。
5.2創建權限驗證服務。
5.3修改POM文件,添加相關坐標。
5.4修改POM問價,添加Zuul啟動器坐標。
5.5修改配置文件,添加服務相關配置。
采用網關過濾器實現權限驗證
6.1 AccessFilter添加登錄權限驗證業務。
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.micrometer.core.instrument.util.StringUtils;
/**
* 簡單的登錄權限校驗
* @author Administrator
*
*/
@Component
public class TokenFilter extends ZuulFilter{
private static final Logger log=LoggerFactory.getLogger(TokenFilter.class);
/**
* 過濾邏輯
*/
@Override
public Object run() throws ZuulException {
RequestContext rc=RequestContext.getCurrentContext();
HttpServletRequest req = rc.getRequest();
String token = req.getParameter("token");
if(StringUtils.isEmpty(token)) {
//未登錄
log.warn("未登錄!!!!");
rc.setSendZuulResponse(false);//設置不向下傳遞,攔截不通過
rc.setResponseStatusCode(401);
rc.setResponseBody("未登錄!!請先登錄");
rc.getResponse().setContentType("text/html;charset=utf-8");
}else {
http://log.info("已登錄,通過過濾器!!!");
}
return null;
}
/**
* 是否開啟過濾
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 攔截優先級 數字越小越高
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 攔截器類型
* PRE過濾器:是在請求路由到具體服務之前執行的,可以做安全驗證,如身份驗證,參數驗證。
*ROUTING過濾器:它用于將請求 路由到具體的微服務實例。默認使用Http Client進行網絡請求。
*POST過濾器:在請求已被路由到微服務后執行的。可用作收集統計信息、指標,以及將響應傳輸到客戶端。
*ERROR過濾器:在其他過濾器發生錯誤時執行。
*/
@Override
public String filterType() {
//只能是小寫
return "pre";
}
}
網關過濾器執行順序與post類型演示
7.1闡述多網關過濾器的執行順序。
7.2創建AccessFilter2過濾器,PostFilter2過濾器,分析他們的執行順序。
采用網關過濾器對系統異常同一處理
8.1闡述如何通過網關過濾器實現異常同意處理?
8.2 ErrorController接口的作用是什么?
8.3創建異常處理過濾器。
8.4創建處理異常響應的控制器,實現異常統一處理。
@Component
public class ErrorMyFilter extends ZuulFilter{
private Logger log=LoggerFactory.getLogger(ErrorMyFilter.class);
/**
* 過濾邏輯
*/
@Override
public Object run() throws ZuulException {
RequestContext rc=RequestContext.getCurrentContext();
HttpServletRequest req = rc.getRequest();
//http://localhost:9999/E-Book-Product-Provider/product/find?token=suibian
http://log.info("------網關過濾器攔截異常------");
throw new RuntimeException("運行異常");
}
/**
* 是否開啟過濾
*/
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true;
}
/**
* 攔截優先級 數字越小越高
*/
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
/**
* 攔截器類型
* PRE過濾器:是在請求路由到具體服務之前執行的,可以做安全驗證,如身份驗證,參數驗證。
*ROUTING過濾器:它用于將請求 路由到具體的微服務實例。默認使用Http Client進行網絡請求。
*POST過濾器:在請求已被路由到微服務后執行的。可用作收集統計信息、指標,以及將響應傳輸到客戶端。
*ERROR過濾器:在其他過濾器發生錯誤時執行。
*只能小寫
*/
@Override
public String filterType() {
// TODO Auto-generated method stub
return "error";
}
}
Zuul和hystrix無縫結合
9.1 Zuul與Hystrix結合時,是否需要添加Hystrix坐標?
9.2獲取網關數據流的URL是什么?
在 zuul 的 jar 包中包含了 hystrix 的 jar 包。所以我們不需要在項目中添加 Hystrix 的坐標
http://localhost:port/actuator/hystrix.stream
在網關中實現對服務降級處理
10.1 ZuulFallbackProvider接口的作用是什么?
10.2創建Maven的jar工程。
10.3需改POM文件,添加相關坐標。
10.4修改POM文件,添加Zuul坐標。
10.5修改配置文件,添加服務相關配置。
10.6創建ProviderProductFallback類,添加服務降級業務邏輯。
ZuulFallbackProvider:定義了網關服務返回托底數據的方法
/**
* 實現FallbackProvider接口,實現服務降級
*
* 1.添加@Component注解
* 2.getRoute方法返回監控的服務名稱
* 3.FallbackProvider
*
* @author Administrator
*
*/
@Component
public class ProductProviderFallback implements FallbackProvider {
/**
* 對指定的服務提供降級處理
*/
@Override
public String getRoute() {
return "E-Book-Product-Provider";
}
/**
* 設置降級后返回的響應
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
/**
* 響應頭
*/
@Override
public HttpHeaders getHeaders() {
HttpHeaders hander=new HttpHeaders();
hander.setContentType(MediaType.APPLICATION_JSON_UTF8);
return hander;
}
/**
* 響應體
*/
@Override
public InputStream getBody() throws IOException {
String content="請求服務不可達!請聯系管理員!";
return new ByteArrayInputStream(content.getBytes());
}
/**
* 狀態碼:String類型
*/
@Override
public String getStatusText() throws IOException {
// TODO Auto-generated method stub
return getStatusCode().getReasonPhrase();
}
/**
* 狀態碼:HttpStatus類型
*/
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
/**
* 狀態碼:int類型
*/
@Override
public int getRawStatusCode() throws IOException {
// TODO Auto-generated method stub
return getStatusCode().value();
}
/**
* 關閉
*/
@Override
public void close() {
}
};
}
}
在高并發情況下,網關實現限流達到自我保護
11.1在高并發情況下,網關如何實現限流達到自我保護?
11.2網關限流配置參數zuul.ratelimit.enabled的作用是什么?
11.3網關限流配置參數zuul.ratelimit.repositry的作用是什么?
對網關服務進行限流
zuul.ratelimit.enabled:開啟網關限流
zuul.ratelimit.repositry: 數據存儲方式,默認為內存存儲
11.4網關限流配置參數
11.5 zuul.ratelimit.policies.ServiceId.refresh-interval的作用是什么?
11.6網關限流配置參數zuul.ratelimit.policies.ServiceId.limit的作用是什么?
11.7網關限流配置參數zuul.ratelimit.policies.ServiceId.quota的作用是什么?
11.8網關限流配置參數zuul.ratelimit.policies.ServiceId.type的作用是什么?
11.9創建Maven的jar工程。
11.10需改POM文件添加相關坐標。
11.11修改POM文件,添加Zuul坐標。
11.12修改POM文件,添加Ratelimit坐標。
11.13修改配置文件,添加服務相關配置。
11.14修改配置文件,添加全局限流策略。
11.15訪問服務,測試限流結果。
11.16需改配置文件,添加局部限流策略。
11.17訪問服務,測試限流結果。
spring:
application:
name: Zuul-getway-ratelimit
redis:
#redis單機配置
host: 47.98.169.238
port: 6379
#redis連接池配置
jedis:
pool:
max-idle: 10
min-idle: 5
max-active: 100
max-wait: 3000
server:
port: 8888
eureka:
client:
serviceUrl:
defaultZone: http://admin:admin@eureka1:8761/eureka/,http://admin:admin@eureka2:8761/eureka/
#配置路由規則
zuul:
routes:
E-Book-Product-Provider:
path: /suibian/**
ratelimit:
enabled: true #開啟限流
#全 局 限 流
default-policy-list: #全局配置
- limit: 10 #訪問次數
quota: 30 #訪問總時間
refresh-interval: 60 #時間間隔
# 即在時間間隔內 訪問的次數 總時間小于 訪問總時間 就會被限制
type:
- origin #對ip進行限制
repository: redis #數據存儲方式,默認為內存存儲
#指定服務限流(局部限流)
# policy-list:
# E-Book-Product-Provider: #被限流的服務名
# - limit: 10
# quota: 30
# refresh-interval: 60
# type:
# - url
# repository: redis #數據存儲方式,默認為內存存儲
#開啟監控端點 http://ip:port/actuator/hystrix.stream 需要actuatorjar包
#management:
# endpoints:
# web:
# exposure:
# include: hystrix.stream
Zuul性能調優-網關的2層超時調優
12.1什么是網關的2層超時調優?
12.1創建Maven的jar工程。
12.2修改POM文件,添加相關坐標。
12.4修改POM文件,添加Zuul啟動器坐標。
12.5修改配置文件,添加2層超時調優策略。
hystrix的超時時間為1s,而ribbon為5s,假設請求在1s內沒有處理完,就會timeout。
我們將hystrix的超時時間調高,避免timeout。
但ribbon的超時時間應該小于hystrix,在集群環境下,給充足的時間讓ribbon調用集群中其他服務。
<!-- SpringBoot配套的運行環境,一定要加上,不加會報錯!!! -->
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<maven-jar-plugin.version>2.6</maven-jar-plugin.version>
</properties>
<dependencies>
<!-- 表示依賴不向下傳遞 -->
<optional>true</optional>
</dependency>
<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-client</artifactId>
</dependency>
<!-- 網關服務 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
spring:
application:
name: Zuul-Gateway-Timeout
server:
port: 9999
eureka:
client:
serviceUrl:
defaultZone: http://admin:admin@eureka1:8761/eureka/,http://admin:admin@eureka2:8761/eureka/
#http://localhost:9999/suibian/product/find
zuul:
routes:
E-Book-Product-Provider:
path: /suibian/**
#hystrix的超時時限
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 8000
#ribbon的超時時限
ribbon:
ReadTimeout: 5000
ConnectTimeout: 5000
management:
endpoints:
web:
exposure:
include: hystrix.stream
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的routing zuul_尚学堂0131之zuul的相关概念及如何性能调优的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: hadooprbac_rbac权限管理系
 - 下一篇: opencv python tutori