openFeign是一个HTTP客户端,它融合了springmvc的注解,使之可以用REST风格的映射来请求转发。 可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射,亦或是作为service层处理逻辑,openFeign可以做一个请求转发的逻辑操作。
搭建:
- 创建一个springboot项目充当提供者
- 创建一个springboot项目充当调用者
- 测试
使用:
提供者
- 引入依赖,web、Lombok、eureka-client
- 配置yml文件
- 启动eureka-client,@EnableEurekaClient
- 写方法,提供给调用者
pom.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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
yml文件
server:
port: 8080
spring:
application:
name: order-service
eureka:
client:
service-url:
defaultZone: http://ip:port/eureka
instance:
hostname: localhost
prefer-ip-address: true
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
controller
@RestController
public class OrderController {
@GetMapping("/doOrder")
public String doOrder(){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "油条——豆浆";
}
}
调用者
- 引入依赖,web、Lombok、eureka-client、openfeign
- 配置yml文件
- 启动eureka-client,@EnableEurekaClient
- 启动feign-client,@EnableFeignClients
- 写接口,供控制器调用
- 写方法,调用远程服务
pom.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>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
yml文件
server:
port: 8081
spring:
application:
name: user-service
eureka:
client:
service-url:
defaultZone: http://ip:port/eureka
instance:
hostname: localhost
prefer-ip-address: true
instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
#feigin只是封装了远程调用功能,其底层仍然是ribbon 所以配置方面,需要修改的是ribbon的参数数据
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
feign接口
@FeignClient(value = "order-service")
public interface UserOrderFeign {
@GetMapping("/doOrder")
String doOrder();
}
controller
@RestController
@Slf4j
public class UserController {
@Autowired
private UserOrderFeign userOrderFeign;
/**
* 总结:
* 浏览器(前端)-->user-service(/userDoOrder)--->RPC(feign)--->order-service(/doOrder)
* feign的默认等待时间为1s
* 超过则报错超时
* @return
*/
@GetMapping("/userDoOrder")
public String userDoOrder(){
log.info("有用户进来了");
//发起远程调用
String s = userOrderFeign.doOrder();
return s;
}
}