1.Feign
Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求
因此
①:Feign被调用的接口是http接口,即为常见的Controller接口,可以简单理解为,Feign和前端,调用的接口是一样的
②:发起调用的一方,是通过注解,来发起http请求调用,接受Controller返回的参数使用
因此,对于初步接触使用Feign的人,重点是放在发起调用的一方,了解这方面的逻辑
2.创建被调用Feign接口
按常规模式创建Controller接口与实现类等,记下接口AIP地址,在本文3.C中使用
/flight/hlFlyCameraInfo/test
Controller
@Api(tags="摄像头信息")
@RestController
@RequestMapping("/flight/hlFlyCameraInfo")
@Slf4j
public class HlFlyCameraInfoController extends JeecgController<HlFlyCameraInfo, IHlFlyCameraInfoService> {
@Autowired
private CameraQuartz cameraQuartz;
/**
* 测试Feign接口
*/
@AutoLog(value = "测试Feign接口")
@ApiOperation(value="测试Feign接口", notes="测试Feign接口")
@GetMapping(value = "/test")
public String queryPage(@RequestParam(name="username") String username) {
cameraQuartz.test("接受数据请求");
return username;
}
}
service
package org.jeecg.modules.flight.api;
public interface CameraQuartz {
String test(String username);
}
serviceImpl
package org.jeecg.modules.flight.api.impl;
import org.jeecg.modules.flight.api.CameraQuartz;
import org.springframework.stereotype.Service;
@Service
public class CameraQuartzImpl implements CameraQuartz {
@Override
public String test(String username) {
System.out.println(username);
return username;
}
}
3.创建发起调用的Feign接口
A.发起调用的微服务添加Feign组件:pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
B.启动类Application添加注解,扫描注册Feign客户端
@EnableFeignClients(basePackages = {"org.jeecg.modules"})
需要注意的是basePackages是要在该路径下,找到C步骤中带有@FeignClient注解的接口
以C步骤中接口CameraTest的路径为例子
package org.jeecg.modules.system.service;
如果不写,就会去找路径下所有的类,没问题
如果写父路径,如org.jeecg,没问题,能找到这个类
如果写错路径,如org.jeecg.system,就会出问题,因为有这个注解,但是这个注解没能被扫描注册到
Field cameraTest in org.jeecg.modules.system.controller.SysPositionController required a bean of type ‘org.jeecg.modules.system.service.CameraTest’ that could not be found.
C.创建发起请求接口,注意是接口interface并配置相关注解
package org.jeecg.modules.system.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(name = "bcd-flight")
public interface CameraTest {
@GetMapping(value = "/flight/hlFlyCameraInfo/test")
String test(@RequestParam("username") String username);
}
其中
@FeignClient(name = “bcd-flight”)的作用,是要向这个bcd-flight微服务发起请求,注意,这是目标微服务名称,不是当前微服务名称
不知道微服务名称的,可以去目标微服务下application.yml看看
spring:
application:
name: bcd-flight
另一个注解,@GetMapping(value = “/flight/hlFlyCameraInfo/test”),就是要向这个http路径发起请求,也就是被调用的微服务下,controller的接口地址
可以看看上面二步骤记录的路径
String test(@RequestParam(“username”) String username); 就是被当前微服务使用,并发起请求的方法与传参
D.发起请求
在需要调用的地方,正常注入接口使用即可
@Autowired
private CameraTest cameraTest;
System.out.println(cameraTest.test("发起数据请求"));