题记
今天起,为了更真实,我搭建了一套spring cloud的代码,student,teacher等项目都会放在一起,后续我会将代码放在git上
需要的前提:
- 代码改成新的结构
- 已经参照之前的文章都住到到了nacos
- 参照之前的结构构建一个提供通用接口的项目feign-api
解释
feign的实现方式是直接调用http接口,这是大前提,一定要明晰这件事情
上代码
模拟一个老师想看学生成绩的场景
客户端相关
- teacher的服务,作为客户端引入feign的pom
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 引入通用接口项目
<dependency>
<groupId>ccom.example.com</groupId>
<artifactId>feign-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
- 新版cloud需要引入这个pom,否则报错
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
- 启动类开启feign,@EnableFeignClients
@EnableFeignClients
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 编写feign客户端类,风格与controller一致,@FeignClient中的值是nacos注册中心的student的服务名
@FeignClient("student")
public interface StudentInfoService {
@GetMapping("/getUserInfo/{id}")
UserInfo getUserInfo(@PathVariable("id") Integer id);
}
- 编写一个service去引用该客户端,为了省劲我就直接在service上写了controller
@RestController
public class TeacherService {
@Resource
private StudentInfoService studentInfoService;
@GetMapping("teacher/get/info")
public UserInfo getInfo(){
return studentInfoService.getUserInfo(200);
}
}
返回数据方相关
- 引入通用接口项目
<!--引入feign的统一api-->
<dependency>
<groupId>ccom.example.com</groupId>
<artifactId>feign-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
- 直接编写一个开放http请求的controller
这么写的原因是不要被误导,不一定非得去实现service才能被调用到,不要被dubbo迷惑,我因为这个深受其害
@RestController
@RequestMapping("/getUserInfo")
public class StudentInfoController {
@GetMapping("/{id}")
public UserInfo getUserInfo(@PathVariable("id") Integer id){
UserInfo userInfo = new UserInfo();
userInfo.setGrade(id.toString());
userInfo.setName("小明在测试");
return userInfo;
}
}
- 启动项目,访问teacher的接口http://127.0.0.1:8082/teacher/get/info