springboot+feign+ribbon+hystrix构建高可用的客户端api访问

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>

编写用户接口用来测试

  1. 用户访问接口
@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);
    }

}
  1. 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));
    }

}
  1. 编写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","获取用户信息失败");
        }
    }

}
  1. 配置feign启用

在类上添加EnableFeignClients注解

/**
 * 在springboot里使用feign ribbon hystrix组合
 */
@SpringBootApplication
@EnableFeignClients
public class SpringBootFeignRibbonHystrixApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootFeignRibbonHystrixApplication.class, args);
    }
}
  1. 配置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地址错误之后,会触发熔断机制。

控制台

源码

源码下载

参考

  1. multi_spring-cloud-feign
  2. multi__circuit_breaker_hystrix_clients
  3. multi_spring-cloud-ribbon
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值