搭建簡單Zuul網關 , ZuulFilter過濾器使用說明

1.問題答疑:

網關API(接口) Gateway(網關) ---接口網關注意: 接口沒有界面
   1.網關概念:相當於客戶端請求統一先請求到網關服務器上,在由網關服務器進行轉發到實際服務地址上,類似Nginx
   2.網關作用:網關可以攔截客戶端所有請求,對該請求進行權限控制,負載均衡,日誌管理,接口調用監控等
   3.網關和過濾器區別是什麼?
        網關是攔截整個微服務所有請求, 過濾器是攔截單個tomcat服務器請求
   4.Nginx與Zuul區別?
        相同點: Nginx和Zuul都可以實現負載均衡,反向代理,過濾請求,實現網關效果.
        不同點: Nginx採用C語言編寫,Zuul採用java語言編寫. Zuul負載均衡實現:採用ribbon+eureka實現本地負載均衡
                     Nginx負載均衡實現:採用服務器端實現負載均衡.Nginx比Zuul功能會更加強大,因爲Nginx整合一些腳本語言                                        (Nginx+Lua)     可以實現一些其他功能.
                     Nginx適合於服務器負載均衡 + 也可以實現網關. Zuul適合微服務中實現網關,而且使用技術是java語言
                     Nginx作用實現反向代理,Zuul對微服務實現網關攔截. 標配最好Nginx+Zuul實現網關.  
   5.接口什麼背景下產生?  在面向服務架構和微服務背景下產生,目的都是爲了解耦,RPC遠程調用中產生
   6.接口如何分類?
       開放接口:其他機構合作伙伴進行調用(必須在外網訪問) 螞蟻開放平臺 ,微信公衆號開發
                       需要通過appid+appsocet生成accessToken進行通訊.對接支付開發,微信開發,目的可以
                       授權一些接口權限OAuth2.0協議方式 如:第三方聯合登錄
       內部接口:一般只能在局域網中進行訪問,服務與服務調用之間關係都在同一個微服務系統中,目的是爲了
                       保證安全問題 
設計一套公司項目的接口,你會如何設計?
    接口權限(開放接口(遵循OAuth2.0協議)|內部接口),考慮冪等性,安全性(Https) 防止篡改數據(驗證簽名),
    使用網關攔截接口實現黑名單和白名單 , 接口使用http協議+json格式restful風格目的爲了跨平臺.
    考慮高併發 對接口服務實現保護.服務降級熔斷隔離等.最後使用API統一管理平臺 Swagger UI

2.搭建Zuul網關

1.添加pom.xml依賴

        <!--SpringBoot整合WEB組件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--SpringBoot整合Eureka客戶端組件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--SpringCloud整合 zuul網關-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>

2.添加配置文件application.properties

#指定運行端口
server.port=80
#服務名稱
spring.application.name=zuul-gateway
#配置註冊中心地址
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/


#zuul網關配置  start
#當客戶端發送請求127.0.0.1:80/api-member開頭的,都會轉發到會員服務
zuul.routes.api-member.path=/api-member/**
#服務別名  zuul網關默認整合ribbon 自動實現負載均衡輪詢效果
zuul.routes.api-member.service-id=member

#當客戶端發送請求127.0.0.1:80/api-order開頭的,都會轉發到訂單服務
zuul.routes.api-b.path=/api-order/**
#服務別名
zuul.routes.api-b.service-id=order
#zuul網關配置  end

3.配置啓動類

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy   //開啓zuul 網關
public class AppGateWay {
    public static void main(String[] args) {
        SpringApplication.run(AppGateWay.class,args);
    }
}

4,訪問測試

5,添加Zuul過濾器

@Component
public class TokenFilter1 extends ZuulFilter {

    //過濾類型
    //pre:在請求被路由(轉發)之前調用
    //route:在路由(請求)轉發時被調用
    //error:服務網關發生異常時被調用
    //post:在路由(轉發)請求後調用
    @Override
    public String filterType() {
        return "pre";
    }

    //過濾器執行順序,當一個請求在同一個階段的時候存在多個過濾器的時候,多個過濾器執行順序
    @Override
    public int filterOrder() {
        return 0;
    }

    //判斷過濾器是否生效
    @Override
    public boolean shouldFilter() {
        return true;
    }

    //編寫過濾器攔截業務邏輯代碼
    @Override
    public Object run() throws ZuulException {
        //案例:攔截所有的服務接口,判斷服務接口上是否有傳遞userToken參數
        //1.獲取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        // 2.獲取request對象
        HttpServletRequest request = currentContext.getRequest();
        // 3.獲取token的時候從請求頭中過去 ,此處測試,直接獲取url上值
        //String userToken = request.getHeader("userToken");
        String userToken = request.getParameter("userToken");
        if(StringUtils.isEmpty(userToken)){
            //不會繼續執行...不會去調用服務接口,網關服務直接響應給客戶端
            currentContext.setSendZuulResponse(false);
            //返回一個錯誤提示
            currentContext.setResponseBody("userToken is null");
            currentContext.setResponseStatusCode(401);
            return null;
        }
        //正常執行調用其他服務接口.....
        return null;
    }
}

6.測試過濾器

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