JHipster創建微服務及相關微服務架構組件介紹

參考鏈接:

一.創建微服務

微服務是一種JHipster應用程序,它沒有前端(必須在網關)上生成Angular前端),並且可以與JHipster Registry一起配置,發現和管理。

創建微服務應用

安裝:

  1. 安裝Java 8 from the Oracle website.
  2. 安裝Node.js from the Node.js website (請安裝 64-bit version)
  3. 安裝npm包: npm install -g npm
  4. 如果你想使用jhipster應用市場, 請安裝 Yeoman: npm install -g yo
  5. 最後安裝JHipster: npm install -g generator-jhipster

執行jhipster:

//首先要創建一個工程文件夾,然後切換到當前文件夾下
mkdir myapp
cd myapp
//也可以一個命令完成
mkdir myapp && cd myapp
//然後運行
jhipster

生成微服務時的問題:

//選擇應用
1.Which *type* of application would you like to create? Microservice gateway
	Monolithic application (recommended for simple projects)  //單體應用
	Microservice application // 微服務應用
	Microservice gateway // 微服務網關
	// 微服務架構下的用戶授權和認證服務
	JHipster UAA server (for microservice OAuth2 authentication) 
//應用的名稱,括號裏就是當前文件夾的名稱,也是推薦的名稱
2.What is the base name of your application? gateway
//設置服務的端口號
3.As you are running in a microservice architecture, on which port would like your server to run? It should be unique to avoid port conflicts. 8086
//Java代碼都會創建到這個包路徑下
4.What is your default Java package name? com.transsion.demo
//選擇註冊中心。一般選擇Registry比較多
5.Which service discovery server do you want to use? JHipster Registry (uses Eureka, provides Spring Cloud Config support and monitoring dashboards)
  	JHipster Registry (uses Eureka)
 	Consul
 	No service discovery
//選擇什麼類型的認證方式,不管用的什麼認證方式,服務器端都用Spring Security實現,而不是Apache Shiro。
6.Which *type* of authentication would you like to use? JWT authentication (stateless, with a token)
  	// JWT(JSON Web Token)是一種服務器端無狀態(stateless)的認證方式,後兩個是有狀態的(Stateful)
  	JWT authentication (stateless, with a token)  // jwt
  	// Oauth2 OIDC 認證服務
  	OAuth 2.0 / OIDC Authentication (stateful, works with Keycloak and Okta)
  	// Oauth2+jwt Uaa認證服務
  	Authentication with JHipster UAA server (the server must be generated separately) 
//選擇數據庫支持Nosql跟常見RDMB數據庫
  7.Which *type* of database would you like to use? SQL (H2, MySQL, MariaDB, PostgreSQL, Oracle, MSSQL)
  	//用Spring Data JPA實現。pom會自動加上spring-boot-starter-data-jpa
  	SQL (H2, MySQL, MariaDB, PostgreSQL, Oracle, MSSQL)
  	//用Spring Data MongoDB實現。pom會自動加上spring-boot-starter-data-mongodb
  	MongoDB
  	//用Spring Data Couchbase實現。pom會自動加上spring-boot-starter-data-couchbase
  	Couchbase
  	//用Spring Data for Apache Cassandra實現。pom會自動加上spring-boot-starter-data-cassandra
  	Cassandra
  	No database
//產品環境下用什麼數據庫,在Spring Boot 的prod profile裏配置的數據庫 
8.Which *production* database would you like to use? MySQL
	MySQL
	MariaDB
	PostgreSQL
	Oracle
	Microsoft SQL Server
//開發環境下用什麼數據庫。也就是在Spring Boot的dev profile裏淚痣的數據庫
//在開發人員電腦上推薦用H2。MySQL甚至是Oracle只適合安裝在測試/產品服務器上
9.Which *development* database would you like to use? MySQL
	//前兩個選項用H2作爲開發和自測用數據庫
	H2 with disk-based persistence	//測試數據寫入硬盤,重啓應用或系統都不會丟失
	H2 with in-memory persistence	//測試數據只存在於內存,每次重啓應用都沒啦
	MySQL
/*
是否使用Spring緩存,如果使用就選擇實現方式。類似JPA和Hiberante/EclipseLink一樣,Spring Cache是一個抽象,允許其他廠商提供自己的實現。Ehcache實現支持本地一個節點緩存,Hazelcast實現支持分佈式多節點。Monolithic類型的應用選擇Ehcache就可以了。
*/
10.Do you want to use the Spring cache abstraction? Yes, with the Hazelcast implementation (distributed cache, for multiple nodes, supports rate-limiting for gateway applications)
/*
之前選擇了SQL類型的數據庫,所以用到Spring Data JPA,而且默認用到Hibernate的實現。所以這一步需要選擇是否用Hibernate的二級緩存。選擇Y。
*/
11.Do you want to use Hibernate 2nd level cache? Yes
/*
用Maven還是Gradle作爲後端的構建工具。雖然Gradle有很多高級特性和方便之處,但是目前最常用的就還是Maven。我們選擇Maven。
*/
12.Would you like to use Maven or Gradle for building the backend? Maven
//是否還用到其他技術。可選的有Elasticsearch、WebSockets、Apache Kafka...
13.Which other technologies would you like to use? Search engine using Elasticsearch
/*
前端用什麼框架。Angular和React選其一。現在還沒有正式支持vue,而是以Blueprint的方式提供的。
*/
14.Which *Framework* would you like to use for the client? Angular
WARNING! Could not fetch bootswatch themes from API. Using default ones.
15.Would you like to use a Bootswatch theme (https://bootswatch.com/)? Default JHipster
//支持國際化?
16.Would you like to enable internationalization support? Yes
//選擇本地支持的語言包含中文
17.Please choose the native language of the application English
//可以額外安裝其他語言
18.Please choose additional languages to install (Press <space> to select, <a> to toggle all, <i> to invert selection)
/*
選擇測試框架,針對微服務http接口測試,生成測試報告.JHipster默認前端用Jest,服務器端用JUnit作爲單元測試框架。
*/
19.Besides JUnit and Jest, which testing frameworks would you like to use? (Press <space> to select, <a> to toggle all, <i> to invert selection)
	Gatling	//性能測試
	Cucumber	//行爲測試
	Protractor	//angular集成測試
//從jhipster市場中選擇組件安裝
20.Would you like to install other generators from the JHipster Marketplace? No

微服務架構中生成實體

如果要實時重載JavaScript/TypeScript代碼,則需要運行npm startyarn start。創建應用程序後,將需要創建 實體。例如,您可能要創建一個 AuthorBook 實體。對於每個實體,您將需要:

  • 數據庫表
  • Liquibase變更集
  • JPA實體
  • Spring Data JPA Repository
  • Spring MVC REST控制器,具有基本的CRUD操作
  • Angular路由器,組件和服務
  • HTML視圖
  • 集成測試,以驗證一切正常
  • 性能測試,看一切是否順利

如果您有多個實體,則可能需要在它們之間建立關係。爲此,您將需要:

  • 數據庫外鍵
  • 用於管理這種關係的特定JavaScript和HTML代碼

“entity”子生成器將創建所有必要的文件,併爲每個實體提供一個CRUD前端(請參閱Angular項目結構React項目結構))。可以通過運行jhipster entity <entityName> --[options]來調用子生成器。可以通過輸入jhipster entity --help找到這些選項的參考。

  • --table-name <table_name> - 默認情況下,JHipster將根據您的實體名稱生成一個表名,如果您希望使用其他表名,則可以通過傳遞此選項來實現。
  • --angular-suffix <suffix> - 如果您希望所有Angular路由都具有自定義後綴,則可以使用此選項傳遞該後綴。
  • --client-root-folder <folder-name> - 指定前端側實體使用的根文件夾名稱。對於富應用和微服務中的網關,默認情況下爲空。
  • --regenerate - 不詢問任何問題重新生成現有實體。
  • --skip-server - -這將跳過服務器端代碼,僅生成前端代碼。
  • --skip-client - 這將跳過前端代碼,僅生成服務器端代碼。
  • --db - -跳過服務器端生成時,指定的數據庫,其他時候無效。

使用了JDL Studio:jdl官方語法文檔

  • 您可以使用import-jdl子生成器通過運行jhipster import-jdl your-jdl-file.jh從JDL文件生成實體。

    • 如果您不想在導入JDL時重新生成實體,則可以使用--json-only標識來跳過實體創建部分,僅在.jhipster文件夾中生成json文件。
    jhipster import-jdl ./my-jdl-file.jdl --json-only
    
    • 默認情況下, import-jdl僅重新生成已更改的實體,如果要重新生成所有實體,則傳遞--force標識。請注意,這將覆蓋您對實體文件的所有本地更改
    jhipster import-jdl ./my-jdl-file.jdl --force
    
  • 如果要使用JHipster UML代替import-jdl子生成器,則需要先通過運行npm install -g jhipster-uml來安裝它,然後運行jhipster-uml yourFileName.jh

字段類型

JHipster支持許多字段類型。這種支持取決於您的數據庫後端,因此我們使用Java類型來描述它們:JavaString將以不同的方式存儲在Oracle或Cassandra中,這是JHipster的優勢之一,可以爲您生成正確的數據庫訪問代碼。

  • String: Java字符串。它的默認大小取決於基礎後端(如果使用JPA,默認情況下爲255),但是您可以使用校驗規則進行更改(例如,修改 max大小爲1024)。
  • Integer: Java整數。
  • Long: Java長整數。
  • Float: Java浮點數.
  • Double: Java雙精度浮點數.
  • BigDecimal: java.math.BigDecimal對象, 當您需要精確的數學計算時使用(通常用於財務操作)。
  • LocalDate: java.time.LocalDate對象, 用於正確管理Java中的日期。
  • Instant: java.time.Instant對象, 用於表示時間戳,即時間線上的瞬時點。
  • ZonedDateTime: java.time.ZonedDateTime對象, 用於表示給定時區(通常是日曆中會議、約定)中的本地日期時間。請注意,REST和持久層都不支持時區,因此您很可能應該使用Instant
  • Duration: java.time.Duration對象, 用於表示時間量。
  • UUID: java.util.UUID對象.
  • Boolean: Java布爾型.
  • Enumeration:Java枚舉對象。選擇此類型後,子生成器將詢問您要在枚舉中使用哪些值,並將創建一個特定的enum類來存儲它們。
  • Blob: Blob對象,用於存儲一些二進制數據。選擇此類型時,子生成器將詢問您是否要存儲通用二進制數據,圖像對象或CLOB(長文本)。圖像將專門在Angular側進行優化處理,因此可以將其正常顯示給最終用戶。

二.JHipster微服務架構概述

“微服務”架構將前端和後端分開,因此您的應用程序可以更輕鬆地擴展和解決基礎架構問題。

JHipster微服務架構以以下方式工作:

  • gateway是JHipster生成的應用程序(生成時選擇microservice application 或 microservice gateway),該應用程序處理Web流量,併爲Angular/React應用程序提供服務。如果您要遵循Backends for Frontends模式,則可以存在幾種不同的網關,但這不是強制性的。
  • Traefik是可以與網關一起使用的現代HTTP反向代理和負載均衡器。
  • JHipster Registry是一個所有應用程序在運行時候在其註冊並從中獲取其配置的服務。它還提供了運行時監視儀表板。
  • Consul是服務發現服務以及提供鍵/值存儲。它可以用作JHipster Registry的替代服務。
  • JHipster UAA是基於JHipster的用戶身份驗證和授權系統,它使用OAuth2協議。
  • Microservices是JHipster生成的應用程序(生成時選擇microservice application),用於處理REST請求。它們是無狀態的,可以並行啓動它們的多個實例來達到負載均衡的目的。
  • JHipster Console是基於ELK Stack的監控和告警控制檯。

在下圖中,綠色組件特定於您的應用程序,藍色組件提供了其基礎結構。

在這裏插入圖片描述

三.JHipster API網關

JHipster可以生成API網關。網關是普通的JHipster應用程序,因此您可以在該項目上使用常規的JHipster選項和開發工作流,但它也充當微服務的入口。更具體地說,它爲所有微服務提供HTTP路由和負載均衡,服務質量,安全性和API文檔

1.架構圖

在這裏插入圖片描述

2.HTTP請求使用網關進行路由

啓動網關和微服務後,它們將在registry中註冊自己(使用src/main/resources/config/application.yml文件中的eureka.client.serviceUrl.defaultZone項)。

網關將使用其應用程序名字自動將所有請求代理到微服務:例如,註冊微服務app1時,該請求在網關上的/app1URL上可用。

例如,如果您的網關運行在localhost:8080上,則可以指向http://localhost:8080/app1/rest/foos來獲取微服務app1服務的foos資源。 如果您嘗試使用Web瀏覽器執行此操作,請不要忘記REST資源在JHipster中是默認保護的,因此您需要發送正確的JWT標頭(請參見下面的安全性要點),或在微服務的MicroserviceSecurityConfiguration類刪除這些URL安全保護。

3.JWT(JSON Web令牌)

JWT(JSON Web令牌)是一種行業標準、易於使用的方法,用於保護微服務體系結構中的應用程序。JHipster使用Okta提供的JJWT library來實現JWT。令牌由網關生成,併發送到底層微服務:由於它們共享一個公共密鑰,因此微服務能夠驗證令牌並使用該令牌對用戶進行身份驗證。

這些令牌是自我描述的:它們具有身份驗證和授權信息,因此微服務不需要查詢數據庫或外部系統。這對於確保可擴展的體系結構很重要。

  • 爲了確保安全,必須在所有應用程序之間共享JWT祕密令牌。
  • 對於每個應用程序,默認令牌是唯一的,由JHipster生成。它存儲在.yo-rc.json文件中。
  • 使用src/main/resources/config/application.yml文件中的jhipster.security.authentication.jwt.secret密鑰配置令牌。
  • 要在所有應用程序之間共享此密鑰,請將密鑰從網關複製到所有微服務,或使用JHipster Registry的Spring Config Server或JHipster的Consul K / V存儲的特定配置進行共享。這是人們使用這些中心配置服務器的主要原因之一。
  • 推薦的做法是在開發和生產中使用其他密鑰。

4.JHipster UAA

JHipster提供了基於Spring Security生成 “UAA”(用戶帳戶和身份驗證)服務器的選項。該服務器提供OAuth2令牌以保護網關。

網關使用Spring Security的JWT實現將JWT令牌發送到微服務,因此,其工作原理與上述JWT配置基本相同。

5.自動文檔

網關暴露了它所代理服務的Swagger API,許多工具依賴此特性,例如Swagger UI和swagger-codegen。

網關的”admin > API”菜單具有特定的下拉列表,其中顯示了網關的API以及已註冊的微服務中的所有暴露API。

6.限速

網關提供速率限制功能,因此可以限制REST請求的數量:

  • 通過IP地址(對於匿名用戶)
  • 通過用戶登錄(對於已登錄的用戶)

然後,JHipster將使用Bucket4jHazelcast請求計數,並在超出限制時發送HTTP 429(請求過多)錯誤。每個用戶的默認限制是每小時100,000個API調用。

網關在保護REST端點安全時,可以完全訪問用戶的安全信息,因此可以輕鬆地擴展它,以根據用戶的安全角色提供特定的速率限制。

要啓用速率限制,請打開application-dev.ymlapplication-prod.yml文件,並將enabled設置爲true

jhipster:
    gateway:
        rate-limiting:
            enabled: true

數據存儲在Hazelcast中,因此,只要配置了Hazelcast分佈式緩存,便可以擴展網關,該網關可以直接使用:

  • 默認情況下,所有網關都配置了Hazelcast
  • 如果使用JHipster Registry,則網關的所有實例都應自動在分佈式緩存中註冊自己

如果要添加更多規則或修改現有規則,則需要在RateLimitingFilter類中對其進行編碼。修改示例可能是:

  • 降低HTTP調用的限制
  • 增加每分鐘或每天限制
  • 取消“admin”用戶的所有限制

7.訪問控制策略

默認情況下,所有已註冊的微服務都可以通過網關來訪問。如果要排除通過網關公開訪問的特定API,可以使用網關的特定訪問控制策略過濾器。可以使用application-*.yml文件中的jhipster.gateway.authorized-microservices-endpoints密鑰對其進行配置:

jhipster:
    gateway:
        authorized-microservices-endpoints: # Access Control Policy, if left empty for a route, all endpoints will be accessible
            app1: /api,/v2/api-docs # recommended dev configuration

例如,如果您只希望微服務bar/api/fooAPI端點可用:

jhipster:
    gateway:
        authorized-microservices-endpoints:
            bar: /api/foo

四.Traefik

Traefik是現代的HTTP反向代理和負載均衡器,旨在輕鬆部署微服務。它可以像Zuul一樣路由HTTP請求,因此它與JHipster網關有些功能重疊,但是它工作在API網關更低的層面:它僅路由HTTP請求,不提供速率限制,安全性或Swagger文檔聚合。

Traefik的好處之一是可以與許多不同的服務發現解決方案一起使用:但是,對於JHipster,默認情況下,它僅與 Consul一起使用。它可以應用於兩種不同的體系結構樣式,如下所述。

架構圖1: 默認配置

由於Traefik是反向代理和負載均衡器,因此它取代了Zuul,並將所有HTTP請求直接路由到正確的服務。

在這裏插入圖片描述

在這種架構中,JHipster“網關”不再是真正的網關,它主要是在這裏爲Angular應用程序服務。這是默認配置.

架構圖2: Traefik和Zuul

Traefik也可以與Zuul一起使用:在這種情況下,對微服務的HTTP請求,先通過Traefik,然後通過Zuul,然後再到達其目的地。

在這裏插入圖片描述

這道中了更多的網絡請求,因此效率不如以前的體系結構。但是,這允許充分利用JHipster網關:它可以專心處理速率限制或Swagger文檔聚合。

總之,Traefik可以用作邊緣服務,從而可以方便擴展JHipster網關。

此配置可與JHipster一起使用,開箱即用:唯一的問題是客戶端應用程序使用絕對URL,例如對於”microservice1”:

  • 默認URL是”/services/microservice1”,僅通過Traefik(這是上面的“默認配置”)。
  • “/services/gateway/microservice1” URL將使用在Traefik中配置的”gateway”應用程序,然後使用Zuul來訪問”microservice1”應用程序。

入門

Traefik僅適用於Consul,因此,如果您使用 JHipster Registry,則此功能將無效。

在微服務架構中使用Traefik,請運行docker-compose子生成器,並在出現詢問您要使用哪個網關的問題時選擇Traefik。

這將生成一個用於在Docker中運行Traefik的traefik.yml配置以及一個traefik/traefik.toml文件,該文件是Traefik的配置文件。

設置此配置文件是爲了:

由於Traefik使用Consul,因此檢查Consul管理UI也很有用,該UI可在端口8500上找到:http://localhost:8500

五.JHipster Registry

JHipster Registry是JHipster團隊提供的應用程序。與JHipster生成器一樣,它是一個開源,Apache 2-licensed應用程序,其源代碼在JHipster組織的GitHub上可用:jhipster/jhipster-registry

JHipster Registry具有三個主要功能:

  • 它是一個Eureka服務,用作應用程序的發現服務。這就是JHipster處理所有應用程序的路由,負載均衡和可伸縮性的方式。
  • 它是一個Spring Cloud配置服務,爲所有應用程序運行時提供配置
  • 它還是一臺管理服務器,具有用於監視和管理應用程序的儀表板

所有這些功能都通過基於Angular的現代用戶界面,打包到一個便利的應用程序中。

使用預打包的WAR文件安裝

JHipster Registry在我們的發行頁面頁面上提供了可執行的WAR文件。

下載WAR文件,並使用您要使用的配置文件(通常是JHipster應用程序)運行它(請參閱關於配置文件的上一節)。例如,要使用存儲在central-config目錄中的Spring Cloud Config配置運行它:

./jhipster-registry-<version>.jar --spring.security.user.password=admin --jhipster.security.authentication.jwt.secret=my-secret-key-which-should-be-changed-in-production-and-be-base64-encoded --spring.cloud.config.server.composite.0.type=native --spring.cloud.config.server.composite.0.search-locations=file:./central-config

// demo
java -jar jhipster-registry-6.1.1.jar --spring.security.user.password=admin --jhipster.security.authentication.jwt.secret=ZjczYmZkMzRlZWQ5NjJjNDNhNTlhNzg0ZTQwOTAzMWFmN2RhOTlhYmY0OGVlOGVmZjhlYWU0NTdhOGZlNGNhODFjZWJhYmU4NjIyYzhlNWFlNTE3N2RkOWM2OTMyZWZiNDQ3ZGM3ZjU0ZGFmZGU2NjcyMDU3MmE1YmFmNDVjZTk= --spring.cloud.config.server.composite.0.type=native --spring.cloud.config.server.composite.0.search-locations=file:./central-config

請注意,通過使用JHIPSTER_SECURITY_AUTHENTICATION_JWT_SECRET環境變量或使用如上所述的參數,向啓動時的registry提供JWT密鑰很重要。另一種可能的方法是在集中式配置源的application.yml文件中設置此值(該文件在啓動時由所有應用程序(包括registry)加載)。

請注意,自JHipster 5.3.0起,我們有了一個新的jhipster.security.authentication.jwt.base64-secret屬性,該屬性更安全,但是由於您可能仍使用舊版本,因此我們也使用jhipster.security.authentication.jwt.secret屬性。有關這些屬性的更多信息,請參考我們的安全性文檔

同樣,要使用prod配置文件運行registry,請根據您的設置調整參數,例如:

./jhipster-registry-<version>.jar --spring.profiles.active=prod --spring.security.user.password=admin --jhipster.security.authentication.jwt.secret=my-secret-key-which-should-be-changed-in-production-and-be-base64-encoded --spring.cloud.config.server.composite.0.type=git --spring.cloud.config.server.composite.0.uri=https://github.com/jhipster/jhipster-registry-sample-config

./jhipster-registry-<version>.jar --spring.profiles.active=prod --spring.security.user.password=admin --jhipster.security.authentication.jwt.secret=my-secret-key-which-should-be-changed-in-production-and-be-base64-encoded --spring.cloud.config.server.composite.0.type=git --spring.cloud.config.server.composite.0.uri=https://github.com/jhipster/jhipster-registry --spring.cloud.config.server.composite.0.search-paths=central-config

從源碼構造安裝

可以直接從jhipster/jhipster-registry克隆/fork/下載JHipster Registry。由於JHipster Registry也是JHipster生成的應用程序,因此您可以像其他任何JHipster應用程序一樣運行它:

  • 使用./mvnw(用於Java服務器)在開發環境中運行它,並使用yarn start(用於管理前端)運行,默認情況下它將使用dev配置文件,並且可以從http://127.0.0.1:8761/訪問。
  • 使用./mvnw -Pprod package將其打包到生產環境中,並生成通常的JHipster可執行WAR文件。然後,您可以使用devprod Spring配置文件運行WAR文件,例如:./jhipster-registry-<version>.jar --spring.profiles.active=prod

請注意,要使用devcomposite配置文件,您需要在配置中包含一個central-config目錄,因此,如果運行./jhipster-registry-<version>.jar --spring.profiles.active=dev,您將需要建立該目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章