微服务之间的交互-Feign

我们知道Eureka Client会保存各个服务的信息,其中包含各个服务的地址。

那么服务之间到底是怎样通过这些信息进行交互的呢?

Spring Cloud服务间的调用默认支持两种方式——Ribbon和Feign,具体来说就是使用RestTemplate和FeignClient来调用。

不管使用什么方式,本质上都是通过调用服务的HTTP接口进行交互,而参数和结果默认都是通过Jackson序列化和反序列化。

 

9.4节中,我们通过RestTemplate在商品微服务和订单微服务之间进行了HTTP请求,在内部请求过程中使用了“http://goods/goods/one?id=id”这个地址,其中并没有涉及IP地址、域名和端口之类的东西,而是直接通过商品服务名的方式来调用的。

正是由于我们添加了@LoadBalanced注解,才能加入Ribbon负载均衡器使用“改造”过的RestTemplate。

当RestTemplate发起请求时,请求会被LoadBalancerInterceptor拦截,实际的请求是由LoadBalancer发起的,LoadBalancer会寻找默认或指定的负载均衡策略来对HTTP请求进行转发。

 

在实际开发中,由于对服务的依赖和调用可能不止一处,往往一个接口会被多处调用,所以我们通常都会针对各个服务自行封装一些客户端类来包装这些依赖服务的调用,此时如果使用RestTemplate进行封装,我们会发现几乎每一个调用都是简单的模板化内容。

 

因此,为了简化自行封装服务调用客户端类的开发,Spring Cloud提供了Feign对服务调用进行封装,由它来帮助我们定义和实现依赖服务接口,我们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。

Feign是一个声明式的Web Service客户端。

Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。

Feign支持多种注解,包括Feign自带注解和JAX-RS注解等。

用Feign的注解定义接口,调用这个接口(类似controller调用service应用),就可以完成服务请求及相关处理。

Feign整合了Ribbon和Hystrix(将在第12章和第13章中进行讲解),可以让我们不再需要显式地使用这两个组件。

 

本节我们将使用Feign的方式来实现9.4节订单微服务调用商品微服务的功能。首先,加入Feign依赖,如程序清单9-15所示。

 

添加完依赖后需要开启Feign,在启动类上添加@EnableFeignClients注解即可,如程序清单9-16所示。

 我们在订单微服务中创建一个GoodsService接口,然后在其上方加上@FeignClient注解,如程序清单9-17所示。

 

@FeignClient的value填写商品微服务的名称goods,然后定义一个接口,在它的上方写上商品微服务对应的controller的RequestMapping即可

 

需要注意的是,这里需要使用@RequestParam将请求参数绑定到对应的商品微服务的接口上才能实现调用,意思是@RequestParam的值“id”和商品微服务相应controller方法findById的参数名一致就行。

最后,我们把9.4节使用RestTemplate调用的代码注释掉。然后注入GoodsService对象,接着调用它的findById方法即可,

如程序清单9-18所示。

 

 

 

 

 

我们在浏览器中进行测试,结果如图9-15和图9-16所示,如此便实现了用Feign完成服务之间的调用。

 

 

posted @ 2022-12-14 10:13  cnetsa  阅读(248)  评论(0编辑  收藏  举报