Spring Cloud Zuul路由網(wǎng)關服務過濾實現(xiàn)代碼
Zuul 簡介
Zuul 的主要功能是路由轉發(fā)和過濾器。路由功能是微服務的一部分,比如 /api/admin 轉發(fā)到到 Admin 服務,/api/member 轉發(fā)到到 Member 服務。Zuul 默認和 Ribbon 結合實現(xiàn)了負載均衡的功能。
引入依賴
在 pom.xml 中主要添加 spring-cloud-starter-netflix-eureka-server 和 spring-cloud-starter-netflix-zuul 依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
相關配置
在 application.yml 中主要添加 Zuul 路由配置
zuul: routes: api-a: path: /api/ribbon/** serviceId: hello-spring-cloud-web-admin-ribbon api-b: path: /api/feign/** serviceId: hello-spring-cloud-web-admin-feign
路由說明:
以 /api/ribbon 開頭的請求都轉發(fā)給 spring-cloud-web-admin-ribbon 服務
以 /api/feign 開頭的請求都轉發(fā)給 spring-cloud-web-admin-feign 服務
在 Application 入口類中添加 @EnableZuulProxy 注解開啟 zuul 功能
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
配置網(wǎng)關路由失敗時的回調(diào)
創(chuàng)建 WebAdminFeignFallbackProvider 回調(diào)類
/**
* 路由 hello-spring-cloud-web-admin-feign 失敗時的回調(diào)
*/
@Component
public class WebAdminFeignFallbackProvider implements FallbackProvider {
@Override
public String getRoute() {
// ServiceId,如果需要所有調(diào)用都支持回退,則 return "*" 或 return null
return "hello-spring-cloud-web-admin-feign";
}
/**
* 如果請求服務失敗,則返回指定的信息給調(diào)用者
* @param route
* @param cause
* @return
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
/**
* 網(wǎng)關向 api 服務請求失敗了,但是消費者客戶端向網(wǎng)關發(fā)起的請求是成功的,
* 不應該把 api 的 404,500 等問題拋給客戶端
* 網(wǎng)關和 api 服務集群對于客戶端來說是黑盒
* @return
* @throws IOException
*/
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.OK.value();
}
@Override
public String getStatusText() throws IOException {
return HttpStatus.OK.getReasonPhrase();
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> map = new HashMap<>();
map.put("status", 200);
map.put("message", "無法連接");
return new ByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8"));
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
// 和 getBody 中的內(nèi)容編碼一致
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
};
}
}
測試路由訪問
依次運行 EurekaApplication > ServiceAdminApplication > WebAdminRibbonApplication > WebAdminFeignApplication > ZuulApplication 各服務
訪問:http://localhost:8769/api/ribbon/hi?message=zuul
瀏覽器顯示
port : 8763,message : zuul
訪問:http://localhost:8769/api/feign/hi?message=zuul
瀏覽器顯示
port : 8763,message : zuul
至此說明 Zuul 的路由功能配置成功。
使用 Zuul 的服務過濾功能
Zuul 不僅僅只是路由,還有很多強大的功能。比如用在安全驗證方面。
創(chuàng)建服務過濾器
/**
* Zuul 的服務過濾演示
*/
@Component
public class LoginFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);
/**
* 配置過濾類型,有四種不同生命周期的過濾器類型
* 1. pre:路由之前
* 2. routing:路由之時
* 3. post:路由之后
* 4. error:發(fā)送錯誤調(diào)用
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 配置過濾的順序
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 配置是否需要過濾:true/需要,false/不需要
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 過濾器的具體業(yè)務代碼
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
if (token == null) {
logger.warn("Token is empty");
context.setSendZuulResponse(false);
context.setResponseStatusCode(401);
try {
context.getResponse().getWriter().write("Token is empty");
} catch (IOException e) {
}
} else {
logger.info("OK");
}
return null;
}
}
測試過濾器
訪問:http://localhost:8769/api/feign/hi?message=zuul
網(wǎng)頁顯示
Token is empty
訪問:http://localhost:8769/api/feign/hi?message=zuul&token=1
網(wǎng)頁顯示
port : 8763,message : zuul
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Java實現(xiàn)刪除排序數(shù)組中重復元素的方法小結【三種方法比較】
這篇文章主要介紹了Java實現(xiàn)刪除排序數(shù)組中重復元素的方法,結合實例形式對比分析了三種常見的數(shù)組元素刪除算法操作技巧,需要的朋友可以參考下2019-02-02
SpringMVC中使用bean來接收form表單提交的參數(shù)時的注意點
本篇文章主要介紹了SpringMVC中使用bean來接收form表單提交的參數(shù)時的注意點,具有很好的參考價值。下面跟著小編一起來看下吧2017-05-05
Springboot?內(nèi)部服務調(diào)用方式
這篇文章主要介紹了Springboot?內(nèi)部服務調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
java基于雙向環(huán)形鏈表解決丟手帕問題的方法示例
這篇文章主要介紹了java基于雙向環(huán)形鏈表解決丟手帕問題的方法,簡單描述了丟手帕問題,并結合實例形式給出了Java基于雙向環(huán)形鏈表解決丟手帕問題的步驟與相關操作技巧,需要的朋友可以參考下2017-11-11

