openFeign远程调用
由于RestTemplate的灵活性不是很高因此我们有更好的方法事项远程调用,OpenFeign是一个声明式的Web Services客户端,类似于Controller调用Services,因此灵活性较高。
提前声明一下,由于Feign有两个starter我们在这里使用的是:spring-cloud-starter-openfeign。
在使用之前我们需要引入相关依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
由于此处我们是想要更好的进行”远程调用" 因此我们只需要在调用的一段加入这个依赖就行,服务端就没有必要加入依赖了。
添加依赖之后我么还需要使用@EnableFeignClients开启openfeign的功能,最后在调用端设置一个接口,这个接口就是进行远程调用的接口,并且在这个接口上添加@FeignClient注解但是任然需要设置一些参数,之后我们会进行介绍。
@FeignClient(value = "product-service",path = "/product") //进行远程调用
public interface ProductApi {@RequestMapping("/{productId}")ProductInfo getProductById( @PathVariable("productId") Integer productId);
}
接下来我们对@FeignClient中的参数进行讲解:
value:表示你想要调用的服务端的namespace,也就是微服务的名称。
path:定义当前FeignClient的统⼀前缀,也就是表示你想要调用的服务端的类似于作用在类之外的@RestMapping(“##”)中的“##”。
通过上述方式就可以在客户端进行远程调用,调用服务端product-Service的数据。
openfeign参数传递
传递单个参数:
@FeignClient(value = "product-service", path = "/product")
public interface ProductApi {
@RequestMapping("/p1")
String p1(@RequestParam("id") Integer id);
}
当然这里的@RequestParam并不是必须要添加的,根据响应的情况进行添加。设置之后就可以在调用端中对应的Service引入ProductApi并且调用p1方法就可以或去掉响应的返回值。
传递多个参数:
@RequestMapping("/p2")
String p2(@RequestParam("id")Integer id,@RequestParam("name")String name);
由此我们可以看出传递多个参数和传递单个参数十分相似,当然事实也是这样的,相较于传递单个参数传递多个参数只不过得将参数的个数增加了,其他的并没有什么改变。
传递对象:
@RequestMapping("/p3")
String p3(@SpringQueryMap ProductInfo productInfo);
传递对象就和前两者有所不同了 需要使用到@SpringQueryMap注解,使用时我们也就只需要将对象传递进去即可进行远程调用。
传递Json格式的数据:
@RequestMapping("/p4")
public String p4(@RequestBody ProductInfo productInfo){
return "接收到对象, productInfo:"+productInfo;
}
传递Json的数据是需要添加@RequestBody注解。