## 前言
* 在以往的單工程項目,所有代碼都融合在一起,業務相互調用只需要引入共有的工具類或者對應模塊的service。
* 但是到了微服務時代,已然不能使用這種方式,我們需要尋找新的解決方案。
* 若每個模塊都把需要調用模塊的service拷貝一份,那會令代碼非常冗余,影響整個工程的健壯性。
* 稍大一些的系統,會分成多個庫,比如用戶庫、訂單庫分開,訂單服務想要取到用戶的相關信息,由于不能連接到用戶的庫,所以無法直接新建數據庫查詢以達到目的。
* 這個時候,遠程調用方案出現,訂單服務只需調用用戶服務的API,就可以獲取所需信息,非常方便。
* 我們下面來學習,如何使用SpringCloud的Feign來進行微服務遠程調用。
## Feign簡介
Feign是一種聲明式、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠程服務時能與調用本地方法一樣的編碼體驗,開發者完全感知不到這是遠程方法,更感知不到這是個HTTP請求。
## 代碼示例
1. 我們以`blade-demo`中的服務為例,讓我們的`blade-desk`可以調用到`blade-demo`的API
2. 在`blade-demo-api`工程中創建一個新的`package`, `feign`

3. 在`package`,`feign`下創建一個接口類,命名為`BlogClient`
4. 增加如下代碼
~~~
package org.springblade.demo.feign;
import org.springblade.common.constant.CommonConstant;
import org.springblade.core.tool.api.R;
import org.springblade.demo.entity.Blog;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(
//定義Feign指向的service-id
value = CommonConstant.APPLICATION_DEMO_NAME
)
public interface BlogClient{
/**
* 接口前綴
*/
String API_PREFIX = "/api/blog";
/**
* 獲取詳情
*
* @param id 主鍵
* @return
*/
@GetMapping(API_PREFIX + "/detail")
R<Blog> detail(@RequestParam("id") Integer id);
}
~~~
5. 返回`blade-demo`,增加feign的實現類`BlogClientImpl`

6. 增加代碼如下,因為Feign本質上是HTTP客戶端,所以我們創建的`BlogClientImpl`其實就是`SpringMVC`的`Controller`,所以需要加上`@RestController`注解。
~~~
package org.springblade.demo.feign;
import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springblade.demo.entity.Blog;
import org.springblade.demo.service.BlogService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@AllArgsConstructor
public class BlogClientImpl implements BlogClient {
private BlogService service;
@Override
@GetMapping(API_PREFIX + "/detail")
public R<Blog> detail(Integer id) {
return R.data(service.getById(id));
}
}
~~~
7. 在`blade-desk`模塊的`pom.xml`文件引入`blade-demo`的API包

8. 找到`DashboardController`,新增如下代碼
~~~
private BlogClient client;
@GetMapping("/blog-detail")
public R<Blog> blogDetail(Integer id) {
R<Blog> result = client.detail(id);
return result;
}
~~~
9. 啟動`blade-desk`并使用Postman調用查看API遠程調用成功

10. 我們再來看下控制臺日志,請求先到了`/dashboard/blog-detail`,由于調用了`Feign`,程序又根據`Feign`的配置去查找名為`blade-demo`的服務,并調用對應方法,最后返回了所需數據,整個流程非常清晰

## 后話
* Feign調用我們已經走通,但是真實環境問題會很多,經常會有服務調用失敗的情況。
* 應對這種場景,我們有沒有什么好的解決方案?
* 下面我們來學習下`Hystrix 熔斷機制`
- 第零章 序
- 序言
- 系統架構
- 視頻公開課
- 開源版介紹
- 商業版介紹
- 功能對比
- 答疑流程
- 第一章 快速開始
- 升級必看
- 環境要求
- 環境準備
- 基礎環境安裝
- Docker安裝基礎服務
- Nacos安裝
- Sentinel安裝
- 插件安裝
- 建數據庫
- 工程導入
- 導入Cloud版本
- 導入Nacos配置
- 導入Boot版本
- 工程運行
- 運行Cloud版本
- 運行Boot版本
- 工程測試
- 測試Cloud版本
- 測試Boot版本
- 第二章 技術基礎
- Java
- Lambda
- Lambda 受檢異常處理
- Stream 簡介
- Stream API 一覽
- Stream API (上)
- Stream API (下)
- Optional 干掉空指針
- 函數式接口
- 新的日期 API
- Lombok
- SpringMVC
- Swagger
- Mybatis
- Mybatis-Plus
- 開發規范
- 第三章 開發初探
- 新建微服務工程
- 第一個API
- API鑒權
- API響應結果
- Redis緩存
- 第一個CRUD
- 建表
- 建Entity
- 建Service和Mapper
- 新增 API
- 修改 API
- 刪除 API
- 查詢 API
- 單條數據
- 多條數據
- 分頁
- 微服務遠程調用
- 聲明式服務調用 Feign
- 熔斷機制 Hystrix
- 第四章 開發進階
- 聚合文檔
- 鑒權配置
- 跨域處理
- Xss防注入
- 自定義啟動器
- Secure安全框架
- Token認證簡介
- Token認證配置
- PreAuth注解配置
- Token認證實戰
- Token認證加密
- 日志系統
- 原理解析
- 功能調用
- Seata分布式事務
- 簡介
- 編譯包啟動
- 配置nacos對接
- docker啟動
- 對接微服務
- 代碼生成配置
- 前言
- 數據庫建表
- 代碼生成
- 前端配置
- 優化效果
- 第五章 功能特性
- SaaS多租戶
- 概念
- 數據隔離配置
- 線程環境自定義租戶ID
- 多終端令牌認證
- 概念
- 系統升級
- 使用
- 第三方系統登錄
- 概念說明
- 對接說明
- 對接準備
- 配置說明
- 操作流程
- 后記
- UReport2報表
- 報表簡介
- 對接配置
- 報表后記
- 接口報文加密
- 簡介
- 運行邏輯
- 對接準備
- 功能配置
- 接口測試
- 改造查詢
- 改造提交
- 改造刪除
- 動態數據權限
- 數據權限簡介
- 數據權限開發
- 純注解配置
- Web全自動配置
- 注解半自動配置
- 數據權限注意點
- 動態接口權限
- 樂觀鎖配置
- 統一服務登陸配置
- Skywalking追蹤監控
- Minio分布式對象存儲
- Boot版本對接至Cloud
- 第六章 生產部署
- windows部署
- linux部署
- jar部署
- docker部署
- java環境安裝
- mysql安裝
- docker安裝
- docker-compose安裝
- harbor安裝
- 部署步驟
- 寶塔部署
- 準備工作
- 安裝工作
- 部署準備
- 部署后端
- 部署前端
- 部署域名
- 結束工作
- k8s平臺部署
- 第七章 版本控制
- Git遠程分支合并
- Git地址更換
- 第八章 學習資料
- 第九章 FAQ
- 第十章 聯系我們