摘要:今天的文章來自李貝寧,成都研究院的資深程序猿和架構(gòu)師。是研究院內(nèi)部的教練,也是成都研究院若干內(nèi)部培訓(xùn)課程的講師。而李貝寧,在成都研究院三支分別使用和的開發(fā)團(tuán)隊(duì)里都被任命為架構(gòu)師,技術(shù)的全面性不輸于史大郎。
今天的文章來自李貝寧(Ben),SAP成都研究院的資深程序猿和架構(gòu)師。
作為成都研究院里同時(shí)精通Java, JavaScript和ABAP這三門編程語言的數(shù)位同事之一,Ben曾經(jīng)先后擔(dān)任了成都CRM Fiori開發(fā)團(tuán)隊(duì),S4CRM開發(fā)團(tuán)隊(duì)和尚未發(fā)布的某款云產(chǎn)品開發(fā)團(tuán)隊(duì)的架構(gòu)師。
Ben在這三個(gè)團(tuán)隊(duì)的職責(zé)都是產(chǎn)品架構(gòu)設(shè)計(jì)和部分功能代碼的編寫,以及組內(nèi)其他同事的代碼審查。
除了自身架構(gòu)設(shè)計(jì)和編程相關(guān)的技能過硬之外,Ben在傳業(yè)授道解惑方面也很有心得。Ben是SAP研究院內(nèi)部的Agile Software Enginnering教練,也是SAP成都研究院若干內(nèi)部培訓(xùn)課程的講師。他的課程幫助了很多剛剛走出大學(xué)校園的年輕同事們從在學(xué)校書寫玩具代碼到走向真正的企業(yè)軟件開發(fā)的專業(yè)之路。
每位同時(shí)精通數(shù)門風(fēng)格截然不同的編程語言的開發(fā)人員,總有自己的一套心得和辦法,把這些語言融為一體,為自己所用。那么Ben又是如何做到的呢?或許可以從Ben的業(yè)余愛好看出點(diǎn)端倪。Ben喜歡足球和圍棋,并且水平在業(yè)余愛好者里不算太差。能同時(shí)駕馭這一動一靜,一剛一柔,一陽一陰的兩個(gè)愛好,除了Ben以外,我能想到的也就只有這幾位高手了:
1. 人到中年,把降龍十八掌練到超過洪七公造詣的大俠郭靖。
豈知郭靖近二十年來勤練九陰真經(jīng),初時(shí)真力還不顯露,數(shù)十招后,降龍十八掌的勁力忽強(qiáng)忽弱,忽吞忽吐,從至剛之中竟生出至柔的妙用,那已是洪七公當(dāng)年所領(lǐng)悟不到的神功?
2. 左手短刀,右手長鞭的峨眉美女掌門周芷若。
周芷若取出軟鞭,右手一抖,鞭子登時(shí)卷成十多個(gè)大大小小的圈子,好看已極,左手翻處,青光閃動,露出了一柄短刀。群雄昨日已見識了她軟鞭的威力,不意她左手尚能同時(shí)用刀,一長一短,一柔一剛,那是兩般截然相異的兵刃。群雄驚佩之下,精神都為之一振。
3.?天微星九紋龍史進(jìn)。
水滸傳里雖然有幾位武力值爆表的好漢,比如盧俊義,史文恭,林沖這些,但是書中他們從始至終都只使用一種武器。而史大郎在戰(zhàn)場上和別人拼命時(shí),曾先后使用了三種不同的武器,其中還包含中國古代武將很少有敢嘗試的高難度武器——流星錘。
史進(jìn)大怒道:“賊回子敢如此猖獗!”便輪著三尖兩刃四竅八環(huán)刀,直取蘭生。蘭生急舉獨(dú)足銅人,敵住史進(jìn)。兩下各顯武藝,奮勇大斗。史進(jìn)換了一支點(diǎn)鋼丈八蛇矛,驟馬出來。哈蕓生見了,便挺著手中五股托天叉,一馬沖來,直取史進(jìn)。二人也不打話,兩馬相交,叉矛并舉,一來一去。只見史進(jìn)那枝矛,忽高忽低,忽前忽后,忽左沖,忽右掠,揮身上下,盡是一片矛影。
說時(shí)遲,那時(shí)快,史進(jìn)早已手提流星錘,換了一匹高頭大馬,趕到陣前。蘭生飛起銅人打去,沙冕二人一齊攢上。史進(jìn)耍圓那顆流星錘,擋住三人。
書中提到的史大郎在八十萬禁軍教頭王進(jìn)的指導(dǎo)下,十八般武藝樣樣精通,果然名不虛傳。
而李貝寧,在SAP成都研究院三支分別使用Java, JavaScript和ABAP的開發(fā)團(tuán)隊(duì)里都被任命為架構(gòu)師,技術(shù)的全面性不輸于史大郎。
據(jù)我所知李貝寧喜歡的球星是被球迷冠以“拼命三郎”,“鐵人”稱號的內(nèi)德維德,喜歡他在球場上不惜體力奔跑那種鐵血作風(fēng)。李貝寧希望自己在球場上也能做一個(gè)像內(nèi)德維德那樣的拼命三郎。
Jerry不是球迷,只知道咱歷史上也有一位拼命三郎:
作為一個(gè)八零后,Jerry幼年在這些卡片上沒少花錢。如果您有同樣的收藏愛好,歡迎后臺交流。
下面是李貝寧的正文。
*
大家好,我叫李貝寧,也可以叫我Ben, 目前在SAP成都研究院某云產(chǎn)品項(xiàng)目組擔(dān)任高級開發(fā)工程師和架構(gòu)師。
我是09年加入SAP的, 之前在上海花旗集團(tuán)軟件中心做了4年銀行系統(tǒng)開發(fā), 進(jìn)到SAP之后先在SAP上海研究院工作了兩年,于11年底轉(zhuǎn)到了SAP成都研究院直至現(xiàn)在,算起來在成都呆了快七年了。
除了編程之外,我還有兩個(gè)鐵打不動的愛好,足球和圍棋,水平嘛分別算得上小區(qū)球星級和街道業(yè)余高手級... 我認(rèn)為這兩件事一個(gè)可以保持身體上的活力,一個(gè)可以保持頭腦上的活力,所以至今一直堅(jiān)持每周踢一場球和下幾盤棋的節(jié)奏,當(dāng)然同時(shí)也作為工作之余的放松。
*
這篇文章就SAP Hybris某款正在開發(fā)的云產(chǎn)品在SAP云平臺上用到的一個(gè)組件Application Router(以下簡稱App Router)做一個(gè)介紹。
SCP App Router是SAP云平臺(以下簡稱SCP)上的核心模塊之一,作為獨(dú)立運(yùn)行在SCP Cloud Foundry環(huán)境中的一個(gè)應(yīng)用程序,它主要支持以下兩大核心功能:
反向代理:將外部請求分發(fā)給SCP Cloud Foundry環(huán)境內(nèi)不同的應(yīng)用程序。
安全集成:和SCP Cloud Foundry上的核心安全組件UAA無縫集成,提供了用戶認(rèn)證,會話管理等安全相關(guān)的功能。
說到這里您也許馬上會想到Nginx,一款優(yōu)秀的開源Web服務(wù)器,用來做類似反向代理的功能。如果我的應(yīng)用程序想要用Nginx,可不可以呢?其實(shí)SCP并沒有限制只能用App Router——它是一個(gè)完全開放的平臺,您可以部署任意你想要的組件為應(yīng)用程序服務(wù),只是SAP在上面已經(jīng)提供了一系列的基礎(chǔ)設(shè)施組件,這套SAP原生組件之間提供了更佳的集成和協(xié)同,App Router就是其中之一。
理解App Router的技術(shù)選型App Router是一個(gè)用Node.js構(gòu)建的標(biāo)準(zhǔn)的Web應(yīng)用。
眾所周知Node.js作為一門開放的技術(shù)環(huán)境,在構(gòu)建基于HTTP的Web應(yīng)用上有先天的優(yōu)勢:?簡單,高效。并且Node.js經(jīng)過近幾年的快速迭代和發(fā)展,已經(jīng)非常成熟和穩(wěn)定,再加上開源社區(qū)提供了豐富的庫,Node.js已經(jīng)成為了服務(wù)器端強(qiáng)大的應(yīng)用開發(fā)環(huán)境。SAP選擇Node.js作為其云戰(zhàn)略平臺上的核心組件的技術(shù)棧,從這個(gè)選擇我們也能看出SAP在云戰(zhàn)略上的思路是逐步走向開放。
您或許會問,Node.js是單線程模型,根據(jù)上面的示例圖,所有對于部署在SCP Cloud Foundry上的后端訪問都通過App Router,這會帶來性能問題嗎?其實(shí)這是對于Node.js運(yùn)行時(shí)模型的一個(gè)誤解,參考一張Node.js的運(yùn)行時(shí)架構(gòu)圖:
Node.js對于應(yīng)用程序端只提供了單線程的編程模型,但是其底層的運(yùn)行架構(gòu)并非是單線程模型。在Node.js中各種HTTP訪問,數(shù)據(jù)庫的讀寫,文件IO的訪問都是以異步的方式代理給了底層的V8引擎,主線程不會被阻塞,而底層V8引擎具備非常強(qiáng)大的并發(fā)處理能力,會迅速將各個(gè)事件并發(fā)的處理結(jié)果通過事件輪詢的方式返回給主線程。只要在Node.js的主線程中不做大量的CPU運(yùn)算(比如大規(guī)模業(yè)務(wù)邏輯運(yùn)算,科學(xué)計(jì)算等),這樣的Node.js應(yīng)用程序是可以具備良好的性能的。
而App Router恰好具有上述所說的那些一典型特征:在用戶認(rèn)證中將識別用戶身份和權(quán)限的工作代理給Cloud Foundry UAA來做,業(yè)務(wù)請求轉(zhuǎn)發(fā)給各個(gè)獨(dú)立的部署Cloud Foundry應(yīng)用,自己僅僅做一些簡單的HTTP參數(shù)的轉(zhuǎn)換和校驗(yàn),請求的轉(zhuǎn)發(fā),以及請求響應(yīng)的返回。
App Router上的routing(路由)在App Router上路由的實(shí)現(xiàn)是通過定義一系列destination來實(shí)現(xiàn)的,具體來說就是在App Router的xs-app.json中配置route和destination,以及在manifest.yml中配置對應(yīng)destination的url:
manifest.yml:
簡單解釋一下主要的參數(shù):
Routes
source:可以是一個(gè)URL,也可以是一個(gè)正則表達(dá)式,定義了當(dāng)前的route是匹配什么樣的請求路徑
target:??當(dāng)前請求如何被重寫到目標(biāo)地址
destination:?當(dāng)前請求路由到manifest中的哪個(gè)目標(biāo)地址
authenticationType:?有三種選擇,xsuaa, none和basic,xsuaa和none分別代表了是否對當(dāng)前請求在App Router上做用戶安全認(rèn)證,下一節(jié)會具體介紹。Basic是和SAP HANA集成的時(shí)候提供默認(rèn)的安全驗(yàn)證支持。
Destination
Name:用來跟xs-app.json中的destination配置相匹配
URL:目標(biāo)應(yīng)用程序真實(shí)的Clould Foundry地址
ForwardAuthToken:??如果請求中帶有oauth token,是否將oauth token轉(zhuǎn)發(fā)給目標(biāo)應(yīng)用程序. App Router也支持oauth token的部分校驗(yàn)功能,所以用戶也可以根據(jù)具體情況選擇不轉(zhuǎn)發(fā)oauth?token,就在App Router端校驗(yàn)
除了基本的路由功能,App Router還提供了豐富的Web應(yīng)用程序相關(guān)的功能支持,比如連接管理,session管理,擴(kuò)展http頭,跨域,Web Socket等等。?
App Router和SCP UAA的安全集成如上一節(jié)提到的,App Router在路由的時(shí)候提供了用戶的安全認(rèn)證支持。將路由的Authentication Type配置為xsuaa,App Router則會檢查前端發(fā)過來的請求是否帶有合法的session。如果沒有,App Router會將用戶導(dǎo)向SCP UAA的用戶認(rèn)證界面,當(dāng)用戶重新認(rèn)證成功之后,會生成新的合法session,并將此session返回給前端應(yīng)用程序。
整個(gè)認(rèn)證的流程是是SCP App Router和SCP UAA協(xié)同完成的,SCP UAA是SAP對Cloud Foundry上提供的安全組件UAA (User Account and Authentication Service)的一個(gè)封裝,Cloud Foundry UAA是一個(gè)實(shí)現(xiàn)了標(biāo)準(zhǔn)Oauth 2.0協(xié)議的authorization server,SAP在此基礎(chǔ)上做了一些自定義的增強(qiáng),但是在接口上和原生的UAA保持了一致,這樣可以盡可能的對OAuth Client端程序提供兼容性。
Cloud Foundry UAA官方文檔:
https://docs.cloudfoundry.org...
SCP標(biāo)準(zhǔn)的OAuth2.0流程:
如果熟悉OAuth2.0協(xié)議,從這張流程圖上很快就能看出App Router和UAA之間是通過Authorization Code Grant Flow來交互的,在交互過程中它們分別充當(dāng)了OAuth Client和OAuth Server的角色。
關(guān)于OAuth2.0,請參見:?https://oauth.net/2/
看到這里您也許會問,為什么不是前端瀏覽器作為OAuth Client?除了安全性的考慮,?App Router將OAuth流程對前端隱藏的另一個(gè)好處是,各種前端應(yīng)用程序不需要知道UAA上諸如Client ID, Client Secret的細(xì)節(jié),提供了更好的安全性。
其次還有SAP在產(chǎn)品層面的考量,為了其標(biāo)準(zhǔn)的產(chǎn)品在UI技術(shù)上的一致性,包括SCP上的產(chǎn)品在內(nèi)大多數(shù)都是基于SAP UI5來構(gòu)建前端UI,而UI5又是基于HTML5技術(shù)而來,即這些產(chǎn)品都是基于瀏覽器的富客戶端應(yīng)用。如此一來,在標(biāo)準(zhǔn)的App Router里面實(shí)現(xiàn)OAuth2.0流程可以使SAP的各種前端應(yīng)用并不需要關(guān)注認(rèn)證流程的細(xì)節(jié)。如上圖所示,App Router在完成了認(rèn)證流程并最終拿到token之后,并沒有將token返回給瀏覽器端,而是在App Router上生成一個(gè)session,并且將session和token關(guān)聯(lián)起來,App Router在這里起到一個(gè)中介者的角色,對于前端統(tǒng)一用session進(jìn)行交互,對于后端統(tǒng)一用token進(jìn)行交互。
SCP除了將標(biāo)準(zhǔn)的實(shí)現(xiàn)默認(rèn)支持瀏覽器端應(yīng)用程序外,作為一個(gè)開放的平臺,當(dāng)然也支持移動端原生應(yīng)用程序的集成,這里不作贅述,具體細(xì)節(jié)可以參考SCP的開發(fā)文檔。
App Router上的session管理App Router上的session管理利用了Node.js的session-express框架,默認(rèn)將session緩存在instance memory中(下圖第79行):
然后采用session stickiness策略來保證在多實(shí)例部署的情況下,相同會話的請求會被發(fā)送到同一個(gè)實(shí)例上以保證會話能繼續(xù)進(jìn)行。
Session Stickiness:
https://stackoverflow.com/que...
這樣做的好處是既利用了instance memory的高性能,也可以在一定程度上保證高可靠性。不過代價(jià)是犧牲了動態(tài)伸縮的能力,一旦某個(gè)App Router實(shí)例上還有正在使用中的session,這個(gè)實(shí)例就不能被關(guān)閉。
好在App Router使用的是開源的express-session框架,該框架并非只能將session存儲在instance memory中,在Node.js開源社區(qū)已經(jīng)提供了多種express-session的外部存儲方案。至少在技術(shù)上,可以將App Router提供的instance memory存儲替換為外部存儲,而不需要做太多的定制化開發(fā),這樣一來多個(gè)App Router實(shí)例就可以共享同一套session存儲。
App Router的可擴(kuò)展性只要說到SAP的產(chǎn)品,extensibility是一個(gè)不可避免的話題,這是由SAP的業(yè)務(wù)是面向企業(yè)級客戶這一特質(zhì)決定的。SAP也一直致力于從平臺到框架,再到上層的產(chǎn)品,盡可能多的給SAP客戶提供良好的可擴(kuò)展性。App Router同樣也不例外,因?yàn)橹苯邮褂昧薔ode.js的connect框架,這是一款本身就提供了豐富擴(kuò)展的中間件框架,可以通過可插拔的方式對Node.js的請求和響應(yīng)提供過濾和攔截,具體大家可以參考connect的主頁。
App Router基于connect,當(dāng)然App Router的用戶就可以直接獲得connect提供的各種中間件,除此之外App Router還提供了自己的一些中間件:
是不是非常簡單和直接?使用這些中間件而不需要修改原生App Router里面的代碼。
這里不再對App Router上的各種中間件一一贅述,具體細(xì)節(jié)可以參考App Router的Github文檔。
總結(jié)說來,App Router是一款設(shè)計(jì)簡單,使用方便,提供了良好可擴(kuò)展性的反向代理組件,為廣大SAP用戶在SCP上開發(fā)應(yīng)用程序提供了更多的選擇和方便。
感謝大家閱讀。
要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注微信公眾號"汪子熙"。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://hztianpu.com/yun/69193.html
摘要:通過這個(gè)鏈接打開對應(yīng)的幫助文檔,可以看到下列七種登錄手段。上圖的圖例描述了部署在云平臺環(huán)境上的應(yīng)用是如何通過訪問系統(tǒng)上的服務(wù)。用戶完成登錄操作后,一個(gè)簡稱為被創(chuàng)建,發(fā)送給,并緩存于內(nèi)。將請求通過轉(zhuǎn)發(fā)給。 ABAP Netweaver 在事務(wù)碼SICF里選擇一個(gè)服務(wù),在明細(xì)頁面對Procedure字段點(diǎn)擊F1,查看Logon Procedure的幫助文檔。showImg(https://...
摘要:通過這個(gè)鏈接打開對應(yīng)的幫助文檔,可以看到下列七種登錄手段。上圖的圖例描述了部署在云平臺環(huán)境上的應(yīng)用是如何通過訪問系統(tǒng)上的服務(wù)。用戶完成登錄操作后,一個(gè)簡稱為被創(chuàng)建,發(fā)送給,并緩存于內(nèi)。將請求通過轉(zhuǎn)發(fā)給。 ABAP Netweaver 在事務(wù)碼SICF里選擇一個(gè)服務(wù),在明細(xì)頁面對Procedure字段點(diǎn)擊F1,查看Logon Procedure的幫助文檔。showImg(https://...
摘要:在美國除開城市里的居民區(qū)道路,其他道路上基本默認(rèn)你可以超,超過這個(gè)數(shù)你得看警察當(dāng)天的心情了。警察基本只抓第一個(gè)帶頭超速的。一般來講美國的警察還是很公正很的。 珍重過去,你好明天 曾經(jīng)有人問我,這些年在外面值嗎?值不值我很難去回答,我是失去很多,但我同樣得到了很多。失去的同時(shí)你一定是在得到的,相反得到的同時(shí)你一定也在失去著。所以我認(rèn)為沒有必要太過于糾結(jié)這種問題,我們需要一直向前看。 即將...
摘要:在美國除開城市里的居民區(qū)道路,其他道路上基本默認(rèn)你可以超,超過這個(gè)數(shù)你得看警察當(dāng)天的心情了。警察基本只抓第一個(gè)帶頭超速的。一般來講美國的警察還是很公正很的。 珍重過去,你好明天 曾經(jīng)有人問我,這些年在外面值嗎?值不值我很難去回答,我是失去很多,但我同樣得到了很多。失去的同時(shí)你一定是在得到的,相反得到的同時(shí)你一定也在失去著。所以我認(rèn)為沒有必要太過于糾結(jié)這種問題,我們需要一直向前看。 即將...
摘要:在美國除開城市里的居民區(qū)道路,其他道路上基本默認(rèn)你可以超,超過這個(gè)數(shù)你得看警察當(dāng)天的心情了。警察基本只抓第一個(gè)帶頭超速的。一般來講美國的警察還是很公正很的。 珍重過去,你好明天 曾經(jīng)有人問我,這些年在外面值嗎?值不值我很難去回答,我是失去很多,但我同樣得到了很多。失去的同時(shí)你一定是在得到的,相反得到的同時(shí)你一定也在失去著。所以我認(rèn)為沒有必要太過于糾結(jié)這種問題,我們需要一直向前看。 即將...
閱讀 1171·2021-11-16 11:44
閱讀 1432·2019-08-30 13:12
閱讀 2493·2019-08-29 16:05
閱讀 3157·2019-08-28 18:29
閱讀 971·2019-08-26 13:41
閱讀 3295·2019-08-26 13:34
閱讀 2678·2019-08-26 10:35
閱讀 1007·2019-08-26 10:28