[JavaEE] 五分鐘搭建SpringCloud環(huán)境, 進入微服務(wù)時代

前言

SpringCloud并不是一個第三方框架的名稱, 而是一整套微服務(wù)框架的統(tǒng)稱, 使用這套框架可以快速搭建出高可用的微服務(wù)環(huán)境, 因為功能眾多拼缝,所以又被稱SpringCloud全家桶, 由于篇幅較長所以文章采用了目錄引導(dǎo), 第二章是微服務(wù)的基礎(chǔ), 第三章是功能模塊擴展, 如網(wǎng)關(guān), 服務(wù)保護, 分布式配置中心, nginx, 下面就跟著我們的文章, 一起來看吧.

目錄

  • 一.什么是微服務(wù)
  • 二.快速開始
  • 三.功能集成(網(wǎng)關(guān), 服務(wù)保護, 負載均衡, 分布式配置中心)
  • 四.打包
  • 五.微服務(wù)發(fā)布利器 -- Docker
  • 六.Demo

一.什么是微服務(wù)

就是把一整個后臺項目拆分成多個模塊, 每一個模塊稱作一個服務(wù), 每個服務(wù)都可以獨立運行, 這樣做的好處是其中有一個服務(wù)掛掉后, 另外的服務(wù)不受影響, 這些服務(wù)使用接口相互通信, 減少了依賴和耦合.
-- 摘自白貓語錄

二.快速開始

整個項目是由maven進行管理的, 依賴包就是我們開發(fā)時需要用到的第三方j(luò)ar包, 也就是框架, 這里為什么什么也不選? 我說一下, 因為我們要做的是微服務(wù), 所以框架結(jié)構(gòu)為一個基座+多個子模塊, 我們上面建立的就是基座, 你可以把它當(dāng)成一個工作空間用途是管理子模塊.

1.Eureka注冊中心

首先要新建我們SpringCloud項目的核心eureka注冊中心, 為什么說它是項目的核心呢, 我在簡介中說過了, 微服務(wù)就是把一整個后臺應(yīng)用拆分成小的功能模塊, 那么這些模塊之間如何進行通信呢?

沒錯就是注冊中心, 那么我們接下來就開始搭建一個注冊中心吧!

首先新建一個Module子項目, 也就是一個微服務(wù)模塊.

到這里我們注冊中心模塊就建立好了, 之后我們來簡單配置一下.

首先開啟eureka服務(wù)

之后找到配置文件

配置一下application.yml, 如果你的是application.properties, 請修改后綴為yml, 這兩個配置文件都可以配置工程, 相比之下yml更直觀一些, 所以本教程使用yml進行配置

之后我們進行配置

server:
  # 配置服務(wù)端口
  port: 8081
eureka:
  client:
    service-url:
      # 配置eureka服務(wù)器地址
      defaultZone: http://127.0.0.1:8081/eureka
    #是否需要將自己注冊到注冊中心(注冊中心集群需要設(shè)置為true)
    register-with-eureka: false
    #是否需要搜索服務(wù)信息 因為自己是注冊中心所以為false
    fetch-registry: false

注意縮進, 因為yml使用縮進來區(qū)分不同字段的.

然后我們來運行項目吧!

在這里選擇ServiceEurekaApplication, 然后點擊綠色的運行即可.

看到上面的日志就證明成功了.

然后我們來訪問一下注冊中心吧.

http://localhost:8081

網(wǎng)頁可以正常運行后 我們的注冊中心就配置完畢了

2.創(chuàng)建微服務(wù)

只有注冊中心是沒有用的, 我們需要找一個地方來寫接口, 所以接下來我們就創(chuàng)建兩個服務(wù).

接下來勾選一些功能模塊

同理配置service-b, 新建完成之后是這個樣子, 同理創(chuàng)建service-b

之后我們配置服務(wù)的入口文件

然后配置一下application.yml
首先是service-a

server:
  # 服務(wù)端口號
  port: 8082
spring:
  application:
    # 服務(wù)名稱 - 服務(wù)之間使用名稱進行通訊
    name: service-objcat-a
eureka:
  client:
    service-url:
      # 填寫注冊中心服務(wù)器地址
      defaultZone: http://localhost:8081/eureka
    # 是否需要將自己注冊到注冊中心
    register-with-eureka: true
    # 是否需要搜索服務(wù)信息
    fetch-registry: true
  instance:
    # 使用ip地址注冊到注冊中心
    prefer-ip-address: true
    # 注冊中心列表中顯示的狀態(tài)參數(shù)
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

之后是service-b

server:
  # 服務(wù)端口號
  port: 8083
spring:
  application:
    # 服務(wù)名稱 - 服務(wù)之間使用名稱進行通訊
    name: service-objcat-b
eureka:
  client:
    service-url:
      # 填寫注冊中心服務(wù)器地址
      defaultZone: http://localhost:8081/eureka
    # 是否需要將自己注冊到注冊中心
    register-with-eureka: true
    # 是否需要搜索服務(wù)信息
    fetch-registry: true
  instance:
    # 使用ip地址注冊到注冊中心
    prefer-ip-address: true
    # 注冊中心列表中顯示的狀態(tài)參數(shù)
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

之后我們來運行一下剛配置好服務(wù)吧

首先看編譯器的左下角, 有一個小方塊, 鼠標(biāo)驮壮幔靠在上面會顯示菜單.

那我們接下來開始寫個簡單的接口

@RestController
public class TestController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

重啟服務(wù), 訪問下面地址

http://localhost:8082/hello

瀏覽器上出現(xiàn)hello world說明成功了

有人會問了 到這里并沒有使用到任何注冊中心的功能啊?
不要著急 接下來我們就是用一用注冊中心
我們現(xiàn)在有一個需求 使用服務(wù)b調(diào)用服務(wù)a的接口
這時我們就需要用到eurka(注冊中心)feign客戶端了
首先我們在service-b中創(chuàng)建interface

@FeignClient("SERVICE-OBJCAT-A")
public interface ServiceAFeignClient {
    @RequestMapping("/hello")
    public String hello();
}

應(yīng)用名可以在eureka中找到
http://localhost:8081

image.png

之后我們來寫接口 在服務(wù)b中添加個控制器

@RestController
public class TestController {

    @Autowired
    private ServerAFeignClient serverAFeignClient;

    @RequestMapping("/call")
    public String call() {
        String result = serverAFeignClient.hello();
        return "b to a 訪問結(jié)果 ----- " + result;
    }
}

之后我們發(fā)現(xiàn)報錯了 不要慌張設(shè)置一下即可

最后在應(yīng)用入口加上注解,就能實現(xiàn)服務(wù)之間的調(diào)用了.

重新運行服務(wù)b 在網(wǎng)站上訪問試試吧

http://localhost:8083/call

到這里服務(wù)之間的相互訪問也可以完成了 到這里springcloud最基本的環(huán)境搭建就完成了 快寫幾個微服務(wù)玩玩吧

內(nèi)容擴展

我們來看一個神奇的現(xiàn)象 我把service-a接口中寫一個延時函數(shù) 我們看一下效果

之后我們重新運行service-a

我們會發(fā)現(xiàn)報如下錯誤

意思是讀取超時了 這是為什么呢

原因就是feign的默認請求超時時間是1秒 而我們延時1.5秒后返回了數(shù)據(jù) 所以這個請求失敗了 那么我們要如何解決這個問題呢?

很簡單 我們在配置文件中配置feign的超時時間即可

server:
  #服務(wù)端口號
  port: 8083
spring:
  application:
    #服務(wù)名稱 - 服務(wù)之間使用名稱進行通訊
    name: service-objcat-b
eureka:
  client:
    service-url:
      #填寫注冊中心服務(wù)器地址
      defaultZone: http://localhost:8081/eureka
    #是否需要將自己注冊到注冊中心
    register-with-eureka: true
    #是否需要搜索服務(wù)信息
    fetch-registry: true
ribbon:
  #建立連接超時時間
  ConnectTimeout: 5000
  #讀取資源超時間
  ReadTimeout: 5000

關(guān)鍵是下面這三行

ribbon:
  #建立連接超時時間
  ConnectTimeout: 5000
  #讀取資源超時間
  ReadTimeout: 5000

這里說一下 ribbon 如果你是搞IT的 那么你一定聽說過一個叫負載均衡的東西 而負載均衡呢 又分為兩種
1.本地負載均衡 一般使用ribbon
2.服務(wù)器端負載均衡 一般使用nginx
顧名思義所謂負載均衡就是讓用戶訪問可以平均到集群服務(wù)上去 避免單個服務(wù)訪問量過大而增加服務(wù)器負擔(dān)
所謂集群 就是相同服務(wù)在不同服務(wù)器上運行(相同服務(wù)器也可 但同一個服務(wù)器端口一定不同) 實現(xiàn)同樣服務(wù)的效果

說到這里 你可能還是不太懂 沒關(guān)系 先看下面的例子 我們來重現(xiàn)一下ribbon的負載均衡功能

我們現(xiàn)在就在本地開啟兩個service-a

首先修改一下代碼 讓服務(wù)打印出當(dāng)前端口號

對服務(wù)a做了上圖中的修改
1.獲取服務(wù)器端口號
2.拼接端口號返回給客戶端
3.注釋掉了延時函數(shù)提高效率

好 那我們來啟動兩個service-a 這個要進行設(shè)置一下 因為idea默認情況下是單例運行的 我們先要給服務(wù)改成不是單例的狀態(tài) 這樣就能跑起來兩個同樣名稱但端口不同的服務(wù)了

image.png

到了這一步 我們來跑起來兩個service-a吧

運行之后我們會發(fā)現(xiàn)有兩個a服務(wù) 一個是8082 一個是8092

這個就成為集群 同一個服務(wù)開啟了兩個端口 獨立運行 我們打開eureka看一下 服務(wù)都順利運行了

有兩個a服務(wù) 一個b服務(wù)

接口下來我們用b服務(wù)來訪問以下a服務(wù) 調(diào)用我們以前就寫好的方法 call

訪問的同一個地址 但是端口會在8082和8092之間來回切換 這就是所謂的本地負載均衡 那么這個機制是怎么實現(xiàn)的呢 其實很簡單 就是輪詢機制 計算公式就是 總請求次數(shù) % 服務(wù)器總數(shù) 取模后就調(diào)用相對應(yīng)索引的服務(wù) 就可以實現(xiàn)本地均衡負載了 這就是ribbon的基本原理

三.功能集成

1.網(wǎng)關(guān)

[JavaEE] SpringCloud集成Zuul網(wǎng)關(guān)
http://www.reibang.com/p/6ef9ca1efa4b

2.服務(wù)保護

[JavaEE] SpringCloud集成Hystrix服務(wù)保護
http://www.reibang.com/p/cce702d44b7d

3.負載均衡

[JavaEE] 狒狒都能懂的Nginx教程 for Mac
http://www.reibang.com/p/c21606bb4044

4.分布式配置中心

[JavaEE] SpringCloud集成Apollo分布式配置中心
http://www.reibang.com/p/5606483c7fbf
[JavaEE] SpringCloud集成SpringCloudConfig分布式配置中心
http://www.reibang.com/p/f6c0793e8458

四.打包

[JavaEE] SpringCloud項目打包
http://www.reibang.com/p/935868c9141e

五.微服務(wù)發(fā)布利器 -- Docker

[Docker] 入門教程
http://www.reibang.com/p/7b3737df847d

六.Demo

https://github.com/objcat/test-spring-cloud-demo.git

finall enjoy it.

by objcat 2018.11.14

更新日志:

  • 2018年11月20日14:24:58
    新增負載均衡原理
    新增網(wǎng)關(guān)配置教程
  • 2018年12月14日15:38:58
    重構(gòu)文章, 完善部分細節(jié)
  • 2018年12月21日15:25:46
    完善Demo, 新增Zuul網(wǎng)關(guān)和分布式配置中心Config
  • 2018年12月25日11:35:33
    完善目錄和部分詞語修正
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末努溃,一起剝皮案震驚了整個濱河市劲装,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兼雄,老刑警劉巖吟逝,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赦肋,居然都是意外死亡块攒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門佃乘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囱井,“玉大人,你說我怎么就攤上這事趣避±派穑” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵鹅巍,是天一觀的道長千扶。 經(jīng)常有香客問我,道長骆捧,這世上最難降的妖魔是什么澎羞? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮敛苇,結(jié)果婚禮上妆绞,老公的妹妹穿的比我還像新娘。我一直安慰自己枫攀,他們只是感情好括饶,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著来涨,像睡著了一般图焰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹦掐,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天技羔,我揣著相機與錄音僵闯,去河邊找鬼。 笑死藤滥,一個胖子當(dāng)著我的面吹牛鳖粟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拙绊,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼向图,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了标沪?” 一聲冷哼從身側(cè)響起张漂,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谨娜,沒想到半個月后航攒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡趴梢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年漠畜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坞靶。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡憔狞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彰阴,到底是詐尸還是另有隱情瘾敢,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布尿这,位于F島的核電站簇抵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏射众。R本人自食惡果不足惜碟摆,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叨橱。 院中可真熱鬧典蜕,春花似錦、人聲如沸罗洗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伙菜。三九已至轩缤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背典奉。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工躺翻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丧叽,地道東北人卫玖。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像踊淳,于是被迫代替她去往敵國和親假瞬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容