微服務互相呼叫-Feign

javafanwk發表於2018-06-13

背景

實際開發中我們經常會面臨在同一個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
@FeignClient("hello-service")
public interface HelloService{
	@RequestMapping("/hello")
	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屬性不能為空

相關文章