javascript
Spring Cloud 学习 (五) Zuul
Zuul 作為路由網關組件,在微服務架構中有著非常重要的作用,主要體現在以下 6 個方面:
Zuul 的核心是一系列過濾器,可以在 Http 請求的發起和響應返回期間執行一系列的過濾器:
Zuul 采取了動態讀取、編譯和運行這些過濾器。過濾器之間不能直接相互通信,而是通過 RequestContext 對象來共享數據,每個請求都會創建一個 RequestContext 對象。Zuul 過濾器具有以下關鍵特性:
使用 Zuul
新建 spring-cloud-eureka-zuul-client
pom
<parent><artifactId>spring-cloud-parent</artifactId><groupId>com.karonda</groupId><version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion><artifactId>spring-cloud-eureka-zuul-client</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</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><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins> </build>application.yml
server:port: 8051eureka:client:service-url:defaultZone: http://localhost:8001/eureka/spring:application:name: zuul-clientzuul:routes:hiapi:path: /hiapi/**serviceId: eureka-clientribbonapi:path: /ribbonapi/**serviceId: ribbon-clientfeignapi:path: /feignapi/**serviceId: feign-client啟動類
@EnableZuulProxy // 開啟 Zuul @SpringBootApplication public class EurekaZuulClientApp {public static void main(String[] args){SpringApplication.run(EurekaZuulClientApp.class, args);} }測試
多次訪問 http://localhost:8031/hiapi/hi?name=victor 可以看到 8011 和 8012 端口交替出現 (Zuul 默認 與 Ribbon 結合實現了負載均衡)
多次訪問 http://localhost:8031/ribbonapi/hi?name=victor 可以看到 8011 和 8012 端口交替出現
多次訪問 http://localhost:8031/feignapi/hi?name=victor 可以看到 8011 和 8012 端口交替出現
在 Zuul 上配置熔斷器
實現 FallbackProvider 接口
@Component public class MyFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {return "eureka-client"; // 如果所有的路由服務都加熔斷功能,返回 "*"}@Overridepublic ClientHttpResponse fallbackResponse(String route, Throwable cause) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return 200;}@Overridepublic String getStatusText() throws IOException {return "OK";}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("error, fallback".getBytes());}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);return headers;}};} }測試
在 Zuul 中使用過濾器
繼承 ZuulFilter
@Component public class MyFilter extends ZuulFilter {private static Logger logger = LoggerFactory.getLogger(MyFilter.class);@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {return 0;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();Object accessToken = request.getParameter("token");if(accessToken == null){logger.warn("token is empty");ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(401);try {ctx.getResponse().getWriter().write("token is empty");} catch (IOException e) {return null;}}logger.info("ok");return null;} }測試
訪問 http://localhost:8051/hiapi/hi?name=victor
訪問 http://localhost:8051/hiapi/hi?name=victor&token=xx
完整代碼:GitHub
本人 C# 轉 Java 的 newbie, 如有錯誤或不足歡迎指正,謝謝
?轉載于:https://www.cnblogs.com/victorbu/p/11017272.html
總結
以上是生活随笔為你收集整理的Spring Cloud 学习 (五) Zuul的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里一年,聊聊我成长了什么,入职阿里的职
- 下一篇: (转)javascript匿名函数