隨着互聯網的發展,網站應用的規模不斷擴大。需求的激增,帶來的是技術上的壓力。 系統架構也所以也不斷的演進、升級、迭代。
從單一應用,到垂直拆分,到分佈式服務,到SOA,以及如今火熱的微服務架構html
當網站流量很小時,只需一個應用 將全部功能都部署在一塊兒,以減小部署節點和成本 從頭至尾就一個工程,部署的時候 , 只須要打成一個war包java
當訪問量逐漸增大,單一應用沒法知足需求,此時爲了應對更高的併發和業務需求,咱們根據業務功能對系統進行拆分nginx
微服務就是把本來臃腫的一個項目的全部模塊拆分開來並作到互相沒有關聯,甚至能夠不使用同一個數據庫web
概述:spring
當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務
分佈式,就是將偌大的系統劃分爲多個模塊(這一點和微服務很像)部署到不一樣機器上 由於一臺機器可能承受不了這麼大的壓力
各個模塊經過接口進行數據交互,其實 分佈式也是一種微服務。數據庫
特色:瀏覽器
微服務與分佈式都是把模塊拆分開來變爲獨立的單元,提供接口來調用springboot
他們本質的區別在於目標的不一樣:服務器
當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現, 此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。
(SOA)用於提升機器利用率的資源調度和治理中心網絡
問題:
服務愈來愈多,須要管理每一個服務的地址 調用關係錯綜複雜,難以理清依賴關係 服務過多,服務狀態難以管理,沒法根據服務狀況動態管理
服務治理要作什麼:
服務註冊中心,實現服務自動註冊和發現,無需人爲記錄服務地址 服務自動訂閱,服務列表自動推送,服務調用透明化,無需關心依賴關係
動態監控服務狀態監控報告,人爲控制服務狀態
微服務只是一種項目的架構方式,或者說是一種概念
Spring-Cloud即是對這種技術的實現
對微服務面臨的問題進行統一的封裝處理
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.3.RELEASE</version> </parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
@SpringBootApplication public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class,args); } }
public class ResponseResult extends HashMap { public static String SUCCESS_CODE = "200"; public static String ERROR_CODE = "500"; public static String DATA_KEY = "data"; public static String MSG_KEY = "msg"; private ResponseResult() { } public ResponseResult set(String key, Object object) { super.put(key, object); return this; } private static ResponseResult newResponseResult() { return new ResponseResult(); } public static ResponseResult success() { return ResponseResult.newResponseResult() .set("code", ResponseResult.SUCCESS_CODE) .set(ResponseResult.MSG_KEY, "操做成功"); } public static ResponseResult success(String msg) { return ResponseResult.newResponseResult() .set("code", ResponseResult.SUCCESS_CODE) .set(ResponseResult.MSG_KEY, msg); } public static ResponseResult success(String msg, Object object) { return ResponseResult.newResponseResult() .set("code", ResponseResult.SUCCESS_CODE) .set(ResponseResult.MSG_KEY, msg) .set(ResponseResult.DATA_KEY, object); } public ResponseResult data(Object obj) { return this.set("data", obj); } public static ResponseResult error() { return ResponseResult.newResponseResult() .set(ResponseResult.MSG_KEY, "操做失敗") .set("code", ResponseResult.ERROR_CODE); } public static ResponseResult error(String msg) { return ResponseResult.newResponseResult() .set(ResponseResult.MSG_KEY, msg) .set("code", ResponseResult.ERROR_CODE); } public static ResponseResult error(String msg, Object object) { return ResponseResult.newResponseResult() .set(ResponseResult.MSG_KEY, msg) .set(ResponseResult.DATA_KEY, object) .set("code", ResponseResult.ERROR_CODE); } }
@RestController public class UserController { @RequestMapping("/getUser.do") public ResponseResult getUser() { return ResponseResult.success("返回成功","myUser"); } }
@Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
在user工程的UserController當中注入restTemplate
經過restTemplate實現工程之間的接口調用
同時運行兩個工程, 訪問http://localhost:5000/getGoods.do
以上操做就實現了兩個工程之間的調用
upstream mServer { server localhost:5001; server localhost:5002; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_pass http://mServer; }
配置完成後啓動nginx.exe
啓動會一閃而過 屬於正常狀況
把user中調用方的端口號改成80
啓動user,goods,goods1 訪問user的地址:http://localhost:5000/getGoods.do
會發現每次刷新訪問,都會返回兩個不一樣的工程的controller,完成集羣的搭建。
存在問題, 若是其中的一個服務中止了, 當訪問的時候 , 會出現有時會很慢的狀況
解決方案:用到SpringCloud的Eureka註冊中心來管理咱們的服務
下次更新 Spring-Cloud-Netflix-Eureka的使用方法