Spring Cloud 服務網關Zuul


Spring Cloud 服務網關Zuul

服務網關是分布式架構中不可缺少的組成部分,是外部網絡和內部服務之間的屏障,例如權限控制之類的邏輯應該在這里實現,而不是放在每個服務單元。

Spring Cloud Netflix 中的Zuul正是提供該功能的組件:

1. 提供路由功能,可屏蔽內部服務細節,並可提供負載均衡

2. 通過服務網關中的過濾器,在各階段過濾請求和相應,提供對外的權限控制。

3. 實現了斷路器,不會因為具體微服務的故障而導致服務網關的阻塞,依然可以對外服務。

 

下來通過簡單的例子體驗一下Zuul提供的功能:

1. 首先需要一個eureka單元注冊服務,一個client單元提供服務,之前已創建

2.新建Spring Cloud項目,命名zuul

3.添加依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

 

4.增加主類

@EnableZuulProxy
@SpringCloudApplication
public class App 
{
    @Bean
    public AccessFilter accessFilter() {
        return new AccessFilter();
    }

    public static void main( String[] args )
    {
        new SpringApplicationBuilder(App.class).web(true).run(args);
    }
}

--- 添加EnableZuulProxy注解為開啟Zuul網關代理

 

5.添加配置文件application.properties

server.port=8011
spring.application.name=zuul

#自定義映射
#zuul.routes.api-a.path=/client/**
#zuul.routes.api-a.serviceId=client
zuul.routes.api-a.path=/bing/**
zuul.routes.api-a.serviceId=http://cn.bing.com/

#默認映射 無需配置
#http://zuulhost:zuulport/serviceId/**  請求會被轉發到serviceId對應的服務,需要注冊到eureka

eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/

---

 

6.增加過濾器類

public class AccessFilter extends ZuulFilter {

    private static Logger log = LoggerFactory.getLogger(AccessFilter.class);

    /**
     pre:可以在請求被路由之前調用
     routing:在路由請求時候被調用
     post:在routing和error過濾器之后被調用
     error:處理請求時發生錯誤時被調用
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }

    //過濾器執行順序
    @Override
    public int filterOrder() {
        return 0;
    }

    //過濾器開關
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
            log.warn("access token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.setResponseBody(request.getMethod()+" "+request.getRequestURL().toString()+" no token");
            return null;
        }
        log.info("access token ok");
        return null;
    }

}

---繼承ZuulFilter類

 

7. 依次啟動eureka 、client、 zuul ,訪問測試

1. 訪問 http://localhost:8001/ 查看服務是否已注冊

2. 訪問 http://localhost:8011/bing/token=1 查看是否跳轉到bing主頁

3. 訪問 http://localhost:8011/bing 查看過濾器是否工作

4. 訪問 http://localhost:8011/client/info?token=1 查看zuul默認映射規則是否生效

 

 

參考:http://projects.spring.io/spring-cloud/spring-cloud.html

 

end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM