微服務開發(fā)手冊_第1頁
微服務開發(fā)手冊_第2頁
微服務開發(fā)手冊_第3頁
微服務開發(fā)手冊_第4頁
微服務開發(fā)手冊_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精品文檔微服務開發(fā)手冊1 .開發(fā)說明 所有服務均基于 spring boot框架開發(fā)。Spring boot內嵌了 tomcat服務器,無需生成war 包,并簡化了 maven配置,能夠讓開發(fā)者快速入手 spring的開發(fā)。 服務的接口定義需嚴格符合restful規(guī)范。rest規(guī)范參考第2節(jié)rest api接口規(guī)范 所有服務都需要在注冊服務上注冊,否則不能被其他服務所調用。同時平臺也能夠實時監(jiān)測服務的狀態(tài),能夠及時預警及調度資源。 所有服務的配置信息統(tǒng)一保存于 gitlab上,并通過配置服務獲取配置。 對數(shù)據(jù)庫的操作統(tǒng)一采用 MyBatis框架。MyBatis是個支持普通 SQL查詢,存儲過程

2、和高級映射的優(yōu)秀持久層框架。Spring boot也提供了 mybatis的集成方案,可以很快捷地整合mybatis到項目中。 包名約定:所有包均以com.drht.服務名 為父包名,如 com.drht.auth,后面再跟具體模塊名稱作為子包名。 所有項目基于jdk1.8來開發(fā)。項目的管理與構建采用maven,代碼統(tǒng)一托管于 gitlab倉庫。2. rest api 接口規(guī)范spring boot接口設計需符合 restful風格。在 RESTful架構中,每個網(wǎng)址代表一種資源(resource),所以網(wǎng)址中不能有動詞,只能有名詞,而且所用的名詞往往與數(shù)據(jù)庫的表格 名對應。而客戶端要執(zhí)行某種

3、類型的操作,需要根據(jù)http的操作協(xié)議來決定。HTTP提供了常用的幾種操作,如下表:動作說明GET (SELECT從服務器取出資源(一項或多項)POST (CREATE在服務器新建一個資源。PUT (UPDATE在服務器更新資源(客戶端提供改變后的完 整資源)。PATCH(UPDATE在服務器更新資源(客戶端提供改變的屬性)。DELETE( DELETE從服務器刪除資源。對數(shù)據(jù)庫的增刪改查操作,應該嚴格遵守上面定義的五種HTTP動作。requestbody來傳遞,格式為json。服務端返回數(shù)據(jù)格式也均對于更新動作,參數(shù)通過 丿為json。服務端返回數(shù)據(jù)對象約定:public class Uni

4、fylnfo private int code; / private String message;/ private String prompt;/ private String path;/返回代碼,1:成功,0:失敗返回信息提示一般用于錯誤時的跳轉路徑般用于查詢時的返回數(shù)據(jù)內容private HashMap<Stri ng, ?> attribute;/ Spring boot會自動將符合javabean 格式的對象轉換為json格式數(shù)據(jù)返回。示例:客戶端請求請求參數(shù)服務端返回數(shù)據(jù)說明GET /users"code":"1","

5、;message":"查詢成功",”prompt":"","path":"","users":查詢所 有用戶GET /users/ID"code":"1","message":"查詢成功","prompt":"","path":"","users":查詢指定ID的用戶POST /users"

6、;username":"user2","e mail":"666633433qq. com""code":"0","message":"創(chuàng)建用戶失敗 ""prompt":" 該用戶已經(jīng)存在 ”,"path":"http:/localhost:8080/users","res ult":創(chuàng)建一個用戶PUT /users/ID"username&quo

7、t;:"user2","e mail":"666633433qq. com""code":"1","message":"創(chuàng)建用戶成功","prompt":"","path":"","result":更新某 用戶信 息PATCH/users/ID"username":"user2","e mail":

8、"666633433qq. com""code":"1","message":"更新成功","prompt":"","path":"","result":更新某 用戶指 定字段DELETE/users/ID"code":"1","message":"刪除成功","prompt":"&quo

9、t;,"path":"","result":刪除指 定用戶而對于登錄、登出操作,可以理解為登錄是創(chuàng)建toke n,登出是刪除toke n,所以可以用POST和 DELETE來定義這兩種接口。刷新token是更新操作所以用 PUT。3 .配置文件管理所有服務的配置文檔均保存于gitlab上,并通過配置服務con fig-service來獲取配置。每個服務在gitlab均保存一份以服務id命名的properties文件。以服務spring-boot-demo為例,其在gitlab上的配置文件為per

10、ties,文件名對應于該服務的perties 中配置的的value值。如果名稱不一致,配置服務將拿不到正確的配置信息。在perties 中通常配置該服務的啟動端口、數(shù)據(jù)庫連接參數(shù)等信息。 當該文件有更新并 push到gitlab 后,配置服務會自動通知客戶端服務更新配置信 息。關鍵配置:在主程序中需要訪問配置文件的類名上加上注解:RefreshScope,如果沒有該注解,|配置服務將不能主動通知客戶端服務更新配置。如下:RefreshScopeRestCo ntrollerpubli

11、c class MessageRestC on troller Value("$message:Hello default")private String message;RequestMapp in g("/message")String getMessage() retur n this.message;當perties 文件里的 message變量發(fā)生變化后,請求 /message時返回的 message值將是更新后的 message內容。pom.xml關鍵依賴項:<dependency><

12、groupld>org.spri ngframework.cloud</groupld><artifactld>spri ng-cloud-c on fig-clie nt</artifactId></depe ndency><dependency><groupId>org.spri ngframework.boot</groupld><artifactId>spri ng-boot-starter-actuator</artifactld></depe ndency>

13、同時需要引入spring cloud的依賴項 <depe nden cyMa nageme nt><depe nden cies><dependency><groupld>org.spri ngframework.cloud</groupld><artifactld>spri ng-cloud-depe nden cies</artifactld> <version> Camde n.SR5</vers ion><type>pom</type><scope&

14、gt;import</scope></depe ndency></depe nden cies></depe nden cyMa nageme nt>在 src/main/resouce目錄建立 perties 文件,設置配置服務 url 與 perties文件內容:#配置服務地址spri ng.cloud.coon fig.uri =http:3:9999#service n amespri ng.applicati on.n ame=spri ng-

15、boot-demo注:不能在 perties設置配置服務的 url, 因為 perties的啟動優(yōu)先級最低,不能在程序啟動之前讀取到配置服務url,從而不能加載配置服務上相應的配置。4 .服務注冊register-service提供服務的注冊與發(fā)現(xiàn)。所有的服務都需要注冊到register-service中,否則不能夠被其他服務發(fā)現(xiàn)與調用,比如路由服務。關鍵配置pom.xml關鍵依賴項: <dependency ><groupId >org.springframework.cloud</ groupId &

16、gt;<artifactId >spring-cloud-starter-eureka-server</ artifactId ></ dependency >同時需要引入spring cloud的依賴項<depe nden cyMa nageme nt><depe nden cies><dependency><groupld>org.spri ngframework.cloud</groupld><artifactld>spri ng-cloud-depe nden cies</

17、artifactld> <version> Camde n.SR5</vers ion><type>pom</type><scope>import</scope></depe ndency></depe nden cies></depe nden cyMa nageme nt>主程序加上注解:E nableEurekaServer如下:En ableEurekaServerSpri ngBootApplicati onpublic class RegisterServiceAppl

18、icatio n public static void main(String args) Sprin gApplicati on.run( RegisterServiceApplicati on. class, args);對應配置服務器上的spri perties中添加注冊服務的地址。spri perties配己置如下:#服務啟動端口server.port=8082#注冊服務地址eureka.clie nt.serviceUrl.defaultZo ne=http:3:9998/eureka/5 .統(tǒng)一網(wǎng)

19、關路由所有rest請求均需要通過網(wǎng)關來路由到具體的服務。網(wǎng)關服務能起到負載均衡、動態(tài) 路由、統(tǒng)一認證等功能。使用代理服務能夠避免必須的跨域資源共享(Cross-Origin Resource Shari ng)。當一個UI應用調用一個或更多的后端服務的時候,通過網(wǎng)關服務來做統(tǒng)一的代理。前端應 用不再需要關心后臺業(yè)務服務的具體地址,因此當業(yè)務服務的地址變更后也不需要修改應用端的配置。所有的請求都在網(wǎng)關做了統(tǒng)一的認證授權,因此業(yè)務服務也不再需要考慮與授權有關的問題。按照約定,一個serviceid 為"userservice"的服務會收到 /userservice 請求路徑的代

20、理請求(前綴會被剝離)。因此要查詢用戶 ID是590d38b064328b1aac828ae6 的信 息,完整的請求路徑是http:/<gateway>:<port>/userservice/users/590d38b064328b1aac828ae6其中 userservice 是 user service 的 sericeid,users/id 是該服務提供的對外訪問 接口。網(wǎng)關服務會自動根據(jù)請求路徑里的 serviceid (本例中是 userservice )找到 userservice 的請求地址,并路由給該服務的 users/id 接口,其最終的路由地址是h

21、ttp:/<userservice>:<port>/users/590d38b064328b1aac828ae6 。注: url 不包括 /userservice 。而網(wǎng)關服務能夠正確路由的前提是 userservice 已經(jīng)在注冊服務上注冊。6認證授權對于某用戶的授權分為兩類,一類是該用戶是否能夠訪問某些url, 類是它在界面上所能看到哪些功能(即菜單)。應用端訪問后臺服務時均需要經(jīng)過授權服務 auth-service 認證才能訪問服務的資源。 授權服務對資源的訪問控制通過uri + serviceid + HTTP METHOD來控制,如角色ROLE_USE啲資源權

22、限為服務名為userservice的user/*,請求方式為ALL ,則其對所有userservice服務的uri為user/形式的資源均有權訪問。如POST http:/<ip>:<port>/user/addGET http:/<ip>:<port>/user/query 所以在設計 api 接口時,需嚴格按照第一節(jié)中 rest api 的規(guī)范定義接口,以方便對某一 類資源的請求做統(tǒng)一的權限配置。同時在應用端, 某用戶登錄進來后能夠訪問的菜單也是通過授權服務控制。菜單資源包括菜單的名稱, 圖標,跳轉路徑等屬性。 應用端通過授權得到的菜單屬性,

23、 并決定菜單界面 的布局。菜單對象定義如下:public class Menu private Integer id;private String menuname;private Integer parentid;private String menucode;private String menuurl;private String menuicon;private String urltarget;private Integer isactive;private Integer navmenu;private Integer isleaf;private Integer viewtype

24、;private Integer sort;private String remark;private String creator;private String modified;private Date createtime;private Date lastupdate;7持續(xù)集成docker項目開發(fā)完成后, 通過 jenkins 持續(xù)集成, 打包成 docker 鏡像后上傳到服務器上的repository 后運行,所以需要在 pom.xml 文件里配置 maven docker 插件。Pom.xml 關鍵配置:<resources><!-使用 站位符,輸出 Docke

25、rfile 至 docker 文件夾 -><resource><directory>src/main/resources</directory><includes><include>*/*</include></includes><filtering>false</filtering></resource><resource><directory>src/main/java</directory><includes><

26、;include>*/*.properties</include><include>*/*.xml</include></includes><filtering>false</filtering></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin&

27、lt;/artifactId> <configuration><fork>true</fork></configuration></plugin><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.11</version><configuration><imageName>172.168

28、.4.43:5000/$project.artifactld</imageName><dockerDirectory>src/ma in /docker</dockerDirectory><pushlmage>true</pushlmage><resources><resource><targetPath>/</targetPath><directory>$project.build.directory</directory><in clude>$pr

29、oject.build.fi nalName.jar</i nclude></resource></resources></c on figurati on></plugi n></plug ins>在src/main/下建立docker目錄,并新建 Dockerfile,內容如下:FROM java:8VOLUME /tmpADD spri ng-boot-demo-0.0.1-SNAPSHOT.jar 即 p.jarEXPOSE 8080CMD java -jar app.jar當程序經(jīng)過測試并提交到 gitlab 后

30、,jenkins將自動構建并打包成docker鏡像發(fā)布到遠程docker倉庫。同時jenkins會通知遠程服務下載該鏡像并重新運行。8 .集成 mybatis所有數(shù)據(jù)庫操作采用Mybatis來管理。集成 Mybatis關鍵配置如下:添加pom.xm依賴<dependency ><groupId >org.mybatis.spring.boot</ groupId ><artifactId>mybatis-spring-boot-starter</ artifactId<version >1.3.0 </ version &

31、gt;</ dependency > <dependency ></ groupId ><groupId >org.mybatis.spri ng.boot</ artifactId<artifactId>mybatis-spr in g-boot-starter-test<version >1.3.0 </ version></ dependency ><!-以mysql數(shù)據(jù)庫為例-><dependency >精品文檔vselect id ="selectC

32、ityByld"resultType ="City" >vgroupld >mysql </ groupld >vartifactld >mysql-connector-java </ artifactld >vversion >5.1.40 </ version ></ dependency >Sperties (托管于gitlab上,由配置服務統(tǒng)一管理)主要配置如下:mybatis.con fig-locatio n=classpath:mybatis

33、-con fig.xmlloggi ng.l .drht.demo.mapper=TRACEspri ng.datasource.driverClass= com.mysql.jdbc.Driverspri ng.datasource.user name=rootspri ng.datasource.password=123456spring.datasource.url=jdbc:mysql:/:3306 /test?useUnicode=true&characterEncoding=utf -8資源的配置結構如下圖:J 嚴 ru/rn a irr/reso urc

34、ejJ com & drfltj 、 mapperLX匚rtyMapper.xmlz perliesx myb mtiauQnfigxml邑.Maven Dependencies其中 mybatis-config.xml 內容:<! DOCTYPE configurationpublic "-//DTD Config 3.0/EN""/dtd/mybatis-3-c on fig.dtd" vcon figurati on>vtypeAliases vp

35、ackage </ typeAliasesn ame="com.drht.domai n"/>vmappers >vmapper</ mappers</ configurationresource ="com/drht/mapper/CityMapper.xml"/>CittyMapper.xml <?xml versi on內容如下:="1.0" en codi ng ="UTF-8"?><! DOCTYPE mapperPUBLIC "-/myba

36、/DTD Mapper 3.0/EN""/dtd/mybatis-3-mapper.dtd"vmapper n amespace ="com.drht.mapper.CityMapper"精品文檔select * from city where id = #id</ select >vdelete id ="deleteCityByld" >delete from city where id = #id</ delete >vinsert id =

37、"i nsertCity" parameterType ="com.drht.domai n. City">in sert into City (id, n ame, state,cou ntry)values (#id,jdbcType=INTEGER, #name,jdbcType=VARCHAR, #state,jdbcType=VARCHAR,#cou ntry,jdbcType=VARCHAR)</ insert ></ mapper >該配置文件定義了三種數(shù)據(jù)庫操作,對應了CityMapper這個接口中的三種方法

38、Mapperintcity_id);city );intcity_id);publicin terfaceCityMapper City selectCityById( void in sertCity(City void deleteCityById(附錄一:完整pom.xmlvprojectxml ns ="http:/mave /POM/4.0.0"xml ns:xsi="/2001/XMLSchema-i nsta nee"xsi:schemaLocati on="http:/ma

39、ve /POM/4.0.0/xsd/mave n-4.0.0.xsd">vmodelVersion >4.0.0 </ modelVersion >vgroupld >com.drht </ groupld >vartifactld >spring-boot-demo </ artifactld >vversion >0.0.1-SNAPSHOT </ version ><name>spring-boot-demo</ n

40、ame>vparent >vgroupld >org.springframework.boot</ groupld >vartifactld>spring-boot-starter-parent</ artifactld >vversion >1.5.1.RELEASE v/ version >v/ pare nt >properties >vproject.build.sourceE ncodi ng>UTF-8 </ project.build.sourceEncodingvjava.version >

41、;1.8 v/java.version > </ properties ><depe nden cies><dependency >vgroupld >org.spri ngframework.boot<artifactld>spri ng-boot-starter-web</ artifactId></ dependency><dependency :><groupld>org.mybatis.spr in g.boot</ groupId ><artifactld&

42、gt;mybatis-spri ng-boot-starter</ artifactId<vers ion>1.3.0 </ version ></ groupId >></ dependency ><dependency ><groupId >org.mybatis.spri ng.boot</ groupId >vartifactld >mybatis-spring-boot-starter-test</ artifactId<version >1.3.0 </ v

43、ersion></ dependency ><dependency ><groupId >mysql </ groupId > <artifactId >mysql-conn ector-java <version >5.1.40 </ version></ dependency ><!- <depe nden cy><groupld>com.h2database</groupld> <artifactld>h2</artifactl

44、d><scope>ru ntime</scope></depe nden cy> -><!- test depe nden cies -><dependency ><groupld >org.spri ngframework.boot <artifactld >spri ng-boot-starter-test <scope >test </ scope ></ dependency ></ artifactId ></ groupId >

45、</ artifactId ><dependency ><groupld>org.spr in gframework.cloud</ groupId ><artifactld>spri ng-cloud-starter-config</ artifactId></ dependency><dependency><groupld>org.spr in gframework.boot</ groupId ><artifactld>spri ng-boot-starte

46、r-actuator</ artifactId></ dependency>vdependency >vgroupld >org.spri ngframework.cloud vartifactld >spri ng-cloud-starter-eureka </ dependency ><dependency >vgroupld >org.spri ngframework.cloud</ groupld ></ artifactld ></ groupld >vartifactld>spri ng-cloud-starter-eureka-servervscope >test </ scope ></ dependency ></ dependencies >vdepe nden cyMa nageme nt >vdepe nden cies >vdependency ></ artifactld >vgroupld >org.spri ngframework.cloud vartifactld> spri ng-cloud-depe n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論