搭建Zuul網(wǎng)關(guān)

image.png

在上一個項目的configCenter父項目中新增maven Module子項目zuul_gateway;
該服務(wù)為網(wǎng)關(guān)服務(wù),所有請求先經(jīng)過該網(wǎng)關(guān)后,由網(wǎng)關(guān)負責(zé)去注冊中心獲取對應(yīng)服務(wù)真實地址,然后在本地做負載均衡請求真實服務(wù)器地址争群。
本網(wǎng)關(guān)服務(wù)對外端口:8102
app-member會員服務(wù)端口:8101
app-order訂單服務(wù)端口:8103
該網(wǎng)關(guān)服務(wù)需要將自己注冊到eureka注冊中心,所以需要EurekaServer服務(wù)。

image.png

pom.xml文件內(nèi)容:

<?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">
    <parent>
        <artifactId>configCenter</artifactId>
        <groupId>configCenter</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>zuul_gateway</artifactId>

    <dependencies>
        <!--spring-cloud2.0比較支持zuul網(wǎng)關(guān) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>
</project>

application.yml 文件內(nèi)容:

server:
  port: 8102

###服務(wù)別名--該服務(wù)注冊到服務(wù)中心的名稱
spring:
  application:
    name: service-zuul
zuul:
  routes:
    ### 定義轉(zhuǎn)發(fā)規(guī)則座韵,這里的api-a是自定義的,也可以修改為api-member
    api-a:
      ### 客戶端請求http://127.0.0.1/api-member開頭的,都會轉(zhuǎn)發(fā)到會員服務(wù)
      path: /api-member/**
      #這里的app-member是會員服務(wù)在注冊中信中的別名
      #zuul網(wǎng)關(guān)默認整合ribbon,自動實現(xiàn)負載均衡輪訓(xùn)效果
      serviceId: app-member
    api-b:
      path: /api-order/**
      serviceId: app-order


eureka:
  client:
    serviceUrl:
      ###當前會員服務(wù)注冊到eureka服務(wù)中心(所有eureka集群地址)
      defaultZone: http://eureka-server1:7100/eureka

項目啟動 ZuulGatewayApplication.java

package zuul_gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
//@EnableEurekaClient 將當前服務(wù)注冊到Eureka
@EnableEurekaClient
//開啟Zuul網(wǎng)關(guān)代理
@EnableZuulProxy
public class ZuulGatewayApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(ZuulGatewayApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ZuulGatewayApplication.class);
    }
}

啟動網(wǎng)關(guān)服務(wù)并測試

image.png
  • 啟動網(wǎng)關(guān)服務(wù)之前踢京,需要先啟動如下服務(wù):
    • springcloud-eureka-service 注冊中心服務(wù)誉碴。端口:7100
    • api-member-service-impl 會員服務(wù).端口:8101
    • api-order-service-impl 訂單服務(wù), 端口:8103
  • 啟動本網(wǎng)關(guān)zuul_gateway服務(wù),端口:8102
  • 訪問EurekaServer:http://127.0.0.1:7100,可以看到會員服務(wù)瓣距,訂單服務(wù)黔帕,網(wǎng)關(guān)服務(wù),三個服務(wù)均已經(jīng)注入到注冊中心蹈丸。
    image.png
  • 直接訪問訂單服務(wù)(不通過網(wǎng)關(guān)):http://127.0.0.1:8103:


    image.png
  • 直接訪問會員服務(wù)(不通過網(wǎng)關(guān)):http://127.0.0.1:8101:


    image.png
  • 通過網(wǎng)關(guān)訪問會員服務(wù):http://127.0.0.1:8102/api-member/
    image.png
  • 通過網(wǎng)關(guān)訪問訂單服務(wù):http://127.0.0.1:8102/api-order/
    image.png

在zuul_gateway網(wǎng)關(guān)項目中添加過濾器

  • 在網(wǎng)關(guān)中添加過濾器,過濾規(guī)則: 獲取參數(shù)userToken, 如果該參數(shù)為空則直接返回.當然這是是一個演示,也可以過濾一些其他規(guī)則.
  • 在zuul_gateway項目中添加 TokenFilter.java過濾器.
package zuul_gateway;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * 網(wǎng)關(guān)token過濾器
 * @author liangxifeng
 * @date 2020-08-09
 */
@Component
public class TokenFilter extends ZuulFilter {
    //過濾器類型pre,表示請求之前執(zhí)行
    @Override
    public String filterType() {
        return "pre";
    }

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

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

    /**
     * 攔截業(yè)務(wù)邏輯代碼
     * 所有通過網(wǎng)關(guān)的請求,都必須通過該方法驗證,才能繼續(xù)放行
     * 如果驗證失敗,則返回401
     */
    @Override
    public Object run() throws ZuulException {
        //案例:攔截所有服務(wù)接口,判斷服務(wù)接口上是否有傳遞userToken參數(shù)
        //1. 獲取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        //2. 獲取Request
        HttpServletRequest request = currentContext.getRequest();
        //3. 獲取token
        String userToken = request.getParameter("userToken");
        if (StringUtils.isEmpty(userToken)) {
            //如果token為空,則網(wǎng)關(guān)直接返回
            currentContext.setSendZuulResponse(false);
            currentContext.setResponseBody("userToken is null");
            currentContext.setResponseStatusCode(401);
            return null;
        }
        //正常調(diào)用其他服務(wù)接口
        return null;
    }
}

動態(tài)Zuul網(wǎng)關(guān)路由轉(zhuǎn)發(fā)

  • 以上Zuul路由轉(zhuǎn)發(fā)規(guī)則只配置兩兩個 api-memberapi-order, 如果網(wǎng)關(guān)項目正在運行,需要新增路由規(guī)則,就需要修改配置文件,重啟網(wǎng)關(guān)服務(wù)了. 這里配置一下動態(tài)讀取配置文件. 不需要重啟服務(wù).

  • 也就是將路由配置信息作為配置文件service-zuul-dev.yml放到git版本庫中,在git中新增zuul_config目錄作為網(wǎng)關(guān)服務(wù)配置文件存儲目錄, 內(nèi)容如下: git地址: https://github.com/liangxifeng833/gkconfig/blob/master/zuul-config/service-zuul-dev.yml

      zuul:
        routes:
          ### 定義轉(zhuǎn)發(fā)規(guī)則蹬屹,這里的api-a是自定義的,也可以修改為api-member
          api-a:
            ### 客戶端請求http://127.0.0.1/api-member開頭的侣背,都會轉(zhuǎn)發(fā)到會員服務(wù)
            path: /api-member/**
            #這里的app-member是會員服務(wù)在注冊中心中的別名
            #zuul網(wǎng)關(guān)默認整合ribbon,自動實現(xiàn)負載均衡輪訓(xùn)效果
            serviceId: app-member
          api-b:
            path: /api-order/**
            serviceId: app-order
    
  • 修改pom.xml文件,新增分布式配置中心相關(guān)依賴

          <!-- 分布式配置中心相關(guān)依賴#################################start -->
          <!-- springCloud整合config-server分布式配置中心client -->
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-config-client</artifactId>
          </dependency>
          <!--actuaor監(jiān)控中心,手動觸發(fā)刷新本地讀取git中配置文件緩存所用-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-actuator</artifactId>
          </dependency>
          <!-- 分布式配置中心相關(guān)依賴#################################end -->
    
  • 然后將zuul_gateway網(wǎng)關(guān)項目application.yml修改為bootstrap.yml, 因為 SpringCloud里面有個“啟動上下文”,主要是用于加載遠端的配置,也就是加載ConfigServer里面的配置,默認加載順序為:加載bootstrap.里面的配置 --> 連接configserver,加載遠程配置 --> 加載application.里面的配置; 總結(jié):這里需要借助于“啟動上下文”來處理加載遠程配置;bootstrap.yml 內(nèi)容如下:

      server:
        port: 8102
    
      ###服務(wù)別名--該服務(wù)注冊到服務(wù)中心的名稱
      spring:
        application:
          #這里的服務(wù)別名=要讀取git的配置文件的服務(wù)名稱
          #配置文件命名規(guī)范:服務(wù)名-環(huán)境.yml(service-zuul-dev.yml)
          name: service-zuul
        cloud:
          config:
            #讀取配置文件的環(huán)境(service-zuul-dev.yml)中的dev
            profile: dev
            #讀取配置文件服務(wù)的config-server環(huán)境
            #也就是配置中心服務(wù)端在eureka注冊的服務(wù)別名
            discovery:
          service-id: config-server
          #開啟讀取權(quán)限
          enabled: true
    
      #actuaor監(jiān)控中心慨默,開啟所有端點贩耐,手動觸發(fā)刷新本地緩存讀取最新git配置文件所用
      management:
        endpoints:
          web:
            exposure:
          include: "*"  # * 在yaml 文件屬于關(guān)鍵字,所以需要加引號
      eureka:
        client:
          serviceUrl:
            ###當前會員服務(wù)注冊到eureka服務(wù)中心(所有eureka集群地址)
            defaultZone: http://eureka-server1:7100/eureka/
    
  • 修改項目入口文件ZuulGatewayApplication, 新增方法如下:
    作用是修改git中配置文件信息后, 手動調(diào)用接口刷新網(wǎng)關(guān)讀取遠程配置文件信息所用.

              // zuul配置使用git中config實現(xiàn)實時更新
          @RefreshScope
          @ConfigurationProperties("zuul")
          public ZuulProperties zuulProperties() {
          return new ZuulProperties();
          }
    
  • 重啟該項目后, 訪問: http://127.0.0.1:8202/api-member?userToken=12, 如果能夠正常訪問就代表配置成功了.

  • 此時我們后端,開啟兩個member服務(wù), 作為集群. zuul可以自動實現(xiàn)ribbon負載均衡. 以下兩次請求代表分別請求到了兩個會員服務(wù)(默認負載均衡為: 輪訓(xùn)算法)

    image.png

    image.png

我的視頻總結(jié)地址:https://www.bilibili.com/video/BV1z64y1F727/
我的源代碼地址:https://github.com/liangxifeng833/springcloud/tree/master/configCenter/zuul_gateway

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厦取,一起剝皮案震驚了整個濱河市潮太,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虾攻,老刑警劉巖铡买,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霎箍,居然都是意外死亡奇钞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門漂坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來景埃,“玉大人,你說我怎么就攤上這事顶别」柔悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵驯绎,是天一觀的道長完慧。 經(jīng)常有香客問我,道長剩失,這世上最難降的妖魔是什么屈尼? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拴孤,結(jié)果婚禮上脾歧,老公的妹妹穿的比我還像新娘。我一直安慰自己乞巧,他們只是感情好涨椒,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绽媒,像睡著了一般蚕冬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上是辕,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天囤热,我揣著相機與錄音,去河邊找鬼获三。 笑死旁蔼,一個胖子當著我的面吹牛锨苏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棺聊,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伞租,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了限佩?” 一聲冷哼從身側(cè)響起葵诈,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祟同,沒想到半個月后作喘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡晕城,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年泞坦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砖顷。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡贰锁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出择吊,到底是詐尸還是另有隱情李根,我是刑警寧澤槽奕,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布几睛,位于F島的核電站,受9級特大地震影響粤攒,放射性物質(zhì)發(fā)生泄漏所森。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一夯接、第九天 我趴在偏房一處隱蔽的房頂上張望焕济。 院中可真熱鬧,春花似錦盔几、人聲如沸晴弃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽上鞠。三九已至,卻和暖如春芯丧,著一層夾襖步出監(jiān)牢的瞬間芍阎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工缨恒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谴咸,地道東北人轮听。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像岭佳,于是被迫代替她去往敵國和親血巍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355