史上最簡單的SpringCloud教程 | 第二篇: 服務(wù)消費者(rest+ribbon)

在上一篇文章复哆,講了服務(wù)的注冊和發(fā)現(xiàn)。在微服務(wù)架構(gòu)中腌零,業(yè)務(wù)都會被拆分成一個獨立的服務(wù)梯找,服務(wù)與服務(wù)的通訊是基于http restful的。Spring cloud有兩種服務(wù)調(diào)用方式益涧,一種是ribbon+restTemplate初肉,另一種是feign。在這一篇文章首先講解下基于ribbon+rest。

一牙咏、ribbon簡介

Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using @FeignClient then this section also applies.

-----摘自官網(wǎng)

ribbon是一個負(fù)載均衡客戶端,可以很好的控制htt和tcp的一些行為嘹裂。Feign默認(rèn)集成了ribbon妄壶。

ribbon 已經(jīng)默認(rèn)實現(xiàn)了這些配置bean:

  • IClientConfig ribbonClientConfig: DefaultClientConfigImpl

  • IRule ribbonRule: ZoneAvoidanceRule

  • IPing ribbonPing: NoOpPing

  • ServerList<Server> ribbonServerList: ConfigurationBasedServerList

  • ServerListFilter<Server> ribbonServerListFilter: ZonePreferenceServerListFilter

  • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer

二、準(zhǔn)備工作

這一篇文章基于上一篇文章的工程寄狼,啟動eureka-server 工程丁寄;啟動service-hi工程,它的端口為8762泊愧;將service-hi的配置文件的端口改為8763,并啟動伊磺,這時你會發(fā)現(xiàn):service-hi在eureka-server注冊了2個實例,這就相當(dāng)于一個小的集群删咱。訪問localhost:8761如圖所示:

三屑埋、建一個服務(wù)消費者

重新新建一個spring-boot工程,取名為:service-ribbon;
在它的pom.xml文件分別引入起步依賴spring-cloud-starter-eureka痰滋、spring-cloud-starter-ribbon摘能、spring-boot-starter-web,代碼如下:

<?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.forezp</groupId>
    <artifactId>service-ribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>service-ribbon</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.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.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</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>Dalston.RC1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


</project>


在工程的配置文件指定服務(wù)的注冊中心地址為http://localhost:8761/eureka/敲街,程序名稱為 service-ribbon团搞,程序端口為8764。配置文件application.yml如下:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764
spring:
  application:
    name: service-ribbon

在工程的啟動類中,通過@EnableDiscoveryClient向服務(wù)中心注冊多艇;并且向程序的ioc注入一個bean: restTemplate;并通過@LoadBalanced注解表明這個restRemplate開啟負(fù)載均衡的功能逻恐。

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceRibbonApplication {

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

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

}

寫一個測試類HelloService,通過之前注入ioc容器的restTemplate來消費service-hi服務(wù)的“/hi”接口峻黍,在這里我們直接用的程序名替代了具體的url地址复隆,在ribbon中它會根據(jù)服務(wù)名來選擇具體的服務(wù)實例,根據(jù)服務(wù)實例在請求的時候會用具體的url替換掉服務(wù)名奸披,代碼如下:

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    public String hiService(String name) {
        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
    }

}

寫一個controller昏名,在controller中用調(diào)用HelloService 的方法,代碼如下:


/**
 * Created by fangzhipeng on 2017/4/6.
 */
@RestController
public class HelloControler {

    @Autowired
    HelloService helloService;
    @RequestMapping(value = "/hi")
    public String hi(@RequestParam String name){
        return helloService.hiService(name);
    }


}

在瀏覽器上多次訪問http://localhost:8764/hi?name=forezp阵面,瀏覽器交替顯示:

hi forezp,i am from port:8762

hi forezp,i am from port:8763

這說明當(dāng)我們通過調(diào)用restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class)方法時轻局,已經(jīng)做了負(fù)載均衡,訪問了不同的端口的服務(wù)實例样刷。

四仑扑、此時的架構(gòu)

此時架構(gòu)圖.png
  • 一個服務(wù)注冊中心,eureka server,端口為8761
  • service-hi工程跑了兩個實例置鼻,端口分別為8762,8763镇饮,分別向服務(wù)注冊中心注冊
  • sercvice-ribbon端口為8764,向服務(wù)注冊中心注冊
  • 當(dāng)sercvice-ribbon通過restTemplate調(diào)用service-hi的hi接口時,因為用ribbon進(jìn)行了負(fù)載均衡箕母,會輪流的調(diào)用service-hi:8762和8763 兩個端口的hi接口储藐;

源碼下載:https://github.com/forezp/SpringCloudLearning/tree/master/chapter2

五俱济、參考資料

本文參考了以下:

spring-cloud-ribbon

springcloud ribbon with eureka

服務(wù)消費者

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钙勃,隨后出現(xiàn)的幾起案子蛛碌,更是在濱河造成了極大的恐慌,老刑警劉巖辖源,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔚携,死亡現(xiàn)場離奇詭異,居然都是意外死亡克饶,警方通過查閱死者的電腦和手機(jī)酝蜒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矾湃,“玉大人亡脑,你說我怎么就攤上這事≈拮穑” “怎么了远豺?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坞嘀。 經(jīng)常有香客問我躯护,道長,這世上最難降的妖魔是什么丽涩? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任棺滞,我火速辦了婚禮,結(jié)果婚禮上矢渊,老公的妹妹穿的比我還像新娘继准。我一直安慰自己,他們只是感情好矮男,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布移必。 她就那樣靜靜地躺著,像睡著了一般毡鉴。 火紅的嫁衣襯著肌膚如雪崔泵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天猪瞬,我揣著相機(jī)與錄音憎瘸,去河邊找鬼。 笑死陈瘦,一個胖子當(dāng)著我的面吹牛幌甘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锅风,長吁一口氣:“原來是場噩夢啊……” “哼酥诽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起皱埠,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盆均,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漱逸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡游沿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年饰抒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诀黍。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡袋坑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眯勾,到底是詐尸還是另有隱情枣宫,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布吃环,位于F島的核電站也颤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏郁轻。R本人自食惡果不足惜翅娶,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望好唯。 院中可真熱鬧竭沫,春花似錦、人聲如沸骑篙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靶端。三九已至谎势,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躲查,已是汗流浹背它浅。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留镣煮,地道東北人姐霍。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镊折。 傳聞我的和親對象是個殘疾皇子胯府,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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