您好,登錄后才能下訂單哦!
這篇文章主要介紹如何實現Zuul的容錯回退與高可用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
zuul的容錯與回退
之前說到過,使用Hystrix實現微服務的容錯與回退,其實Zuul默認已經整合了Hystrix,使用起來也是比較簡單:
在原有 zuul-gateway 項目的基礎上新增,實現ZuulFallbackProvider接口,并實現getRoute和fallbackResponse方法。
import com.google.gson.Gson; import com.simons.cn.util.CommonEnum; import com.simons.cn.util.CommonResult; import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; @Component public class UserProviderZuulFallBack implements ZuulFallbackProvider { private static final String USER_PROVIDER_SERVICE = "user-provider"; @Override public String getRoute() { return USER_PROVIDER_SERVICE; //返回你需要為哪個微服務提供回退 } @Override public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { /** * 返回Http狀態碼標識 */ @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } /** * 返回Http狀態碼對應數字:200,詳見HttpStatus */ @Override public int getRawStatusCode() throws IOException { return 200; } /** *返回Http狀態碼對應中譯:OK,詳見HttpStatus */ @Override public String getStatusText() throws IOException { return HttpStatus.OK.getReasonPhrase(); } @Override public void close() { } /** *body響應體 */ @Override public InputStream getBody() throws IOException { String message = new Gson().toJson(CommonResult.success(CommonEnum.SERVICE_NOT_AVAILABLE.getCode(), CommonEnum.SERVICE_NOT_AVAILABLE.getMessage())); return new ByteArrayInputStream(message.getBytes("UTF-8")); } /** * 設置HttpHeaders */ @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); // MediaType mediaType = new MediaType("application/json;charset=utf-8"); //這是錯誤寫法 MediaType mediaType = new MediaType("application", "json", Charset.forName("utf-8")); headers.setContentType(mediaType); return headers; } }; } }
CommonEnum中的枚舉(部分):
SERVICE_NOT_AVAILABLE("5001","當前服務不可用,請稍后重試!"),
測試:
啟動zuul-gateway項目和user-provider-eureka、discovery-eureka三個項目,瀏覽器訪問http://localhost:10010/user/getuserinfo?name=jack,效果如圖:
關閉user-provider-eureka服務,再訪問http://localhost:10010/user/getuserinfo?name=jack,效果如圖:
可以看到,當用戶微服務不可用時候,默認返回了自定義的json。
zuul的高可用策略
一、如果Zuul也注冊到了服務發現組件Eureka上,那么zuul就已經實現了高可用配置,這種情況和普通的服務消費者和提供者的高可用是一致的;
二、若zuul未注冊到Eureka上,則可以通過Nginx/HAProxy等負載均衡器來將請求分配到zuul的其中一個節點;這點更多的還是負載均衡器的配置。例如nginx的:
以上是“如何實現Zuul的容錯回退與高可用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。