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中再次定义,只需要在子类中直接引入这两个依赖即可。

相关推荐
daidaidaiyu20 小时前
ThingsBoard 集群的核心逻辑源码分析
java
我可能是个假开发21 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong21 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
【JAVA】玩家1 天前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog1 天前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
MandalaO_O1 天前
IDEA 开发(快捷键 + 调试 + 序列化)
java·ide·intellij-idea
xiaoqiMikko1 天前
JVM 线上排查实战(七):jps 看不见它、jstack 连不上它,可它明明活得好好的
java·jvm
狼爷1 天前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
念何架构之路1 天前
zap扩展生态与总结
java·前端·数据库
第七页独白1 天前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库