以前已經說過了SpringCloud做爲「分佈式微服務」的解決方案時的大概原理和方法了。就是一個個web應用之間的訪問,以前的訪問方式有兩種:java
@GetMapping("demo1/consumer/hello/{id}") public String hello(@PathVariable("id") String id){ //遠程調用provider中的接口 return restTemplate.getForObject("http://localhost:8001/demo1/provider/hello/"+id,String.class); }
@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訪問時,要對參數進行拼接。那麼有沒有更好的方法呢?web
並且,若是咱們想和RPC框架同樣(好比Dubbo等),使用本地接口就能夠訪問呢?那麼咱們就要引入Feign算法
既然咱們想像在本地訪問同樣來調用遠程「微服務」接口,固然,將遠程代碼寫在本項目中是不可能的,那麼就建立一個接口來訪問spring
其實你建立這個項目就是爲了讓消費者微服務進行依賴的,固然你能夠直接在你的消費者項目中建立這個接口,可是並不利於管理,因此就新建立了一個項目,專門用來寫feign的接口瀏覽器
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
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中的app
<!--以前的依賴省略,請查看源碼--> <!--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>
@EnableFeignClients(basePackages= {"cn.lyn4ever.provider"})
@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的服務提供者、剛纔建立的這個服務消費者,而後使用瀏覽器進行訪問負載均衡
更多關於SpringCloud的學習筆記以及代碼地址,關注微信公衆號「小魚與Java」回覆「SpringCloud」獲取框架