Spring Cloud實戰之初級入門(六)— 服務網關zuul

1.環境介紹

好了,不知不覺中我們已經來到了最後一篇文章,也來到了最一個工程"mirco-service-zuul",zuul是一個服務網關,雖然現在spring也出了spring cloud gateway,相信有很多之前就使用spring cloud的公司依然使用的是zuul;看完這六篇文章相信有點基礎的小夥伴們應該能自己做點東西了,當然spring cloud這個系列遠遠還沒有說完,後面我計劃在春節前後開源一個最小化的微服務手腳架項目,使用spring cloud來做實戰演練。

2.api網關服務

2.1 創建工程

因爲api網關是一個比較獨立的東西,基本不需要對原有的工程進行改造。

  • 配置文件中加入
server:
  port: 5001

spring:
  application:
    name: service-gateway-zuul

zuul:
  routes:
    baidu:
      url: http://www.baidu.com
      path: /api/**
  • 爲啓動文件加入@EnableZuulProxy註解
  • 啓動服務,訪問http://localhost:5001/api/,你會看到頁面重定向到百度了。那麼我們zuul的配置就完了。

    2.2 api網關服務化

  • 主要是配置文件的改動,改動後的application.yml配置文件如下
server:
  port: 5001

spring:
  application:
    name: service-gateway-zuul
    
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9001/eureka/
  • 啓動文件改造如下:
@EnableDiscoveryClient
@EnableZuulProxy
@SpringBootApplication
public class MircoServiceZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(MircoServiceZuulApplication.class, args);
    }
}

因爲服務化改造後,zuul會自動代理所有eureka上的服務,訪問格式如下:
http://localhost:5001/{service-id}/{app-path}

  • 這裏service-id指的是應用的id,就像前面我們一直所說的,spring.application.name這個名字的重要性。
  • 這裏app-path指的是你服務對應的訪問目錄。

2.3 api網關中使用token機制

api網關中,可以在請求被路由之前調用,四種狀態 pre、routing、POST、error,這四種狀態的意思大家可以自行去了解一下。我們要使用的是pre狀態。

  • 創建“com.example.cloud.zuul.filter.ValidateTokenFilter”類,具體實現如下:
public class ValidateTokenFilter extends ZuulFilter{

    @Override
    public boolean shouldFilter() {
        // 是否執行此過濾
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        // 處理過程
        RequestContext context = RequestContext.getCurrentContext() ;
        HttpServletRequest request = context.getRequest() ;
        
        Boolean bool = Boolean.valueOf(request.getParameter("token")) ;

        if(bool) {
            context.setSendZuulResponse(true) ; //是否路由
            context.setResponseStatusCode(200);
            context.set("isSuccess", true);
            
        }else {
            context.setSendZuulResponse(false) ; //是否路由
            context.setResponseStatusCode(400);
            context.set("isSuccess", false);
        }
        
        return null;
    }

    @Override
    public String filterType() {
        return "pre"; // 可以在請求被路由之前調用,四種狀態 pre、routing、POST、error
    }

    @Override
    public int filterOrder() {
        // 執行順序
        return 10;
    }
}
  • 在啓動文件中加入如下代碼:
    @Bean
    public ZuulFilter putFilter() {
        return new ValidateTokenFilter() ;
    }
  • 這裏我們可以看到如果訪問的參數中帶有token,且token的值爲true,api網關纔會路由,如果不帶token,那麼路由失敗,並訪問狀態爲400的錯誤。

2.4 測試

  • 訪問http://localhost:5001/service-consumer/consumerHelloWorld?name=rose,我們可以看到訪問被拒絕。
  • 訪問http://localhost:5001/service-consumer/consumerHelloWorld?name=rose&token=true,我們就可以看到訪問的效果。

2.5 小結

  • 如果不使用api網關,那麼當我們的微服務足夠多的時候,我們無法以一下統一的地址對外提供服務。
  • 沒有api網關,那麼我們的所有的服務需要鑑權必須要散落到每一個工程裏面。無法統一管理。

3.一點點重要的事情

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章