微服務互相呼叫-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微服務
- 微服務之間的呼叫(Ribbon與Feign)微服務
- [jaeger] 四、微服務之呼叫鏈(Feign+SpringCloud)微服務SpringGCCloud
- 129、springcloud-eureka-client微服務的互相呼叫SpringGCCloudclient微服務
- Spring Cloud微服務-基於Eureka的feign呼叫(1)SpringCloud微服務
- 微服務架構 | 4.2 基於 Feign 與 OpenFeign 的服務介面呼叫微服務架構
- SpringBoot+Eureka註冊中心+Feign進行微服務之間呼叫Spring Boot微服務
- SpringCloud微服務治理二(Robbin,Hystix,Feign)SpringGCCloud微服務
- 微服務Spring Cloud17_Feign9微服務SpringCloud
- 還在用Feign?推薦一款微服務間呼叫神器,跟SpringCloud絕配!微服務SpringGCCloud
- Spring Cloud Feign 宣告式服務呼叫SpringCloud
- 宣告式服務呼叫 Spring Cloud FeignSpringCloud
- SpringCloud-使用Feign呼叫服務介面SpringGCCloud
- Spring Cloud之微服務之間相互呼叫、如何讓一個微服務呼叫另外一個微服務SpringCloud微服務
- 微服務通訊之feign的配置隔離微服務
- 微服務通訊之feign整合負載均衡微服務負載
- Spring Cloud構建微服務架構(Feign)SpringCloud微服務架構
- Spring Cloud Alibaba(8)---Feign服務呼叫SpringCloud
- (22)SpringCloud-使用Feign呼叫服務介面SpringGCCloud
- spring cloud微服務快速教程之(十四)spring cloud feign使用okhttp3--以及feign呼叫引數丟失的說明SpringCloud微服務HTTP
- SpringCloud微服務(基於Eureka+Feign+Hystrix+Zuul)SpringGCCloud微服務Zuul
- go微服務系列(三) - 服務呼叫(http)Go微服務HTTP
- groovy與javah互相呼叫Java
- doc,view,frame互相呼叫View
- Eureka的微服務之間呼叫微服務
- 微服務之間的相互呼叫微服務
- Eureka實現微服務的呼叫微服務
- Spring Cloud構建微服務架構—服務消費(Feign)SpringCloud微服務架構
- Spring Cloud構建微服務架構—服務消費FeignSpringCloud微服務架構
- SpringCloud系列之使用Feign進行服務呼叫SpringGCCloud
- SpringCloud之服務提供與呼叫(Ribbon,Feign)SpringGCCloud
- SpringCloud之使用Feign跨服務呼叫最佳方式SpringGCCloud
- 微服務呼叫鏈追蹤中心搭建微服務
- Eureka-實現微服務的呼叫微服務
- Unity——Js和Unity互相呼叫UnityJS
- 被標記為事務的方法互相呼叫的坑(下)
- 被標記為事務的方法互相呼叫的坑(上)