ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
OpenFeign是在客户端进行负载均衡,所以服务端不需要任何关于OpenFeign的相关依赖。 <br/> 下面演示消费端模块 cloud-comsumer-feign-order80 通过Feign封装的接口来调用下面两个服务端的服务。 ``` cloud-provider-payment8001 cloud-provider-payment8002 ``` <br/> 构建步骤如下: **1. 构建消费端模块:cloud-comsumer-feign-order80** **2. 在当前模块的`pom.xml`中添加 openfeign 依赖** ```xml <dependencies> <!-- openfeign不进行负载均衡时,是可以不需要eureka等这类注册服务的 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> ... </dependencies> ``` **3. 当前模块的`resources/application.yml`** ```yml server: port: 80 spring: application: name: cloud-comsumer-order main: #允许存在多个同名的feign接口 allow-bean-definition-overriding: true eureka: client: service-url: #将当前模块注册到三个注册中心中 defaultZone: http://www.eureka7001.com:7001/eureka/,http://www.eureka7002.com:7002/eureka/,http://www.eureka7003.com:7003/eureka/ ####openfeign#### ribbon: #建立连接所用的时间,单位ms ReadTimeout: 5000 #建立连接后从服务器读取到可用资源所用的时间,单位ms ConnectTimeout: 5000 #要访问的微服务名,就是服务端 spring.application.name 的配置 provider: payment: name: cloud-payment-service ``` **4. 在当前模块封装Feign接口** ```java /** * value: 要调用的微服务名,服务端 spring.application.name 配置。 */ @Component @FeignClient(value = "${provider.payment.name}") public interface PaymentFeignService { /** * 注意:在接口这个地方,openfeign方法编写规则如下: * 1. 只能有一个注解@RequestBody标注的实体参数(即只允许有一个实体参数) * 但可以有无数个@RequestParam,或者@PathVariable标注的参数。 * 2. 使用注解@RequestParam,或者@PathVariable时必须指定name属性。 * 3. 方法返回值要与服务端的返回值一样,即使是返回值的父类也不可以。 */ @RequestMapping(value = "/payment/name", method = RequestMethod.GET) String getName(@RequestParam("name") String name); } ``` **5. 在当前模块的启动类上添加注解`@EnableFeignClients`** ```java @SpringBootApplication @EnableFeignClients public class OrderFeignMain80 { public static void main(String[] args) { SpringApplication.run(OrderFeignMain80.class,args); } } ``` **6. 在当前模块调用封装的Feign接口访问服务** ```java @RestController @RequestMapping("/order") public class OrderFeignController { @Autowired private PaymentFeignService paymentFeignService; @GetMapping("/name") public String getName(@RequestParam("name") String name) { return paymentFeignService.getName(name); } } ``` **7. 验证效果** (1)启动三个Eureka注册中心。 ``` cloud-eureka-server7001 cloud-eureka-server7002 cloud-eureka-server7003 ``` (2)启动2个服务端。 ``` cloud-provider-payment8001 cloud-provider-payment8002 ``` (3)启动当前模块。 ``` cloud-comsumer-feign-order80 ``` 不断刷新当前模块的地址 http://localhost:80/order/name?name=zhangsan ,其效果是消费端按照<mark>轮询</mark>的方式调用两个服务端。 ![](https://img.kancloud.cn/f6/42/f64236869dbec1c9a8eb480b1ebd38cf_1207x172.gif)