1. 程式人生 > >小白學SpringCloud(二):服務間的呼叫

小白學SpringCloud(二):服務間的呼叫

feign&Rest_logo

SpringCloud服務間的呼叫有兩種方式:RestTemplate和FeignClient。不管是什麼方式,他都是通過REST介面呼叫服務的http介面,引數和結果預設都是通過jackson序列化和反序列化。

一、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, so if you are using @FeignClient then this section also applies.

這是官網對Ribbon的簡介,簡單的說Ribbon是一個負載均衡客戶端,SpringCloud的兩種服務間呼叫方式背後都用了Ribbon。

二、使用RestTemplate進行服務呼叫

程式碼Demo接上篇SpringCloud(一):服務的註冊與發現(Eureka)
**1.**我們首先啟動埠為8761的eureka工程,把SpringCloud的服務註冊中心啟動。

**2.**開啟我們的Discovery工程。這時候Discovery工程相當於服務端,我們來為它寫一個提供服務的方法:

@RestController
public class HelloController {

    @Value
("${server.port}") private String port; @GetMapping("/hello") public String hello() { return "hello! 我是" + port; } }

然後將配置檔案中的埠改為8762和8763分別啟動。
如果你使用的是IDEA的話,只需要去掉下圖中紅框框住的部分就可以將同一工程啟動多個例項
Rest_1
這時,我們就擁有了埠為8762和8763的兩個Discovery叢集,Eureka中可以看到
feign&Rest_2
**3.**我們再新建一個Eureka-Discovery工程(可以參照上一篇文章),首先為他配置好Eureka-Client的配置。在配置檔案中為它指定埠為8764:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/ #服務端地址
server:
  port: 8764 #客戶端埠
spring:
  application:
    name: client #客戶端名稱

然後我們為它新增一個RestTemplate的配置Bean,可以參照如下程式碼

@Component
public class HelloConfig {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

之後我們就可以在需要呼叫的地方用如下方式進行呼叫

@RestController
public class ClientController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/cliHello")
    public String CliHello() {
        //第一個引數為:服務端的應用名稱/呼叫介面的Mapping
        //第二個引數為返回的型別
        return restTemplate.getForObject("http://discovery/hello",String.class);
    }

}

結果如圖:
feign&Rest_3
這裡因為Ribbon的預設負載均衡方式為輪詢,所以我們可以看到埠8762和8763依次出現。如果有想改變負載均衡方式的小夥伴可以下去自行研究一下,這裡就不過多贅述了。

三、使用Feign進行服務呼叫

1.新增Feign的pom引用
在FeignClient的pom檔案中新增

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

需要注意的是版本一定要跟我的一致,否則新增的依賴有可能會不一樣
2.為啟動類添加註解
這一步很簡單,只需要在在啟動類上新增@EnableFeignClients註解:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ClientApplication {

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

3.定義一個Feign介面
程式碼如下:

//name是服務端的名稱
@FeignClient(name = "discovery")
public interface HelloClient {

    //url是呼叫服務的url值
    @GetMapping("/hello")
    String hello();
}

4.呼叫
在配置了Feign介面後,我們就可以直接進行注入呼叫了

    @Autowired
    private HelloClient helloClient;

    @GetMapping("/feignHello")
    public String feignHello() {
        return helloClient.hello();
    }

呼叫的結果跟RestTemplate也相同
feign&Rest_3_1
從這裡我們可以看到,使用Feign是偽分散式的呼叫方式。

相關推薦

SpringCloud()服務呼叫

SpringCloud服務間的呼叫有兩種方式:RestTemplate和FeignClient。不管是什麼方式,他都是通過REST介面呼叫服務的http介面,引數和結果預設都是通過jackson序列化和反序列化。 一、Ribbon簡介 在說這兩種方式之前

SpringCloud(五)路由閘道器(Zuul)

在微服務的架構下,各個服務一般會有各自的網路地址,在這樣的情況下外部客戶端的呼叫可能會形成雜亂無章的局面。這時候我們就可以使用微服務閘道器Zuul這個元件,我們讓所有的客戶端請求全部請求Zuul,再由Zuul統一的去請求各個服務。 一、Zuul簡介 Zuu

基於gin的golang web開發服務呼叫

微服務開發中服務間呼叫的主流方式有兩種HTTP、RPC,HTTP相對來說比較簡單。本文將使用 ```Resty``` 包來實現基於HTTP的微服務呼叫。 ### Resty簡介 ```Resty``` 是一個簡單的HTTP和REST客戶端工具包,簡單是指使用上非常簡單。Resty在使用簡單的基礎上提供了非常

Python 爬蟲(3)前置準備()Linux基礎入門

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 Linux 基礎 CentOS 官網: https://www.centos.org/ 。 CentOS 官方下載連結: https://www.cent

Python 爬蟲(12)urllib 基礎使用(

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

Python 爬蟲(34)爬蟲框架 Scrapy 入門基礎(

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

Python 爬蟲(39) JavaScript 渲染服務 scrapy-splash 入門

人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Pyth

Python 資料分析(3)Pandas ()資料結構 Series

在家為國家做貢獻太無聊,不如跟我一起學點 Python 順便問一下,你們都喜歡什麼什麼樣的文章封面圖,老用這一張感覺有點醜 人生苦短,我用 Python 前文傳送門: 小白學 Python 資料分析(1):資料分析基礎 小白學 Python 資料分析(2):Pandas (一)概述 引言 先介

Python 資料分析(13)Pandas (十)資料表拼接

![](https://cdn.geekdigging.com/python/spider-blog/Python_logo.jpg) > 人生苦短,我用 Python 前文傳送門: [小白學 Python 資料分析(1):資料分析基礎](https://www.geekdigging.com/2020

Python 資料分析(17)Matplotlib()基礎操作

![](https://cdn.geekdigging.com/python/spider-blog/Python_logo.jpg) > 人生苦短,我用 Python 前文傳送門: [小白學 Python 資料分析(1):資料分析基礎](https://www.geekdigging.com/2020

SpringCloud服務呼叫負載均衡策略調整

比如我建立的一個訂單服務:order-service, 要呼叫我的商品服務product-service裡面的介面,預設使用輪詢的負載均衡策略 現在我要使用隨機分配,如何操作呢?   1.order-service的配置檔案application.yml裡面修改配置即可: 要指定呼叫的服務

ES 02-Linux中部署Elasticsearch單機服務(5.6.10版本)

目錄 1 前提: 安裝JDK 2 準備安裝包 3 建立ES專用使用者 4 啟動ES服務 5 驗證ES服務是否可用 6 關閉ES服務 7 重啟ES服務 8 常見問題的解決 此部署過程以Elasticsearch-5.6.10版本為例, 後續的學習和演示也用此版本.

ES 05 - 通過Kibana管理叢集服務

目錄 1 檢查叢集的健康狀況 2 檢視叢集中的節點個數 3 檢視叢集中的索引 4 簡單的索引操作 4.1 建立索引 4.2 刪除索引 前述步驟: ① 啟動Kibana; ② 通過瀏覽器訪問Kibana; ③ 進入Dev Tools(開發

python入門第一步

Python的安裝: 進入Python官方網站下載安裝包 點選導航欄的 Downloads 會自動識別你的windows系統 你會看到 Python3.6.2 和 Python2.7.13 (32位系統)的安裝包 注:Python3以後版本不再向Python2進行相容,所有如果你

Python()----判斷語句

一、判斷語句 1、if判斷語句 <1> if判斷語句介紹 if語句是用來進行判斷的,其使用格式如下: if 要判斷的條件: 條件成立時,要做的事情 demo1:(demo的中文意思:演示、案例) age = 30 print("------if判斷開始------") if ag

語句SQL筆記4

練習4: 做一個登入小程式,登入錯誤3次之後禁止登入 首先在Program.cs加入那段程式碼 string dataDir = AppDomain.CurrentDomain.BaseDirectory; if (dataDi

python新人爬蟲,學習筆記()——前期的環境準備

前幾天,我剛剛進行了爬蟲基本知識和學習背景的總結和筆記,今天記錄的是Python的爬蟲入門實踐須知。 首先,是環境的配置 學習python網路爬蟲技術當然需要在Python的環境下,對此,我們可以直接使用Python官網提供的各種不同版本的Python3,當

springcloud學習筆記服務提供、消費與ribbon

在學習筆記一里,我們簡單實現了一個註冊中心,我們就可以在上面進行服務的註冊與訂閱消費。 編寫服務,進行註冊 同樣,我們可以在STS中右鍵New->Spring Starter Project ,填寫相應內容->點選next 選擇需要的依賴包,我們這裡由於是構建一個服務提供

遊戲常用演算法】、A*啟發式搜尋演算法

  在上一篇部落格中,我們一起學習了隨機迷宮演算法,在本篇部落格中,我們將一起了解一下尋路演算法中常用的A*演算法。   通常情況下,迷宮尋路演算法可以使用深度優先或者廣度優先演算法,但是由於效率的原因,不會直接使用這些演算法,在路徑搜尋演算法中最常見的就是A*尋路演算法。使用A*演算法的魅力之處在於它不僅

JAVA《》--- 集合的介面、型別、方法拓展

Map HashMap中,如果是我們的自己定義的類的物件,作為鍵的時候,必須要重寫hashcode( )和equals( ),當然上層的HashSet,也同理 HashMap底層是陣列+單向連結串列的結構,陣列用於存放鍵的hash值,而連結串列用於儲存k-v結構