通过接口上面添加注解 可以实现服务的RPC远程调用,面向微服务接口调用。
两个要点 绑定服务 面向微服务接口
首先创建一个用Feign实现接口调用的服务
cloud-feign-consumer-83
pom中引入OpenFeign
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2021</artifactId> <groupId>com.liuxu</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-feign-consumer-83</artifactId> <dependencies> <!--引入comm工程--> <dependency> <groupId>com.liuxu</groupId> <artifactId>cloud-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--eurekaClient--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--OpenFeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--springboot 必须有的--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--图像化显示相关--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--热启动--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
启动类开Feign
package liuxu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; /** * @author liuxu * @date 2021/10/27 21:45 */ @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class EurekaFeignClient83 { public static void main(String[] args) { SpringApplication.run(EurekaFeignClient83.class,args); } }
编写yml文件
server: port: 83 #端口号 spring: application: name: cloud-cinsumer-83 #服务名 eureka: client: # 是否从Eureka抓取注册信息 单节点情况下无用 集群情况下才能配合robbion使用负载均衡 fetch-registry: true # 注册如Eureka 用 true register-with-eureka: true service-url: # 设置与eureka server交互的地址查询和注册服务都需要这个地址 向注册中心注册 defaultZone: http://localhost:7001/eureka/ ribbon: ReadTimeout: 5000 #等待服务响应的时间 默认1s ConnectTimeout: 5000 #等待服务连接的时间 默认1s
编写与远程服务接口路径相同对应的接口
package liuxu.feign; import com.liuxu.result.CommResult; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; /** * @author liuxu * @date 2021/10/29 21:06 */ @FeignClient("cloud-provider") //指定要调用的服务名 可以在eureka客户端看到 也可以在8001 //8002 服务提供方配置文件中找到 不区分大小写 public interface Providers { @RequestMapping("/provider/ok")//会访问路径 到8001 或者8002 找对应路径的接口 mvc内容 public CommResult ok(); @RequestMapping("/provider/port") public CommResult getPort(); @RequestMapping("/provider/timeOut") public CommResult timeOut(); }
8001 8002 中添加可以供远程调用的接口
package com.liuxu.controller; import com.liuxu.result.CommResult; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; /** * @author liuxu * @date 2021/10/27 22:00 */ @RestController @RequestMapping("/provider") public class MyController { @Value("${server.port}") private String port; @RequestMapping("/ok") public CommResult ok(){ CommResult commResult = new CommResult(); commResult.setCode("200"); commResult.setMsg("8001正常返回"); return commResult; } @RequestMapping("/port") public CommResult getPort(){ CommResult commResult = new CommResult(); commResult.setCode("200"); commResult.setMsg("8001正常返回port是:"+port); return commResult; } @RequestMapping("/timeOut") public CommResult timeOut(){ try{ TimeUnit.SECONDS.sleep(3); }catch (Exception e){ e.printStackTrace(); } CommResult commResult = new CommResult(); commResult.setMsg("3s等待后远程调用成功"); commResult.setCode("500"); return commResult; } }
此时启动 注册中心 7001 ,服务提供者8001 8002 ,服务消费者Feign客户端83
通过访问
http://localhost:83/feign/getService
可以看到 轮询调用了8001 8002
访问http://localhost:83/feign/getTimeOut
如果配置文件配置了超时时间小于 8001 或者 8002 服务的程序等待时间 就会报超时错误
如果配置的是5000ms 大于 3s等待时间 则会3s后正常返回
此外OpenFeingn有增强日志功能。可以自行研究
下一篇介绍断路器相关内容