Spring Cloud入门实战(六)------Feign&Ribbon&Hystrix

前言

这一篇将介绍Spring Cloud支持的另一种调用方式Feign。

正文

实例项目路径

第一步,依赖

Maven的.pom文件中客户端所需依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        <version>1.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
        <version>1.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
        <version>1.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
        <version>1.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.5.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.8</version>
    </dependency>

其中spring-cloud-starter-ribbon用来负载均衡,spring-cloud-starter-hystrix用来熔断降级。

第二步,配置

定义配置文件,命名为application.yml或application.properties均可。

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8762/eureka/
server:
  port: 7766
spring:
  application:
    name: feign-client
feign:
  hystrix:
    enabled: true
  ribbon:
      ReadTimeout: 0
      ConnectTimeout: 0
      MaxAutoRetries: 0
      MaxAutoRetriesNextServer: 0
      OkToRetryOnAllOperations: false
      eureka:
        enabled: false
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 4000
  • feign.hystrix.enabled:true,代表开启hystrix;
  • feign.ribbon,代表开启负载均衡策略;
  • hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds,设置超时时间,超过这个时间将走本地逻辑;

第三步,服务接口类

作为调用远程服务的本地入口。

package com.silence.spring.cloud.feign.service;

import com.silence.spring.cloud.feign.hystrix.FeignHystrix;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(value = "provider", fallback = FeignHystrix.class)
public interface FeignInterface {

    @RequestMapping("/getInfo")
    public String getInfo();

}

fallback = FeignHystrix.class,代表声明依赖服务出现问题时,将走FeignHystrix的处理逻辑。

第四步,熔断类

如果远程服务出现问题,本地的处理逻辑,可以理解为服务的熔断。

package com.silence.spring.cloud.feign.hystrix;

import com.silence.spring.cloud.feign.service.FeignInterface;
import org.springframework.stereotype.Component;

@Component
public class FeignHystrix implements FeignInterface {

    @Override
    public String getInfo() {

        return "Get Info Error!Hystrix!";

    }

}

第五步,调用类

构建服务调用类:

package com.silence.spring.cloud.feign.controller;

import com.silence.spring.cloud.feign.service.FeignInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FeignController {

    @Autowired
    FeignInterface feignInterface;

    @RequestMapping("/printInfoByFeign")
    public String printInfo() {

        return feignInterface.getInfo();

    }


}

第六步,启动类

构建启动类:

package com.silence.spring.cloud.feign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class FeignApplication {

    public static void main(String[] args) {

        SpringApplication.run(FeignApplication.class, args);

    }

}

@EnableFeignClients注解标明开启FeignClient。

验证

正常验证

启动运行后,键入http://localhost:7766/printInfoByFeign 链接,出现如下内容代表调用成功。
验证结果

负载验证

如果想要验证一下负载均衡是否起作用,则可以启动两个server,然后刷新便可验证。

熔断验证

如果想要验证熔断是否起作用,则可以在server中增加相应提高响应时间的逻辑,比如

    @RequestMapping("/getInfo")
    public String getInfo() {

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return servicePort;

    }

然后通过调整本地的hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds参数进行验证。

猜你喜欢

转载自blog.csdn.net/keysilence1/article/details/80254057