signed

QiShunwang

“诚信为本、客户至上”

springcloud微服务(五)声明式服务调用SpringCloud Feign

2021/1/28 17:15:21   来源:

feign介绍

Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。

而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix(关于Hystrix我们后面再讲),可以让我们不再需要显式地使用这两个组件。

feign特性

  • 可插拔的注解支持,包括Feign注解和JAX-RS注解;
  • 支持可插拔的HTTP编码器和解码器;
  • 支持Hystrix和它的Fallback;
  • 支持Ribbon的负载均衡;
  • 支持HTTP请求和响应的压缩。

 

 

环境搭建

接着前面的代码

Maven依赖信息

 


   <dependency>

          <groupId>org.springframework.cloud</groupId>

          <artifactId>spring-cloud-starter-openfeign</artifactId>

      </dependency>

 

feign客户端接口

@FeignClient name指定调用服务中心的哪个服务

package com.eurekaclient.order.api.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

// name 指定服务名称
@FeignClient(name = "eureka-client-member")
public interface MemberApiFeign {

    @RequestMapping("/member")
    public String getMember();

}

修改Order服务的Controller

package com.eurekaclient.order.api.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class IndexController {
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    private MemberApiFeign memberApifeign;


    @GetMapping("/feignorder")
    public String order(){
      String result=  memberApifeign.getMember();
        return "我是订单服务调用了"+result;
    }
}

 

 

项目启动加上@EnableFeignClients

 

@SpringBootApplication

@EnableEurekaClient

@EnableFeignClients

public class AppOrder {

   public static void main(String[] args) {

      SpringApplication.run(AppOrder.class, args);



      // 如果使用rest方式以别名方式进行调用依赖ribbon负载均衡器 @LoadBalanced

      // @LoadBalanced就能让这个RestTemplate在请求时拥有客户端负载均衡的能力

   }



   // 解决RestTemplate 找不到原因 应该把restTemplate注册SpringBoot容器中 @bean

   @Bean

   @LoadBalanced

   RestTemplate restTemplate() {

      return new RestTemplate();

   }



}

效果

 

调用order项目的feignorder接口