前言
这一篇将介绍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参数进行验证。