springcloud學習之路: (三) springcloud集成Zuul網關


網關就是做一下過濾或攔截操作 讓我們的服務更加安全 用戶訪問我們服務的時候就要先通過網關 然后再由網關轉發到我們的微服務

1. 新建一個網關服務Module

 2. 依然選擇springboot工程

 3. 老規矩起個名字

 4. 勾選注冊中心客戶端

 5. 勾選zuul網關模塊

 6. 編寫配置文件

server:
  # 服務端口號
  port: 8085
spring:
  application:
    # 服務名稱 - 服務之間使用名稱進行通訊
    name: service-zuul
eureka:
  client:
    service-url:
      # 填寫注冊中心服務器地址
      defaultZone: http://localhost:8081/eureka
zuul:
  routes:
    # 設置服務a 路徑名稱 隨便起
    service-a:
      path: /service-a/**
      # 這里寫a服務的注冊名字
      serviceId: service-objcat-a
    # 設置服務b 路徑名稱 隨便起
    service-b:
      path: /service-b/**
      # 這里寫b服務的注冊名字
      serviceId: service-objcat-b

 7. 創建一個包 名字是com.objcat.filter, 創建一個類TokenFilter繼承ZuulFilter 用來實現過濾規則

  8. 重寫ZuulFilter中的方法,在run()方法中編寫過濾邏輯

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

public class TokenFilter extends ZuulFilter {
    /**
     * 過濾器類型 pre表示在請求之前進行邏輯操作
     */
    @Override
    public String filterType() {
        return "pre";
    }

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

    /**
     * 是否開啟過濾
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 編寫過濾器攔截業務邏輯代碼
     */
    @Override
    public Object run() {
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        String token = request.getParameter("token");
        if (token == null) {
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseBody("token is null");
            currentContext.setResponseStatusCode(401);
        }
        return null;
    }
}

邏輯很簡單 就是校驗客戶端發來的請求token是否為空 如果為空就不能通過 返回 token is null

9. 配置網關入口文件, 這個地方千萬不要忘記實例化出來filter否則不生效

import com.example.servicezuul.filter.TokenFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
// 添加注解聲明是注冊中心客戶端
@EnableEurekaClient
// 開啟網管
@EnableZuulProxy
public class ServiceZuulApplication {

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

    // 實例化tokenfilter,否則網管不生效
    @Bean
    TokenFilter tokenFilter(){
        return new TokenFilter();
    }

}

10. 通過網關訪問a服務

只需要使用 網關的地址 + 網關的端口號 + 服務的別名路徑(配置文件中配置) + api名稱 就可以訪問了

http://localhost:8085/service-a/testA

http://localhost:8085/service-a/testA?token=123

 

 當沒有token的時候返回就是 token is null,當token有值的時候就可以正常進行訪問了

這種網關轉發之后的請求 就叫做反向代理你可以隱藏你本地的服務器的真實地址
只暴露給外界網關的地址 然后由網關轉發給服務器 從而做到安全性更高

 


免責聲明!

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



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