以前已經說過了SpringCloud做爲「分佈式微服務」的解決方案時的大概原理和方法了。就是一個個web應用之間的訪問,以前的訪問方式有兩種:git
使用RestTemplate這個封裝好的類,使用ip+端口+服務地址進行訪問,這是最簡單的訪問方式了web
@GetMapping("demo3/consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
//遠程調用provider中的接口
return restTemplate.getForObject("http://localhost:8001/demo1/provider/hello/"+id,String.class);
}
使用Ribbon進行訪問負載均衡,也就是將「提供者」註冊到註冊中心,而後「消費者」使用微服務名進行訪問算法
@GetMapping("demo3/consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
//遠程調用provider中的接口
return restTemplate.getForObject("http://demo3-ribbon-provider/demo3/provider/hello/"+id,String.class);
}
可是呢?這麼訪問仍是很麻煩,使用restTemplate訪問時,要對參數進行拼接。那麼有沒有更好的方法呢?spring
並且,若是咱們想和RPC框架同樣(好比Dubbo等),使用本地接口就能夠訪問呢?那麼咱們就要引入Feign瀏覽器
1. 建立一個服務訪問的接口
既然咱們想像在本地訪問同樣來調用遠程「微服務」接口,固然,將遠程代碼寫在本項目中是不可能的,那麼就建立一個接口來訪問微信
建立一個新的項目 demo4-feign-interfaceapp
其實你建立這個項目就是爲了讓消費者微服務進行依賴的,固然你能夠直接在你的消費者項目中建立這個接口,可是並不利於管理,因此就新建立了一個項目,專門用來寫feign的接口負載均衡
pom.xml(導入Feign客戶端的依賴)框架
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
而後編寫接口的Service類maven
package cn.lyn4ever.provider;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* 這個註解代表這是一個Feign的客戶端,
* 其中的value屬性就是目標微服務的服務名
*/
@FeignClient(value = "demo3-ribbon-provider")
public interface ProviderService {
/**
* 這個實際上是provider提供者中的方法
*
* @param id
* @return
*/
@GetMapping("demo3/provider/hello/{id}")
public String hello(@PathVariable("id") Integer id);
}
主要看一下上邊的FeignClient註解中的value值,就是目標微服務中的服務名
這個hello()方法以及註解中的內容,所有都是項目demo3-ribbon-provider中的
而後,使用maven的命令,clean 而後install到本地倉庫中以便於其餘的項目進行調用
這個應用只是作爲一個消費者的依賴,因此並不須要啓動類
2.建立一個新的項目,使用Feign進行訪問
建立新的使用Feign的消費者項目,將以前的demo3-consumer複製一份,而後修改以下:
pom.xml添加feign的依賴和咱們以前建立的demo4-feign-interface
<!--以前的依賴省略,請查看源碼-->
<!--feign的依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!--以前建立的feign接口項目-->
<dependency>
<groupId>cn.lyn4ever</groupId>
<artifactId>demo4-feign-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
application.yml 不用修改,仍是將以前的配置文件複製過來
在啓動類上添加註解,聲明Feign的調用包名
@EnableFeignClients(basePackages= {"cn.lyn4ever.provider"})
接下來就是修改咱們的controller類,可使用本地接口進行訪問了
@RestController
public class HelloConsumerController {
@Autowired
private ProviderService providerService;
@GetMapping("demo4/consumer/hello/{id}")
public String hello(@PathVariable("id") Integer id){
//直接使用本地的接口就能夠訪問了
return providerService.hello(id);
}
}
這樣就算完了,啓動Eureka集羣、三個provicder的服務提供者、剛纔建立的這個服務消費者,而後使用瀏覽器進行訪問
3.使用Feign進行訪問有什麼好處及其原理?
使用FeignClient訪問時,能夠不用再使用ip+port或者使用微服務名進行訪問。能夠直接在Autowired後,在本地調用方法
其實就是Feign在本地生成了動態代理,能夠直接使用Autowired調用。其本質仍是使用Ribbon進行負載均衡訪問
Feign中內置了Ribbon進行負載均衡,因此也一樣能夠像Ribbon同樣進行自定義負載均衡算法
掃碼關注後回覆「SpringCloud」獲取更多SpringCloud的學習筆記以及代碼地址
本文分享自微信公衆號 - 小魚與Java(Fish_Java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。