下面演示消费端模块 order8500 通过 OpenFeign 接口轮询调用下面三个服务端的服务。
```
assemb-server-payment8001
assemb-server-payment8002
assemb-server-payment8003
```
>[info]OpenFeign 是客户端,只需要在客户端引入即可,服务端不需要引入 OpenFeign。
构建步骤如下:
[TOC]
# 1. 构建openfeign接口模块
**1. 构建接口模块:assemb-payment-api**
**2. 接口模块引入 openfeign**
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
```
**3. 创建 openfeign 接口**
```java
/**
* name: 服务端的微服务名,即服务端的 spring.application.name
*/
@FeignClient(name = "assemb-server-payment", contextId = "orderClient")
public interface OrderClient {
/**
* 注意:在接口这个地方,openfeign方法编写规则如下:
* 1. 只能有一个注解@RequestBody标注的实体参数,即只允许有一个实体参数,但可以有无数个@RequestParam,
* 或@PathVariable标注的参数。
* 2. 使用注解@RequestParam,或@PathVariable时必须指定name属性。
* 3. 方法返回值要与服务端的返回值一样,即使是返回值的父类也不可以。
*/
@GetMapping("/order/findById/{id}")
Map<String, Object> findById(@PathVariable("id") Integer id);
}
```
<br/>
# 2. 在服务端引入openfeign接口
**1. 引入接口模块:assemb-payment-api**
```xml
<dependency>
<groupId>accu.note.record</groupId>
<artifactId>assemb-payment-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
```
**2. 服务端 controller 层实现 openfeign 接口**
```java
@RestController
public class OrderController implements OrderClient {
@Override
public Map<String, Object> findById(Integer id) {
Map<String, Object> orderMap = Maps.newHashMap();
orderMap.put("id", id);
orderMap.put("instance-id", "assemb-server-payment8001");
return orderMap;
}
}
```
<br/>
# 3. 构建消费端
**1. 构建消费端模块:assemb-consumer-order8500**
**2. 在当前模块中添加 openfeign**
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>accu.note.record</groupId>
<artifactId>assemb-payment-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
```
**3. 当前模块的配置**
```yml
server:
port: 8500
spring:
application:
name: assemb-consumer-order
eureka:
client:
service-url:
defaultZone: http://www.eureka7001.com:7001/eureka/
instance:
instance-id: ${spring.application.name}${server.port}
prefer-ip-address: true
lease-renewal-interval-in-seconds: 1
lease-expiration-duration-in-seconds: 2
```
**4. 在当前模块通过 feign 接口调用服务端服务**
```java
@RestController
@RequiredArgsConstructor
public class OrderController {
/**
* 上面已封装好的 openfeign 接口
*/
final OrderClient orderClient;
@GetMapping("/order/findById/{id}")
public Map<String, Object> findById(@PathVariable("id") Integer id) {
return orderClient.findById(id);
}
}
```
**5. 在当前模块的启动类上添加注解`@EnableFeignClients`**
```java
/**
* basePackages:扫描openfeign接口所在的包
*/
@SpringBootApplication
@EnableFeignClients(basePackages = {"assemb.payment.api"})
public class Order8500Application {
public static void main(String[] args) {
SpringApplication.run(Order8500Application.class, args);
}
}
```
**6. 验证效果**
1. 启动 eureka7001 注册中心。
2. 启动三个服务端。
```
assemb-server-payment8001
assemb-server-payment8002
assemb-server-payment8003
```
3. 启动当前消费端模块。
```
assemb-consumer-order8500
```
不断刷新当前消费端模块地址 http://localhost:8500/order/findById/100 ,可以看到消费端按照轮询的方式调用三个服务端。
![](https://img.kancloud.cn/39/bd/39bd640adff945204c1d8290e2c54fae_1298x359.gif)