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

相关推荐
秋饼5 小时前
JDK 27 企业级 AI 服务落地实战:G1 默认、紧凑对象头、后量子 TLS 与 JFR 脱敏全解析
java·ai·技术分享·后端开发
卓怡学长5 小时前
w176基于SpringBoot的医院管理系统
java·spring boot·spring·maven·intellij-idea
lemon_sjdk5 小时前
ObjectProperty
java·开发语言·算法
hh9505 小时前
Agent Plan x DeepSeek Harness:Agent 供应链安全与第三方插件审计
java·开发语言·安全·agent plan·adg成都社区·adg社区
吴声子夜歌5 小时前
Java面试——HBase原理及应用
java·面试·hbase
浪兎兎6 小时前
【Java Web】Servlet + JSP 笔记
java·前端·servlet
吴声子夜歌6 小时前
Java面试——ElasticSearch原理及应用
java·面试·es
lhldsg6 小时前
家政派单系统开发实战:从需求分析到智能调度全流程指南
java·junit·小程序·uni-app·需求分析
吴声子夜歌6 小时前
Java面试——Spring原理及应用(一)
java·spring·面试
灰阳阳6 小时前
Docker-数据卷命令解析
java·docker·eureka