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

相关推荐
weixin_440784115 小时前
【HandlerThread实现原理】
android·java·开发语言
leoZ2315 小时前
本地跑大模型实战(七):llama.cpp 性能调优,让推理更快更省
java·人工智能·spring·生成对抗网络·语言模型·自然语言处理·llama
mubei-1236 小时前
SpringDAO的用法
java·开发语言·数据库
happymagic6 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
都叫我大帅哥9 小时前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java
江南十四行9 小时前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
fb_1234510 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt
码智社11 小时前
JSON 零基础到资深全体系教程
java·json
wgego12 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
IKUN家族12 小时前
Spring MVC(四)
java·spring·mvc