SpringCloud微服務(wù) 之 Provider & Cosumer

前言

本小節(jié)我們將進(jìn)入學(xué)習(xí)SpringCloud的預(yù)熱階段既學(xué)習(xí)與理解微服務(wù)中的服務(wù)提供者和消費者。

我們知道在微服務(wù)的架構(gòu)體系中服務(wù)與服務(wù)間的通訊可以通過RestTamplate(Spring對RESTful API請求的一種簡單封裝)和Fegin(SpringCloug集成的聲明式客戶端掌眠,后面我們將學(xué)習(xí)到)奏赘。

此處我們對本節(jié)案例中涉及到的一些技術(shù)椓壬粒或知識點不做細(xì)數(shù),學(xué)習(xí)的基礎(chǔ)前提是大家對SpringBoot有比較好的了解并且對SpringCloud有一個整體認(rèn)識磨淌。我們將模擬一個業(yè)務(wù)場景:微服務(wù)中有一個deal模塊作為服務(wù)的提供者(Provider)疲憋,有一個broker模塊作為服務(wù)的消費者(Consumer)。broker通過RestTamplate消費deal即broker模塊調(diào)用deal模塊梁只。

以上業(yè)務(wù)場景是一個在微服務(wù)中常見的服務(wù)調(diào)用場景缚柳。

案例

準(zhǔn)備工作

本案包括以后的案例中我們都是使用的:使用STS IED開發(fā)。因為STS對Spring生態(tài)做了很好的擴展搪锣。

服務(wù)提供者業(yè)務(wù)實現(xiàn)

編寫一個服務(wù)提供者的業(yè)務(wù)用于服務(wù)調(diào)用

項目結(jié)構(gòu)

代碼解讀

使用STS 的Spring Starter Project構(gòu)建Maven WEB項目(STS的SSP Plugin會將該項目構(gòu)建成一個基于SpringBoot的web項目然后使用SpringCloud做一次封裝)秋忙。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>

<artifactId>microservice.deal</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<name>microservice-deal</name>

<description>Demo project for Spring Boot</description>

<!-- 引入spring boot的依賴 -->

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.5.9.RELEASE</version>

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<java.version>1.8</java.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId>

</dependency>

<dependency>

<groupId>com.h2database</groupId>

<artifactId>h2</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

</dependency>

</dependencies>

<!-- 引入spring cloud的依賴 -->

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>Edgware.RELEASE</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

<!-- 添加spring-boot的maven插件 -->

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

</project>

為方便快速演示本案例將使用h2以及Spring JPA做DB和Persistence. properties.yml配置如下

server:

port: 8080

spring:

jpa:

generate-ddl: false

show-sql: true

hibernate:

ddl-auto: none

datasource: # 指定數(shù)據(jù)源

platform: h2 # 指定數(shù)據(jù)源類型

schema: classpath:schema.sql # 指定h2數(shù)據(jù)庫的建表腳本

data: classpath:data.sql # 指定h2數(shù)據(jù)庫的數(shù)據(jù)腳本

logging: # 配置日志級別,讓hibernate打印出執(zhí)行的SQL

level:

root: INFO

org.hibernate: INFO

org.hibernate.type.descriptor.sql.BasicBinder: TRACE

org.hibernate.type.descriptor.sql.BasicExtractor: TRACE

## INFO

info:

app:

name: @project.artifactId@

encoding: @project.build.sourceEncoding@

java:

source: @java.version@

target: @java.version@

management:

security:

enabled: false

Controler

@RestController

public class DealController {

@Autowired

private DealRepository dealRepository;

@GetMapping("/{id}")

public Deal findById(@PathVariable Long id) {

Deal findOne = this.dealRepository.findOne(id);

return findOne;

}

}

訪問 http://localhost:8080/1 獲取訂單信息

服務(wù)消費者業(yè)務(wù)實現(xiàn)

項目結(jié)構(gòu)

代碼解讀

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>

<artifactId>microservice.deal.broker</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>

<name>microservice-deal-broker</name>

<description>Demo project for Spring Boot</description>

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.0.5.RELEASE</version>

<relativePath/> <!-- lookup parent from repository -->

</parent>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

</properties>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

</project>

properties.yml

server:

port: 8010

controller

@RestController

public class BrokerController {

@Autowired

private RestTemplate restTemplate;

@GetMapping("/deal/{id}")

public Deal findById(@PathVariable Long id) {

return this.restTemplate.getForObject("http://localhost:8080/" + id, Deal.class);

}

}

訪問?

http://localhost:8010/deal/1 獲取訂單信息

小結(jié)

如上案例是一個在微服務(wù)中常用到的業(yè)務(wù)場景即一個服務(wù)消費另一個服務(wù)淤翔,只是實現(xiàn)地比較簡單翰绊。同時這樣實現(xiàn)也存在一些問題:

缺少服務(wù)注冊和發(fā)現(xiàn)機制,無法保證服務(wù)的可用性旁壮。

存在著硬編碼的問題监嗜,服務(wù)的可擴展性極低。

我們將在下一章節(jié)中學(xué)習(xí)服務(wù)的注冊與發(fā)現(xiàn)機制抡谐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裁奇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子麦撵,更是在濱河造成了極大的恐慌刽肠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件免胃,死亡現(xiàn)場離奇詭異音五,居然都是意外死亡,警方通過查閱死者的電腦和手機羔沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門躺涝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扼雏,你說我怎么就攤上這事坚嗜『话颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵苍蔬,是天一觀的道長诱建。 經(jīng)常有香客問我,道長碟绑,這世上最難降的妖魔是什么俺猿? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蜈敢,結(jié)果婚禮上辜荠,老公的妹妹穿的比我還像新娘。我一直安慰自己抓狭,他們只是感情好伯病,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著否过,像睡著了一般午笛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苗桂,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天药磺,我揣著相機與錄音,去河邊找鬼煤伟。 笑死癌佩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的便锨。 我是一名探鬼主播围辙,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼放案!你這毒婦竟也來了姚建?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤吱殉,失蹤者是張志新(化名)和其女友劉穎掸冤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體友雳,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡稿湿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了押赊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缎罢。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出策精,到底是詐尸還是另有隱情,我是刑警寧澤崇棠,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布咽袜,位于F島的核電站,受9級特大地震影響枕稀,放射性物質(zhì)發(fā)生泄漏询刹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一萎坷、第九天 我趴在偏房一處隱蔽的房頂上張望凹联。 院中可真熱鬧,春花似錦哆档、人聲如沸蔽挠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澳淑。三九已至,卻和暖如春插佛,著一層夾襖步出監(jiān)牢的瞬間杠巡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工雇寇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留氢拥,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓锨侯,卻偏偏與公主長得像嫩海,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子识腿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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