1. 程式人生 > >springcloud腳手架搭建(四)---zuul閘道器搭建

springcloud腳手架搭建(四)---zuul閘道器搭建

1.引入pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId
>
com.gameley</groupId> <artifactId>gateway-service</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging> <name>gateway-service</name> <description>Demo project for Spring Boot</description> <parent
>
<groupId>com.gameley</groupId> <artifactId>adplatform</artifactId> <version>1.0.0-SNAPSHOT</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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--<dependency>--> <!--<groupId>org.springframework.cloud</groupId>--> <!--<artifactId>spring-cloud-sleuth-zipkin-stream</artifactId>--> <!--</dependency>--> <!--<dependency>--> <!--<groupId>org.springframework.cloud</groupId>--> <!--<artifactId>spring-cloud-starter-stream-rabbit</artifactId>--> <!--</dependency>--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.6.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.33</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.14</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.gameley</groupId> <artifactId>gameley-common</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!--<dependency>--> <!--<groupId>org.springframework.cloud</groupId>--> <!--<artifactId>spring-cloud-starter-zipkin</artifactId>--> <!--<version>RELEASE</version>--> <!--</dependency>--> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

2.配置zuul:

zuul:
  routes:
    api-a:
      path: /user-api/**
      serviceId: user-service
    api-b:
          path: /gameley-auth/**
          serviceId: gameley-auth
  prefix: /api #為zuul設定一個公共的字首

3.建立springboot啟動類

package com.gameley;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableFeignClients
public class GatewayServiceApplication {

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

    /**
     * 解決跨域問題
     * @return
     */
    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); // 允許cookies跨域
        config.addAllowedOrigin("*");// #允許向該伺服器提交請求的URI,*表示全部允許
        config.addAllowedHeader("*");// #允許訪問的頭資訊,*表示全部
        config.setMaxAge(18000L);// 預檢請求的快取時間(秒),即在這個時間段裡,對於相同的跨域請求不會再預檢了
        config.addAllowedMethod("*");// 允許提交請求的方法,*表示全部允許,也可以單獨設定GET、PUT等
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");// 允許Get的請求方法
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

4.配置登入攔截器

package com.gameley.filter;

import com.alibaba.fastjson.JSON;
import com.gameley.bean.Audience;
import com.gameley.bean.JwtInfo;

import com.gameley.common.constant.RestCodeConstants;
import com.gameley.common.msg.auth.TokenErrorResponse;

import com.gameley.feign.ElementService;
import com.gameley.utils.JwtHelper;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@EnableConfigurationProperties(Audience.class)
@Slf4j
@Component
public class loginfiler extends ZuulFilter {

    @Autowired
    ElementService iUserService;
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }
    @Value("${zuul.prefix}")
    private String zuulPrefix;
    @Value("${gate.ignore.startWith}")
    private String startWith;

    @Autowired
    private  Audience audience;
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        final String requesturi=request.getRequestURI().substring(zuulPrefix.length());
        String token=request.getHeader("token");
        String client=request.getHeader("client");
        //不進行攔截的地址
        if(isStartWith(requesturi)){
            return null;
        }
        /**
         * 未登入,踢出
         */
        if(token==null||client==null){
            ctx.setSendZuulResponse(false);// 過濾該請求,不對其進行路由
            ctx.setResponseStatusCode(RestCodeConstants.TOKEN_ERROR_CODE);// 返回錯誤碼
            ctx.setResponseBody("fail token");// 返回錯誤內容
            ctx.set("isSuccess", false);
            return null;
        }

        try {
            JwtInfo jwtInfo=new JwtInfo();
            jwtInfo.setToken(token);
            jwtInfo.setClientId(audience.getClientId());
            jwtInfo.setExpiresSecond(audience.getExpiresSecond());
            jwtInfo.setName(audience.getName());
            JwtHelper jwtHelper=new JwtHelper();
            jwtHelper.setJwtInfo(jwtInfo);
            Claims claims = jwtHelper.parseJWT(token, audience.getBase64Secret());
            Claims clientClaims = jwtHelper.parseJWT(client, audience.getClient64Secret());


            if(claims==null||clientClaims==null){
                /**
                 * 暫不使用後臺自動重新整理,改為前端頁面定時自動拉取重新整理
                 */
                setFailedRequest("token過期", RestCodeConstants.TOKEN_ERROR_CODE);
                return null;
//                String refreshToken=jwtInfo.getToken();
//                ctx.addZuulRequestHeader("token",refreshToken);
//                ctx.addZuulResponseHeader("token",refreshToken);
            }else {

                ctx.addZuulRequestHeader("token",token);
            }


        } catch (Exception e) {
            setFailedRequest(JSON.toJSONString(new TokenErrorResponse(e.getMessage())), RestCodeConstants.TOKEN_ERROR_CODE);
            return null;
        }


        return null;
    }


    /**
     * URI是否以什麼打頭
     *
     * @param requestUri
     * @return
     */
    private boolean isStartWith(String requestUri) {
        boolean flag = false;
        for (String s : startWith.split(",")) {
            if (requestUri.startsWith(s)) {
                return true;
            }
        }
        return flag;
    }

    /**
     * 閘道器拋異常
     *
     * @param body
     * @param code
     */
    private void setFailedRequest(String body, int code) {

        log.debug("Reporting error ({}): {}", code, body);
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.setResponseStatusCode(code);
        if (ctx.getResponseBody() == null) {
            ctx.setResponseBody(body);
            ctx.setSendZuulResponse(false);
        }
    }
}

相關推薦

springcloud腳手架搭建()---zuul搭建

1.引入pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/

SpringCloud(九)zuul 路由與負載均衡

前言:        在前面的章節中,微服務架構中,每一個微服務都需要暴漏,不同的url,不同的埠,沒有一個統一的入口,這樣設計顯然不合理,閘道器的一個功能就是實現一個統一的入口,所有請求經過閘道器,然後閘道器統一代理到各個微服務,並且能實現負載均衡的功能。程式碼:工程構造如

第十二天:浪跡天涯網上商城(1.0版本)--spring cloud zuul搭建

1、需求我們都知道專案中的服務是越來越多的,如果沒有一個統一的閘道器來做分發,那麼就會將複雜度帶到客戶端,所以我們必須搭建閘道器。2、實現步驟1、建立一個專案langjitianya-gateway2、準備好pom.xml檔案3、準備好配置檔案4、準備好啟動類5、run 起來

SpringCloud(五)Zuul與分散式配置中心

在 Spring Cloud 微服務系統中,一種常見的負載均衡方式是,客戶端的請求首先經過負載均衡(Ngnix),再到達服務閘道器(Zuul 叢集),然後再到具體的服務。服務統一註冊到高可用的服務註冊中心叢集,服務的所有的配置檔案由配置服務管理,配置服務的配置檔案放在 GIT 倉庫,方便開發人員隨時改配置。

springcloud zuul搭建伺服器介面

加入依賴;<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</art

SpringCloud搭建

Zuul的主要功能是路由轉發和過濾器。路由功能是微服務的一部分,比如/api/info轉發到到info服務,/api/login轉發到到login服務。zuul預設和Ribbon結合實現了負載均衡的功能, 類似於nginx轉發。   pom <parent> <groupI

超簡單的SpringClound入門教程(.路由zuul)

一個微服務的專案架構是要有要的基礎構件的,包括服務註冊與發現、服務消費、負載均衡、斷路器、智慧路由、配置管理等;這樣便能構件出一個簡單的微服務專案; 整理出一個簡單的微服務架構圖; 大家可以看在圖中Zuul就充當著路由轉發的角色 不止如此,Zuul還具備很多功能: Authenticat

zuul:(一)SpringCloud介紹和zuul的使用

1)什麼是閘道器?         API Gateway,是系統的唯一對外的入口,介於客戶端和伺服器端之間的中間層,處理非業務功能 提供路由請求、鑑權、監控、快取、限流等功能 統一接入 智慧路由

springcloudZuul服務

Zuul是Netflix開源的微服務閘道器,它的核心是一系列的過濾器,這些過濾器可以完成以下功能: 身份認證與安全:識別每個資源的驗證要求,並拒絕那些與要求不符的請求。 審查與監控:在邊緣位置追蹤有意義的資料和統計結果,從而帶來精確的生產檢視。 動態路由:動態的請求路由到不同的後端叢集。

SpringCloud微服務基礎5:Zuul

       我們使用Spring Cloud Netflix中的Eureka實現了服務註冊中心以及服務註冊與發現;而服務間通過Ribbon或Feign實現服務的消費以及均衡負載;通過Spring Cloud Config實現了應用多環境的外部化配置以及

SpringCloud微服務Zuul【真】動態路由

SpringCloud微服務Zuul閘道器動態路由 新的改變 功能快捷鍵 合理的建立標題,有助於目錄的生成 如何改變文字的樣式 插入連結與圖片 如何插入一段漂亮的程式碼片 生成一個適合你的列表 建立一個表

springcloud(十一):服務Zuul高階篇

Zuul的核心 Filter是Zuul的核心,用來實現對外服務的控制。Filter的生命週期有4個,分別是“PRE”、“ROUTING”、“POST”、“ERROR”,整個生命週期可以用下圖來表示。 Zuul大部分功能都是通過過濾器來實現的,這些過濾器型別對應於請求的典型生命週期。 PRE: 這

企業級 SpringCloud (五)路由(zuul)

在微服務架構中,需要幾個基礎的服務治理元件,包括服務註冊與發現、服務消費、負載均衡、斷路器、智慧路由、配置管理等,由這幾個基礎元件相互協作,共同組建了一個簡單的微服務系統。一個簡答的微服務系統如下圖:  注意:A服務和B服務是可以相互呼叫的,作圖的時候忘記了。並且配置服務也是註冊到服務註冊中心的。

SpringCloud實戰6-Zuul服務

為什麼需要閘道器呢? 我們知道我們要進入一個服務本身,很明顯我們沒有特別好的辦法,直接輸入IP地址+埠號,我們知道這樣的做法很糟糕的,這樣的做法大有問題,首先暴露了我們實體機器的IP地址,別人一看你的IP地址就知道服務部署在哪裡,讓別人很方便的進行攻擊操作。 第二,我

SpringCloud Zuul整合Swagger

一、關於Swagger Swagger能成為最受歡迎的REST APIs文件生成工具之一,有以下幾個原因: Swagger 可以生成一個具有互動性的API控制檯,開發者可以用來快速學習和嘗試API。 Swagger 可以生成客戶端SDK程式碼用於各種不同的平臺上的實現。

spring cloud()-服務Zuul-過濾器

前言 一般許可權控制,登入控制可以加到閘道器過濾器中。 1、過濾器的實現 繼承ZuulFilter,重寫4個方法filterType、filterOrder、shouldFilter 、run。 fil

springCloud Zuul

1.springboot 僅2.0.x 支援,在此選擇 2.0.7 2.新建Module eureka-zuul-client 3.匯入依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=

獨立使用zuul分發不同服務的請求、許可權控制,非SpringCloud

閘道器api Gateway的重要性不言而喻,閘道器負責統一接收所有請求,然後根據不同的規則進行轉發到不同的服務。使用閘道器能夠統一的管理請求日誌、進行許可權控制、過濾等,這樣就能避免在每個單體應用中做重複的工作。這一篇主要是講zuul的獨立使用,就是隻作為一個獨立的專案進行

Java B2B2C o2o多使用者商城 springcloud架構(十):服務zuul初級篇

為什麼需要API Gateway 1、簡化客戶端呼叫複雜度 在微服務架構模式下後端服務的例項數一般是動態的,對於客戶端而言很難發現動態改變的服務例項的訪問地址資訊。因此在基於微服務的專案中為了簡化前端的呼叫邏輯,通常會引入API Gateway作為輕量級閘道器,同時API Gateway中也

SpringCloud(5)路由Zuul

1.為什麼需要Zuul Zuul很容易實現 負載均衡、智慧路由 和 熔斷器,可以做身份認證和許可權認證,可以實現監控,在高流量狀態下,對服務進行降級。 2.路由閘道器 繼續前面文章的搭建,新建一個Spring Boot工程模組。取名為service-zuul. 1.匯入依賴 <?xml ver