SpringCloud-微服務網關ZUUL(六)

前言:前面說過,因爲微服務過多,可能某一個小業務就須要調各類微服務的接口,不可避免的就會須要負載均衡和反向代理了,以確保ui不直接與全部的微服務接口接觸,因此咱們須要使用一個組件來作分發,跨域等各類請求。html

1、微服務網關ZUUL

  ZUUL是Netflix開源的微服務網關,它能夠和Eureka、Ribbon、Hystrix等組件配合使用,它主要用做反向代理、Filter擴展、動態加載、動態路由、壓力測試、彈性擴展、審查監控、安全檢查等。
  git

2、ZUUL與SpringCloud各組件的整合使用

  一、建立一個Maven工程,gateway-zuul,添加依賴:spring

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.RELEASE</version>
  </parent>

  <dependencies>
<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>
</dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 添加spring-boot的maven插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>

  二、在啓動類上添加註解@EnableZuulProxy,聲明ZUUL代理,經過觀察Zuul的類庫發現,zuul的依賴庫中除了有它自己的核心包外還有actuator、hystrix的整合包,默認實現了監控和熔斷機制,全部通過zuul的請求都會在hystrix命令中執行:跨域

@SpringBootApplication @EnableZuulProxy public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }

  三、編寫配置文件application.properties:安全

server.port=8000 spring.application.name=zuul-8000 eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#因爲zuul中的actuator默認的安全權限爲ture,需改成false,若不修改則會致使沒法訪問路由管理(localhost:8000/routes) management.security.enabled=false

(注:下面的測試,是基於以前作的幾個關於Ribbon、Hystrix的demo來作的,若感興趣能夠看一下我以前的文章:SpringCloud-客戶端的負載均衡Ribbon(三)SpringCloud-容錯處理Hystrix熔斷器(五)架構

  四、測試路由網關是否啓動:app

  分別啓動 eureka-ribbon-server eureka-ribbon-client eureka-ribbon-client2 和  gateway-zuul,打開服務配置中心,並訪問http://localhost:8000/client-8762/getUser:負載均衡

  

  

  經過網關訪問成功!框架

  五、測試負載均衡是否可用:maven

  分別啓動  eureka-ribbon-servereureka-feign-hystrix-client、修改 eureka-ribbon-client2 端口爲876三、修改 eureka-ribbon-client2 端口爲8764 和  gateway-zuul,打開服務配置中心,並屢次訪問http://localhost:8000/client-8762/loadInstance,觀察返回結果

  

  

  

 

   根據觀察結果知,經過網關實現負載均衡!

  六、測試熔斷與路由端點是否可用:

  熔斷:

    分別啓動 eureka-ribbon-server eureka-feign-hystrix-client eureka-ribbon-client2  gateway-zuul,打開服務配置中心,並屢次訪問http://localhost:8000/client-8762/loadInstance,觀察返回結果

    

    

    將CLIENT-87實例關閉,再次調用:

    

    注:因爲client-87的實例關閉後要等eureka將實例移除後,而後eureka通知zuul,zuul再將client-87從網關列表中移除,最後訪問,才能夠看到熔斷,走回調函數了!

  啓動項目與上面 測試5相同,注意網關中的application.properties必定要將安全權限打開或者以其餘方式,纔可訪問localhost:8000/routes/

#因爲zuul中的actuator默認的安全權限爲ture,需改成false,若不修改則會致使沒法訪問路由管理(localhost:8000/routes) management.security.enabled=false

  

3、ZUUL過濾器的實踐

  

  Zuul提供一個框架,能夠對Groovy寫的過濾器進行動態的加載、編譯、運行。過濾器之間沒有直接的相互通訊,經過一個RequestContext的靜態類中ThreadLocal變量來進行數據傳遞,過濾器類型:

  PRE:這種過濾器在請求到達Origin Server以前調用。好比身份驗證,在集羣中選擇請求的Origin Server,記log等;

  ROUTING:在這種過濾器中把用戶請求發送給Origin Server。發送給Origin Server的用戶請求在這類過濾器中build。並使用Apache HttpClient或者NetfilxRibbon發送給Origin Server;

  POST:這種過濾器在用戶請求從Origin Server返回之後執行。好比在返回的response上面加response header,作各類統計等。並在該過濾器中把response返回給客戶;

  ERROR:在其餘階段發生錯誤時執行該過濾器;

  客戶定製:好比咱們能夠定製一種STATIC類型的過濾器,用來模擬生成返回給客戶的response;

  一、建立過濾器類,繼承ZuulFilter抽象類,實現該方法:

/** * @program: springcloud-example * @description: * @author: * @create: 2018-06-20 16:53 **/
public class RequestLogFilter extends ZuulFilter { private Logger logger = LoggerFactory.getLogger(RequestLogFilter.class); /** * @Description: 返回過濾器類型,就是上面介紹的那幾種類型 * @Param: * @return: * @Author: * @Date: 2018/6/20 */ @Override public String filterType() { return "pre"; } /** * @Description:指定過濾器執行的順序 * @Param: * @return: * @Author: * @Date: 2018/6/20 */ @Override public int filterOrder() { return 1; } /** * @Description:指定該過濾器是否執行 * @Param: * @return: * @Author: * @Date: 2018/6/20 */ @Override public boolean shouldFilter() { return true; } /** * @Description: 過濾器的具體方法邏輯 * @Param: * @return: * @Author: * @Date: 2018/6/20 */ @Override public Object run() { RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletRequest request = currentContext.getRequest(); String url = request.getRequestURL().toString(); logger.info("請求URL:"+url); return null; } }

  二、在啓動類,將該過濾器注入到Spring容器中:

 @Bean public RequestLogFilter getRequestLogFilter() { return new RequestLogFilter(); }

  三、分別啓動 eureka-ribbon-server eureka-ribbon-client eureka-ribbon-client2 gateway-zuul測試:

  

 

 

 

參考書籍:《SpringCloud與Docker微服務架構實戰》周力著

代碼示例:https://gitee.com/lfalex/springcloud-example eureka-feign-hystrix-client eureka-hystrix-client eureka-ribbon-client eureka-ribbon-client2 eureka-ribbon-server gateway-zuul

相關文章
相關標籤/搜索