在一个 Spring Boot 多模块 Gradle 项目中,使用 Feign 进行远程调用是一个很好的选择。Feign 是一个声明式的 HTTP 客户端,它使得 HTTP API 的调用像调用本地方法一样简单。以下是详细步骤:

  1. 添加 Feign 依赖

首先,在你的 build.gradle 文件中添加 Feign 的依赖。在你的 service-api 模块中:

1
2
3
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}

在 service-impl 模块中也添加相同的依赖:

1
2
3
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
}
  1. 启用 Feign 客户端

在你的主应用类中启用 Feign 客户端。在你的 service-api 模块中的主应用类上添加 @EnableFeignClients 注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.serviceapi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class ServiceApiApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApiApplication.class, args);
}
}
  1. 创建 Feign 客户端接口

在 service-api 模块中定义一个接口来声明远程调用。在 com.example.serviceapi.client 包中创建一个接口:

1
2
3
4
5
6
7
8
9
10
11
package com.example.serviceapi.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "example-service", url = "${example.service.url}")
public interface ExampleClient {
@GetMapping("/api/example/{id}")
String getExample(@PathVariable("id") Long id);
}
  1. 配置 Feign 客户端

在 service-impl 模块中的 application.yml 文件中配置 Feign 客户端的 URL:

1
2
3
example:
service:
url: http://localhost:8080 # 更换为实际的服务 URL
  1. 在服务中使用 Feign 客户端

在你的 service-impl 模块中使用 Feign 客户端。在你的服务类中注入 Feign 客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.example.serviceimpl.service;

import com.example.serviceapi.client.ExampleClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ExampleService {
private final ExampleClient exampleClient;

@Autowired
public ExampleService(ExampleClient exampleClient) {
this.exampleClient = exampleClient;
}

public String getExample(Long id) {
return exampleClient.getExample(id);
}
}
  1. 测试 Feign 调用

现在可以在你的控制器或其他服务中使用 ExampleService 来测试 Feign 调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.serviceimpl.controller;

import com.example.serviceimpl.service.ExampleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExampleController {
private final ExampleService exampleService;

@Autowired
public ExampleController(ExampleService exampleService) {
this.exampleService = exampleService;
}

@GetMapping("/example/{id}")
public String getExample(@PathVariable("id") Long id) {
return exampleService.getExample(id);
}
}
  1. 运行和测试

确保所有模块都编译成功并且服务都已启动。然后可以通过发送 HTTP 请求到 ExampleController 来测试 Feign 调用:
GET http://localhost:8081/example/1
这个请求将触发 ExampleService 中的 Feign 客户端调用,并返回远程服务的响应。

通过上述步骤,你就可以在 Spring Boot 多模块 Gradle 项目中使用 Feign 进行远程调用了。