[菜鳥SpringCloud入門]第四章:遠端呼叫服務實戰

qqxx6661發表於2019-03-12

在這裡插入圖片描述

前言

歡迎來到菜鳥SpringCloud入門實戰系列(SpringCloudForNoob),該系列通過層層遞進的實戰視角,來一步步學習和理解SpringCloud。

本系列適合有一定Java以及SpringBoot基礎的同學閱讀。

每篇文章末尾都附有本文對應的Github原始碼,方便同學除錯。

Github倉庫地址:

https://github.com/qqxx6661/springcloud_for_noob

菜鳥SpringCloud入門實戰系列

你可以通過以下兩種途徑檢視菜鳥SpringCloud入門實戰系列

前文回顧:

實戰版本

  • SpringBoot:2.0.3.RELEASE
  • SpringCloud:Finchley.RELEASE

-----正文開始-----

遠端呼叫服務實戰

本章節中需要有三個角色:服務註冊中心(對應前文中我們的eureka子模組)、服務提供者(對應前文中我們的eureka-hi子模組)、服務消費者,其中服務註冊中心就是我們上一篇的eureka單機版啟動既可,流程是首先啟動註冊中心,服務提供者生產服務並註冊到服務中心中,消費者從服務中心中獲取服務並執行。

服務提供者:使用原來的eureka-hi子模組

子模組不需要做更改。

值得注意的是,你可以使用@EnableDiscoveryClient代替@EnableEurekaClient

兩者的區別:

https://www.jianshu.com/p/f6db3117864f

註解@EnableEurekaClient上有@EnableDiscoveryClient註解,可以說基本就是EnableEurekaClient有@EnableDiscoveryClient的功能,另外上面的註釋中提到,其實@EnableEurekaClientz註解就是一種方便使用eureka的註解而已,可以說使用其他的註冊中心後,都可以使用@EnableDiscoveryClient註解,但是使用@EnableEurekaClient的情景,就是在服務採用eureka作為註冊中心的時候,使用場景較為單一。

服務消費者:新建service-feign子模組

建立子模組service-feign,步驟和之前類似,請參考教程第一章。

修改pom.xml,引入:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
複製程式碼

然後在主程式引入:

@EnableFeignClients
@EnableEurekaClient
複製程式碼

這時候,我的springboot2.0.3又出事了,@EnableFeignClients無法引入,需要將pom.xml的引入修改為:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <!--spring boot 2.0.3版本解決方案:spring-cloud-starter-feign-->
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
複製程式碼

補充:Spring Boot 2下使用Feign找不到@EnableFeignClients的解決辦法

https://blog.csdn.net/alinyua/article/details/80070890

該作者給了一個完整的解決無法引入包問題的思路,文章篇幅很長,思路值得學習!

之後,修改application.yml:

server:
  # 服務埠號
  port: 8765
spring:
  application:
    # 服務名,即serviceId
    name: service-feign
eureka:
  client:
    serviceUrl:
      # 安全認證的服務註冊中心地址
      defaultZone: http://localhost:8761/eureka
複製程式碼

遠端呼叫

首先回顧一下eureka-hi的方法,它提供了一個上述eureka-hi服務提供了一個RESTful風格的介面:

/** 獲取埠號 */
@Value("${server.port}")
String port;

/**
 * 定義一個簡單介面
 * @param name
 * @return
 */
@GetMapping("/hi/{name}")
public String home(@PathVariable String name){
    return "hi " + name + ",I am from service-hi, port :" + port;
}
複製程式碼
  • 行為:GET
  • 資源:/hi/{name}

編寫呼叫eureka-hi提供的介面的本地介面ServiceHi.java,如下:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * <p>一個Feign服務消費者介面</p>
 **/
@FeignClient(value = "service-hi")
public interface ServiceHi {
    /**
     * <p>通過Feign偽Http客戶端呼叫service-hi提供的服務</p>
     * @author hanchao 2018/5/19 17:59
     **/
    @GetMapping("/hi/{name}")
    String sayHiFromServiceHi(@PathVariable(value = "name") String name);
}

複製程式碼

說明:

  • 通過@FeignClient標識當前介面是一個Feign客戶端,value = "service-hi"表示其針對的是名為service-hi的服務。
  • service-hi則是我們eureka-hi子模組的spring.application.name,這個name已經在eureka註冊過
  • sayHiFromServiceHi方法為偽裝成HTTP客戶端方法,與eureka-hi的[GET] /hi/{name}服務介面相對應。

之後,新建HelloController.java,如下:


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>服務消費控制層</p>
 **/
@RestController
public class HelloController {

    /** 注入服務"service-hi"的Feign客戶端ServiceHi */
    @Autowired
    private ServiceHi serviceHi;

    /**
     * 呼叫Feign客戶端提供的服務,自帶負載均衡
     * @param name
     * @return
     */
    @GetMapping("/hello/{name}")
    public String sayHi(@PathVariable String name){
        //呼叫Feign客戶端ScheduleServiceHi的介面
        return serviceHi.sayHiFromServiceHi(name);
    }
}
複製程式碼

重點:

  • serviceHi.sayHiFromServiceHi(name)即通過Feign呼叫偽HTTP客戶端的服務介面。

至此我們已經配置完畢,依次啟動服務eureka、eureka-hi和service-feign。可以看到兩個服務都已經在eureka註冊:

在這裡插入圖片描述

訪問 http://localhost:8765/hello/rude3knife ,即service-feign提供的服務介面。 這個服務介面會通過Feign去呼叫服務eureka-hi提供的服務介面,結果顯示服務間呼叫成功。

在這裡插入圖片描述

在該呼叫中,我們feign並不需要指定埠號,它並不知道這個方法所在的服務提供者現在在哪個埠執行,我們只需要向eureka尋求服務。

三個模組的拓撲圖如下:

在這裡插入圖片描述

測試Feign負載均衡

Feign會對服務呼叫進行負載平衡,我們需要同時開啟兩個eureka-hi服務,由於在同一臺電腦上,就得把埠號從8763改為8764,然後同時開啟8763和8764兩個服務。

要同時執行兩個埠不同的相同服務,需要在run configuration裡面把allow parallle開啟:

在這裡插入圖片描述

執行結構是這樣的:

在這裡插入圖片描述
可以看到有兩個Service-Hi進行了註冊:

在這裡插入圖片描述

訪問http://localhost:8765/hello/rude3knife

連續訪問兩次,發現兩次會分別取呼叫eureka-hi的兩個服務節點:

在這裡插入圖片描述
在這裡插入圖片描述

最後是負載平衡的拓撲圖:

在這裡插入圖片描述

本章程式碼

https://github.com/qqxx6661/springcloud_for_noob/tree/master/04-servier-feign

參考

Spring-Cloud筆記04:服務消費者Feign

https://blog.csdn.net/hanchao5272/article/details/80574441

springcloud(三):服務提供與呼叫

http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html

-----正文結束-----

菜鳥SpringCloud實戰專欄全導航:通過以下兩種途徑檢視

關注我

我是蠻三刀把刀,後端開發。

主要關注後端開發,資料安全,爬蟲等方向。

來微信和我聊聊:yangzd1102

Github個人主頁:

github.com/qqxx6661

原創部落格主要內容

  • Java知識點複習全手冊
  • Leetcode演算法題解析
  • 劍指offer演算法題解析
  • Python爬蟲相關技術實戰
  • 後端開發相關技術實戰
  • SpringCloud入門實戰

同步更新公眾號及以下部落格

1. Csdn

blog.csdn.net/qqxx6661

擁有專欄:

  • Leetcode題解(Java/Python)
  • Python爬蟲實戰
  • Java程式設計師知識點複習手冊
  • SpringCloud入門實戰

2. 知乎

www.zhihu.com/people/yang…

擁有專欄:

  • Java程式設計師面試複習手冊
  • LeetCode演算法題詳解與程式碼實現
  • 後臺開發實戰

3. 掘金

juejin.im/user/5b4801…

4. 簡書

www.jianshu.com/u/b5f225ca2…

個人公眾號:Rude3Knife

個人公眾號:Rude3Knife

如果文章對你有幫助,不妨收藏起來並轉發給您的朋友們~

相關文章