Spring微服務實戰--註解版

第一章 歡迎邁入雲世界

導語–本系列文章是基於《Spring微服務實戰》,鑑於一些同學沒有微服務方面的經驗和實戰,可能閱讀本書的難度略微大些,我儘量在原著的基礎上,以更直白的語言和明晰的結果圖展示給大家,幫助大家瞭解微服務。

微服務之前的開發,用的是傳統的單體結構,即常寫的service層,dao層,conroller層,業務不分家,所有的業務邏輯在一個project中,每當修改一個業務邏輯時,整個應用程序都需要重建、重新冒煙、重部,每次的感覺都是牽一髮而動全身,我們經常會在傳統行業中見到這種開發模式或者應用結構,例如銀行業、保險業、政務等等…
鑑於上述單體結構的缺點,微服務應運而生,我直接引用文中的話,什麼是微服務,微服務就是一個小的、鬆耦合的分佈式服務。微服務將一個大的應用拆分成具有嚴格意義的便於管理的單個服務,舉個例子,用戶服務就只用於管理用戶,如註冊、登錄等,金融服務就只負責金融交易等,如轉賬、代發工資等。但是他們又是相互協調的,轉賬不可能離開用戶,因爲其要用到用戶的賬號等信息;但是他們又是單一職責的,各自爲政;他們之間需要通信,如轉賬時去用戶服務拿收付方的信息,他們是通過基本的協議進行通信(通常是HTTP+JSON)的;微服務也是跨語言的,就像JVM的設計者當初的設想一樣,JVM並不是單獨爲Java語言服務的,微服務對於採用什麼技術實現並沒有什麼建議和影響。但是微服務的目標是明確的,使擁有明確責任領域的各個小型開發團隊,共同協作,提供更好的、更快的交付和解決方案。下圖簡單示意下微服務。
在這裏插入圖片描述
這本書基本上是基於三個框架實現的,即Spring、SpringBoot、SpringCloud,這三個框架也成了當今面試後端開發中高級崗位必備的三種技術。Spring的核心就是依賴注入,比較形象的比喻就是把一個一個的bean當成積木,Spring負責將他們生產並且組裝;用過Spring的都清楚,它那一堆XML着實又難看又難懂,SpringBoot是對Spring的重新思考,基於SpringMVC,以註解代替xml配置,自帶tomcat,又容易與第三方框架集成,從而提供了一個基於java的面向REST的微服務框架,也方便打包和部署;當服務部署在公有云時,微服務成爲了更常見的架構,SpringCloud爲這一切搭起了更簡易 的橋樑,它在一個公共框架下集成封裝了多個流行的微服務框架,實現了服務的註冊、發現、負載均衡、網關等多種功能,成爲了微服務開發的較好選擇。
不知道平時大家用什麼IDE,是Eclipse還是IDEA,我見我剛畢業的一位同事,第一次用IDEA配Tomcat,花費了一上午。其深感用基本的MVC,搭建一個web應用的難處,再加上對於Tomcat的不熟練,更加頭疼。SpringBoot不會再讓你感到爲難,一起看下第一個簡單的SpringBoot服務。
先簡單看下基本的用戶請求處理過程吧,應該大部分人都清楚。
在這裏插入圖片描述
本系列實驗需要用到IDE和客戶端調用工具PostMan。對應的代碼可以在作者的GitHub上下載,對應的地址是https://github.com/carnellj/。
我們就以作者的例子進行演示。事先說明一點,本書作者的演示都是在docker中進行的,可能有的同學沒有用過docker,沒有用過docker的可以直接在IDE中啓動程序就可以了,或者用命令行啓動(在對應的位置輸入mvn spring-boot:run)。

package com.thoughtmechanix.simpleservice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.PathVariable;

//這個註解告訴框架,這裏是整個服務的入口
@SpringBootApplication
//要將代碼公開爲一個Controller
@RestController
//映射路徑,類級別的,以/hello開頭
@RequestMapping(value="hello")
public class Application {
   //程序入口
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    /**
     * 方法級別的映射
     * @param firstName
     * @param lastName
     * @return
     */
    @RequestMapping(value="/{firstName}/{lastName}",method = RequestMethod.GET)
    //@PathVariable的作用將url中的參數映射到方法中對應的參數
    public String hello( @PathVariable("firstName") String firstName,
                         @PathVariable("lastName") String lastName) {

        return String.format("{\"message\":\"Hello %s %s\"}", firstName, lastName);
    }
}

直接在main上啓動就可以了。我們看下啓動日誌

在這裏插入圖片描述
用Postman進行調用,結果如下
在這裏插入圖片描述
上面展示了一個springboot服務的基本操作,簡單易懂,所以springboot會慢慢成爲主流開發框架。
下面回到微服務的討論上來
還是尊重作者,記住一句話:小型的、簡單的和解耦的服務=可伸縮的、有彈性的和靈活的應用程序,簡單翻譯下,就是微服務的各個服務職責單一,相互獨立,但是靈活組合和安排,以提供快速交付的功能,他還能優雅的降級,能夠跨多個服務器進行水平分佈。
按照微服務大小適當、位置透明、有彈性、可重複、可伸縮的要求,簡單介紹幾種微服務模式,這幾種模式也解釋了上述的微服務要求。
核心微服務開發模式
1、服務粒度—劃分適當,不宜太粗或太細
2、通信協議—JSON
3、接口設計—怎樣讓客戶端進行服務調用,需要提供合適的URL
4、服務的配置管理—切換不同環境時,核心配置不會更改,不會發生配置漂移
微服務路由模式
解決兩個問題:服務發現、服務路由
服務發現—抽象出服務的物理位置可以被找到,可以透明的擴大或刪除服務實例
服務路由—爲服務客戶端提供單一的url來進行通信,一般會在服務發現之前,這裏會做一些授權、驗證、內容檢查等。
舉個例子,你要去小明家,小明家在一個村子裏,村子裏有很多人家,服務路由就是給你一個唯一的地址,就是小明家在XX市XX鎮XX村,你找到XX村了,然後你發現有好多一樣的房子,你在這麼多一樣的房子裏,找到小明家是哪個。
微服務客戶端彈性模式
客戶端負載均衡—要雨露均沾,別一個服務一個勁地調
斷路器模式—繞過不爽的服務,不爽的就是死掉的或者半死不活,反應慢的
後備模式—這個服務不行,你得給我個備胎啊
艙壁模式—服務之間誰也不打擾誰,咱們之間有堵牆,你不行,別影響我。
微服務安全模式
驗證—證明你就是你,證明調用服務的客戶端是合法的
授權—你只能在自己的一畝三分地玩,客戶端調用服務只能做被允許的事情
憑證管理和傳播—古代進出宮門需要腰牌,腰牌即是憑證,皇宮這麼多們,不可能每個門都要一個腰牌,一個腰牌就可以了,每個宮門怎麼證明這個腰牌就是真實的腰牌,即是傳播
微服務日誌記錄和跟蹤模式
日誌關聯—使用關聯ID,將一個調用涉及到的服務的日誌關聯起來
日誌聚合—將微服務生成的所有日誌合併到一個可查詢的數據庫中。
微服務跟蹤—可視化事務的流程,瞭解服務的性能特徵。
下面介紹下,SpringCloud是怎樣集成這些模式的,即不同模式下使用到的框架和技術。
在這裏插入圖片描述
在本節的最後,想給大家留下一句話:SpringCloud真正的美在於,只需要一個註解,你就可以爲所欲爲。
在接下來的系列文章中,我們一一探祕,瞭解上述的功能和技術。

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