企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
下面演示消费端模块 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)