1. 程式人生 > >【微服務】之五:輕鬆搞定SpringCloud微服務-呼叫遠端元件Feign

【微服務】之五:輕鬆搞定SpringCloud微服務-呼叫遠端元件Feign

上一篇文章講到了負載均衡在Spring Cloud體系中的體現,其實Spring Cloud是提供了多種客戶端呼叫的元件,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在呼叫遠端服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的非同步HTTP Client, Spring的RestTemplate。但是,用起來最方便、最優雅的還是要屬Feign了。今天這一篇文章是系列教程中第五篇,也是對負載均衡的第二篇,主要對Spring Cloud Feign的實戰。

本系列教程

Feign簡介

Feign是一種宣告式、模板化的HTTP客戶端,也是netflix公司元件。使用feign可以在遠端呼叫另外服務的API,如果呼叫本地API一樣。
我們知道,阿里巴巴的doubbo採用二進位制的RPC協議進行底層通訊,客戶端可以使用類似本地方法一樣呼叫。那麼,雖然Feign同樣可以有這種效果,但是底層還是通過HTTP協議調取restful的API的方式。
通過Feign, 我們能把HTTP遠端呼叫對開發者完全透明,得到與呼叫本地方法一致的編碼體驗。

Spring Cloud Feign

開始起飛

起飛之前,先說明一下,本篇文章還是會在之前文章的原始碼繼續。因此同樣需要服務發現中心、服務配置中心、服務、客戶端等微服務,因此沿用之前的專案中的子專案。

建立客戶端服務

為了方便,可以直接複製上一片文章中的cloud-hyh-ribbon-test-client 子專案。並命名為新子專案。

配置客戶端Pom檔案

<dependencies>
    <!--服務發現eureka元件 依賴-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <!--web支援 依賴-->
    <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>
    </dependency>
    <!--feign依賴 配置-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
</dependencies>
<!--構建-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

配置檔案配置

對resources檔案下配置檔案進行配置。

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8081/eureka/
  instance:
    appname: feign-client

server:
  port: 8093

spring:
  application:
    name: ribbon-client

啟動類編寫

建立子包以後,建立主類FeignApplication.java


/**
 * @Description :啟動類,示範feign
 * @Author hanyahong
 * @Date 2017/12/10- 07:00
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignClientApplication.class, args);
    }
}

說明:
@EnableFeignClients :該註解是開啟feign的掃描。

建立服務層

建立資料夾service ,然後建立TestService.java。

/**
 * @Description :測試feign介面服務
 * @Author hanyahong
 * @Date 2017/12/10- 12:43
 * <p>
 * 通過在本服務的service層直接呼叫其他服務的api層的API介面進行相關操作。
 * cloud-service 是一個簡單服務,測試返回一個獲取部落格名稱的介面。
 */

@FeignClient("cloud-service")
public interface TestService {

    /**
     * 調取部落格名稱
     *
     * @return 部落格名稱
     */
    @GetMapping("/ribbon/name")
    String getBlogName();
}

說明:
@FeignClient 註解:就是你要呼叫的微服務介面所在的服務名。
比如A服務想呼叫B服務的服務。就要填寫B服務的服務名。
@GetMapping註解:就是要呼叫的介面rest資源路徑。

API層介面

我們將建立一個介面,暴露出去,可以呼叫剛才服務層的這個介面。

/**
 * @Description :部落格操作API,對外暴露
 * @Author hanyahong
 * @Date 2017/12/10- 12:53
 */
@RestController
@RequestMapping(value = "/feign")
public class BlogApi {
    /**
     * 注入服務層介面
     */
    @Autowired
    TestService testService;


    /**
     * 通過Feign客戶端的方式,呼叫之前一個服務的API
     *
     * @return
     */
    @RequestMapping("/blogName")
    public String getBlogNameByFeign() {
        return "通過feign方式得到:" + testService.getBlogName();
    }
}

目錄參考

目錄參考.png

啟動專案群並測試

啟動註冊中心、配置中心、兩個相同配置服務、還有一個本文建立的客戶端cloud-hyh-test-feign.

檢視是否啟動成功

訪問註冊中心,檢視是否全部啟動。
image.png

已經啟動成功!

訪問測試

訪問地址http://localhost:8093/feign/blogName 路徑,檢視是否成功返回需要的資料。

結果顯示:

通過feign方式得到:千萬之路剛開始-www.hanyahong.com-beijing該伺服器埠8072

原始碼

本文出處:http://www.hanyahong.com/
Github原始碼:https://github.com/hanyahong/spring-cloud-microservice
轉發請註明出處!

相關推薦

服務輕鬆SpringCloud服務-呼叫遠端元件Feign

上一篇文章講到了負載均衡在Spring Cloud體系中的體現,其實Spring Cloud是提供了多種客戶端呼叫的元件,各個微服務都是以HTTP介面的形式暴露自身服務的,因此在呼叫遠端服務時就必須使用HTTP客戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、

服務輕鬆SpringCloud服務-負載均衡Ribbon

對於任何一個高可用高負載的系統來說,負載均衡是一個必不可少的名稱。在大型分散式計算體系中,某個服務在單例的情況下,很難應對各種突發情況。因此,負載均衡是為了讓系統在效能出現瓶頸或者其中一些出現狀態下可以進行分發業務量的解決方案。在SpringCloud 體系當中,加入了Netflix公司的很多優秀產品,其中

服務輕鬆SpringCloud服務-API閘道器zuul

通過前面幾篇文章的介紹,我們可以輕鬆搭建起來微服務體系中比較重要的幾個基礎構建服務。那麼,在本篇博文中,我們重點講解一下,如何將所有微服務的API同意對外暴露,這個就設計API閘道器的概念。 本系列教程 閘道器名稱解釋 閘道器(Gateway)又稱網間聯結器、協議轉換器。閘道器在網路層以上實現網路互連,

服務輕鬆SpringCloud服務-API許可權控制

許可權控制,是一個系統當中必須的重要功能。張三隻能訪問輸入張三的特定功能,李四不能訪問屬於趙六的特定選單。這就要求對整個體系做一個完善的許可權控制體系。該體系應該具備針區分使用者、許可權、角色等各種必須的功能。 本系列教程 本系列為連載文章,閱讀本文之前強烈建議您先閱讀前面幾篇。 上一節我們講到AP

服務從零開始,輕鬆SpringCloud服務-配置中心

官方解釋 Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration

服務從零開始,輕鬆SpringCloud服務系列--註冊中心(一)

微服務體系,有效解決專案龐大、互相依賴的問題。目前SpringCloud體系有強大的一整套針對微服務的解決方案。本文中,重點對微服務體系中的服務發現註冊中心進行詳細說明。本篇中的註冊中心,採用Netflix 公司的Eureka。 註冊中心簡介 Netflix Eureka:雲端負載均衡,一個基於 RES

框架之一從零開始,輕鬆SpringCloud服務系列--開山篇(spring boot 小demo)

Spring頂級框架有眾多,那麼接下的篇幅,我將重點講解SpringCloud微框架的實現 Spring 頂級專案,包含眾多,我們重點學習一下,SpringCloud專案以及SpringBoot專案 ————————————————————main———————————————————— 一

框架之一從零開始,輕鬆SpringCloud框架系列--開山篇

一、SpringCloud專案簡介   Spring Cloud:     微服務工具包,為開發者提供了在分散式系統的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排等開發工具包。   Spring Boot:     旨在簡化建立產品級的 Spring

服務輕松SpringCloud服務-API權限控制

cat https lte urn 錯誤碼 netflix req ons 體系 權限控制,是一個系統當中必須的重要功能。張三只能訪問輸入張三的特定功能,李四不能訪問屬於趙六的特定菜單。這就要求對整個體系做一個完善的權限控制體系。該體系應該具備針區分用戶、權限、角色等各種

服務輕松SpringCloud服務-API網關zuul

公司 create lan ice 子項目 專題 系統 如果 rose 通過前面幾篇文章的介紹,我們可以輕松搭建起來微服務體系中比較重要的幾個基礎構建服務。那麽,在本篇博文中,我們重點講解一下,如何將所有微服務的API同意對外暴露,這個就設計API網關的概念。 本系列教

Java並發編程volatile變量修飾符—意料之外的問題(含代碼)

功能 模式 aik 執行 方法 end bold 有變 目的 轉載請註明出處: volatile用處說明 在JDK1.2之前,Java的內存模型實現總是從主存(即共享內存)讀取變量,是不需要進行特別的註意的。而隨著JVM的成熟和優化,現在在多線程環境下vo

Java 安全技術探索路系列J2SE安全架構類載入器

【Java 安全技術探索之路系列:J2SE安全架構】章節列表 一 類載入器的作用 1.1 名字空間的隔離(Name Space Separation) 把名字空間隔離以防止有意或無意的名字衝突問題。 1.2 包邊界保護(Packa

深入Java虛擬機器Java垃圾收集機制

物件引用     Java中的垃圾回收一般是在Java堆中進行,因為堆中幾乎存放了Java中所有的物件例項。談到Java堆中的垃圾回收,自然要談到引用。在JDK1.2之前,Java中的引用定義很很純粹:如果reference型別的資料中儲存的數值代表的是另外一塊

Java併發程式設計volatile變數修飾符—意料之外的問題(含程式碼)

示例程式 下面給出一段程式碼,通過其執行結果來說明使用關鍵字volatile產生的差異,但實際上遇到了意料之外的問題: public class Volatile extends Object implements Runnable { //value變數沒有被標記為volatile private

JAVA進階架構師指南JVM效能調優

## 前言   首先給大家說聲對不起,最近屬實太忙了,白天上班,晚上加班,回家還要收拾家裡,基本每天做完所有事兒都是凌晨一兩點了,沒有精力再搞其他的了.   好了,進入正題,讓我們來聊聊JVM篇最後一個章節----JVM效能調優.童鞋們隨便開啟一個大廠的招聘崗位JD,應該都會有JVM調優相關的描述,其實招

如何安裝和配置打印服務將打印機發布到活動目錄實現智能手動添加

是否 blog col 詳細信息 and 手動 應用 所有 文檔 如何安裝和配置打印服務器之四:使用組策略部署打印機 ?Lander Zhang 專註外企按需IT基礎架構運維服務,IT Helpdesk 實戰培訓踐行者http://blog.51cto.com/lander

spring系列6bean的初始化和銷燬方法

bean的生命週期:bean建立---初始化----銷燬的過程 容器管理bean的生命週期:我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法 構造(物件建立): 單例項:在容器啟動的時候建立物件 多例項:在每次獲

spring系列8屬性賦值

一:使用@Value賦值     基本數值     可以寫SpEL; #{}     可以寫${};取出配置檔案【properties】中的值(在執行環境變數裡面的值) demo:set,get省略 @Value("張三") private String na

spring系列14spring宣告式事務實現原理剖析

通過上一節事務環境搭建,我們知道,在搭建的5個步驟中,有兩個是spring為我們提供底層去稍作配置,然後使用的, 這兩個操作涉及的便是: @EnableTransactionManagement PlatformTransactionManager 其中,Platfor

spring系列7生命週期-BeanPostProcessor原理以及在spring底層中的運用

本章節重點說一下我們自定義的BeanPostProcessor的執行機制和呼叫棧。 事前準備: 1.自定義beanPostProcessor 2.註冊自定義的beanPostProcessor到容器中 1.自定義beanPostProcessor @Componen