spring cloud 入门11-Eureka服务节点之间的调用—Feign

Eureka服务节点之间的调用—Feign

我们在使用spring cloud ribbon的时候已经使用RestTemplate完成了多服务节点之间的相互调用,而RestTemplate已经实现了对HTTP请求的封装处理,形成了一套模板化的调用方法,但是在实际开发过程中对于微服务的依赖不止一处,往往一个接口被多处调用

使用RestTemplate并非那么友好。因为除了要编写URL,还需要注意这些参数的组装和结果的返回等操作。为了克服这些不友好,除了Ribbon外,Spring Cloud还提供了声明式调用组件——Feign。

Feign是一个 基于接口的编程方式,开发者只需要声明接口和配置注解,在调度接口方法时,Spring Cloud就根据配置来调度对应的REST风格的请求,从其他微服务系统中获取数据。使用Feign,首先需要在产品微服务中使用Maven引入依赖包

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

下一步:使用spring提供的注解在项目中启用feign ,我们需要做的仅仅是在方法的启动类上添加注解就可以完成:

@SpringBootApplication
@EnableFeignClients //启用feignClients
public class BigsoftProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(BigsoftProductApplication.class, args);
    }

}

现在我们就可以使用feign了,在使用之前,我们先回顾下user节点中提供的方法

在这里插入图片描述
标记位置是指user节点中提供的rest风格访问路径

在product节点需要使用ribbon分布式调用这个节点中的这个方法,如果使用RestTemplat,我们就需要提供URL地址,还要关心它的返回值,这很麻烦,而使用feign我们只需要做的仅仅是声明接口和配置注解

1:新建UserService的接口:
在这里插入图片描述
在接口中申明:
在这里插入图片描述
标记1位置这个地方主要作用就是FeignClient 需要去访问user节点(在user节点的配置文件中配置的这个名字),如果写错将会报 找不到这个节点的错误

标记2位置是确定访问位置,这里是访问user节点中GET请求下路径为 /user/{id}这个路径,如果这里写错了会报 在当前节点下找不到该方法(404)这个错误

最后在product节点提供对外的调用controller,然后去调用这个请求

 @RestController
public class UserController {
    @Autowired
    private UserService service;
    // 测试
    @GetMapping("product/getUser/{id}")
    public User getUser(@PathVariable int id) {
        User user = service.getUser(id);
        return user;
    }
}

我们还是先看一眼注册中心,看看user节点和product节点有没有正常注册
在这里插入图片描述
发现已经注册到了注册中心

直接通过浏览器访问http://localhost:9001/product/getUser/1(product节点路径)
在这里插入图片描述
发现同过fegin找到user节点,并且正确的给我们返回了返回值

我们继续来做一个添加用户的操作
1:首先在user节点controller中规定好方法如下:

  @PostMapping("/addUser")
    public String addUser(@RequestBody User user){
        System.out.println(user);
        return "add--------"+user+"-----------success";
    }

这里添加用户并且返回了String类型的返回值

2:在product节点申明了@FeignClient(“user”)的类中添加接口函数

 @PostMapping("/addUser")
    public String regist(@RequestBody User user);

还是要注意:
在这里插入图片描述
这个标记位置一定要和user节点中添加用户给的路径一直,要不然找不到

3:在controller中提供对外的方法:

  @PostMapping("product/regist")
    public String regist(@RequestBody User user){
       String result=service.regist(user);
       return result;
    }

在这里插入图片描述
标记1位置是product对外访问路径,可以和user节点的访问路径不同
标记2位置调用刚才什么好的借口方法

最后通过postman测试
在这里插入图片描述
我们发现已经正常返回,证明通过fegin做分布式调用已经完成了

注意:
1:返回值问题
上述两个实验中我们的返回值分别为 User(对象类型) String类型,我们仅仅在申明方法的时候同时申明方法的返回值为上述两种类型(可以返回任意java支持的返回类型例如Map、List等),fegin就会自动帮我们抓取相应的返回值,而在RestTemplate中就需要我们自己关心返回值,并且用泛型规范去抓取需要的数据了

2:请求路径问题 :
同样的在RestTemplate中我们需要自己写URL地址栏去访问,而在fegin中我们仅仅需要在方法头部添加注解@FeignClient("user") 这样就会自己去查找user这个服务节点去进行分布式调用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章