当前位置:主页 > java教程 > SpringCloud实战之Feign声明式服务调用

SpringCloud中Feign声明式服务调用的方法详解

发布:2020-01-20 14:07:12 198


本站收集了一篇SpringCloud相关的编程文章,网友暨真洁根据主题投稿了本篇教程内容,涉及到SpringCloud、声明式服务调用、Feign、SpringCloud实战之Feign声明式服务调用相关内容,已被898网友关注,相关难点技巧可以阅读下方的电子资料。

SpringCloud实战之Feign声明式服务调用

在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下,并且显得好傻。

那么有没有更好的解决方案呢?答案是确定的有,Netflix已经为我们提供了一个框架:Feign。

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

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

总起来说,Feign具有如下特性:

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

这看起来有点像我们springmvc模式的Controller层的RequestMapping映射。这种模式是我们非常喜欢的。Feign是用@FeignClient来映射服务的。

首先第一步,在原来的基础上新建一个Feign模块,接着引入相关依赖,引入Feign依赖,会自动引入Hystrix依赖的,如下:

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
      <version>1.3.5.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-feign</artifactId>
      <version>1.4.0.RELEASE</version>
    </dependency>

application.yml配置如下:

server:
 port: 8083
spring:
 application:
  name: feign-consumer
eureka:
 client:
  service-url:
   defaultZone: http://localhost:8888/eureka/,http://localhost:8889/eureka/

接着在前面文章中的的的两个provider1和provider2两个模块的服务新增几个方法,如下代码所示:

/**
 * Created by cong on 2018/5/8.
 */
@RestController
public class HelloController {

  @RequestMapping("/hello")
  public String hello(){
    System.out.println("访问来1了......");
    return "hello1";
  }

  @RequestMapping("/hjcs")
  public List<String> laowangs(String ids){
    List<String> list = new ArrayList<>();
    list.add("laowang1");
    list.add("laowang2");
    list.add("laowang3");
    return list;
  }

  //新增的方法
  @RequestMapping(value = "/hellol", method= RequestMethod.GET)
  public String hello(@RequestParam String name) {
    return "Hello " + name;
  }

  @RequestMapping(value = "/hello2", method= RequestMethod.GET)
  public User hello(@RequestHeader String name, @RequestHeader Integer age) {
    return new User(name, age);
  }

  @RequestMapping(value = "/hello3", method = RequestMethod.POST)
  public String hello (@RequestBody User user) {
    return "Hello "+ user. getName () + ", " + user. getAge ();
  }

}

接着是上面代码所需用到的User类,代码如下:

/**
 * Created by cong 2017/12/2.
 */
public class User {

  private String name;
  private Integer age;

  //序列化传输的时候必须要有空构造方法,不然会出错
  public User() {
  }
  public User(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }
}

接下来用Feign的@FeignClient(“服务名称”)映射服务调用。代码如下:

package hjc;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.*;

/**
 * Created by cong on 2018/5/17.
 */
//configuration = xxx.class 这个类配置Hystrix的一些精确属性
//value=“你用到的服务名称”

@FeignClient(value = "hello-service",fallback = FeignFallBack.class)
public interface FeignService {
  //服务中方法的映射路径
  @RequestMapping("/hello")
  String hello();

  @RequestMapping(value = "/hellol", method= RequestMethod.GET)
  String hello(@RequestParam("name") String name) ;

  @RequestMapping(value = "/hello2", method= RequestMethod.GET)
  User hello(@RequestHeader("name") String name, @RequestHeader("age") Integer age);

  @RequestMapping(value = "/hello3", method= RequestMethod.POST)
  String hello(@RequestBody User user);
}

接着在Controller层注入FeiService这个接口,进行远程服务调用,代码如下:

/**
 * Created by cong on 2018/5/17.
 */
@RestController
public class ConsumerController {

  @Autowired
  FeignService feignService;

  @RequestMapping("/consumer")
  public String helloConsumer(){
    return feignService.hello();
  }

  @RequestMapping("/consumer2")
  public String helloConsumer2(){
    String r1 = feignService.hello("hjc");
    String r2 = feignService.hello("hjc", 23).toString();
    String r3 = feignService.hello(new User("hjc", 23));
    return r1 + "-----" + r2 + "----" + r3;
  }

}

接着在Feign模块的启动类哪里打上Eureka客户端的注解@EnableDiscoveryClient  Feign客户端的注解

@EnableFeignClients,代码如下:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {

  public static void main(String[] args) {
    SpringApplication.run(FeignApplication.class, args);
  }
}

接着启动启动类,浏览器上输入localhost:8083/consumer  运行结果如下:

SpringCloud实战之Feign声明式服务调用

SpringCloud实战之Feign声明式服务调用

可以看到负载均衡轮询出现hello1,hello2。

接着继续在浏览器上输入localhost:8083/consumer2,运行结果如下:

SpringCloud实战之Feign声明式服务调用

接下来我们进行Feign声明式调用服务下的,服务降级的使用,那么我们就必须新建一个FeignFallBack类来继承FeiService,代码如下:

package hjc;

import org.springframework.stereotype.Component;

/**
 * Created by cong on 2018/5/17.
 */
@Component
public class FeignFallBack implements FeignService{
  //实现的方法是服务调用的降级方法
  @Override
  public String hello() {
    return "error";
  }

  @Override
  public String hello(String name) {
    return "error";
  }

  @Override
  public User hello(String name, Integer age) {
    return new User();
  }

  @Override
  public String hello(User user) {
    return "error";
  }
}

接着我们再把那两个服务提供模块provider1,provider2模块进行停止,运行结果如下所示:

SpringCloud实战之Feign声明式服务调用

可以看到我们这几个调用,都进行了服务降级了。

那么如果我们想精确的控制一下Hystrix的参数也是可以的,比方说跟Hystrix结合的参数,那么可以在FeignClient注解里面配置一个Configuration=XXX类.class属性,在哪个类里面精确的指定一下属性。

或者在application.yml里面配置,如下:

hystrix:
 command:
  default:
   execution:
    isolation:
     thread:
      timeoutinMilliseconds: 5000

ribbon:
 connectTimeout: 500

 
#如果想对单独的某个服务进行详细配置,如下
hello-service:
 ribbon:
  connectTimeout: 500

970

这里满足了我们大部分场景的调用,但是有写精细场景,还是要用原生的Hystrix,跟我们之前的Hystrix用法一下,不要走Feign客户端调用就行了,如下:

/**
 * Created by cong on 2018/5/17.
 */
public class HjcCommand extends HystrixCommand {
  protected HjcCommand(HystrixCommandGroupKey group) {
    super(group);
  }

  @Override
  protected Object run() throws Exception {
    return null;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。


相关文章

  • SpringCloud OpenFeign概述与使用

    发布:2023-04-18

    OpenFeign源于Netflix的Feign,是http通信的客户端。屏蔽了网络通信的细节,直接面向接口的方式开发,让开发者感知不到网络通信细节。所有远程调用,都像调用本地方法一样完成


  • Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置实例详解

    发布:2020-01-15

    今天小编就为大家分享一篇关于Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧


  • SpringCloud中Ribbon的使用方法

    发布:2019-09-05

    本文重点给大家介绍SpringCloud 中使用 Ribbon的方法,本文通过实例文字相结合的形式给大家介绍的非常详细,需要的朋友可以参考下


  • spring-cloud入门之spring-cloud-config(配置中心)

    发布:2023-01-13

    给网友们整理关于spring cloud的教程,这篇文章主要介绍了spring-cloud入门之spring-cloud-config(配置中心),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • springcloud3 Sentinel的搭建及案例操作方法

    发布:2023-04-21

    Sentinel是分布式系统流量控制的哨兵,阿里开源的一套服务容错的综合性解决方案,这篇文章主要介绍了springcloud3 Sentinel的搭建以及案例操作,需要的朋友可以参考下


  • SpringCloud实现SSO单点登录的用法及实例

    发布:2019-09-05

    作为分布式项目,单点登录是必不可少的,这篇文章主要介绍了SpringCloud实现SSO 单点登录的示例代码,非常具有实用价值,需要的朋友可以参考下


  • SpringCloud OpenFeign基本介绍与实现示例

    发布:2023-03-28

    OpenFeign源于Netflix的Feign,是http通信的客户端。屏蔽了网络通信的细节,直接面向接口的方式开发,让开发者感知不到网络通信细节。所有远程调用,都像调用本地方法一样完成


  • SpringCloud中Eureka的配置及使用讲解

    发布:2023-03-14

    Eureka 服务注册中心,主要用于提供服务注册功能,当微服务启动时,会将自己的服务注册到 Eureka Server,这篇文章主要介绍了SpringCloud中Eureka的配置及详细使用,需要的朋友可以参考下


网友讨论