- 首先编写服务提供者代码,也就是创建一个springboot项目,端口默认8080即可,然后新建一个接口,启动项目之后可以通过http://localhost:8080/api/data直接访问
@RestController
@RequestMapping("/api")
public class DataController {
@GetMapping("/data")
public String getData() {
return "Hello from Producer!";
}
}
- 然后编写服务消费者代码,端口设置为8081,启动类加@EnableFeignClients,访问http://localhost:8081/consumer/data依旧可以返回结果
@FeignClient(name = "producer", url = "http://localhost:8080")
public interface ProducerClient {
@GetMapping("/api/data")
String getData();
}
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private ProducerClient producerClient;
@GetMapping("/data")
public String getDataFromProducer() {
return producerClient.getData();
}
}
- 总结
-
在这个案例中,是基于 HTTP 的调用,而不是传统的 RPC 调用。这里使用了 OpenFeign 来简化 HTTP 客户端的开发,通过定义接口
ProducerClient
并使用注解@FeignClient
指定了目标服务的 URL 和接口路径,OpenFeign 会自动生成实现这个接口的 HTTP 客户端,从而让你能够像调用本地方法一样调用远程服务。 -
具体来说,在你的例子中,
ConsumerController
中的getDataFromProducer
方法调用了ProducerClient
接口的getData
方法。这看起来就像是直接调用了远程服务的一个方法,但实际上,ProducerClient
是由 OpenFeign 动态生成的一个代理对象,该对象内部实现了向http://localhost:8080/api/data
发起 HTTP GET 请求的功能,并将响应结果转换成String
类型返回给调用者。 -
因此,尽管从代码的角度看,调用过程类似于 RPC 调用,但实际上,这仍然是基于 HTTP 协议的 RESTful API 调用。OpenFeign 只是提供了一种更简洁的方式来处理这些 HTTP 请求,使代码更加清晰易读,减少了手动构建 HTTP 请求和解析响应的工作量。