NACOS+Feign完成远程接口调用快速上手

458 阅读1分钟

题记

今天起,为了更真实,我搭建了一套spring cloud的代码,student,teacher等项目都会放在一起,后续我会将代码放在git上

需要的前提:

  1. 代码改成新的结构
  2. 已经参照之前的文章都住到到了nacos
  3. 参照之前的结构构建一个提供通用接口的项目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;
    }
}

image.png