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