Zuul閘道器服務使用詳解
阿新 • • 發佈:2019-01-26
1)在SpringBoot工程 part-1-website 中新增依賴,如下
3.Zuul的幾種請求路由方式 準備工作:
1)啟動一個高可用的Eureka-server
2)建立一個服務應用,以對外提供介面服務
3)複製一份該服務端服務,除了埠號不一致其他都保持一致,尤其spring.application.name要保持一致,用於驗證在外部請求到達時是否負載均衡
筆者在本示例中服務應用名稱設定為 part-1-sms-interface ,全部四個應用啟動後,訪問eureka可看到
以上:PART-1-EUREKA即為高可用eureka-server;PART-1-SMS-INTERFACE即為對外服務應用,提供/sms/test服務
1)傳統路由
* 單例項配置(通過zuul.routes.<route>.path和zuul.routes.<route>.url引數對的方式來配置)
在application.properties檔案中新增路由規則即可
* 多例項配置(通過zuul.routes.<route>.path和zuul.routes.<route>.serviceId引數對的方式來配置)
在application.properties檔案中新增如下路由規則即可
2)服務路由配置
通過Zuul和Eureka的整合,實現對服務例項的自動化維護
在這種情況下,我們不需要像傳統路由那樣為serviceId指定具體的服務例項地址,只需要將path和serviceId對應上
注意:實現這種方式,需要引入eureka依賴,並將zuul例項註冊到eureka中
在application.properties檔案中新增如下路由規則
4.過濾器 過濾負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎。
Zuul的過濾器使用方式如下:
1)建立一個類,繼承com.netflix.zuul.ZuulFilter
shouldFilter:true表示需要過濾;false表示不需要
filterType: * pre 請求被路由之前被呼叫(一般做一些前置加工) * route 在路由請求時呼叫(將外部請求轉發到具體的服務例項上) * post 路由請求返回時呼叫(包裝加工返回資訊) * error 處理請求發生錯誤時呼叫
filterOrder:通過數字來表示filter的執行順序
run:做真正的邏輯處理
2)在Application下建立@Bean,將此Filter作為一個bean注入
參考:Spring Cloud微服務實戰
2)在Application上新增@EnableZuulProxy註解,開啟Zuul閘道器服務<!-- spring-cloud-starter-hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <parent> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Dalston.SR1</version> <relativePath /> </parent>
@EnableZuulProxy
public class WebsiteApp {
}
3)設定該工程應用名稱、埠號等資訊# 應用名稱
spring:
application:
name: part-1-website
#埠
server:
port: 1102
以上即成功構建應用,以下為請求路由方式3.Zuul的幾種請求路由方式 準備工作:
1)啟動一個高可用的Eureka-server
2)建立一個服務應用,以對外提供介面服務
3)複製一份該服務端服務,除了埠號不一致其他都保持一致,尤其spring.application.name要保持一致,用於驗證在外部請求到達時是否負載均衡
筆者在本示例中服務應用名稱設定為 part-1-sms-interface ,全部四個應用啟動後,訪問eureka可看到
1)傳統路由
* 單例項配置(通過zuul.routes.<route>.path和zuul.routes.<route>.url引數對的方式來配置)
在application.properties檔案中新增路由規則即可
注意:以上規則即說明,對當前website應用的所有以 /part-1-website開始的請求路徑全部轉發到http://localhost:1109上; 如果是請求localhost:1102/part-1-website/sms/test即會轉發到localhost:1109/sms/test上,即實現對PART-1-SMS-INTERFACE的服務訪問#route rule zuul.routes.part-1-website.path=/part-1-website/** zuul.routes.part-1-website.url=http://localhost:1109/
* 多例項配置(通過zuul.routes.<route>.path和zuul.routes.<route>.serviceId引數對的方式來配置)
在application.properties檔案中新增如下路由規則即可
zuul.routes.part-1-website.path=/part-1-website/**
zuul.routes.part-1-website.serviceId=website
website.ribbon.listOfServers=http://localhost:1108/,http://localhost:1109/
注意:與單例項不同就是:通過serviceId和listOfServers來確定path和url的對應關係;
website讀者可自定義,只要保持與listOfServers保持一致即可,servers值即PART-1-SMS-INTERFACE服務對應的應用IP:埠 2)服務路由配置
通過Zuul和Eureka的整合,實現對服務例項的自動化維護
在這種情況下,我們不需要像傳統路由那樣為serviceId指定具體的服務例項地址,只需要將path和serviceId對應上
注意:實現這種方式,需要引入eureka依賴,並將zuul例項註冊到eureka中
在application.properties檔案中新增如下路由規則
zuul.routes.part-1-website.path=/part-1-website/**
zuul.routes.part-1-website.service-id=part-1-sms-interface
eureka.client.service-url.defaultZone=http://eureka1:1001/eureka/
注意:service-id即為要呼叫的服務名稱;需要將本應用註冊到eureka4.過濾器 過濾負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎。
Zuul的過濾器使用方式如下:
1)建立一個類,繼承com.netflix.zuul.ZuulFilter
public class AccessFilter extends ZuulFilter{
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
//也可獲取其他引數,如response、
String token = request.getParameter("accessToken");
if(StringUtils.isEmpty(token)){
context.setSendZuulResponse(false);
context.setResponseStatusCode(401);
context.setResponseBody("has no accessToken");
}
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
}
注意:需實現ZuulFilter的abstract方法;shouldFilter:true表示需要過濾;false表示不需要
filterType: * pre 請求被路由之前被呼叫(一般做一些前置加工) * route 在路由請求時呼叫(將外部請求轉發到具體的服務例項上) * post 路由請求返回時呼叫(包裝加工返回資訊) * error 處理請求發生錯誤時呼叫
filterOrder:通過數字來表示filter的執行順序
run:做真正的邏輯處理
2)在Application下建立@Bean,將此Filter作為一個bean注入
@Bean
public AccessFilter accessFilter(){
return new AccessFilter();
}
3)重啟應用後,發出請求,如果request中沒有新增AccessToken,則會收到報錯,說明Filter生效參考:Spring Cloud微服務實戰