1. 程式人生 > >史上最簡單的SpringCloud教程 | 第二篇: 服務消費者(rest+ribbon)

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

226350人閱讀 評論(226) 收藏 舉報 分類: springcloud(26)

目錄(?)[+]

在上一篇文章,講了服務的註冊和發現。在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式,一種是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.

—–摘自官網

ribbon是一個負載均衡客戶端,可以很好的控制htt和tcp的一些行為。Feign預設集成了ribbon。

ribbon 已經預設實現了這些配置bean:

  • IClientConfig ribbonClientConfig: DefaultClientConfigImpl

  • IRule ribbonRule: ZoneAvoidanceRule

  • IPing ribbonPing: NoOpPing

  • ServerList ribbonServerList: ConfigurationBasedServerList

  • ServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilter

  • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer

二、準備工作

這一篇文章基於上一篇文章的工程,啟動eureka-server 工程;啟動service-hi工程,它的埠為8762;將service-hi的配置檔案的埠改為8763,並啟動,這時你會發現:service-hi在eureka-server註冊了2個例項,這就相當於一個小的叢集。訪問localhost:8761如圖所示:

三、建一個服務消費者

重新新建一個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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

在工程的配置檔案指定服務的註冊中心地址為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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在工程的啟動類中,通過@EnableDiscoveryClient向服務中心註冊;並且向程式的ioc注入一個bean: restTemplate;並通過@LoadBalanced註解表明這個restRemplate開啟負載均衡的功能。

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceRibbonApplication {

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

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

寫一個測試類HelloService,通過之前注入ioc容器的restTemplate來消費service-hi服務的“/hi”介面,在這裡我們直接用的程式名替代了具體的url地址,在ribbon中它會根據服務名來選擇具體的服務例項,根據服務例項在請求的時候會用具體的url替換掉服務名,程式碼如下:

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

寫一個controller,在controller中用呼叫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);
    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

hi forezp,i am from port:8762

hi forezp,i am from port:8763

這說明當我們通過呼叫restTemplate.getForObject(“http://SERVICE-HI/hi?name=“+name,String.class)方法時,已經做了負載均衡,訪問了不同的埠的服務例項。

四、此時的架構

此時架構圖.png

  • 一個服務註冊中心,eureka server,埠為8761
  • service-hi工程跑了兩個例項,埠分別為8762,8763,分別向服務註冊中心註冊
  • sercvice-ribbon埠為8764,向服務註冊中心註冊
  • 當sercvice-ribbon通過restTemplate呼叫service-hi的hi介面時,因為用ribbon進行了負載均衡,會輪流的呼叫service-hi:8762和8763 兩個埠的hi介面;

相關推薦

簡單SpringCloud教程 | 第二: 服務消費者rest+ribbon(Finchley版本)

在上一篇文章,講了服務的註冊和發現。在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式,一種是ribbon+restTemplate,另一種是feign。在這一篇文章首先講解下基於rib

簡單SpringCloud教程 | 第二: 服務消費者rest+ribbon

2017年04月08日 23:25:26 226350人閱讀 評論(226) 收藏

SpringCloud | 第二: 服務消費者rest+ribbon

在上一篇文章,講了服務的註冊和發現。在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式,一種是ribbon+restTemplate,另一種是feign。在這一篇文章首先講解下基於r

第二: 服務消費者rest+ribbon(Greenwich版本)

一、在前一章的基礎上啟動eureka-server和兩個eureka-client例項(在application.properties更改下埠號)新增一個模組service-ribbon 修改父工程的pom.xml檔案在<Modules>節點處增加ser

SpringCloud教程 | 第二: 服務消費者Feign

一、Feign簡介Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要建立一個介面並註解。它具有可插拔的註解特性,可使用Feign 註解和JAX-RS註解。Feign支援可插拔的編碼器和解碼器。Feign預設集成了Ribbon,並

簡單SpringCloud教程第二服務消費者rest+ribbon

image tree 開啟 then rom cat learn 替代 官網 最新Finchley版本:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f2-ribbon/或者http://blog.csdn.n

在eclipse部署springcloud小例子--第二服務消費者rest+ribbon

在上一篇文章,講了服務的註冊和發現。在微服務架構中,業務都會被拆分成一個獨立的服務,服務與服務的通訊是基於http restful的。Spring cloud有兩種服務呼叫方式,一種是ribbon+restTemplate,另一種是feign。在這一篇文章首先講解下基於ribbon+rest。 &n

企業級 SpringCloud 教程 服務消費者rest+ribbon

一、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 Ribbo

企業級 SpringCloud 服務消費者rest+ribbon

ota ces 說明 源地址 地址 ted mapping rgs www 一、ribbon簡介 Ribbon is a client side load balancer which gives you a lot of control over the behavio

Springcloud電子商城系統 java B2B2C-服務消費者rest+ribbon

一、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

SpringCloud2服務消費者rest+ribbon

1.準備工作 這一篇文章基於上一篇文章的工程。啟動eureka-server 工程,埠為 8761。分別以埠 8762 和 8763 啟動 service-hi 工程。訪問 localhost:8761 你會發現,service-hi 在eureka-server 註冊了2個例項,這就相當於一個小的叢集。

Spring Cloud 入門教程(二): 服務消費者rest+ribbon(Greenwich.RELEASE)

一、準備工作,eclipse執行兩個例項 1、修改  eurekaclient1 中 application.yml

簡單MySQL教程詳解基礎之多表聯合查詢

常用術語 內連線 外連線 左外連線 右外連線 注意事項: 自連線 子查詢 在上篇文章史上最簡單MySQL教程詳解(基礎篇)之資料庫設計正規化及應用舉例我們介紹過,在關係型資料庫中,我們通常為了減少資料的冗餘量將對資料表進行規範,將

簡單MySQL教程詳解進階之儲存引擎介紹及預設引擎設定

什麼是儲存引擎? 與其他資料庫例如Oracle 和SQL Server等資料庫中只有一種儲存引擎不同的是,MySQL有一個被稱為“Pluggable Storage Engine Architecture”(可替換儲存引擎架構)的特性,也就意味著My

Intellij idea簡單教程之Linux下安裝與破解Intellij idea2017

成功 zxvf java 新建 pre form 旗艦版 lan intel 一、前言 這一節我們介紹在Linux下如何安裝與破解Intellij idea2017。現在有很多公司開發環境都是Linux,所以掌握在Linux環境下使用Idea辦公也是咱們必須得掌握的技能。

詳細的WinHex數據恢復大師六大章節視頻教程

主分區 操作 17. 回收 刪除 顯示 清空 大小 sin 1.數據恢復基礎課(1)\1.為什麽要學winhex手工恢復數據;目錄中文件數:2個(2)\2.數據恢復環境之虛擬磁盤;目錄中文件數:2個(3)\3.數據恢復軟件之winhex的使用;目錄中文件數:2個(4)\4.

SpringCloud | 第三: 服務消費者Feign

上一篇文章,講述瞭如何通過RestTemplate+Ribbon去消費服務,這篇文章主要講述如何通過Feign去消費服務。 一、Feign簡介 Feign是一個宣告式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要建立一個介面並註解。它具有

簡單SpringCloud 教程 | 第十四服務註冊(consul)

配置 資料 源碼下載 擴展性 local sta tar value mark 這篇文章主要介紹 spring cloud consul 組件,它是一個提供服務發現和配置的工具。consul具有分布式、高可用、高擴展性。 consul 具有以下性質: 服務發現:cons

簡單SpringCloud教程 | 第六: 分布式配置中心(Spring Cloud Config)(Finchley版本)

prope shu 由於 ext master strip div 文件配置 rap 在上一篇文章講述zuul的時候,已經提到過,使用配置服務來保存各個服務的配置文件。它就是Spring Cloud Config。 在分布式系統中,由於服務數量巨多,為了方便服務配置文件統

簡單SpringCloud教程 | 第五: 路由網關(zuul)(Finchley版本)

開頭 proxy 打開 系統 blog 註冊 hub 需要 ews 在微服務架構中,需要幾個基礎的服務治理組件,包括服務註冊與發現、服務消費、負載均衡、斷路器、智能路由、配置管理等,由這幾個基礎組件相互協作,共同組建了一個簡單的微服務系統。一個簡答的微服務系統如下圖: 註