一、openFeign简介
openFeign是一种伪声明式RPC,它旨在使编写Java Http客户端变得更容易,它的性能主要体现在它的通信层面上。
二、通过demo来学习
首先,我们需要一个“order项目”,我们通过部署多个订单系统来分散订单压力;其次我们需要一个“user项目”,在“user项目”上我们需要实现客户端的负载均衡。
1、order-service订单项目
新建一个spring项目,项目名称为“order-service”。
(1)、项目依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(2)、application.properties配置文件
spring.application.name=order-service
server.port=8080
(3)、项目代码
package com.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
@Value("${server.port}")
private int port;
@GetMapping("getOrder")
public String getOrder(){
return "获取订单信息,服务端口:"+port;
}
}
订单项目构建好后,我们可以启动多个订单服务。IDEA启动多个服务
2、user-service用户系统
新建一个spring项目,项目名称为“user-service”。
(1)、项目依赖
<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>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
(2)、application.properties配置文件
spring.application.name=user-service
server.port=8070
#配置指定服务提供者的列表
order-service.ribbon.listOfServers=\
localhost:8080,localhost:8081
(3)、项目代码
新建FeignClient接口,添加@FeignClient注解,配置应用服务名“order-service”
package com.example;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient("order-service")
public interface OrderServiceFeignClient {
@GetMapping("getOrder")
String getOrder();
}
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OpenFeignController {
@Autowired
private OrderServiceFeignClient orderServiceFeignClient;
@GetMapping("feignClientMethod")
public String feignClientMethod(){
return orderServiceFeignClient.getOrder();
}
}
另外我们需要在spring入口类中添加@EnableFeignClients注解来开启openFeign。如果我们的feignClient接口和入口类不在同级目录下,我们还需要配置basePackages,例如:
@EnableFeignClients(basePackages = "com.example.clients")
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
三、总结
另外open-feign还提供了熔断降级机制,我们可以通过“fallback”配置来提供请求的默认返回参数,处理返回异常。详见以下代码。
@FeignClient(value = "order-service",fallback = OrderServiceFeignClientImpl.class)
public interface OrderServiceFeignClient {
@GetMapping("getOrder")
String getOrder();
}
import org.springframework.stereotype.Component;
@Component
public class OrderServiceFeignClientImpl implements OrderServiceFeignClient {
@Override
public String getOrder() {
//接口请求失败,默认返回此处的提示信息
return "查询订单失败,请稍后重试!";
}
}