最簡單的微服務部署測試實踐

微服務特別適合業務複雜,開發隊伍龐大的項目。微服務能夠到達化整爲零,簡化單個服務,下降溝通成本的效果。但微服務在性能上比單體服務低,也會有數據冗餘的問題,要結合自身狀況,不要盲目崇拜。
本文介紹一種簡單的微服務技術架構。幫助你們對微服務如何部署,如何開發有個初步的認識。java

一個簡單的微服務架構

部署圖以下
mysql

nginx:

對外統一入口,根據url將請求分發到不一樣微服務,用ip:port區分不一樣的微服務。也會直接處理一些靜態資源的訪問,自己就是web服務器。nginx

springboot+dubbo:

spring boot是目前最流行的開發web服務的框架(jsp,ejb,ssh這些框架過於老舊),它和微服務沒有必然聯繫,但它結合dubbo能夠開發微服務,要求就是spring boot工程要import dubbo.jar或者使用maven引入dubbo。配置dubbo-application.xml,裏面寫好zookeeper服務地址端口以及提供者和消費者要註冊的接口方法。
一個微服務要調用另外一個微服務的方法,只須要@Autowired註冊接口類的對象,用對象調用方法便可。麻煩點的是各個微服務對同一個接口方法要有一致的接口描述java文件,使用maven管理描述接口的jar包能夠有效解決接口一致的問題。
最後打jar包,java -jar ***.jar一個微服務就啓動了。git

zookeeper:

springboot須要dubbo,而dubbo最推薦的服務註冊中心是zookeeper,至關於一個公告板,各個微服務均可以看到上面註冊的提供者和消費者的接口方法github

DB:

MySQL Oracle等web

redis:

緩存session數據,和其它有必要緩存的業務數據redis

tomcat+dubbo-admin:

dubbo管理系統,用於監控和排查故障,部署在tomcat下,能夠在瀏覽器上查看各個微服務的運行狀況,查看某個方法是否能夠被正常調用。spring

積分查詢業務場景,幫助理解微服務。

B服務提供檢查登錄狀態功能。A服務提供查詢帳號積分功能。
當用戶在app點擊查詢積分時,nginx看見url裏有查詢積分關鍵字,會根據nginx.conf的配置將請求發送到A服務,app會有個sessionid發送給A服務,A服務遠程調用B服務的檢查登錄狀態的接口,將sessionid傳給接口,B服務接口被調用,使用sessionid到redis查用戶信息,若是查詢到redis有對應的用戶信息,將用戶信息返回,A服務接收到遠程調用接口返回的用戶信息userid,接下來根據用戶信息到數據庫DB查詢積分狀況。
這就是兩個微服務配合實現一個業務的例子,用到了架構圖中的所有單元。查詢登錄狀態的要求在各個業務都存在,因此會有不少微服務須要遠程調用B服務的接口。同時每一個微服務能夠便是提供者,又是消費者。
sql

在windows下配置一套完整的微服務開發環境。

nginx

D:\Program Files\nginx-1.8.1>start nginx.exe
數據庫

成功後瀏覽器以下

MySQL

D:\Program Files\mysql-8.0.12-winx64\bin>mysqld --console

redis

D:\Program Files\Redis-x64-3.0.504>redis-server.exe redis.windows.conf
圖我忘截了

zookeeper

雙擊zkServer.cmd

tomcat和dubbo-admindubbo-admin

須要github上下載,而後單獨對dubbo-admin進行編譯打war包,war包放到tomcat的webapps目錄下,tomcat啓動時會自動解壓出文件夾,以下圖

tomcat/bin目錄執行startup.bat  成功後瀏覽器以下

打開 http://127.0.0.1:8080/dubbo-admin-2.5.8/  (我最初打開頁面卡死,後來刪除tomcat/log裏的所有日誌後正常了)
用戶名root 密碼root

沒有啓動任何微服務因此上圖各項都是空的。在Intellij IDEA運行兩個微服務(cmd裏java -jar 啓動微服務jar包也能夠,但調試修改代碼不太方便)
能夠看到dubbo管理系統能夠看見兩個服務,一個是提供者,一個是消費者。裏面能夠查看名稱,狀態,日誌,對排錯挺有幫助的。


測試dubug

瀏覽器輸入登錄的url能夠看到打開登陸頁面。

到此一個微服務系統的開發調試環境就完成了。若是隻測試後端服務不關心瀏覽器和app界面的功能,可使用postman工具,直接發送url給服務端,查看返回的json數據等是否達到預期要求。