盤古開發(fā)框架集成 ShenYu 網(wǎng)關(guān)實現(xiàn) Dubbo 泛化調(diào)用

盤古開發(fā)框架下實現(xiàn)微服務(wù)網(wǎng)關(guān)的缺省姿勢為基于 pangu-web 模塊的傳統(tǒng)接口調(diào)用模式,具體請參考文檔:如何發(fā)布微服務(wù) (API 網(wǎng)關(guān))题暖。本文提供另外一種通過集成Apache ShenYu 實現(xiàn)網(wǎng)關(guān)泛化調(diào)用 Dubbo 服務(wù)將其發(fā)布為 HTTP 接口的可選方法按傅。

ShenYu 網(wǎng)關(guān)介紹

ShenYu 網(wǎng)關(guān)基于 Webflex 非阻塞模型通過泛化調(diào)用后端 Dubbo 服務(wù)。依賴 Netty 不需要 Servlet 容器胧卤,不需要引入服務(wù)接口包即可通過 Dubbo 泛化調(diào)用服務(wù)接口的方式就可以將后端 Dubbo 服務(wù)轉(zhuǎn)換為 HTTP API唯绍。同時網(wǎng)關(guān)支持鑒權(quán)、動態(tài)限流枝誊、熔斷况芒、防火墻、灰度發(fā)布等叶撒。

相關(guān)名詞解釋

  • shenyu-admin
    網(wǎng)關(guān)插件和元數(shù)據(jù)信息配置管理后臺绝骚。獨立 JAR,需要單獨部署祠够。
  • shenyu-gateway
    網(wǎng)關(guān)模塊压汪,代理 Http 請求,泛化調(diào)用后端 Dubbo 服務(wù)古瓤。此模塊負(fù)責(zé)接收 Http 請求止剖。
  • 數(shù)據(jù)同步
    數(shù)據(jù)同步是指在 ShenYu-Admin 后臺操作數(shù)據(jù)以后,使用何種策略將數(shù)據(jù)同步到 ShenYu Gateway 網(wǎng)關(guān)模塊落君。ShenYu 當(dāng)前支持 ZooKeeper穿香、WebSocket、Http 長輪詢绎速、Nacos 皮获、Etcd 和 Consul 進(jìn)行數(shù)據(jù)同步。盤古開發(fā)使用的是 WebSocket 方式進(jìn)行數(shù)據(jù)同步纹冤。
  • 插件
    ShenYu 使用插件化設(shè)計思想魔市,實現(xiàn)插件的熱插拔主届。內(nèi)置豐富的插件赵哲,包括 RPC 代理待德、熔斷和限流、權(quán)限認(rèn)證枫夺、監(jiān)控等等将宪。
  • 選擇器
    每個插件可設(shè)置多個選擇器,對流量進(jìn)行初步篩選橡庞。
  • 規(guī)則
    每個選擇器可設(shè)置多個規(guī)則较坛,對流量進(jìn)行更細(xì)粒度的控制。

網(wǎng)關(guān)調(diào)用結(jié)構(gòu)圖

9-pangu-framework-shenyu.png

ShenYu 網(wǎng)關(guān)實戰(zhàn)

ShenYu 網(wǎng)關(guān)提供的功能非常多扒最,這里我們只關(guān)注 HTTP 請求代理功能丑勤。即代理前端 HTTP 請求,通過 Dubbo 泛化調(diào)用后端 Dubbo 服務(wù)吧趣。

安裝相關(guān)模塊

  • 盤古 Parent
<parent>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-parent</artifactId>
    <version>latest.version.xxx</version>
    <relativePath/>
</parent>
  • 基礎(chǔ)模塊
<dependency>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-spring-boot-starter</artifactId>
</dependency>
  • Dubbo 模塊
<dependency>
    <groupId>com.gitee.pulanos.pangu</groupId>
    <artifactId>pangu-dubbo-spring-boot-starter</artifactId>
</dependency>
  • 網(wǎng)關(guān)模塊
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-sync-data-websocket</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-plugin-apache-dubbo</artifactId>
</dependency>

基于 ShenYu 網(wǎng)關(guān)開發(fā)模式不需要引入 Dubbo 服務(wù)接口 Jar法竞,網(wǎng)關(guān)會根據(jù)服務(wù)接口的元數(shù)據(jù)信息,泛化調(diào)用 Dubbo 服務(wù)接口强挫。服務(wù)接口的元數(shù)據(jù)信息則根據(jù) Dubbo 服務(wù)應(yīng)用中的配置自動上傳到 ShenYu 網(wǎng)關(guān)管理系統(tǒng)岔霸。此內(nèi)容在下文會繼續(xù)講解。

本地配置

為便于理解俯渤,本文基于本地配置的方式編寫呆细。若改為標(biāo)準(zhǔn)的 Nacos 配置中心模式,請參閱:配置中心 章節(jié)八匠。

server:
  port: 9090

spring:
  main:
    allow-bean-definition-overriding: true

shenyu:
  cross:
    enabled: true
    allowedHeaders:
    allowedMethods: "*"
    allowedOrigin: "*"
    allowedExpose: "*"
    maxAge: "18000"
    allowCredentials: true
  switchConfig:
    local: true
  file:
    enabled: true
    maxSize : 10
  sync:
    websocket:
      urls: ${shenyu.websocket.urls:ws://localhost:9095/websocket}
  dubbo:
    parameter: multi
  exclude:
    enabled: false
    paths:
      - /favicon.ico
  extPlugin:
    path:
    enabled: true
    threads: 1
    scheduleTime: 300
    scheduleDelay: 30
  scheduler:
    enabled: false
    type: fixed
    threads: 16
  upstreamCheck:
    enabled: false
    timeout: 3000
    healthyThreshold: 1
    unhealthyThreshold: 1
    interval: 5000
    printEnabled: true
    printInterval: 60000

關(guān)鍵配置項說明

  • shenyu.sync.websocket.urls
    表示網(wǎng)關(guān)和 ShenYu Admin 之間使用 Websocket 的方式進(jìn)行數(shù)據(jù)同步絮爷,這里是配置 ShenYu Admin 提供的 Websocket 數(shù)據(jù)同步服務(wù)的地址(支持集群,逗號分割)梨树。

上表中提到到 ShenYu Admin 是 ShenYu 網(wǎng)關(guān)框架的配置 & 元數(shù)據(jù)管理后臺坑夯。這里包含了網(wǎng)關(guān)模塊自己的配置信息也包含了后臺服務(wù)接口元數(shù)據(jù)信息,這理的配置信息和元數(shù)據(jù)信息需要和網(wǎng)關(guān)模塊同步劝萤。ShenYu 支持多種數(shù)據(jù)同步方案渊涝,Websocket 只是盤古開發(fā)選用的一種缺省方案。

調(diào)用微服務(wù)接口

基于 ShenYu 的網(wǎng)關(guān)開發(fā)模式既不需要引入服務(wù)接口 JAR床嫌,也不需要編寫具體的調(diào)用代碼跨释。完全由網(wǎng)關(guān)根據(jù)服務(wù)接口元數(shù)據(jù)進(jìn)行 Dubbo 泛化調(diào)用。

網(wǎng)關(guān)是如何知道 Dubbo 服務(wù)接口元數(shù)據(jù)的呢厌处?

  • 通過 ShenYu Admin 后臺系統(tǒng)鳖谈,『基礎(chǔ)配置->元數(shù)據(jù)管理』菜單,手工新增每一個接口的元數(shù)據(jù)阔涉,然后將數(shù)據(jù)自動同步到網(wǎng)關(guān)模塊缆娃。(不建議捷绒,量大的話太繁瑣)
  • 對Dubbo服務(wù)提供者增加 ShenYu Client 支持,通過在接口方法上使用注解 @ShenyuDubboClient 來自動采集上傳接口元數(shù)據(jù)到 ShenYu Admin贯要,然后將數(shù)據(jù)自動同步到網(wǎng)關(guān)模塊暖侨。(具體實現(xiàn)見下文所述)

改造 Dubbo 服務(wù)端,自動上傳接口元數(shù)據(jù)

對原 Dubbo 服務(wù)端做一些配置變更崇渗,使其能自動將接口元數(shù)據(jù)上傳到 ShenYu Admin 后臺系統(tǒng)字逗。
安裝 ShenYu Client 依賴包

<dependency>
    <groupId>org.apache.shenyu</groupId>
    <artifactId>shenyu-spring-boot-starter-client-apache-dubbo</artifactId>
</dependency>

增加配置項

shenyu.client.register-type=http
shenyu.client.server-lists=${shenyu.server-lists:http://localhost:9095}
shenyu.client.props.contextPath=/dubbo
  • shenyu.client.register-type
    服務(wù)接口元數(shù)據(jù)采集方式,可選 http 直連模式或配置中心 zookeeper宅广、etcd葫掉、consul 和 nacos。盤古開發(fā)采集接口元數(shù)據(jù)缺省選擇 http 直接 ShenYu Admin 的方式跟狱。
  • shenyu.client.server-lists
    ShenYu Admin 地址或配置中心地址俭厚。集群時多個地址用逗號分開。
  • shenyu.client.props.contextPath
    本服務(wù)在網(wǎng)關(guān)中的路由前綴,可自定義按需配置驶臊。

自動上報服務(wù)接口元數(shù)據(jù)
在 Dubbo 服務(wù)實現(xiàn)類的方法上使用注解 @ShenyuDubboClient 標(biāo)記挪挤,表示該接口方法元數(shù)據(jù)自動上傳到 ShenYu Admin。如下代碼所示资铡。

@Service(version = "1.0.0", group = "pangu-examples-dubbo-gateway-service")
public class UserServiceImpl implements UserService {

    @Override
    @ShenyuDubboClient(path = "/findUserEntity", desc = "查詢用戶信息")
    public UserEntity findUserEntity(Long id) {
        ...
        return userEntity;
    }
}

配置網(wǎng)關(guān)泛化調(diào)用 Dubbo 服務(wù)所需的注冊中心地址
通過 ShenYu Admin 后臺系統(tǒng)『基礎(chǔ)配置->插件管理』菜單电禀,啟用 dubbo插件 并填入注冊中心地址。比如笤休,我測試用的注冊中心地址:nacos://169.188.88.140:1688?namespace=pangu-dev尖飞。如下圖所示。

4-pangu-framework-shenyu-dubbo.png

重啟服務(wù)提供者

  • 進(jìn)入 ShenYu Admin 后臺系統(tǒng)的『基礎(chǔ)配置->元數(shù)據(jù)管理』菜單店雅,會看到自動上報的服務(wù)元數(shù)據(jù)信息政基。如下圖所示。


    2-pangu-framework-shenyu-metadata.png
  • 進(jìn)入 ShenYu Admin 后臺系統(tǒng)的『插件列表-> proxy -> dubbo』菜單闹啦,會看到自動注冊的選擇器和規(guī)則信息沮明。如下圖所示。


    3-pangu-framework-shenyu-plugin.png

啟動入口

@SpringBootApplication
public class WebApiGatewayApplication {
    public static void main(String[] args) {
        PanGuApplicationBuilder.init(WebApiGatewayApplication.class).run(args);
    }
}

網(wǎng)關(guān)請求URL

至此窍奋,網(wǎng)關(guān)就可以調(diào)用 Dubbo 服務(wù)了荐健。但是,如何確定 Dubbo 服務(wù)對應(yīng)的請求 url 地址呢琳袄?

  • 由網(wǎng)關(guān)模塊配置文件可知網(wǎng)關(guān)應(yīng)用端口是 9090江场。
  • Dubbo 服務(wù)的配置項 shenyu.client.props.contextPath 為 /dubbo
  • Dubbo 方法通過 @ShenyuDubboClient 標(biāo)記的 path 屬性為:/findUserEntity窖逗。

綜上址否,Dubbo 服務(wù) UserService#findUserEntity 的完整請求地址為:http://localhost:9090/dubbo/findUserEntity

參數(shù)說明

通過 http 協(xié)議碎紊,post 方式訪問網(wǎng)關(guān)佑附。在 http body 中傳入 json 格式的參數(shù)樊诺。

請求示例

curl --location --request POST 'http://127.0.0.1:9090/dubbo/findUserEntity' \
--header 'Content-Type: application/json' \
--data '{id=1}'
{
    "code": 200,
    "message": "Access to success!",
    "data": {
        "name": "云南碼農(nóng)大熊",
        "id": 1,
        "userType": 2,
    }
}

本范例源碼

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市音同,隨后出現(xiàn)的幾起案子词爬,更是在濱河造成了極大的恐慌,老刑警劉巖瘟斜,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缸夹,死亡現(xiàn)場離奇詭異,居然都是意外死亡螺句,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門橡类,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛇尚,“玉大人,你說我怎么就攤上這事顾画∪〗伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵研侣,是天一觀的道長谱邪。 經(jīng)常有香客問我,道長庶诡,這世上最難降的妖魔是什么惦银? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮末誓,結(jié)果婚禮上扯俱,老公的妹妹穿的比我還像新娘。我一直安慰自己喇澡,他們只是感情好迅栅,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晴玖,像睡著了一般读存。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呕屎,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天让簿,我揣著相機(jī)與錄音,去河邊找鬼榨惰。 笑死拜英,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琅催。 我是一名探鬼主播居凶,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼虫给,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侠碧?” 一聲冷哼從身側(cè)響起抹估,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弄兜,沒想到半個月后药蜻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡替饿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年语泽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片视卢。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡踱卵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出据过,到底是詐尸還是另有隱情惋砂,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布绳锅,位于F島的核電站西饵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鳞芙。R本人自食惡果不足惜眷柔,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望积蜻。 院中可真熱鬧闯割,春花似錦、人聲如沸竿拆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丙笋。三九已至谢澈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間御板,已是汗流浹背锥忿。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留怠肋,地道東北人敬鬓。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钉答。 傳聞我的和親對象是個殘疾皇子础芍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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