不尾號限行!純電動車在北京受禮遇

4月2日,北京市政府發佈消息稱,自2015年4月11日至2016年4月10日,北京將繼續實施工作日機動車尾號限行措施,限行時間為7時至20時,範圍為五環路以內道路(不含五環路)。   而今年的限行措施特別提到,純電動小客車將不受尾號限行影響,具體執行時間由交管局公佈。其中,純電動小客車不受工作日高峰時段區域限行交通管理措施限制,具體執行時間由市公安交通管理部門另行公佈。   今年3月,國家交通運輸部發佈的《關於加快推進新能源汽車在交通運輸行業推廣應用的實施意見》便對推行電動車在內的新能源車有政策傾斜,提出要對新能源汽車不限行、不限購,對新能源計程車的運營權指標適當放寬。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

3dTiles 數據規範詳解[2] Tileset與Tile

轉載請聲明出處:全網@秋意正寒 https://www.cnblogs.com/onsummer/p/13128682.html

一、一個簡單的3dTiles數據示例

上圖是一份 3dTiles數據集在文件夾內的樣子,層層打開可得以下特點:

  • 入口文件是 tileset.json
  • 各級瓦片用文件夾(目錄)來組織

3dTiles 數據目前的具體文件實現,是一些零散的文件。

數據集的名稱與所在文件夾的名稱並無關係,數據集的名稱寫在入口文件中。

3dTiles至少有一個 tileset.json 文件,作為整個數據集的入口。它是一個 json 文件,描述了整個三維瓦片數據集,它記錄的是上一節提及的“邏輯信息”,還包括一些其他的元數據。而“屬性信息”、“嵌入的gltf模型” 則位於各個二進制瓦片文件中,這些二進制文件則由 tileset.json 中的瓦片中的 uri 來引用。

瓦片是什麼?

瓦片,屋頂上的瓦片。古時候,蓋房子,屋頂不能一次澆築完工,也沒有特定的“屋頂”零件,所以只好一片片瓦片蓋上去(我瞎掰的)。

瓦片切割了三維數據,允許三維數據進行細分。我們都知道網速是有限的,在加載超大規模的三維模型數據時,不可能把一個模型全部下載下來再渲染,那樣等待的時間太慢了,但是一點一點出現,視野範圍外的“瓦片”則乾脆就不下載、渲染,性能、視覺都有提高。這就是瓦片的設計優點。

傳統的二維地圖瓦片,叫做 WMTS 或 TMS,這個 “T” 就是 Tile 的意思。

現在,你只要知道,3dTiles就是把空間進行切塊,每個塊叫做 “tile”,也即瓦片。至於怎麼切的——待會介紹 tileset.json 時,會隆重介紹樹結構。

瓦片只有兩種情況:恭弘=叶 恭弘子瓦片,非恭弘=叶 恭弘子瓦片。根瓦片也是非恭弘=叶 恭弘子瓦片。非恭弘=叶 恭弘子瓦片和恭弘=叶 恭弘子瓦片有什麼區別呢?主要就是恭弘=叶 恭弘子瓦片不會再有孩子了(樹結構的知識哈,不懂的建議去學習數據結構中的樹)。

瓦片包含什麼內容呢?本篇稍微靠後再仔細了解瓦片。

現在,我們先認識一下,描述整個 3dTiles 數據集的入口文件,也叫做三維瓦片數據集 —— tileset.json:

二、Tileset——(三維)瓦片數據集

通常,一個三維瓦片數據集(之後簡稱:一個3dtiles數據)的入口就是那個”tileset.json“,至於這個文件的名稱可不可以改,暫時未作測試。

現在,我們先來研究研究 這個入口文件記錄了哪些信息,拿一份最簡單的 3dtiles數據來舉例,該數據只有一個根瓦片(root),根瓦片再無子瓦片。

root對象中有一個content,內有uri屬性,其就記錄了根瓦片的二進制數據文件的URL,這個URL是個相對路徑,相對於 tileset.json 文件。

① 頂級屬性概覽

通過上面介紹,3dTiles數據的入口文件是一個名叫 tileset.json 的文件,而通常來說,這個json必須存在以下幾個頂級對象:

  • asset
  • root
  • geometricError

由於本人學識有限,目前不太清楚 geometricError 的精確含義,只知道這個數值的大小能控制 LOD 的显示隱藏,且這個數值父級瓦片一定比子級瓦片大。

asset 對象,記錄了整個數據集的聲明和歸屬數據,類似於數據聲明,能在此寫入 versiontilesetVersion 等屬性,當然也可以像上方的例子一樣,寫入生成工具、gltf朝向等信息。

root 對象,即這個數據集的根瓦片,每個3dTiles數據集必須有一個 root 對象。

至於 tileset.json 中其他的頂級對象,請查閱官方文檔:點我

② root瓦片及其children

樹結構對於三維空間數據的組織有很大的優勢。3dTiles在空間上允許數據集使用如下幾種樹結構:

  • 四叉樹
  • 八叉樹
  • KD樹
  • 格網結構

四叉樹允許使用傳統的均勻四叉樹,也允許使用鬆散四叉樹等變種(例如,允許子節點,即子瓦片允許存在空間範圍重疊)。

上圖為兩個子瓦片在空間上存在部分重疊,照顧到了建築物不可能嚴格切分的特點。

四叉樹對在高度上不太好切分的數據比較適合,而如果追求極致的空間分割和分級(例如點雲數據),那麼八叉樹更合適。

八叉樹也允許使用各種變種。

kd樹比較難理解,在此不作展開,這也是一種有趣的空間結構分割的數據結構。

格網結構的樹允許瓦片存在多個子瓦片:

通常出現在傾斜攝影數據上,但是這會導致網絡請求過多的問題。

③ 坐標系統

我們可以用簡單的兩位數、三位數:經緯度,還有一個高度來標識地球表面附近的任何一個點。經緯度的範圍不超過三位數,而用米作單位的空間直角坐標系來描繪地球,数字太大,不好記憶。

在GIS中,WGS84就是一個用經緯度來標識空間坐標的“地理坐標系,Geographic Coordinate System”。

由於歷史上對地球測量的技術不同,科學家製造了多個長半軸短半軸不太一樣的“橢球”,來模擬地球的形狀。目前,最具代表性的就是兩個以地球質心為中心的橢球體:

  • WGS84橢球體
  • 中國國家2000橢球體(即CGCS2000)

基於橢球體,我們允許有多種不同的坐標系定義,WGS84坐標系其實並不太嚴謹。基於WGS84橢球(長短半軸等信息自行查詢哈),可以使用球面坐標度量,即經緯度,還有一個從質心射向橢球面上的點的“橢球高度”射線,來記錄第三維高度數據。

介紹了那麼多,3dTiles其實採用的是WGS84橢球,但是並未採用經緯度記錄數據:因為相對於精細三維模型來說,經緯度不足以提供足夠精確的空間分割(要照顧圖形显示問題)。所以,同樣是那個形狀,3dTiles使用了同一個WGS84橢球,但是更方便計算的坐標:空間直角坐標。

用經緯度記錄數據的WGS84坐標系,WKID是4326,用地心為坐標原點的空間直角坐標來記錄數據的坐標系,WKID是4979.

3dTiles 用的就是4979坐標系。

三、Tile——構成3dtiles的成員:瓦片

通常,瓦片對象會引用一個二進制的瓦片數據文件(也有例外,往下拉一點會說):

在1.0 版本的規範中,瓦片所引用的二進制的瓦片數據文件,有四種類型:

類型 英文名稱 文件後綴名
批量三維模型 Batch 3D Model b3dm
實例三維模型 Instance 3D Model i3dm
點雲 PointCloud pnts
複合模型 Component cmpt

這些不同的瓦片對應了些什麼數據呢?本篇只貼一張各種數據類型的截圖和信息對比表:

瓦片類型 對應實際數據
b3dm 傳統三維建模數據、BIM數據、傾斜攝影數據
i3dm 一個模型多次渲染的數據,燈塔、樹木、椅子等
pnts 點雲數據
cmpt 前三種數據的複合(允許一個cmpt文件內嵌多個其他類型的瓦片)

關於這些二進制瓦片數據文件的數據結構如何,下一篇開始會詳細展開。

現在,我們關注一下,瓦片對象的職能,也就是,它記錄了啥信息:

這是一個children下的第一個瓦片,觀察不難得知,與root瓦片其實在屬性上長得一模一樣。

瓦片對象都有如下屬性:

  • boundingVolume:空間範圍框,允許有box、sphere、region三種範圍框,但是只能定義一種
  • geometricError:幾何誤差
  • content:瓦片內容,uri屬性引用二進制瓦片數據文件。
  • 其他屬性:viewerRequestVolume、transform

沒錯,瓦片對象記錄的就是瓦片的元數據,真正瓦片的本體數據在content所引用的二進制文件中。

瓦片還可以再引用 3dTiles 數據集!

我一再強調3dTiles十分靈活。

Tile不僅僅可以在其uri屬性中引用 諸如 .b3dm.i3dm.pnts等二進制瓦片數據文件,還可以再引用一個 3dTiles!

這是一份從osgb傾斜攝影數據轉換而來的3dtiles數據,清晰可見在root瓦片的第一個child瓦片中,引用了另外一個json文件。這證明了兩件事:

  • 3dTiles的文件名可以不是tileset.json
  • 3dTiles允許套娃

原則上,只要被引用的子一級3dtiles 不循環引用父級3dtiles,那麼就OK(規範如是說)。

它真的很靈活!

下一節將展示二進制瓦片文件中的至關重要的一部分:兩大數據表。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

GitLab Runner部署(kubernetes環境)

歡迎訪問我的GitHub

https://github.com/zq2599/blog_demos
內容:所有原創文章分類匯總及配套源碼,涉及Java、Docker、Kubernetes、DevOPS等;

關於GitLab CI

如下圖所示,開發者將代碼提交到GitLab后,可以觸發CI腳本在GitLab Runner上執行,通過編寫CI腳本我們可以完成很多使用的功能:編譯、構建、生成docker鏡像、推送到私有倉庫等:

本次實戰內容

今天咱們會一起完成以下操作:

  1. 部署minio,pipeline腳本中的cache功能由minio來實現;
  2. 配置和部署GitLab Runner;
  3. 編寫和運行pipeline腳本;

環境和版本信息

本次實戰涉及到多個服務,下面給出它們的版本信息供您參考:

  1. GitLab:Community Edition 13.0.6
  2. GilLab Runner:13.1.0
  3. kubernetes:1.15.3
  4. Harbor:1.1.3
  5. Minio:2020-06-18T02:23:35Z
  6. Helm:2.16.1

需要提前準備好的服務

以下服務需要您在實戰前提前準備好:

  1. 部署好GitLab,參考《群暉DS218+部署GitLab》
  2. 部署好Harbor,參考《群暉DS218+部署Harbor(1.10.3)》
  3. 部署好Helm,參考《部署和體驗Helm(2.16.1版本)》

準備完畢后開始實戰;

部署minio

minio作為一個獨立的服務部署,我將用docker部署在服務器:192.168.50.43

  1. 在宿主機準備兩個目錄,分別存儲minio的配置和文件,執行以下命令:
mkdir -p /var/services/homes/zq2599/minio/gitlab_runner \
&& chmod -R 777 /var/services/homes/zq2599/minio/gitlab_runner \
&& mkdir -p /var/services/homes/zq2599/minio/config \
&& chmod -R 777 /var/services/homes/zq2599/minio/config
  1. 執行docker命令創建minio服務,指定服務端口是9000,並且指定了access key(最短三位)和secret key(最短八位):
sudo docker run -p 9000:9000 --name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=access" \
-e "MINIO_SECRET_KEY=secret123456" \
-v /var/services/homes/zq2599/minio/gitlab_runner:/gitlab_runner \
-v /var/services/homes/zq2599/minio/config:/root/.minio \
minio/minio server /gitlab_runner
  1. 瀏覽器訪問,輸入access key和secret key后登錄成功:
  2. 如下圖,點擊紅框中的圖標,創建一個bucket,名為runner
  3. 至此,minio已備好,接下來在kubernetes環境部署GitLab Runner;

GitLab Runner的類型

從使用者的維度來看,GitLab Runner的類型分為sharedspecific兩種:

  1. 如果您想創建的GitLab Runner給所有GitLab倉庫使用,就要創建shared類型;
  2. 如果您的GitLab Runner只用於給某個固定的Gitlab倉庫,就要創建specific類型;

今天的實戰,我們創建的是specific類型,即先有GitLab代碼倉庫,然後創建該倉庫專用的runner,所以請您提前準備好GitLab倉庫;

準備GitLab配置信息(specific)

在部署GitLab Runner之前,要準備兩個關鍵的配置信息,以便GitLab Runner啟動后可以順利連接上GitLab:

  1. 瀏覽器訪問GitLab,打開用來做CI的代碼倉庫,點擊Settings -> CI/CD -> Runners -> Expand:
  2. 如下圖,紅框1中是gitlab url,紅框2中是registration token,記好這兩個參數,稍後會用到:

準備GitLab配置信息(shared)

本次實戰不會創建shared類型的runner,如果您要創建該類型runner,只需按照以下方法準備信息即可,創建出來的runner就是所有倉庫都能使用的了:

  1. 以管理員身份登錄GitLab;
  2. 按照下圖紅框的順序取得gitlab urlregistration token

部署RitLab Runner

  1. 請確保當前可以通過kubectl命令在kubernetes進行常規操作;
  2. 創建名為gitlab-runner的namespace:
kubectl create namespace gitlab-runner
  1. 創建一個secret,把minio的access key和secret key存進去,在後面配置cache的時候會用到:
kubectl create secret generic s3access \
--from-literal=accesskey="access" \
--from-literal=secretkey="secret123456" -n gitlab-runner
  1. 用helm部署GitLab Runner之前,先把chart的倉庫添加到helm的倉庫列表中:
helm repo add gitlab https://charts.gitlab.io
  1. 下載GitLab Runner的chart:
helm fetch gitlab/gitlab-runner
  1. 當前目錄會多出一個文件gitlab-runner-0.18.0.tgz,解壓:
tar -zxvf gitlab-runner-0.18.0.tgz
  1. 解壓后是名為gitlab-runner的文件夾,內容如下圖所示,接下來要修改裏面的三個文件:
  2. 打開values.yaml,裏面有四處需要修改:
  3. 第一處,找到已被註釋掉的gitlabUrl參數位置,添加gitlabUrl的配置,其值就是前面在GitLab網頁取得的gitlab url參數,如下圖紅框:
  4. 第二處,找到已被註釋掉的runnerRegistrationToken參數位置,添加runnerRegistrationToken的配置,其值就是前面在GitLab網頁取得的registration token參數,如下圖紅框:
  5. 找到rbac的配置,將createclusterWideAccess的值都改成true(創建RBAC、創建容器gitlab-bastion用於管理job的容器):
  6. 設置此GitLab Runner的tagk8s,在pipeline腳本中可以通過指定tag為k8s,這樣pipeline就會在這個Gitlab Runner上允許:
  7. 找到cache的配置,在修改之前,cache的配置如下圖,可見值為空內容的大括號,其餘信息全部被註釋了:
  8. 修改后的cache配置如下圖,紅框1中原先的大括號已去掉,紅框2中的是去掉了註釋符號,內容不變,紅框3中填寫的是minio的訪問地址,紅框4中的是去掉了註釋符號,內容不變:
  9. 上圖紅框4中的s3CacheInsecure參數等於false表示對minio的請求為http(如果是true就是https),但實際證明,當前版本的chart中該配置是無效的,等到運行時還是會以https協議訪問,解決此問題的方法是修改templates目錄下的_cache.tpl文件,打開此文件,找到下圖紅框中的內容:
  10. 將上圖紅框中的內容替換成下面紅框中的樣子,即刪除原先的if判斷和對應的end這兩行,直接給CACHE_S3_INSECURE賦值:
  11. 接下來要修改的是templates/configmap.yaml文件,在這裏面將宿主機的docker的sock映射給runner executor,這樣job中的docker命令就會發到宿主機的docker daemon上,由宿主機來執行,打開templates/configmap.yaml,找到下圖位置,我們要在紅框1和紅框2之間添加一段內容:
  12. 要在上圖紅框1和紅框2之間添加的內容如下:
cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
            [[runners.kubernetes.volumes.host_path]]
              name = "docker"
              mount_path = "/var/run/docker.sock"
              read_only = true
              host_path = "/var/run/docker.sock"
    EOF
  1. 添加上述內容后,整體效果如下,紅框中就是新增內容:
  2. 修改完畢,回到values.yam所在目錄,執行以下命令即可創建GitLab Runner:
helm install \
--name-template gitlab-runner \
-f values.yaml . \
--namespace gitlab-runner
  1. 檢查pod是否正常:
  2. 看pod日誌也並未發現異常:
  3. 回到GitLab的runner頁面,可見新增一個runner:

    至此,整個GitLab CI環境已部署完畢,接下來簡單的驗證環境是否OK;

驗證

  1. 在GitLab倉庫中,增加名為.gitlab-ci.yml的文件,內容如下:
# 設置執行鏡像
image: busybox:latest

# 整個pipeline有兩個stage
stages:
- build
- test

# 定義全局緩存,緩存的key來自分支信息,緩存位置是vendor文件夾
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
  - vendor/

before_script:
  - echo "Before script section"

after_script:
  - echo "After script section"

build1:
  stage: build
    tags:
  - k8s
  script:
    - echo "將內容寫入緩存"
    - echo "build" > vendor/hello.txt

test1:
  stage: test
  script:
    - echo "從緩存讀取內容"
    - cat vendor/hello.txt
  1. 提交上述腳本到GitLab,如下圖,可見pipeline會被觸發,狀態為pending是因為正在等待runner創建executor pod:
  2. 稍後就會執行成功,點開看結果:
  3. 點開build1的圖標,可見此job的輸出信息:
  4. 點開test1的圖標,可見對應的控制台輸出,上一個job寫入的數據被成功讀取:

    至此,GitLab Runner已經成功在kubernetes環境部署和運行,接下來的文章,我們會一起實戰將SpringBoot應用構建成docker鏡像並推送到Harbor;

歡迎關注我的公眾號:程序員欣宸

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

澳洲東西部爆發數十起野火 高溫預報不利救災

摘錄自2019年11月17日中央通訊社澳洲報導

澳洲東部和西部今天(17日)共有數十起野火焚燒,散布在寬闊帶狀區域。由於未來幾天氣溫預料將升高,風勢也將更強勁,消防人員正緊急強化防火措施。

澳洲西部部分地區18日氣溫預測將超越攝氏40度,且高溫預料下週擴大至東部,恐令新南威爾斯省(New South Wales)和昆士蘭省(Queensland)氣候環境更不利。這2個省分已飽受叢林野火肆虐之苦。澳洲叢林大火季今年提前在南半球春天爆發,9日至今已在新南威爾斯省造成4人死亡,摧毀303間房屋。

其中哥斯伯斯山(Gospers Mountain)火災在雪梨西北方郊區附近延燒超過4萬4800公頃,消防人員用「引火回燒」(back burn)方式強化防火線,但火勢仍尚未獲得控制。引火回燒是刻意放火來清除乾燥易燃的矮木叢。

新南威爾斯省環境暨遺產局(NSW Office of Environment and Heritage)在推特發文表示,由於火災危險程度仍處於非常高至嚴重等級,省內中部至北部沿海的國家公園大多將維持關閉,包括藍山(Blue Mountains)北部的國家公園,直到發布新通知。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

學界首次發現空污與腦癌有關 慎防奈米級「超細懸浮微粒」

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

Angular 從入坑到挖坑 – 模塊簡介

一、Overview

Angular 入坑記錄的筆記第七篇,介紹 Angular 中的模塊的相關概念,了解相關的使用場景,以及知曉如何通過特性模塊來組織我們的 Angular 應用

對應官方文檔地址:

  • NgModule 簡介
  • NgModules
  • JavaScript 模塊 vs. NgModule
  • 使用根模塊啟動應用
  • 常用模塊
  • 特性模塊

二、Contents

  1. Angular 從入坑到棄坑 – Angular 使用入門
  2. Angular 從入坑到挖坑 – 組件食用指南
  3. Angular 從入坑到挖坑 – 表單控件概覽
  4. Angular 從入坑到挖坑 – HTTP 請求概覽
  5. Angular 從入坑到挖坑 – Router 路由使用入門指北
  6. Angular 從入坑到挖坑 – 路由守衛連連看
  7. Angular 從入坑到挖坑 – 模塊簡介

三、Knowledge Graph

四、Step by Step

4.1、前端模塊化

前端模塊化是指將程序中一組相關的功能按照一定的規則組織在一塊,整個模塊內部的數據和功能實現是私有的,通過 export 暴露其中的一些接口(方法)與系統中的別的模塊進行通信

NgModule 簡介

在 Angular 應用中,至少會存在一個 NgModule,也就是應用的根模塊(AppModule),通過引導這個根模塊就可以啟動整個項目

像開發中使用到 FormsModule、HttpClientModule 這種 Angular 內置的庫也都是一個個的 NgModule,在開發中通過將組件、指令、管道、服務或其它的代碼文件聚合成一個內聚的功能塊,專註於系統的某個功能模塊

常見的 NgModule 模塊
模塊名稱 模塊所在文件 功能點
BrowserModule @angular/platform-browser 用於啟動和運行瀏覽器應用的的基本服務
CommonModule @angular/common 使用 NgIf、NgFor 之類的內置指令
FormsModule @angular/forms 使用 NgModel 構建模板驅動表單
ReactiveFormsModule @angular/forms 構建響應式表單
RouterModule @angular/router 使用前端路由
HttpClientModule @angular/common/http 發起 http 請求
JavaScript 模塊與 NgModule

在 JavaScript 中,每一個 js 文件就是一個模塊,文件中定義的所有對象都從屬於那個模塊。 通過 export 關鍵字,模塊可以把其中的某些對象聲明為公共的,從而其它 JavaScript 模塊可以使用 import 語句來訪問這些公共對象

例如下面的示例代碼中,別的 javascript 模塊可以通過導入這個 js 文件來直接使用暴露的 getRolesgetUserInfo 方法

function getRoles() {
    // ...
}

function getUserInfo() {
    // ...
}

export {
    getRoles,
    getUserInfo
}

NgModule 是一個帶有 @NgModule 裝飾器的類,通過函數的參數來描述這個模塊,例如在上節筆記中創建的 CrisisModule,定義了我們在該特性模塊中創建的組件,以及需要使用到的其它模塊

在使用 @NgModule 裝飾器時,通常會使用到下面的屬性來定義一個模塊

  • declarations:當前模塊中的組件、指令、管道

  • imports:當前模塊所需的其它 NgModule 模塊

  • exports:其它模塊中可以使用到當前模塊可聲明的對象

  • providers:當前模塊向當前應用中其它應用模塊暴露的服務

  • bootstrap:用來定義整個應用的根組件,是應用中所有其它視圖的宿主,只有根模塊中才會存在

4.2、應用的根模塊

根模塊是用來啟動此 Angular 應用的模塊, 按照慣例,它通常命名為 AppModule

通過 Angular CLI 新建一個應用后,默認的根模塊代碼如下,通過使用 @NgModule 裝飾器裝飾 AppModule 類,定義了這個模塊的一些屬性特徵,從而告訴 Angular 如何編譯和啟動本應用

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
declarations

declarations 數組告訴 Angular 哪些組件屬於當前模塊。 當創建新的組件時,需要將它們添加到 declarations 數組中。每個組件都只能聲明在一個 NgModule 類中,同時,如果你使用了未聲明過的組件,Angular 將會報錯

同樣的,對於當前模塊使用到的自定義指令、自定義管道,也需要在 declarations 數組中進行聲明

imports

imports 數組表明當前模塊正常工作時需要引入哪些的模塊,例如這裏使用到的 BrowserModuleAppRoutingModule 或者是我們使用雙向數據綁定時使用到的 FormsModule,它表現出當前模塊的一個依賴關係

providers

providers 數組定義了當前模塊可以提供給當前應用其它模塊的各項服務,例如一個用戶模塊,提供了獲取當前登錄用戶信息的服務,因為應用中的其它地方也會存在調用的可能,因此,可以通過添加到 providers 數組中,提供給別的模塊使用

bootstrap

Angular 應用通過引導根模塊來啟動的,因為會涉及到構建組件樹,形成實際的 DOM,因此需要在 bootstrap 數組中添加根組件用來作為組件樹的根

4.3、特性模塊

特性模塊是用來將特定的功能或具有相關特性的代碼從其它代碼中分離出來,聚焦於特定應用需求。特性模塊通過它提供的服務以及共享出的組件、指令和管道來與根模塊和其它模塊合作

在上一章中,定義了一個 CrisisModule 用來包括包含與危機有關的功能模塊,創建特性模塊時可以通過 Angular CLI 命令行進行創建

-- 創建名為 xxx 的特性模塊
ng new component xxx
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { CrisisRoutingModule } from './crisis-routing.module';

import { FormsModule } from '@angular/forms';

import { CrisisListComponent } from './crisis-list/crisis-list.component';
import { CrisisDetailComponent } from './crisis-detail/crisis-detail.component';


@NgModule({
  declarations: [
    CrisisListComponent,
    CrisisDetailComponent
  ],
  imports: [
    CommonModule,
    FormsModule,
    CrisisRoutingModule
  ]
})
export class CrisisModule { }

當創建完成后,為了將該特性模塊包含到應用中,需要和 BrowserModuleAppRoutingModule 一樣,在根模塊中 imports 引入

默認情況下,NgModule 都是急性加載的,也就是說它會在應用加載時儘快加載,所有模塊都是如此,無論是否立即要用。對於帶有很多路由的大型應用,考慮使用惰性加載的模式。惰性加載可以減小初始包的尺寸,從而減少程序首次的加載時間

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { FormsModule } from '@angular/forms';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

// 添加自定義的模塊
import { CrisisModule } from './crisis/crisis.module';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    CrisisModule, // 引入自定義模塊
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

Dubbo想要個網關怎麼辦?試試整合Spring Cloud Gateway

一、背景

在微服務架構中 API網關 非常重要,網關作為全局流量入口並不單單是一個反向路由,更多的是把各個邊緣服務(Web層)的各種共性需求抽取出來放在一個公共的“服務”(網關)中實現,例如安全認證、權限控制、限流熔斷、監控、跨域處理、聚合API文檔等公共功能。

 

在以 Dubbo 框架體系來構建的微服務架構下想要增加API網關,如果不想自研開發的情況下在目前的開源社區中幾乎沒有找到支持dubbo協議的主流網關,但是 Spring Cloud 體系下卻有兩個非常熱門的開源API網關可以選擇;本文主要介紹如何通過 Nacos 整合 Spring Cloud GatewayDubbo 服務

 

二、傳統 dubbo 架構

dubbo屬於rpc調用,所以必須提供一個web層的服務作為http入口給客戶端調用,並在上面提供安全認證等基礎功能,而web層前面對接Nginx等反向代理用於統一入口和負載均衡。

web層一般是根據業務模塊來切分的,用於聚合某個業務模塊所依賴的各個service服務

PS:我們能否把上圖中的web層全部整合在一起成為一個API網關呢?(不建議這樣做)

因為這樣的web層並沒有實現 泛化調用 必須引入所有dubbo服務的api依賴,會使得網關變得非常不穩定,任何服務的接口變更都需要修改網關中的api依賴!

 

三、整合 Srping Cloud Gateway 網關

下面就開始聊聊直接拿熱門的 Srping Cloud Gateway 來作為dubbo架構體系的網關是否可行,首先該API網關是屬於 Spring Cloud 體系下的組件之一,要整合dubbo的話需要解決以下問題:

  1. 打通註冊中心:spring cloud gateway 需要通過註冊中心發現下游服務,而 dubbo 也需要通過註冊中心實現服務的註冊與發現,如果兩者的註冊中心不能打通的話就會變成雙註冊中心架構就非常複雜了!
  2. 協議轉換: gateway 使用http傳輸協議調用下游服務,而dubbo服務默認使用的是tcp傳輸協議

上面提到的第一個問題“打通註冊中心”其實已經不是問題了,目前dubbo支持 ZookeeperNacos 兩個註冊中心,而 Spring Cloud 自從把 @EnableEurekaClient 改為 @EnableDiscoveryClient 之後已經基本上支持所有主流的註冊中心了,本文將使用 Nacos 作為註冊中心打通兩者

 

3.1. 方式一

把傳統dubbo架構中的 Nginx 替換為 Spring Cloud Gateway ,並把 安全認證 等共性功能前移至網關處實現

由於web層服務本身提供的就是http接口,所以網關層無需作協議轉換,但是由於 安全認證 前移至網關了需要通過網絡隔離的手段防止被繞過網關直接請求後面的web層

 

3.2. 方式二

dubbo服務本身修改或添加 rest 傳輸協議的支持,這樣網關就可以通過http傳輸協議與dubbo服務通信了

rest傳輸協議:基於標準的Java REST API——JAX-RS 2.0(Java API for RESTful Web Services的簡寫)實現的REST調用支持

目前版本的dubbo已經支持dubbo、rest、rmi、hessian、http、webservice、thrift、redis等10種傳輸協議了,並且還支持同一個服務同時定義多種協議,例如配置 protocol = { “dubbo”, “rest” } 則該服務同時支持 dubborest 兩種傳輸協議

 

3.3. 總結

方式一 對比 方式二 多了一層web服務所以多了一次網絡調用開銷,但是優點是各自的職責明確單一,web層可以作為聚合層用於聚合多個service服務的結果經過融合加工一併返回給前端,所以這種架構下能大大減少服務的 循環依賴

 

四、代碼實踐

依賴環境

  • lombok
  • jdk 1.8
  • Nacos 1.3
  • Spring Boot 2.2.8.RELEASE
  • Spring Cloud Hoxton.SR5
  • Spring Cloud Alibaba 2.2.1.RELEASE

 

在根目錄的 pom.xml 中定義全局的依賴版本

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>8</java.version>

        <spring-boot-dependencies.version>2.2.8.RELEASE</spring-boot-dependencies.version>
        <spring-cloud-dependencies.version>Hoxton.SR5</spring-cloud-dependencies.version>
        <spring-cloud-alibaba-dependencies.version>2.2.1.RELEASE</spring-cloud-alibaba-dependencies.version>
        <jaxrs.version>3.12.1.Final</jaxrs.version>
    </properties>

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

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

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

 

4.1. 創建dubbo-api工程

分別定義兩個api接口

DubboService 使用dubbo協議的服務

public interface DubboService {
    String test(String param);
}

RestService 使用rest協議的服務

public interface RestService {
    String test(String param);
}

 

4.2. 創建web-dubbo工程

使用 方式一 整合對接網關,這裏為了簡化在同一個服務下只使用邏輯分層定義controller層與service層,並沒有做服務拆分

4.2.1. 創建配置

定義 spring boot 配置

server:
  port: 8081

spring:
  application:
    name: zlt-web-dubbo
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      server-addr: 192.168.28.130:8848
      username: nacos
      password: nacos

server.port:配置應用服務器暴露的端口

spring.cloud.nacos:配置 spring cloud 的註冊中心相關參數,nacos 的配置需要改為自己環境所對應

定義 dubbo 配置

dubbo:
  scan:
    base-packages: org.zlt.service
  protocols:
    dubbo:
      name: dubbo
      port: -1
  registry:
    address: spring-cloud://localhost
  consumer:
    timeout: 5000
    check: false
    retries: 0
  cloud:
    subscribed-services:

dubbo.scan.base-packages:指定 Dubbo 服務實現類的掃描基準包

dubbo.protocols:服務暴露的協議配置,其中子屬性 name 為協議名稱,port 為協議端口( -1 表示自增端口,從 20880 開始)

dubbo.registry.address:Dubbo 服務註冊中心配置,其中子屬性 address 的值 “spring-cloud://localhost”,說明掛載到 Spring Cloud 註冊中心

 

4.2.2. 創建DubboService的實現類

通過 protocol = "dubbo" 指定使用 dubbo協議 定義服務

@Service(protocol = "dubbo")
public class DubboServiceImpl implements DubboService {
    @Override
    public String test(String param) {
        return "dubbo service: " + param;
    }
}

 

4.2.3. 創建Controller類

使用 Spring Boot@RestController 註解定義web服務

@RestController
public class WebController {
    @Autowired
    private DubboService dubboService;

    @GetMapping("/test/{p}")
    public String test(@PathVariable("p") String param) {
        return dubboService.test(param);
    }
}

 

4.3. 創建rest-dubbo工程

使用 方式二 整合對接網關,由於該服務是通過dubbo來創建rest服務,所以並不需要使用 Spring Boot 內置應用服務

4.3.1. 創建配置

定義 spring boot 配置

spring:
  application:
    name: zlt-rest-dubbo
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      server-addr: 192.168.28.130:8848
      username: nacos
      password: nacos

因為不使用 Spring Boot 內置的應用服務所以這裏並不需要指定 server.port

定義 dubbo 配置

dubbo:
  scan:
    base-packages: org.zlt.service
  protocols:
    dubbo:
      name: dubbo
      port: -1
    rest:
      name: rest
      port: 8080
      server: netty
  registry:
    address: spring-cloud://localhost
  consumer:
    timeout: 5000
    check: false
    retries: 0
  cloud:
    subscribed-services:

dubbo.protocols:配置兩種協議,其中rest協議定義 8080 端口並使用 netty 作為應用服務器

 

4.3.2. 創建RestService的實現類

通過 protocol = "rest" 指定使用 rest協議 定義服務

@Service(protocol = "rest")
@Path("/")
public class RestServiceImpl implements RestService {
    @Override
    @Path("test/{p}")
    @GET
    public String test(@PathParam("p") String param) {
        return "rest service: " + param;
    }
}

 

4.4. 創建Spring Cloud Gateway工程

定義 spring boot 配置

server:
  port: 9900

spring:
  application:
    name: sc-gateway
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      server-addr: 192.168.28.130:8848
      username: nacos
      password: nacos

server.port:定義網關端口為 9090

定義網關配置

spring:
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        - id: web
          uri: lb://zlt-web-dubbo
          predicates:
            - Path=/api-web/**
          filters:
            - StripPrefix=1
        - id: rest
          uri: lb://zlt-rest-dubbo
          predicates:
            - Path=/api-rest/**
          filters:
            - StripPrefix=1

分別定義兩個路由策略:

  • 路徑 /api-web/ 為請求 web-dubbo 工程
  • 路徑 /api-rest/ 為請求 rest-dubbo 工程

 

4.5. 測試

分別啟動:Nacos、sc-gateway、web-dubbo、rest-dubbo 工程,通過網關的以下兩個接口分別測試兩種整合方式

  1. http://127.0.0.1:9900/api-web/test/abc :請求 web-dubbo 工程測試整合方式一
  2. http://127.0.0.1:9900/api-rest/test/abc :請求 rest-dubbo 工程測試整合方式二

 

五、demo下載

ide需要安裝 lombok 插件

https://github.com/zlt2000/dubboSpringCloud

 
掃碼關注有驚喜!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

另闢財源!特斯拉開賣 Model S 二手車

電動車大廠特斯拉(Tesla)開始在官網銷售 Model S 二手車,跨出從新創公司轉變成主流車商的重要一步。特斯拉大約在一周前悄悄推出認證二手車方案,讓消費者可以買到價格比新車便宜的特斯拉電動車,並提供 4 年或 5 萬英里保修方案。   特斯拉發言人說,第一批二手車來源主要是一些車主淘汰舊車、添購去年底上市的四輪傳動 Model S。此外,特斯拉在 2012 年推出租車方案,租期通常為 3 年,這些車將在今年開始歸還給特斯拉。   特斯拉並不運用獨立經銷商通路,所以可以保有賣二手車的全部營收。不過,因特斯拉的二手車供應量有限,目前特斯拉網站只在美國 11 個大都會區提供二手車。特斯拉發言人說,這些二手車將分組存放,未必會存放在零售門市。客戶訂購二手車後,可以赴各地區的存放地點取車,或要求特斯拉把車運送到府。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

特斯拉推儲能電池系統 德國石墨陽極商 SGL 受惠

美國豪華電動車製造商特斯拉 (Tesla) 跨界家用電池,德國汽車碳纖維生產商西格里集團 (SGL Carbon SE) 在投資人期待該公司可望因此受惠的激勵下,股價創下近三個月以來最大單日漲幅。   SGL 主要是為日立、Panasonic 這些日本電子大廠供應石墨陽極材料,而日立、Panasonic 則會將電池元件賣給特斯拉。   Bankhaus Lampe 分析師 Marc Gabriel 說,SGL 是少數幾家能因電池需求增溫而受惠的德國業者。根據報導,SGL 發言人已確認,該公司的確是日立、Panasonic 的石墨陽極材料供應商。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

看好電動車市場 大同及東元積極卡位

東元及大同看好電動車市場忙卡位布局。東元在菲律賓蘇比克灣設電動車廠,預計第 2 季完工、第 3 季投產。大同集團旗下尚志精密化學將磷酸鋰鐵正極材料打入日本及韓國等電池市場後,大同也以傳動馬達與動力系統廠商、車輛業談合作打入國外電動車市場供應鏈。   東元去年底董事會通過斥資 270 萬美元,3 月已在菲律賓蘇比克灣正式成立東元電動車公司,其特種電動三輪車及電動小巴的底盤是由東元與供應商共同開發;電控系統及馬達由東元負責供應;電池則是菲律賓當地供應,東元未來還打算跨足電動貨車領域。   大同集團旗下尚志精密化學生產磷酸鋰鐵正極材料,先後打入日本及韓國電動車電池市場後,大同開發各式高效率專業用電動車的傳動馬達,應用在電動高爾夫球車、電動貨卡車、電動堆高車、電動沙灘車、電動垃圾車壓縮系統、果菜市場電動搬運車及電動巴士。目前也積極與動力系統廠商、車輛業洽談合作,希望打入國外電動車市場供應鏈。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?