假定提供接口的模块为模块A,需要远程调用的模块为模块B,模块A内部有一个接收用户信息的Controller类为
UserController
,其中含有一个queryUserById(Long id)
方法
- 1.先在模块A中创建一个api的目录,将需要被调用的方法按照类似Controller的格式转换为接口文件的格式保存在该目录下,则接口文件格式参考如下:
[若返回值为ResponseEntity的可以将ResponseEntity去除,只取其内部的内容]
@RequestMapping("user")
public interface UserApi {
@GetMapping("{id}")
User queryUserById(@PathVariable("id") Long id);
}
- 2.接着在模块B中添加Feign的依赖和模块A的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<dependency>
<groupId>cn.demo</groupId>
<artifactId>module-a</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
- 3.在模块B的启动类上添加Feign开启的注解
@EnableFeignClients
,同时创建一个client目录,在其内部添加一个名为UserClient
的接口类
@FeignClient(value = "模块A的服务名称")
public interface UserClient extends UserApi {
}
- 4.此时就可以在模块B中需要使用模块A方法的地方注入
UserClient
对象,再调用其内部的方法即可
@Autowired
private UserClient userClient;
// 调用其内部方法
User user = this.userClient.queryUserById(id);
对于涉及到不同IP的两个模块之间的调用,可以简化掉Api类的环节,包括对另一个模块的依赖也可以去除,直接将方法相关信息写入Client类中,演示如下:
@FeignClient(value = "模块A的服务名称")
public interface UserClient {
@GetMapping("{id}")
User queryUserById(@PathVariable("id") Long id);
}