SpringCloud OpenFeign集成使用示例代码
简介
OpenFeign客户端是一个web声明式http远程调用工具,直接可以根据服务名称去注册中心拿到指定的服务IP集合,提供了接口和注解方式进行调用,内嵌集成了Ribbon本地负载均衡器,这里使用Nacos作为注册中心。
PS:这里只做简单集成不做详细解释,需要详细全面功能介绍跳转
代码目录结构
集成OpenFeign
1、POM
springcloud-openfeign-example
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hutool.version>5.2.5</hutool.version>
<fastjson.version>1.2.74</fastjson.version>
<lombok.version>1.18.12</lombok.version>
</properties>
<dependencies>
<!--工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${
hutool.version}</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${
fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${
lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
kerwin-common
kerwin-order
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>kerwin-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
kerwin-order-app
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>kerwin-order-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>kerwin-user-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
kerwin-order-client
PS:client工程这里是提供给下游服务引用的尽量将引入的包减小,因为这里只需要几个注解而已
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>
kerwin-user
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>kerwin-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
kerwin-user-app
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>kerwin-user-client</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
kerwin-user-client
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>
2、服务代码实现
kerwin-common
com.kerwin.common.api
public enum ApiCode {
SUCCESS(200,"成功!"),
ERROR(500,"服务器异常!")
;
ApiCode(int code, String value){
this.code=code;
this.value=value;
}
private int code;
private String value;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@Data
@Accessors(chain = true)
@Builder
@AllArgsConstructor
public class ApiResult<T> implements Serializable {
private static final long serialVersionUID = 8004487252556526569L;
/**
* 响应码
*/
private int code;
/**
* 响应消息
*/
private String msg;
/**
* 响应数据
*/
private T data;
public static <T> ApiResult<T> success(){
return new ApiResult<T>(ApiCode.SUCCESS.getCode(),ApiCode.SUCCESS.getValue(),null);
}
public static <T> ApiResult<T> success(T data){
return new ApiResult<T>(ApiCode.SUCCESS.getCode(),ApiCode.SUCCESS.getValue(),data);
}
public static <T> ApiResult<T> success(T data,String msg){
return new ApiResult<T>(ApiCode.SUCCESS.getCode(),msg,data);
}
public static <T> ApiResult<T> fail(){
return new ApiResult<T>(ApiCode.ERROR.getCode(),ApiCode.ERROR.getValue(),null);
}
public static <T> ApiResult<T> fail(String msg){
return new ApiResult<T>(ApiCode.ERROR.getCode(),msg,null);
}
public static <T> ApiResult<T> fail(int code,String msg){
return new ApiResult<T>(code,msg,null);
}
public boolean isSuccess(){
return ApiCode.SUCCESS.getCode() == this.code ;
}
public boolean isFail(){
return !isSuccess();
}
}
kerwin-user
kerwin-user-app
启动类
com.kerwin.user.UserApplication
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class);
}
}
Controller
com.kerwin.user.controller.UserInfoController
@RestController
@RequestMapping("/user-info")
public class UserInfoController {
/**
* 获取用户信息
*/
@GetMapping("/info/{id}")
public ApiResult getInfo(@PathVariable("id") Long id){
return ApiResult.success("用户"+id+"号");
}
}
配置文件
server:
port: 8100
spring:
application:
name: kerwin-user
cloud:
nacos:
discovery:
namespace: springcloud-openfeign-example
server-addr: 192.168.10.220:8848
kerwin-user-client
feignClient
com.kerwin.user.client.UserInfoClient
@FeignClient("kerwin-user")
public interface UserInfoClient {
/**
* 获取用户信息
*/
@GetMapping("/user-info/info/{id}")
ApiResult getInfo(@PathVariable("id") Long id);
}
kerwin-order
kerwin-order-app
启动类
com.kerwin.order.OrderApplication
@SpringBootApplication
// 开启feign扫描com.kerwin.user.client包下所有的FeignClient
@EnableFeignClients(basePackages = {
"com.kerwin.user.client"})
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class);
}
}
Controller
@RestController
@RequestMapping("/order-info")
public class OrderInfoController {
@Autowired
private UserInfoClient userInfoClient;
/**
* 获取订单信息
* @param id
* @return
*/
@GetMapping("/info/{id}")
public ApiResult getInfo(@PathVariable("id") Long id){
ApiResult result = userInfoClient.getInfo(RandomUtil.randomLong(100));
if(result.isFail()){
return result;
}
return ApiResult.success("订单-"+id + "-" +result.getData());
}
}
配置文件
server:
port: 8200
spring:
application:
name: kerwin-order
cloud:
nacos:
discovery:
namespace: springcloud-openfeign-example
server-addr: 192.168.10.220:8848
logging:
level:
com:
kerwin: debug
feign:
client:
config:
# 默认配置 如果不单独配置每个服务会走默认配置
default:
connectTimeout: 1000 # 连接超时时间
readTimeout: 1000 # 读取超时时间
loggerLevel: full # 日志级别 NONE:默认不打印 BASIC:打印简单信息 HEADERS:打印头信息 FULL:打印全部信息
ribbon:
ServerListRefreshInterval: 10000 #刷新所服务列表间隔时间默认30000ms
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置对应的规则,其他ribbon自带的规则 可查看IRule接口的实现类