1. 程式人生 > >Api Gateway Zuul簡介及SpringCloud中的使用

Api Gateway Zuul簡介及SpringCloud中的使用

Zuul 的官方介紹是 “Zuul is the front door for all requests from devices and web sites to the backend of the Netflix streaming application. As an edge service application, Zuul is built to enable dynamic routing, monitoring, resiliency and security. It also has the ability to route requests to multiple Amazon Auto Scaling Groups as appropriate.”
大致是說zuul是裝置和網站到Netflix後臺應用程式的所有的請求的前門,是一個邊緣化應用程式,它的建立是為了實現動態路由,監控,彈性,和安全性, 它還能夠根據需要將請求路由到多個Amazon Auto Scaling組。 來源'https://github.com/Netflix/zuul/wiki'
其實zuul主要實現的功能就是API Gateway(api閘道器)的功能,為什麼使用api gateway:
  • 客戶端會多次請求不同的微服務,導致客戶端複雜度增加,使用閘道器時客戶端只與閘道器互動,降低客戶端的呼叫邏輯的複雜度,同時閘道器也可以實現認證邏輯簡化內部服務的之間相互呼叫的複雜度。
  • 對不同客戶端的支援及資料的聚合,如一個網站有web端,手機端,頁面所需的資料有同有異,可以將資料整合或者裁剪,減少客戶端的請求次數,比如BFF架構。
  • 可以更好的對專案的微服務封裝,可將專案的微服務統一封裝在一個內網環境中,只通過閘道器提供服務,同時閘道器也可以對安全,認證,監控,防禦單獨強化。
在springcloud使用zuul:     1:除了新增eureka依賴外,新增zuul依賴包:         
<dependency>     <groupId> org.springframework.cloud </groupId>     <artifactId> spring-cloud-starter-eureka </artifactId> </dependency> <dependency>     <groupId> org.springframework.cloud </groupId>     <artifactId> spring-cloud-starter-zuul </artifactId> </dependency>
     2:在啟動類上使用@EnableZuulProxy 啟用zuul @SpringBootApplication @EnableZuulProxy public class   ZuulApplication {     public static void   main (String[] args) {         SpringApplication. run (ZuulApplication. class,   args) ;     } }     3:配置檔案application.yml     
spring:
     application:           name:   micoserice-gateway-zuul server:      port:   8090
eureka:     client:         serviceUrl:             defaultZone:  http://localhost:8761/eureka/     instance:         prefer-ip-address:  true         instance-id:  ${ spring.application.name }:${ server.port }
啟動執行:

如圖我這裡啟動了三個服務, zuul註冊到Eureka-service為服務後預設情況下是構建PAI-GATEWAY,訪問時只要zuul-host/appname/api 如我這裡訪問:http://localhost:8090/micoserice-user/user/getuser,當呼叫服務有多個時,zuul是實現了負載均衡的。
zuul中使用hystrix的回退: 程式碼如下 /** * @author wxy * zuul 中使用 hystrix 的回退 */ @Component public class MyFallbackProvider implements ZuulFallbackProvider {      @Override      public String getRoute () {           // 路由配置 micoserice-user ,如果全部用 "*" 代替           return "micoserice-user" ;      }
     @Override      public ClientHttpResponse fallbackResponse () {           return new ClientHttpResponse() {                @Override                public HttpStatus getStatusCode () throws IOException {                     // 回退的狀態碼                     return HttpStatus. OK ;                  }
               @Override                public int getRawStatusCode () throws IOException {                     // 數字型別狀態碼                     return 200 ;                   }
               @Override                public String getStatusText () throws IOException {                     // 狀態文字                     return "ok" ;                }
               @Override                public void close () {   }
               @Override                public InputStream getBody () throws IOException {                     // 回退響應體                     return new ByteArrayInputStream( " 服務不可用稍後再試 " .getBytes()) ;                }
               @Override                public HttpHeaders getHeaders () {                     //header 設定                     HttpHeaders headers = new HttpHeaders() ;                     MediaType mediaType = new MediaType( "application" , "json" , Charset. forName ( "UTF-8" )) ;                     headers.setContentType(mediaType) ;                     return headers ;                }           } ;      } } 添加回退後當訪問 micoserice-user 微服務失敗後將會返回“ 服務不可用稍後再試 ”。 zuul過濾器: /** * @author wxy * zuul 過濾器 * zuul 中定義了四種標準過濾型別,這些過濾型別對應請求的生命週期 * * PRE: 這種過濾型別在請求被路由之前呼叫。可利用這種過濾器實現身份驗證,在叢集中選擇請求的微服務,記錄除錯資訊等。 * * ROUTING: 這種過濾器將請求路由到微服務。這種過濾用於構建傳送給微服務的請求, * 並可以使用 Apache HttpClient,Fegin,Ribbon 請求微服務。 * * POST: 這種過濾器在路由到微服務以後執行。這種過濾器可用來微響應新增標準的 http header, * 蒐集統計資訊和指標,將響應傳送給客戶端。 * * ERROR: 在其他階段發生錯誤時執行該過濾器。 * */ public class RequestLogFilter extends ZuulFilter {      private static Logger logger = LoggerFactory. getLogger (RequestLogFilter. class ) ;      @Override      public String filterType () {           return PRE_TYPE ;      }
     @Override      public int filterOrder () {           return 1 ;      }
     @Override    public boolean shouldFilter () {           return true;      }
     @Override      public Object run () {           RequestContext requestContext =RequestContext. getCurrentContext () ;             HttpServletRequest request = requestContext.getRequest() ;           logger .info(String. format ( "send %s request to %s" , request.getMethod() , request.getRequestURL().toString())) ;           return null;      } } //在啟動類下新增Bean @Bean public RequestLogFilter getRequestLogFilter (){ return new RequestLogFilter() ; } 示例程式碼: https://github.com/xiaoyangW/SpringCloud/tree/master/microservice-gateway-zuul 本文參考 http://cloud.spring.io/spring-cloud-static/Finchley.M2/#_router_and_filter_zuul http://www.ityouknow.com/springcloud/2017/06/01/gateway-service-zuul.html http://microservices.io/patterns/apigateway.html