在使用restTemplate訪問遠程接口的時候捍壤,我們難以將接口管理起來,當(dāng)接口變動的時候我們可能會修改多處。Spring Cloud 提供OpenFeign來解決這個問題冒黑。本文將通過配置OpenFeign來訪問遠程服務(wù)试伙。
系列文章
SpringCloud(一)-手把手教你創(chuàng)建springcloud微服務(wù)父子項目
SpringCloud(二)-手把手教你搭建Eureka Server和Eureka Client
SpringCloud(三)-手把手教你通過Rinbbon實現(xiàn)客戶端負載均衡
SpringCloud(四)-手把手教你使用OpenFeign
SpringCloud(五)-手把手教你使用Hystrix配置服務(wù)熔斷和降級以及Hystrix Dashboard
SpringCloud(六)-手把手教你搭建SpringCloud Config配置中心
SpringCloud(七)-手把手教你使用消息總線Bus實現(xiàn)動態(tài)刷新
SpringCloud(八)-手把手教你使用Stream消息驅(qū)動
1. OpenFeign簡介
OpenFeign是一種聲明式嘁信、模板化的HTTP客戶端。在Spring Cloud中使用OpenFeign疏叨,可以做到使用HTTP請求訪問遠程服務(wù)潘靖,就像調(diào)用本地方法一樣的,開發(fā)者完全感知不到這是在調(diào)用遠程方法蚤蔓,更感知不到在訪問HTTP請求卦溢。
2. 配置OpenFeign
2.1 配置pom.xml
找到服務(wù)消費者8200項目,修改pom.xml添加依賴
<!--openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2 主啟動類加上注解@EnableFeignClients注解
@EnableFeignClients申明該項目是Feign客戶端秀又,掃描對應(yīng)的feign client单寂。
package com.elio.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
public class ProductConsumer8200 {
public static void main(String[] args){
SpringApplication.run(ProductConsumer8200.class, args);
}
}
2.3 新增提供者API接口
我們需要集中化管理API,就可以通過接口統(tǒng)一管理涮坐,需要新增商品服務(wù)的接口類ProductService凄贩,并添加@FeignClient(name="springcloud-product-provider")注解,其中name就是我們要訪問的微服務(wù)的名稱袱讹。比如getServiceInfo方法中@GetMapping("product/provider/get/info")和服務(wù)提供者8100的接口路徑是一樣的疲扎。
package com.elio.springcloud.service;
import com.elio.springcloud.dto.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Component
@FeignClient(name="springcloud-product-provider")
public interface ProductService {
/**
* 查詢
* @return
*/
@GetMapping("product/provider/get/info")
public Result getServiceInfo();
/**
* 查詢
* @param id
* @return
*/
@GetMapping("product/provider/get/{id}")
public Result selectById(@PathVariable("id") Long id);
}
2.4 修改消費者Controller
現(xiàn)在接口已經(jīng)封裝在了ProductService里面了,因此在消費者Controller捷雕,我們不用再通過微服務(wù)名加地址去訪問了椒丧,修改后的Controller如下
package com.elio.springcloud.controller;
import com.elio.springcloud.dto.Result;
import com.elio.springcloud.service.ProductService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
public class ProductConsumerController {
@Resource
RestTemplate restTemplate;
@Resource
ProductService productService;
//public static String url = "http://localhost:8100/";
public static String url = "http://springcloud-product-provider/";
/**
* 查詢
* @return
*/
@GetMapping("product/consumer/get/info")
public Result getServiceInfo(){
return productService.getServiceInfo();
/*return new Result(200, "查詢成功",
restTemplate.getForObject(url+"product/provider/get/info", Result.class));*/
}
/**
* 查詢
* @param id
* @return
*/
@GetMapping("product/consumer/get/{id}")
public Result selectById(@PathVariable("id") Long id){
return productService.selectById(id);
/* return new Result(200, "查詢成功",
restTemplate.getForObject(url+"product/provider/get/"+id, Result.class));*/
}
}
2.5 測試
現(xiàn)在我們已經(jīng)配置好了消費端通過OpenFeign調(diào)用遠程接口,接下來就是重啟消費端服務(wù)8200救巷,重啟后壶熏,瀏覽器訪問消費者API
3. 總結(jié)
本文簡單介紹了如何通過OpenFeign訪問提供者的服務(wù),不僅有效的管理了API,還集成了Ribbon實現(xiàn)了負載均衡的功能∑忠耄現(xiàn)在的項目貌似已經(jīng)很完美了棒假, 既可以是實現(xiàn)服務(wù)注冊也可以實現(xiàn)服務(wù)發(fā)現(xiàn)溯职,還可以實現(xiàn)負載均衡功能,但是假如服務(wù)提供者返回一個錯誤的話帽哑,那么消費者將直接在瀏覽器展示錯誤頁面谜酒,這是不合理的,這個問題我們將在下一篇文章中解決妻枕。