如果你学过Spring Cloud,你应该知道我们可以通过OpenFeign从一个服务中调用另一个服务,我们一般采用的方式就是定义一个Feign接口并使用@FeignClient
注解来进行标注,feign会默认为我们创建的接口生成一个代理对象。
当我们在代码中调用Feign接口的方法的时候,实际上就是在调用我们Feign生成的代理对象的方法,代理对象会根据接口定义的方法信息,将我们的请求转发到相应的代码提供者。
然后Feign会根据接口方法的注解信息,进行构建HTTP请求,并将相关请求发送给服务提供者,目前Feign支持多种HTTP请求,包括但不限于GET,POST等,并且支持请求参数,请求头等的配置。
服务提供者接收到请求后,根据请求路径和参数等信息,执行相应的业务逻辑,并将相关结果返回给Feign客户单,至此,Feign客户端接收到服务提供者的响应后,将响应结果返回给调用方。
接下来,请跟着我的步骤进行完成,注意本案例,是在博主Spring Cloud系列中进行的,如果你想跟着一起来,不妨先看前几篇文章把框架搭建好。
首先我们启动相关服务,其中本案例将用到主要的三个服务如下:
EurekaApplication,EurekaClientApplication,FeignApplication。
启动服务之后,我们在Feign直接调用EurekaClientApplication中的接口,首先,我们就在启动类里边添加相关注解:
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class FeignApplication
{
public static void main( String[] args )
{
SpringApplication.run(FeignApplication.class);
}
}
然后创建一个DcClient接口:
@FeignClient("eureka-client")
public interface DcClient {
@GetMapping("/dc")
String consumer();
}
那么我们应该在那里调用这个接口呢?
我们直接通过控制层进行调用:创建一个DcController控制类:
@RestController
public class DcController {
@Autowired
DcClient dcClient;
@GetMapping("/consumer")
public String dc() {
return dcClient.consumer();
}
}
然后重启FeignApplication。通过访问
localhost:2380/consumer
出现如下图所示信息,代表你成功在Feign服务中调用到EurekaClient模块中的DcController,让我们看看EurekaClient模块中的DcController:
@RestController
public class DcController {
@Autowired
DiscoveryClient discoveryClient;
@GetMapping("/dc")
public String dc() {
String services = "Services: " + discoveryClient.getServices();
System.out.println(services);
return services;
}
}
我们发现启动的服务如上:
Services: [zuul-demo, hystrix-demo, ribbon-demo, eureka-client, feign-demo]
来对照一下发现,我们启动的服务均在localhost:1000中可以见。我们可以同@FeignClient
定义的接口来统一申明我们需要依赖的微服务接口,通过我们上述的方式进行,让我们可以在具体使用的时候,跟着调用本地方法一样的进行调用。