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接口的实现类

kerwin-order-client

猜你喜欢

转载自blog.csdn.net/weixin_44606481/article/details/131224308