
雲原生(Cloud Native)Node JS Express Reactive 微服務模板 (REST/GraphQL) 這個項目提供了完整的基於 Node JS / Typescript 的微服務模板,包括生產部署、監控、調試、日志記錄、安全、CI/CD 所需的所有功能。還添加了基於響應性擴展的示例,以演示如何將其用於構建微服務 API 邊緣服務(edge-service)、前端的后端(BFF)或將其用作構建任何類型微服務的基礎。
項目地址:nxplorerjs-microservice-starter
設計原則
- 使用同類最佳的模塊來創建可用於生產的微服務框架
- 基於 12-factor app 原則
- 沒有定制代碼或包裝器,因此任何開發人員都可以修改/替換任何模塊或實現
- 可作為參考的實現的設計模式
- 模塊化,可替換和即插即用代碼
- 為業務 API 和微服務平台開發提供入門
- DevOps 准備了代碼質量,單元和集成測試,自動部署。
功能/特性
Node JS,Express,Typescript, 依賴注入(Dependency Injection base)- 基於
Backpack(webpack) - 構建 , 開發 , 打包 - 啟用
Swagger- Express swagger 中間件 / Swagger UI 集成 - GraphQL 基於
Apollo Server 2.0,帶有JWT安全性、數據加載器(data loader)和REST數據源示例 - 通過
graphql-import支持GraphQL SDL - 開發期間
GraphQL mock resolvers(可選) -graphql-tools - 基於 GraphQL 的客戶端包裝 API -
graphql-request - REST APIs - 使用
Inversify Controller - 外部化配置 -
DotEnv(設置,特定於 Env 的 API URL) - 測試 -
Jest,SuperTest,GraphQL Tester。 自動化單元和集成測試的基礎設施 - 代碼覆蓋率 -
Istanbul - 代碼質量 -
tslint - 容器支持 -
Docker,Kubernetes集群 - 基於
Helm Chart的部署支持 Prometheus集成- API 響應日志記錄,Express Server 日志記錄,UUID 傳播 -
Pino - Reactive Extensions 支持 -
RxJS6 - CORS, JSONObject 限制 , Helmet , CSRF - Express 安全
- 基於 IOC / 依賴注入 / Express 注釋的 API -
Inversify - 文檔 -
TypeDocs - API 異常處理實用程序
- 標准 HTTP Code 以獲取更清蒸的 code
- 示例 API,模式以供參考
Sonar Qube集成Hystrix熔斷器支持 (使用 Brakes)- 基於 JWT 的 API 安全性 -
jsonwebtoken,express-jwt - 現在使用超級快速的
pino日志程序來滿足所有的日志記錄需求 - 內置額外的性能時間記錄
查看 REST API /examples/{id}
{
"pid": 3984,
"hostname": "LP-507B9DA1D355",
"level": 30,
"time": 1515813665734,
"0": {
"socket": 5.656709999995655,
"lookup": 186.8375229999947,
"connect": 389.5646870000055,
"response": 594.8022639999981,
"end": 599.1270230000082
},
"v": 1
}
REST APIs
- 可以使用以下 URL 下載 API 規范
http://localhost:3000/api-docs/Api.yaml
http://localhost:3000/api-docs/
- examples - API 中的按 ID 示例搜索的基本示例 (
/examples/:id) - shop - 如何使用 Reactive Extensions 進行 API 編排(
FlatMap)的示例 (/shop/priceByOptionId/:id) - starwars - 如何使用 Reactive Extensions 進行 API 編排的示例(
ForkJoin)(/starwars/people/:id) - hystrix - 如何對 API 使用熔斷模式的示例 (
/hystrix) - scraper - 如何使用 scrape-it 從網站上抓取數據的示例 (
/scraper) - 使用 swagger UI 以獲得示例 API 的完整列表
- metrics - 為所有 API 添加了基於 Prometheus 的指標 (
/metrics) - API 部分 JSON 響應支持
curl http://localhost:3000/api/v1/starwars/people/1
- Response
{
name: "Luke Skywalker",
height: "172",
mass: "77",
hair_color: "blond",
skin_color: "fair",
eye_color: "blue",
birth_year: "19BBY",
gender: "male",
homeworld: {
name: "Tatooine",
rotation_period: "23",
orbital_period: "304",
diameter: "10465",
climate: "arid",
gravity: "1 standard",
terrain: "desert",
surface_water: "1",
population: "200000",
residents: [
"http://swapi.co/api/people/1/",
"http://swapi.co/api/people/2/",
"http://swapi.co/api/people/4/",
"http://swapi.co/api/people/6/",
"http://swapi.co/api/people/7/",
"http://swapi.co/api/people/8/",
"http://swapi.co/api/people/9/",
"http://swapi.co/api/people/11/",
"http://swapi.co/api/people/43/",
"http://swapi.co/api/people/62/"
],
films: [
"http://swapi.co/api/films/5/",
"http://swapi.co/api/films/4/",
"http://swapi.co/api/films/6/",
"http://swapi.co/api/films/3/",
"http://swapi.co/api/films/1/"
],
created: "2014-12-09T13:50:49.641000Z",
edited: "2014-12-21T20:48:04.175778Z",
url: "http://swapi.co/api/planets/1/"
},
films: [
"http://swapi.co/api/films/2/",
"http://swapi.co/api/films/6/",
"http://swapi.co/api/films/3/",
"http://swapi.co/api/films/1/",
"http://swapi.co/api/films/7/"
],
species: [
"http://swapi.co/api/species/1/"
],
vehicles: [
"http://swapi.co/api/vehicles/14/",
"http://swapi.co/api/vehicles/30/"
],
starships: [
"http://swapi.co/api/starships/12/",
"http://swapi.co/api/starships/22/"
],
created: "2014-12-09T13:50:51.644000Z",
edited: "2014-12-20T21:17:56.891000Z",
url: "http://swapi.co/api/people/1/"
}
curl http://localhost:3000/api/v1/starwars/people/1?data(name,gender,homeworld(gravity,population))
- Response
{
"data": {
"name": "Luke Skywalker",
"gender": "male",
"homeworld": {
"gravity": "1 standard",
"population": "200000"
}
}
}
GraphQL
- 已基於 apollo framework 和參考實現添加了
GraphQL支持(包括來自swapi.co的starwars api)

-
從
http://localhost:3000/playground訪問 graphql playground -
從
http://localhost:3000/graphiql訪問 graphiql tool -
GraphQL API 跟蹤(可配置)
-
用於緩存和批處理的數據加載器(Dataloader)
-
添加了多個啟用 Dataloader 示例
- RxJS API 調用 - peopleWithPlanets(id :
) - Starwars APIs - people(id:
) , planet(id: ) , starship(id: ) - peopleList(keys: [number])
- RxJS API 調用 - peopleWithPlanets(id :
-
查詢列表(請參閱 schema 詳細信息以獲取完整列表)
- quoteOfTheDay: String
- random: Float
- examples: [ExampleType] <-- JWT身份驗證
- example(id: Int): ExampleType
- blog(id: Int) (Paginated query)
- rollThreeDice: [Int]
- peopleWithPlanet(id: Int): PeopleWithPlanetType (Uses RxJS to combine results from 2 APIs)
- peopleDS(id: Int): PersonType (Based on REST DataSource)
- people(id: Int): PersonType (Based on data loader)
- planet(id: Int): PlanetType
- starship(id: Int): StarshipType
- peopleList(keys: [Int]): [PersonType]
- movie: MovieType
- 示例查詢執行

-
Mutations
- addExample(name: String!): ExampleType
- addComment(comment: CommentInput!): Comment
- login(email: String!,password: String!): UserType
- 示例 Mutation 執行

-
Subscriptions
- exampleAdded (將檢查是否通過 mutation 添加了新元素)
- commentAdded (每當通過 mutation 添加新 comment 時都會檢查)
- 示例 Subscription 執行


- VSCode 調試啟動配置(添加了預配置的調試啟動器)
- 在開發過程中添加了用於遙測的 Node 儀表板視圖
- 增加了 NodeJS 集群模式(負載均衡 worker)
- 啟動服務器時,它會根據 CPU 數量添加 worker
Master cluster setting up 4 workers...
Worker 2828 is online
Worker 2816 is online
Worker 13956 is online
Worker 3756 is online
up and running in development @: LP-507B9DA1D355 on port: 3000
up and running in development @: LP-507B9DA1D355 on port: 3000
up and running in development @: LP-507B9DA1D355 on port: 3000
up and running in development @: LP-507B9DA1D355 on port: 3000
Graphql 客戶端 API
-
當我們構建基於 GraphQL 的服務器時,可能需要從其他下游基於 GraphQL 的 API 服務器獲取數據。
-
作為一個示例,
graphqlcool/graphql-request模塊用於演示這一點,使用graphqlcool演示 graphQL apihttps://api.graph.cool/simple/v1/movies。 -
API 規范
query {
movie {
releaseDate
slug
actors {
name
}
}
}
- API 輸出
{
"data": {
"movie": {
"releaseDate": "2010-08-28T20:00:00.000Z",
"slug": "inception",
"actors": [
{
"name": "Leonardo DiCaprio"
},
{
"name": "Ellen Page"
},
{
"name": "Tom Hardy"
},
{
"name": "Joseph Gordon-Levitt"
},
{
"name": "Marion Cotillard"
}
]
}
}
}
先決條件
安裝 npm 和 nodeJS
npm version >= 3.x
node version >= 6.x
安裝它
npm install
設置 外部環境
- 編輯 .{PROFILE}.env 文件 —— 其中的概要文件(PROFILE)可以是測試(test)、開發(development)、生產(production)
| 變量 | 描述 | 默認值 |
|---|---|---|
| PORT | 服務器端口 | 3000 |
| LOG_LEVEL | 日志級別 (info,debug,error) | info |
| SESSION_SECRET | 用於簽名 cookie 的字符串 | |
| API_TIME_OUT | 默認API超時(以毫秒為單位) | 10000 |
| TEST_TIME_OUT | 默認測試超時(以毫秒為單位) | 10000 |
| JWT_AUTH | 啟用/禁用基於 JWT 的 API 安全 | true |
| RSA_PRIVATE_KEY_FILE | RSA 私鑰路徑示例 | |
| RSA_PUBLIC_KEY_FILE | RSA 公鑰路徑示例 | |
| TOKEN_EXPIRY_TIME | JWT 令牌到期(從 /login 生成) | 1 hour (1h) |
| STREAM_HYSTRIX | 啟用/禁用 Hystrix streaming 服務器 (true 或 false) | false |
| CORS | 在服務器上啟用/禁用 CORS (true 或 false)。僅在生產版本中可用 | false |
| CLUSTER_MODE | 在服務器上啟用/禁用 Node Clustering (true 或 false) | false |
| SWAGGER_API_DOCS_ROOT | 服務您的 Swagger API 文件,以便它們可與 Swagger UI,PostMan 等前端工具一起使用。 | /api-docs/ |
| GRAPHQL_SUBSCRIPTIONS | 啟用/禁用 GraphQL subscriptions (true 或 false) | true |
| GRAPHQL_PLAYGROUND | 啟用/禁用 GraphQL Playground (true 或 false) | true |
| GRAPHQL_TRACING | 啟用/禁用 GraphQL tracing (true 或 false) | true |
| GRAPHQL_MOCK | 啟用/禁用 GraphQL Mock,對於未實現的接口(true 或 false) | true |
| API_MOCK | 啟用/禁用 REST API Mock,對於未實現的路由(true 或 false) | true |
運行它
運行在 開發 模式
npm run dev
運行在 生產 模式
npm run compile
npm start
運行在 VS Code 調試 模式
npm run compile
Press F5
運行帶有代碼覆蓋率的測試
運行單元測試
- 單元測試與要測試的模塊或類位於同一目錄中
- 所有單元測試都需要有一個擴展名
\*.spec.ts
npm run test
運行集成測試
- 集成測試與要測試的模塊或類位於同一目錄中
- 所有集成測試都需要有一個擴展名 *.itest.ts
- 首先構建集成測試。這將在構建中設置集成測試環境
npm run itest:build
- 運行 node 服務器並對其進行集成測試
- 這等待服務器啟動,運行測試,然后在完成時終止所有進程
npm itest:run
嘗試一下
- 將您的瀏覽器指向 http://localhost:3000.
- 直接或通過 swagger 調用示例 REST 端點
http://localhost:3000/swagger - 使用端點調用 Prometheus 指標
curl http://localhost:3000/metrics - 訪問針對 graphQL 的瀏覽器內置 IDE
http://localhost:3000/graphiql - 訪問 graphQL playground app
http://localhost:3000/playground/ - 訪問健康檢查 api
curl http://localhost:3000/healthcheck
文件結構
├───public * nxplorer server 的登錄頁面
├───screenshots * 示例截圖
└───server * 服務器配置和 API
| ├───api * 服務器上定義的 REST API
| │ ├───controllers * 使用 RxJS,Inversify 的 API controller
| │ │ ├───examples * Examples controller
| │ │ ├───hystrix-demo * Hystrix demo controller
| │ │ ├───security * JWT login API controller
| │ │ ├───shop * 帶有產品,價格,庫存的示例商店 API
| │ │ └───starwars * SWAPI controller
| │ ├───interfaces * Service 接口
| │ ├───models * API 數據模型
| │ └───services * Service API 實現
| ├───common * Server 啟動和配置
| │ ├───config * Server 配置
| │ ├───constants * Inversify 和其他通用標識符常量
| │ ├───interfaces * 公共 service 接口
| │ ├───middleware * 自定義中間件
| │ ├───models * 公共 API 數據模型
| │ ├───services * 公共 service 實現
| │ └───swagger * Swagger API 規范 (YAML)
| | └───env.ts * DotENV 配置
| | └───server.ts * Express Server 啟動和配置
| └───graphql * 服務器上定義的 GraphQL API
| | ├───dataloader * GraphQL 數據加載器功能
| | ├───errors * GraphQL 錯誤處理程序
| | ├───schema * GraphQL Schema 類型
| | ├───mocks * GraphQL Mock Resolvers
| | └───resolvers * GraphQL resolvers
| | └───setupSchema.ts * GraphQL schema 配置
| └───index.ts * 主 Server 入口點
├───helm * Helm chart 部署腳本
│ ├───charts *
│ └───templates *
└───backpack.config.js * Backpack 配置
└───package.json * npm 依賴
└───build.js * ShellJS 實用程序構建腳本
└───deploy-k8s.sh * Kubernetes 部署腳本
└───Dockerfile * Docker 構建文件
└───docker-compose.yml * Docker 構建和運行文件
└───build-docker.bat|sh * Docker 構建文件
└───itest.config.json * Jest 集成測試配置
└───unit.config.json * Jest 單元測試配置
└───tsconfig.json * typescript 配置
└───tslint.json * tslint 配置
└───.{profile}.env * 基於配置文件的外部環境文件 (development 開發,test 測試, production 生產)
└───sonar-properties.json * sonarscanner|SonarQube 配置
└───jwtRS256.key|.key.pub * 服務器使用的 JWT 私鑰和公鑰示例
日志與 UUID
-
添加了 UUID 傳播的示例實現。這取決於在請求對象中設置的 cookie 'UUID'。LogService 將把 uuid 添加到它生成的所有日志中。
-
例如,如果 'UUID' 設置為
xxxx-dddd-ssss-wwww-ssss,那么調用/shop/productsAPI 將生成
{
"pid": 13492,
"hostname": "LP-507B9DA1D355",
"level": 30,
"time": 1515859200496,
"uuid": "xxxx-dddd-ssss-wwww-ssss",
"fullUrl": "http://localhost:3000/api/v1/shop/products",
"statusCode": 200,
"responseTime": "1.187",
"v": 1
}
GraphQL Mocks
- 作為 TDD 的一部分,我們可能需要模擬 graphql 響應,直到我們能夠實現解析器為止
- 該基礎結構設置為僅為當前未實現的解析器添加模擬。因此,一旦實現可用,實際的解析器就會接手。 同樣,如果解析器執行失敗,那么這將落在模擬響應上。 此功能只能在開發期間使用,因此已添加檢查以禁用“生產”版本中的此功能。
- 為了支持
- 設置環境變量 GRAPHQL_MOCK 為 true
- 在 mocks/index.ts 文件定義 mock 解析器(resolver)
- 作為示例,有查詢添加了 examplesMock, peopleMock
- 示例輸出如下

RestAPI Mocks
- 在
.<Profile>.env文件中啟用API_MOCK=true。注意:為了安全起見,即使API_MOCK設置為true,也無法在生產模式下使用 - 針對自動產生 mock,
swagger-express-middleware模塊提供了開箱即用的支持 - 步驟
- 在 Api.yaml 文件 定義 API swagger 規范
- 如果 express 路由中沒有可用的實現,那么中間件將為這些 api 創建模擬
- 訪問
nXplorer(/swagger) 提供的swagger ui,並引用標記為Mock API和帶有前綴/mock的 API。該示例有兩個主要實體 ——cars和drivers。您可以搜索、執行 CRUD 操作以及上傳和下載圖像。
構建 Docker 鏡像
./build-docker.sh
k8s 部署
- 基於 Helm chart 的部署
./deploy-k8s.sh
- 一個示例的輸出
release "nxplorerjs-microservice" deleted
NAME: nxplorerjs-microservice
LAST DEPLOYED: Fri Sep 22 22:10:58 2017
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/ConfigMap
NAME DATA AGE
nxplorerjs-microservice-starter 5 1s
==> v1/Service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nxplorerjs-microservice-starter 10.0.0.196 <nodes> 80:30316/TCP 1s
==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nxplorerjs-microservice-starter 1 1 1 0 1s
注意:
1. 通過運行以下命令獲取應用程序 URL:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services nxplorerjs-microservice-nxplorerjs-microservice-starter)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
Express 微服務被部署到 http://192.168.99.100:30316/
使用 node 儀表板視圖(僅針對開發環境)
- 去使用 node 儀表板視圖
npm run compile
npm run dash
- 這將啟動帶有附加的 node 儀表板的應用程序,該儀表板提供有關內存,cpu 和日志的詳細信息
安全
- 已使用示例 JWT 私鑰和公鑰實現了基於 JWT 的安全性
- REST API 和 GraphQL 都添加了示例實現。
- 驗證中間件代碼可以在這里查看
JWT Security GraphQL
- 基於
JWT的安全性的演示實現已啟用一個查詢“示例”。 下面是測試的步驟。 - 如果啟用了
JWT安全性(環境變量JWT_AUTH為true),我們需要使用登錄突變API來獲取示例JWT令牌(當前設置為1小時到期) - Step 1 - 使用登錄 mutation(突變)來獲取有效用戶的 jwt 令牌。出於演示目的,可以提供任何電子郵件和密碼字符串。該角色是可選的。如果未提供,則默認為角色 “USER”
mutation {
login(email: "tsukhu@nxplorer.com",
password:"admin",role:"ADMIN") {
id
role
email
jwt
}
}

- Step 2 - 驗證“示例”是否無需身份驗證即可工作。 它將給出一個錯誤(注意:錯誤處理需要改進,但是這里我們只看這個概念)

- Step 3 - 在執行 “examples” 查詢之前,使用
Bearer token設置授權頭。
{
"Authorization": "Bearer xxx.xxx.xxx"
}

JWT Security REST APIs
- 如果啟用了 JWT 安全性,那么我們需要使用
/loginAPI 獲取示例 JWT 令牌(當前設置為1小時到期)
curl -X POST "http://localhost:3000/api/v1/login" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"email\": \"test@gmail.com\", \"password\": \"pwd\", \"role\": \"admin\"}"
- 示例輸出。注意,JWT token 是屬性 idToken 的值
{
"idToken":
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYWRtaW4iLCJpYXQiOjE1MTQ4NjQ3ODMsImV4cCI6MTUxNDg2ODM4Mywic3ViIjoidGVzdEBnbWFpbC5jb20ifQ.hAEa6AL1Kxxxxxxx",
"expiresIn": "1h"
}
api/v1/examplesAPI,一個有效的 JWT 令牌必須在 “Authorization” header 中,在所有查詢中傳遞。注意,這只是一個示例。您也可以類似地輕松啟用添加端點。- 請查看 examples controller
@controller('/examples', authMiddleware(<User>{ role: 'admin'})) - 函數 authMiddleware 負責驗證在 header 中傳遞的 JWT token。
- 它可以擴展為也支持基於角色的訪問,並為此提供了支持。
- 注意:作為演示示例,這里提供了公鑰和私鑰。理想情況下,在真實場景中從外部維護這些JWKS (JSON Web Key Set)端點
- 請查看 examples controller
- “Authorization” header 中必須使用以下語法:
Bearer xxxxxx.yyyyyyy.zzzzzz - 使用 swagger ui 測試
- 點擊 “Authorize” 按鈕,設置上面提到的 Bearer token
- 現在所有
/examples相關的api都可以工作了
RBAC 測試
- 如果啟用了 JWT 安全性,並且我們使用
/loginAPI 獲取示例JWT token,但其角色為 “guest” 而不是 “admin”
curl -X POST "http://localhost:3000/api/v1/login" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"email\": \"test@gmail.com\", \"password\": \"pwd\", \"role\": \"guest\"}"
- 在 “Authorization” header 中設置 Bearer token,用於后續調用任何
/examples api,將導致基於角色的授權失敗

GraphQL Directives
- 這項工作正在進行中。
- 當前添加了一個使用
@date指令的示例(如graphql-tools文檔中所述) - Query (
{ today(format: "mmm-dd-yy") }) - 這里的格式基於@date scheme Directive,該格式接受解析器的輸出並格式化日期,然后再將其發送給客戶端。 - Query (
{ examplesWithAuth { id name } }- 這是對 JWT GraphQL APIs 部分中提到的示例查詢的一種變體。此處的區別在於,我們使用@auth指令根據角色來處理身份驗證,而不是對解析程序中的實現進行硬編碼。這是更清蒸的方法,並且與解析器分離。 - 查詢 schema
examplesWithAuth: [ExampleType] @auth(requires: ADMIN)使用@auth指令,該指令將攔截具有適當角色的經過身份驗證的用戶的調用檢查。(注意:您需要在之前運行loginmutation,然后使用 Authorization token 設置 HTTP header)

CSRF Security
- 在生產模式中啟用了 CSRF 安全性
- 所有 POST API 都需要讀取瀏覽器中設置的 cookie “XSRF-TOKEN”,然后使用以下任一
key將其傳遞到響應頭中- req.headers['csrf-token'] - CSRF-Token HTTP 請求頭。
- req.headers['xsrf-token'] - XSRF-Token HTTP 請求頭。
- req.headers['x-csrf-token'] - X-CSRF-Token HTTP 請求頭。
- req.headers['x-xsrf-token'] - X-XSRF-Token HTTP 請求頭。
Compression
- 默認情況下,壓縮是在服務器上啟用的,並且基於壓縮模塊
- 配置詳細信息位於 compression.ts 文件中
- 如果需要在不壓縮的情況下獲取響應,請在請求頭中傳遞
x-no-compression鍵
Hystrix 熔斷器支持
- 熔斷器支持已添加到項目中,並使用 hystrix 兼容模塊 brakes
- Hystrix 默認禁用流支持。
- 通過在 .env 文件中將 STREAM_HYSTRIX 屬性設置為 “STREAM_HYSTRIX=true” 來啟用它
- 為了方便起見,提供了 Hystrix 服務器的 Docker 版本,並在 docker-compose.yml 文件中進行了設置
在 Docker 上執行的步驟
npm run compile
docker-compose build
docker-compose up
- 在 Docker 上設置 3000 和 8080 的端口轉發

- Access the Hystrix dashboard at localhost:8080/hystrix and set the stream location to
localhost:3001/hystrix.stream - 訪問
localhost:8080/hystrix上的 Hystrix 儀表板,並將流位置設置為localhost:3001/hystrix.stream - 在
/api/v1/hystrix下執行示例,並在儀表板上查看 hystrix stream 結果

與 SonarQube 集成(保證持續的代碼質量)
假設您已經安裝了 SonarQube 5.5.6 (LTS)
- 使用 Sonar Typescript 插件和 Generic Test Coverage 插件設置 SonarQube
- 全局安裝 sonar-scanner (
npm install --global sonar-scanner) - 更新屬性
sonar.host.url的sonar-project.properties文件以指向您的 SonarQube 服務器。默認情況下,這假設 SonarQube 服務器使用默認端口在本地運行 - 運行單元測試
npm run test
- 測試結果以 sonar 兼容格式收集在結果文件夾中
- 將結果推送到 SonarQube
npm run sonar-scanner
- 如果使用 SonarQube 6.x。它支持通用測試數據
修改 package.json 以設置適當的 sonarQube 版本
jestSonar": {
"reportPath": "reports",
"reportFile": "test-reporter.xml",
"indent": 4,
"sonar56x": true
}
注意:對於 Sonar 6.x,將 sonar56x 設置為 “false”,這將生成使用 sonar 6 schema 的測試報告。
負載測試
- loadtest 是用於負載測試的出色工具
- 使用步驟
- 將其安裝為全局 npm 模塊
npm install -g loadtest
- 啟動 nxplorerjs-microservice
npm run start
- 針對生產版本運行負載測試。以下是一個示例
loadtest http://localhost:3000/api/v1/examples/1 -t 20 -c 20
