Spring Cloud構(gòu)建微服務(wù)架構(gòu)(二)服務(wù)消費(fèi)者

在上一篇《Spring Cloud構(gòu)建微服務(wù)架構(gòu)(一)服務(wù)注冊(cè)與發(fā)現(xiàn)》中合是,我們已經(jīng)成功創(chuàng)建了“服務(wù)注冊(cè)中心”了罪,實(shí)現(xiàn)并注冊(cè)了一個(gè)“服務(wù)提供者:COMPUTE-SERVICE”。那么我們要如何去消費(fèi)服務(wù)提供者的接口內(nèi)容呢聪全?

Ribbon

Ribbon是一個(gè)基于HTTP和TCP客戶端的負(fù)載均衡器泊藕。Feign中也使用Ribbon,后續(xù)會(huì)介紹Feign的使用难礼。

Ribbon可以在通過(guò)客戶端中配置的ribbonServerList服務(wù)端列表去輪詢?cè)L問(wèn)以達(dá)到均衡負(fù)載的作用娃圆。

當(dāng)Ribbon與Eureka聯(lián)合使用時(shí),ribbonServerList會(huì)被DiscoveryEnabledNIWSServerList重寫(xiě)蛾茉,擴(kuò)展成從Eureka注冊(cè)中心中獲取服務(wù)端列表讼呢。同時(shí)它也會(huì)用NIWSDiscoveryPing來(lái)取代IPing,它將職責(zé)委托給Eureka來(lái)確定服務(wù)端是否已經(jīng)啟動(dòng)臀稚。

下面我們通過(guò)實(shí)例看看如何使用Ribbon來(lái)調(diào)用服務(wù)吝岭,并實(shí)現(xiàn)客戶端的均衡負(fù)載。

準(zhǔn)備工作

  • 啟動(dòng)Chapter-9-1-1中的服務(wù)注冊(cè)中心:eureka-server
  • 啟動(dòng)Chapter-9-1-1中的服務(wù)提供方:compute-service
  • 修改compute-service中的server-port為2223吧寺,再啟動(dòng)一個(gè)服務(wù)提供方:compute-service

此時(shí)訪問(wèn):http://localhost:1111/

alt

可以看到COMPUTE-SERVICE服務(wù)有兩個(gè)單元正在運(yùn)行:

  • 192.168.21.101:compute-service:2222
  • 192.168.21.101:compute-service:2223

使用Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的消費(fèi)者

構(gòu)建一個(gè)基本Spring Boot項(xiàng)目窜管,并在pom.xml中加入如下內(nèi)容:


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <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>

<dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Brixton.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    </dependencies>
</dependencyManagement>

在應(yīng)用主類中,通過(guò)@EnableDiscoveryClient注解來(lái)添加發(fā)現(xiàn)服務(wù)能力稚机。創(chuàng)建RestTemplate實(shí)例幕帆,并通過(guò)@LoadBalanced注解開(kāi)啟均衡負(fù)載能力。


@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class, args);
    }

}

創(chuàng)建ConsumerController來(lái)消費(fèi)COMPUTE-SERVICE的add服務(wù)赖条。通過(guò)直接RestTemplate來(lái)調(diào)用服務(wù)失乾,計(jì)算10 + 20的值常熙。

@RestController
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public String add() {
        return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
    }

}

application.properties中配置eureka服務(wù)注冊(cè)中心


spring.application.name=ribbon-consumer
server.port=3333

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

啟動(dòng)該應(yīng)用,并訪問(wèn)兩次:http://localhost:3333/add

然后碱茁,打開(kāi)compute-service的兩個(gè)服務(wù)提供方裸卫,分別輸出了類似下面的日志內(nèi)容:

  • 端口為2222服務(wù)提供端的日志:
2016-06-02 11:16:26.787  INFO 90014 --- [io-2222-exec-10] com.didispace.web.ComputeController      : /add, host:192.168.21.101, service_id:compute-service, result:30
  • 端口為2223服務(wù)提供端的日志:
2016-06-02 11:19:41.241  INFO 90122 --- [nio-2223-exec-1] com.didispace.web.ComputeController      : /add, host:192.168.21.101, service_id:compute-service, result:30

可以看到,之前啟動(dòng)的兩個(gè)compute-service服務(wù)端分別被調(diào)用了一次纽竣。到這里墓贿,我們已經(jīng)通過(guò)Ribbon在客戶端已經(jīng)實(shí)現(xiàn)了對(duì)服務(wù)調(diào)用的均衡負(fù)載。

完整示例可參考:Chapter9-1-2/eureka-ribbon

Feign

Feign是一個(gè)聲明式的Web Service客戶端蜓氨,它使得編寫(xiě)Web Serivce客戶端變得更加簡(jiǎn)單聋袋。我們只需要使用Feign來(lái)創(chuàng)建一個(gè)接口并用注解來(lái)配置它既可完成。它具備可插拔的注解支持穴吹,包括Feign注解和JAX-RS注解幽勒。Feign也支持可插拔的編碼器和解碼器。Spring Cloud為Feign增加了對(duì)Spring MVC注解的支持港令,還整合了Ribbon和Eureka來(lái)提供均衡負(fù)載的HTTP客戶端實(shí)現(xiàn)啥容。

下面,通過(guò)一個(gè)例子來(lái)展現(xiàn)Feign如何方便的聲明對(duì)上述computer-service服務(wù)的定義和調(diào)用缠借。

創(chuàng)建一個(gè)Spring Boot工程干毅,配置pom.xml宜猜,將上述的配置中的ribbon依賴替換成feign的依賴即可泼返,具體如下:


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <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>

<dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Brixton.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    </dependencies>
</dependencyManagement>

在應(yīng)用主類中通過(guò)@EnableFeignClients注解開(kāi)啟Feign功能,具體如下:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }

}

定義compute-service服務(wù)的接口姨拥,具體如下:

@FeignClient("compute-service")
public interface ComputeClient {

    @RequestMapping(method = RequestMethod.GET, value = "/add")
    Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);

}
  • 使用@FeignClient("compute-service")注解來(lái)綁定該接口對(duì)應(yīng)compute-service服務(wù)
  • 通過(guò)Spring MVC的注解來(lái)配置compute-service服務(wù)下的具體實(shí)現(xiàn)绅喉。

在web層中調(diào)用上面定義的ComputeClient,具體如下:

@RestController
public class ConsumerController {

    @Autowired
    ComputeClient computeClient;

    @RequestMapping(value = "/add", method = RequestMethod.GET)
    public Integer add() {
        return computeClient.add(10, 20);
    }

}

application.properties中不用變叫乌,指定eureka服務(wù)注冊(cè)中心即可柴罐,如:

spring.application.name=feign-consumer
server.port=3333

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

啟動(dòng)該應(yīng)用,訪問(wèn)幾次:http://localhost:3333/add

再觀察日志憨奸,可以得到之前使用Ribbon時(shí)一樣的結(jié)果革屠,對(duì)服務(wù)提供方實(shí)現(xiàn)了均衡負(fù)載。

這一節(jié)我們通過(guò)Feign以接口和注解配置的方式排宰,輕松實(shí)現(xiàn)了對(duì)compute-service服務(wù)的綁定似芝,這樣我們就可以在本地應(yīng)用中像本地服務(wù)一下的調(diào)用它,并且做到了客戶端均衡負(fù)載板甘。

完整示例可參考:Chapter9-1-2/eureka-feign

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末党瓮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盐类,更是在濱河造成了極大的恐慌寞奸,老刑警劉巖呛谜,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異枪萄,居然都是意外死亡隐岛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)瓷翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)礼仗,“玉大人,你說(shuō)我怎么就攤上這事逻悠≡” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵童谒,是天一觀的道長(zhǎng)单旁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)饥伊,這世上最難降的妖魔是什么象浑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮琅豆,結(jié)果婚禮上愉豺,老公的妹妹穿的比我還像新娘。我一直安慰自己茫因,他們只是感情好蚪拦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著冻押,像睡著了一般驰贷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洛巢,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天括袒,我揣著相機(jī)與錄音,去河邊找鬼稿茉。 笑死锹锰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漓库。 我是一名探鬼主播恃慧,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼米苹!你這毒婦竟也來(lái)了糕伐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蘸嘶,失蹤者是張志新(化名)和其女友劉穎良瞧,沒(méi)想到半個(gè)月后陪汽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褥蚯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年挚冤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赞庶。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡训挡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歧强,到底是詐尸還是另有隱情澜薄,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布摊册,位于F島的核電站肤京,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茅特。R本人自食惡果不足惜忘分,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望白修。 院中可真熱鬧妒峦,春花似錦、人聲如沸兵睛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卤恳。三九已至累盗,卻和暖如春寒矿,著一層夾襖步出監(jiān)牢的瞬間突琳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工符相, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拆融,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓啊终,卻偏偏與公主長(zhǎng)得像镜豹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蓝牲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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