Feign 的工程化实例
eureka ribbon openfeign hystrix
1 创建父项目 feign
2 创建子 module
Consumer-user-service 消费者
Provider-order-service 提供者
Model 公共实体类
Provider-api 消费者接口
3 父项目 feign 的 pom.xml
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.bjpowernode</groupId>
<artifactId>feign</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>consumer-user-service</module>
<module>provider-order-service</module>
<module>provider-api</module>
<module>model</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Order {
private Integer orderId;
private String name;
private Double price;
}
公共接口api(接口中有-> 消费者需要调用提供者的方法)
@FeignClient(value = "order-service", fallback = UserOrderFeignHystrix.class)
public interface UserOrderFeign {
// 查询订单
@GetMapping("/order/getOrderByUserId")
Order getOrderByUserId(@RequestParam Integer userId);
}
熔断器:
@Component
public class UserOrderFeignHystrix implements UserOrderFeign {
/**
* 一般远程调用的熔断可以直接返回null
* @param userId
* @return
*/
@Override
public Order getOrderByUserId(Integer userId) {
return null;
}
}
Provider-order-service 提供者的 controller
直接实现 UserOrderFeign接口 注解也会被一起带过来
@RestController
public class OrderController implements UserOrderFeign {
@Override
public Order getOrderByUserId(Integer userId) {
System.out.println(userId);
Order order = Order.builder()
.name("青椒肉丝盖饭")
.price(15D)
.orderId(1)
.build();
return order;
}
}
}
User消费者
@RestController
public class UserController {
//直接注入 不用再在User-Service包下写Feign接口
@Autowired
public UserOrderFeign userOrderFeign;
@GetMapping("find")
public Order findOrder() {
return userOrderFeign.getOrderByUserId(1);
}
}