從零開始,手打一個權(quán)限管理系統(tǒng)(第十五章 網(wǎng)關(guān))

第十五章 網(wǎng)關(guān)

前言

本系統(tǒng)中網(wǎng)關(guān)最主要的功能就是:路由轉(zhuǎn)發(fā)哼勇、路徑重寫、負(fù)載均衡呕乎、過濾等积担。Spring Cloud Gateway官方文檔


一、POM配置

父級pom.xml引入相關(guān)依賴猬仁,具體內(nèi)容請參考源碼帝璧,核心的依賴就是SpringCloud、SpringCloudAlibaba湿刽、SpringBoot聋溜,

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

Gateway子項目引入的核心包,

<!--注冊中心客戶端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--配置中心客戶端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--gateway 網(wǎng)關(guān)依賴,內(nèi)置webflux 依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

二叭爱、路由配置

路由信息全部都托管到nacos里面一個名為dynamic_routes的文件撮躁。


image.png
routes:
  # service-auth
  - id: service-auth
    predicates:
      - Path=/auth/**
    uri: lb://service-auth
    filters:
      - StripPrefix=1
  # service-upms-api
  - id: service-upms-api
    predicates:
      - Path=/upms/**
    uri: lb://service-upms-api
    filters:
       - StripPrefix=1
  # service-demo
  - id: service-demo
    predicates:
      - Path=/demo/**
    uri: lb://service-demo
    filters:
      - StripPrefix=1
 - id: test
   uri: http://www.baidu.com/
   predicates:
     - Path=/test

參數(shù)解釋:
id:路由唯一標(biāo)識,用來區(qū)別于其他的route
uri:請求被轉(zhuǎn)發(fā)到的微服務(wù)买雾,lb表示負(fù)載均衡
predicate:斷言的作用是進(jìn)行條件判斷把曼,我們這里用的是Path Route Predicate Factory,路徑匹配成功才會執(zhí)行路由漓穿。
filter: 過濾器嗤军,StripPrefix=1表示去掉前綴


三、路由初始化

路由的配置信息存放在Nacos里面晃危,在系統(tǒng)啟動的時候需要從nacos里面取出來叙赚,然后加載到系統(tǒng)里面;同時還需要監(jiān)聽配置文件的變化僚饭,方便實時更新配置文件震叮,源碼如下:

@Slf4j
@Configuration
@AllArgsConstructor
public class DynamicRouteInit {
    private RouteDefinitionWriter routeDefinitionWriter;
    private NacosConfigProperties nacosConfigProperties;

    @PostConstruct
    public void initRoute() {
        try {
            Properties properties = new Properties();
            properties.put(PropertyKeyConst.SERVER_ADDR, nacosConfigProperties.getServerAddr());
            properties.put(PropertyKeyConst.USERNAME, nacosConfigProperties.getUsername());
            properties.put(PropertyKeyConst.PASSWORD, nacosConfigProperties.getPassword());
            ConfigService configService = NacosFactory.createConfigService(properties);
            String content = configService.getConfig(CommonConstant.CONFIG_DATA_ID, CommonConstant.CONFIG_GROUP, CommonConstant.CONFIG_TIMEOUT_MS);
            log.info("初始化路由網(wǎng)關(guān)開始");
            updateRoute(content);
            log.info("初始化路由網(wǎng)關(guān)完成");

            /**
             * 監(jiān)聽配置
             * 如果希望 Nacos 推送配置變更,可以使用 Nacos 動態(tài)監(jiān)聽配置接口來實現(xiàn)鳍鸵。
             */
            configService.addListener(CommonConstant.CONFIG_DATA_ID, CommonConstant.CONFIG_GROUP, new Listener() {
                @Override
                public void receiveConfigInfo(String configInfo) {
                    log.info("更新路由網(wǎng)關(guān)開始");
                    updateRoute(configInfo);
                    log.info("更新路由網(wǎng)關(guān)完成");
                }

                @Override
                public Executor getExecutor() {
                    return null;
                }
            });
        } catch (NacosException e) {
            log.error("加載路由出錯:{}", e.getErrMsg());
        }
    }

    public void updateRoute(String content) {
        Yaml yaml = new Yaml();
        GatewayRouteList gatewayRouteList = yaml.loadAs(content, GatewayRouteList.class);
        gatewayRouteList.getRoutes().forEach(route -> {
            log.info("加載路由:{},{}", route.getId(), route);
            routeDefinitionWriter.save(Mono.just(route)).subscribe();
        });
    }
}

四苇瓣、其他配置

新建配置文件bootstrap.yml,用來配置一些固定不變的參數(shù)偿乖,其他動態(tài)或者有變化可以托管到nacos配置中心击罪。

server:
  port: 8888

spring:
  application:
    # 應(yīng)用名稱
    name: @artifactId@
  # 配置中心
  cloud:
    nacos:
      # 服務(wù)發(fā)現(xiàn)
      discovery:
        # 服務(wù)發(fā)現(xiàn)地址
        server-addr: @nacos.addr@
        # 組名
        group: @group.name@
      # 配置中心
      config:
        # 配置中心地址
        server-addr: @nacos.addr@
        # 文件擴展名
        file-extension: yml
        # 組名
        group: @group.name@
        # 共享文件配置
        shared-configs[0]:
          # 文件名稱
          data-id: application.${spring.cloud.nacos.config.file-extension}
          refresh: true

log:
  # 日志名
  appName: service-gateway

其中@***@這種類型的參數(shù)是配置到pom.xml里面的哲嘲,可以參考源碼

<profiles>
        <!--生產(chǎn)環(huán)境-->
        <profile>
            <id>prod</id>
            <properties>
                <nacos.addr>127.0.0.1:8848</nacos.addr>
                <group.name>DEFAULT_GROUP</group.name>
            </properties>
        </profile>
    </profiles>

五、驗證

  1. 啟動Gateway服務(wù)媳禁,可以看到路由加載的日志眠副,并且能服務(wù)注冊中心發(fā)現(xiàn)該服務(wù)。


    image.png

    image.png
  2. 添加新路由竣稽,并發(fā)布囱怕,可以在控制臺看到路由更新日志

  - id: test
    uri: http://www.baidu.com/
    predicates:
      - Path=/test
image.png
  1. 訪問http://127.0.0.1:8888/demo/user/test,可以正確路由到service-demo這個服務(wù)的方法上丧枪。
    image.png

當(dāng)前版本tag:2.0.0
代碼倉庫


六光涂、 體驗地址

后臺數(shù)據(jù)庫只給了部分權(quán)限庞萍,報錯屬于正常拧烦!
想學(xué)的老鐵給點點關(guān)注吧!6奂啤恋博!
歡迎留言交流!K教瘛债沮!

我是阿咕嚕,一個從互聯(lián)網(wǎng)慢慢上岸的程序員本鸣,如果喜歡我的文章疫衩,記得幫忙點個贊喲,謝謝荣德!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闷煤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涮瞻,更是在濱河造成了極大的恐慌鲤拿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件署咽,死亡現(xiàn)場離奇詭異近顷,居然都是意外死亡,警方通過查閱死者的電腦和手機宁否,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門窒升,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慕匠,你說我怎么就攤上這事异剥。” “怎么了絮重?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵冤寿,是天一觀的道長歹苦。 經(jīng)常有香客問我,道長督怜,這世上最難降的妖魔是什么殴瘦? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮号杠,結(jié)果婚禮上蚪腋,老公的妹妹穿的比我還像新娘。我一直安慰自己姨蟋,他們只是感情好屉凯,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眼溶,像睡著了一般悠砚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堂飞,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天灌旧,我揣著相機與錄音,去河邊找鬼绰筛。 笑死枢泰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铝噩。 我是一名探鬼主播衡蚂,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骏庸!你這毒婦竟也來了毛甲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤敞恋,失蹤者是張志新(化名)和其女友劉穎丽啡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硬猫,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡补箍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啸蜜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑雅。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衬横,靈堂內(nèi)的尸體忽然破棺而出裹粤,到底是詐尸還是另有隱情,我是刑警寧澤蜂林,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布遥诉,位于F島的核電站拇泣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏矮锈。R本人自食惡果不足惜霉翔,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苞笨。 院中可真熱鬧债朵,春花似錦、人聲如沸瀑凝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粤咪。三九已至谚中,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間射窒,已是汗流浹背藏杖。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工将塑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脉顿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓点寥,卻偏偏與公主長得像艾疟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子敢辩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容