Java集成openfeign远程RPC调用教程

一、api模块

此模块不需要启动类

1、依赖引入

bash 复制代码
<!-- RPC 远程调用相关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <optional>true</optional>
        </dependency>

2、代码实现

bash 复制代码
package com.cloud.zhenyu.enums;


public class ApiConstants {
    /**
     * 服务名
     *
     * 注意,需要保证和 spring.application.name 保持一致
     */
    public static final String NAME = "revenue-influx";

    public static final String PREFIX = "/rpc-api/revenue/influx";

    public static final String VERSION = "1.0.0";
}
bash 复制代码
package com.cloud.zhenyu.api;

import com.cloud.zhenyu.api.dto.SmartMeterHistoryApiReqVO;
import com.cloud.zhenyu.enums.ApiConstants;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@FeignClient(name = ApiConstants.NAME)
@Tag(name = "RPC 服务 - 查询水表数据")
public interface InfluxApi {

    String PREFIX = ApiConstants.PREFIX + "/influx";

    @GetMapping(PREFIX + "/listData")
    List<SmartMeterHistoryApiReqVO> listData(@RequestParam(value = "manufacturerName", required = false) String manufacturerName,
                                             @RequestParam(value = "meterNo", required = false) String meterNo,
                                             @RequestParam(value = "readNum", required = false) String readNum,
                                             @RequestParam(value = "startTime", required = false) String startTime,
                                             @RequestParam(value = "endTime", required = false) String endTime);

}

3、注意事项

@FeignClient中定义的name要与后文中被调用的模块注册到nacos的名称一模一样。

若是Get请求,请按照上面所写进行,不要传对象,解析不了会报错,需要拆成一个一个的单个参数。

二、influx模块(被调用者)

1、依赖引入

此处引入的是一中的api模块

bash 复制代码
        <!--revenue-influx-api模块-->
        <dependency>
            <groupId>com.cloud.zhenyu</groupId>
            <artifactId>revenue-influx-api</artifactId>
            <version>${parent.version}</version>
        </dependency>

2、代码实现

bash 复制代码
package com.cloud.zhenyu.api;

import cn.hutool.core.bean.BeanUtil;
import com.cloud.zhenyu.api.dto.SmartMeterHistoryApiReqVO;
import com.cloud.zhenyu.controller.vo.SmartMeterHistoryPageReqVO;
import com.cloud.zhenyu.controller.vo.SmartMeterHistoryReqVO;
import com.cloud.zhenyu.service.InfluxService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


@RestController
public class InfluxApiImpl implements InfluxApi {

    @Resource
    private InfluxService influxService;

    @Override
    public List<SmartMeterHistoryApiReqVO> listData(String manufacturerName,
                                                    String meterNo,
                                                    String readNum,
                                                    String startTime,
                                                    String endTime){

        // 1. 将入参 SmartMeterHistoryApiPageReqVO 转为 SmartMeterHistoryPageReqVO
        SmartMeterHistoryPageReqVO pageReqVO = new SmartMeterHistoryPageReqVO();
        pageReqVO.setManufacturerName(manufacturerName);
        pageReqVO.setMeterNo(meterNo);
        pageReqVO.setReadNum(readNum);
        pageReqVO.setStartTime(startTime);
        pageReqVO.setEndTime(endTime);

        // 2. 查询Influx数据
        List<SmartMeterHistoryReqVO> smartMeterHistoryReqVOS = influxService.listData(pageReqVO);

        // 集合批量转换
        List<SmartMeterHistoryApiReqVO> resultList = BeanUtil.copyToList(smartMeterHistoryReqVOS, SmartMeterHistoryApiReqVO.class);
        return resultList;
    }
}

3、注意事项

不要忘记加@RestController了。

三、meter模块(调用者)

1、依赖引入

此处引入的是一中的api模块与openfeign,loadbalancer依赖,缺一不可。

bash 复制代码
        <!--revenue-influx-api模块-->
        <dependency>
            <groupId>com.cloud.zhenyu</groupId>
            <artifactId>revenue-influx-api</artifactId>
            <version>${parent.version}</version>
        </dependency>

        <!-- RPC 远程调用相关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

2、代码实现

此处直接注入InfluxApi

bash 复制代码
package com.cloud.zhenyu.controller.meterthirdlog;

import com.cloud.zhenyu.api.InfluxApi;
import com.cloud.zhenyu.api.dto.SmartMeterHistoryApiPageReqVO;
import com.cloud.zhenyu.api.dto.SmartMeterHistoryApiReqVO;
import com.cloud.zhenyu.controller.meterthirdlog.vo.MeterThirdLogPageReqVO;
import com.cloud.zhenyu.controller.meterthirdlog.vo.MeterThirdLogRespVO;
import com.cloud.zhenyu.dal.dataobject.meterthirdlog.MeterThirdLogDO;
import com.cloud.zhenyu.pojo.CommonResult;
import com.cloud.zhenyu.pojo.PageResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

import static com.cloud.zhenyu.pojo.CommonResult.success;

@Tag(name = "管理后台 - 远传表历史数据")
@RestController
@RequestMapping("/meter-third-log")
@Validated
public class MeterThirdLogController {

    @Resource
    private InfluxApi influxApi;

    @GetMapping("/influxListDataYesterday")
    @Operation(summary = "获得昨日fluxDB数据(openfeign调用)")
//    @SaCheckPermission("revenue:meter-third-log:query")
    public CommonResult<List<SmartMeterHistoryApiReqVO>> getMeterThirdLogPage() {
        SmartMeterHistoryApiPageReqVO pageReqVO = new SmartMeterHistoryApiPageReqVO();

        // 获取昨天日期
        LocalDate yesterday = LocalDate.now().minusDays(1);
        // 昨日 00:00:00
        String start = yesterday.atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        // 昨日 23:59:59
        String end = yesterday.atTime(23, 59, 59).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

        pageReqVO.setStartTime(start);
        pageReqVO.setEndTime(end);

        List<SmartMeterHistoryApiReqVO> list = influxApi.listData(pageReqVO.getManufacturerName(),
                pageReqVO.getMeterNo(),
                pageReqVO.getReadNum(),
                pageReqVO.getStartTime(),
                pageReqVO.getEndTime());
        return success(list);
    }

}
bash 复制代码
package com.cloud.zhenyu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication(scanBasePackages = {"com.cloud.zhenyu"})
@EnableFeignClients(basePackages = "com.cloud.zhenyu.api")
public class RevenueMeterApplication {
    public static void main(String[] args) {
        SpringApplication.run(RevenueMeterApplication.class, args);;
    }
}

3、注意事项

启动类上一定要加@EnableFeignClients注解,最好再用basePackages指定包路径,以免跨包扫描不到bean。

@SpringBootApplication中最好把scanBasePackages也带上,双保险,免得扫不出bean。

openfeign,loadbalancer依赖一定要一起引入。

四、统一注意事项

博主所用的是基于springcloudAlibaba2025.0.0.0版本,此版本spring-cloud-alibaba-dependencies已经统一管理了openfeign,loadbalancer的依赖版本,所以不用在父POM中再次定义,只需要在子类中直接引入这两个依赖即可。

相关推荐
wear工程师4 小时前
volatile 这题别只答「可见性」:面试官真正想听的是这条 happens-before
java·jvm
王九思4 小时前
对称加密与非对称加密详解
java·网络·数据库
SimonKing5 小时前
Spring Boot 4.0 + gRPC 极简集成:4步搞定,比REST还丝滑
java·后端·程序员
C++、Java和Python的菜鸟5 小时前
第3章 后端Web基础 (Maven)
java
小小编程路5 小时前
Java super 关键字详解:用法、场景与常见误区
java·开发语言
我登哥MVP5 小时前
走进 Gang of Four 设计模式:外观模式
java·设计模式·外观模式
tiancaijiben5 小时前
阿里云SAE应用引擎弹性扩缩容完全指南:从手动调控到智能自动化
java·网络·数据库
增量星球5 小时前
《持续交付2.0系列一》从技术交付到业务引领
java·docker·容器·devops
ch.ju5 小时前
Java Programming Chapter 4——Anonymous inner class
java·开发语言