spring-boot-feign-ribbon-hystrix
在springboot中使用feign、ribbon、hystrix组合功能,构建高可用的外部api访问
添加feign、ribbon、hystrix对应的依赖
springboot1.5.15+Dalston.SR4版本依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
springboot2.1.0+Greenwich.M1版本依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
编写用户接口用来测试
- 用户访问接口
@RestController
@Slf4j
public class UserController {
@RequestMapping(value = "/getUser", method = RequestMethod.POST)
public Map<String, Object> getUser(@RequestBody Map<String, Object> params, HttpServletRequest request) {
log.info("来自ip:{}, 请求参数:{}", request.getRemoteAddr(), JSON.toJSONString(params));
Integer id = (Integer) params.getOrDefault("id", 1);
return ImmutableMap.of("id", id, "name", "xiaoming", "age", 19);
}
}
- feign测试接口
/**
* <p>fegin test</p>
* Created by @author zhezhiyong@163.com on 2018/11/2.
*/
@RestController
@Slf4j
public class FeignController {
@Autowired
private UserClient userClient;
@RequestMapping(value = "/getUser/{id}", method = RequestMethod.GET)
public Map<String, Object> getUser(@PathVariable Integer id){
log.info("收到客户端请求getUser id:{}",id);
return userClient.getUser(ImmutableMap.of("id", id));
}
}
- 编写feign访问用户api接口
/**
* <p>用户接口</p>
* Created by @author zhezhiyong@163.com on 2018/11/2.
*/
@FeignClient(name = "user", fallback = UserClient.UserFallback.class)
@RibbonClient(name = "user")
public interface UserClient {
/**
* 测试
* @param data 测试数据
* @return 测试数据
*/
@RequestMapping(method = RequestMethod.POST,
value = "/getUser",
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE
)
Map<String, Object> getUser(Map<String, Object> data);
@Slf4j
@Component
class UserFallback implements UserClient {
@Override
public Map<String, Object> getUser(Map<String, Object> data) {
log.error("fallback:" + JSON.toJSONString(data));
return ImmutableMap.of("code", -1, "msg","获取用户信息失败");
}
}
}
- 配置feign启用
在类上添加EnableFeignClients注解
/**
* 在springboot里使用feign ribbon hystrix组合
*/
@SpringBootApplication
@EnableFeignClients
public class SpringBootFeignRibbonHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootFeignRibbonHystrixApplication.class, args);
}
}
- 配置ribbon负载均衡访问
在application.properties里面配置对应@RibbonClient(name = “user”)、@FeignClient(name = “user”)的user配置,并开启熔断机制
feign.hystrix.enabled=true
user.ribbon.listOfServers=http://192.168.97.120:8080,http://127.0.0.1:8080
访问请求
请求地址: http://127.0.0.1:8080/getUser/1
返回:
{
"id": 1,
"name": "xiaoming",
"age": 19
}
可以发现控制台打印如下,已经达到ribbon负载均衡了,并且配置ribbon地址错误之后,会触发熔断机制。