微服務互相呼叫-Feign
背景
實際開發中我們經常會面臨在同一個eureka註冊中心下的各個微服務之間互相呼叫彼此的介面來獲取預期的資料。通過Spring Cloud Feign,我們只需要建立一個介面並用註解的方式來配置它,即可完成對服務提供方的介面繫結。
被呼叫服務及介面: hello-service服務的/hello介面。返回 hello world.
主微服務:feign-consumer
步驟
修改pom.xml
建立spring boot工程feign-comsumer,在pom.xml中引入spring-cloud-starter-eureka和spring-cloud-starter-feign
1 2 3 4 5 6 7 8 9 | <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> |
修改主類
修改應用主類ConsumerApplication,並通過@EnableFeignClients註解開啟Spring Cloud Feign的支援功能。
1 2 3 4 5 6 | @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication public class ConsumerApplication { ... } |
建立介面
定義HelloService介面,通過@FeignClient註解指定服務名來繫結服務,然後再使用Spring MVC的註解來繫結具體該服務提供的REST介面。
1 2 3 4 5 | public interface HelloService{ String hello(); } |
建立controller
接著建立一個controller來實現對Feign客戶端的呼叫。使用@Autowired直接注入上面定義的HelloService例項,並在helloConsumer函式中呼叫這個便規定了hello-service服務介面的客戶端來向該服務發起/hello介面呼叫。
1 2 3 4 5 6 7 8 9 10 | @RestController public class ConsumerController{ @Autowired HelloService helloService; @RequestMapping(value="/feign-consumer",method=RequestMethod.GET) public String helloConsumer(){ return helloService.hello(); } } |
引數繫結
上面的例子中我們實現的是一個不帶引數的REST服務繫結。然而現實系統中的各種業務介面要比它複雜的多,我們會在HTTP的各個位置傳入各種不同型別的引數,並且在返回請求響應的時候也可能是一個複雜的物件結構。
修改介面宣告
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @FeignClient("hello-service") public interface HelloService{ @RequestMapping("/hello") String hello(); @RequestMapping(value="/hello1",method-RequestMethod.GET) String hello(@RequestParam("name") String name); @RequestMapping(value="/hello2",method-RequestMethod.GET) User hello(@RequestHeader("name") String name); @RequestMapping(value="/hello3",method-RequestMethod.GET) String hello(@RequestBody User user); } |
注意:在定義各引數繫結時,@RequestParam, @RequestHeader 等可以指定引數名稱的註解,它們的value千萬不能少。在springmvc程式中,這些註解會根據引數名來作為預設值,但是Feign中繫結引數必須通過value屬性來指明具體的引數名,否則會丟擲IllegalStateException異常,value屬性不能為空
相關文章
- 微服務呼叫元件 Feign微服務元件
- Eureka微服務之間呼叫-feign微服務
- 129、springcloud-eureka-client微服務的互相呼叫SpringGCCloudclient微服務
- [jaeger] 四、微服務之呼叫鏈(Feign+SpringCloud)微服務SpringGCCloud
- Spring Cloud微服務-基於Eureka的feign呼叫(1)SpringCloud微服務
- 微服務架構 | 4.2 基於 Feign 與 OpenFeign 的服務介面呼叫微服務架構
- SpringBoot+Eureka註冊中心+Feign進行微服務之間呼叫Spring Boot微服務
- SpringCloud-使用Feign呼叫服務介面SpringGCCloud
- Spring Cloud Alibaba(8)---Feign服務呼叫SpringCloud
- Spring Cloud Feign 宣告式服務呼叫SpringCloud
- 宣告式服務呼叫 Spring Cloud FeignSpringCloud
- 還在用Feign?推薦一款微服務間呼叫神器,跟SpringCloud絕配!微服務SpringGCCloud
- 微服務Spring Cloud17_Feign9微服務SpringCloud
- SpringCloud微服務治理二(Robbin,Hystix,Feign)SpringGCCloud微服務
- (22)SpringCloud-使用Feign呼叫服務介面SpringGCCloud
- SpringCloud之服務提供與呼叫(Ribbon,Feign)SpringGCCloud
- spring cloud微服務快速教程之(十四)spring cloud feign使用okhttp3--以及feign呼叫引數丟失的說明SpringCloud微服務HTTP
- SpringCloud系列之使用Feign進行服務呼叫SpringGCCloud
- SpringCloud之使用Feign跨服務呼叫最佳方式SpringGCCloud
- Spring Cloud之微服務之間相互呼叫、如何讓一個微服務呼叫另外一個微服務SpringCloud微服務
- 微服務通訊之feign的配置隔離微服務
- 微服務通訊之feign整合負載均衡微服務負載
- SpringCloud微服務(基於Eureka+Feign+Hystrix+Zuul)SpringGCCloud微服務Zuul
- Unity——Js和Unity互相呼叫UnityJS
- Eureka的微服務之間呼叫微服務
- 微服務之間的相互呼叫微服務
- Eureka實現微服務的呼叫微服務
- go微服務系列(三) - 服務呼叫(http)Go微服務HTTP
- Spring Cloud Alibaba系列(三)使用feign進行服務呼叫SpringCloud
- ②SpringCloud 實戰:引入Feign元件,發起服務間呼叫SpringGCCloud元件
- 被標記為事務的方法互相呼叫的坑(下)
- 被標記為事務的方法互相呼叫的坑(上)
- 微服務實戰SpringCloud之Spring Cloud Feign替代HTTP Client微服務SpringGCCloudHTTPclient
- spring cloud微服務分散式雲架構-服務消費者FeignSpringCloud微服務分散式架構
- 微服務之Eureka(二)服務中心互相註冊-Ribbon的結合使用微服務
- SpringCloud(一)微服務遠端呼叫 -- RestTemplateSpringGCCloud微服務REST
- Eureka-實現微服務的呼叫微服務
- 微服務呼叫鏈追蹤中心搭建微服務