Spring Cloud Feign服务通信与负载均衡机制

Posted 肖镜泽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Feign服务通信与负载均衡机制相关的知识,希望对你有一定的参考价值。

首先要知道一点Feign的负载均衡是Ribbon来实现的。

 

Feign是一个声明式Web Service客户端,它的目的就是让Web Service调用更加简单Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了RibbonHystrix(Hystrix熔断保护机制),可以让我们不再需要显式地使用这两个组件。

 

Feign具有如下特性:

 

可插拔的注解支持,包括Feign注解和JAX-RS注解;

 

支持可插拔的HTTP编码器和解码器;

 

支持Hystrix和它的Fallback;

 

支持Ribbon的负载均衡;

 

支持HTTP请求和响应的压缩。

Feign的使用

 

举个栗子:我有一个orders-server服务,和一个user-server-3000服务,user-server-3000服务做了集群user-server-3001

 

      orders-server服务要访问user-server服务。这时就需要Ribbon来实现权重均衡。轮询user-server-3000和user-server-3001服务

 

 

1.在orders-server的pom.xml导包spring-cloud-starter-openfeign

 

<!--
    feign依赖
-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

 

2.在order-server的配置类中添加@EnableFeignClients("接口包的全限定名")注解

/**
 * @EnableFeignClients
 * 开启feign的客户端
 *
 * ("cn.itsorce.spring.feignclient")
 * 接口的权限定包名,不是必要的
 * 因为:
 * @EnableFeignClients扫描所有使用注解@FeignClient定义的feign客户端
 */

@SpringBootApplication
@EnableFeignClients("cn.itsorce.spring.feignclient")
public class OrdersServerApplication {

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


}

 

3.在cn.itsorce.spring.feignclient包下创建个接口

/**
 * @FeignClient(value="user-server")负载均衡客户端的名字
 *
 */

@FeignClient(value = "user-server")
public interface UserFeignClient { 
/**
*
* 这个方法是和user-server的controller的方法
* 方法名要和user-server的controller的方法,(返回值,方法名,参数,,requestMapping)一样
*
* @param id
* @return
*/
    @GetMapping("/user/{id}")
    User getUserById(@PathVariable("id")Long id);

}

4.在orders-server的controller注入接口,在方法中调用接口的方法实现负载均衡(黄色背景的是主要代码)

@RestController
public class OrderConsumerController {

    /**
     * 注入feign的接口
     */
    @Autowired
    private UserFeignClient feignClient;


    /**
     * 该方法是浏览器来调用
     * @param id
     * @return
     */
    @GetMapping("/order/user/{id}")
    public User getUserById(@PathVariable("id") Long id){
        User user = feignClient.getUserById(id);
        return user;
    }
}

5.重启服务,就行了。

 

 

修改负载均衡的机制:

如果要把轮询机制改成随机机制

在orders-server配置类中添加代码

@Bean
    public IRule ribbonRule() {
        // 负载均衡规则,改为随机
        return new RandomRule();
    }

重启服务,就行了。

以上是关于Spring Cloud Feign服务通信与负载均衡机制的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud入门 - REST客户端Feign

spring-cloud-feign负载均衡组件

Spring Cloud Alibaba系列使用feign进行服务调用

Spring Cloud Alibaba系列使用feign进行服务调用

Spring Cloud负载均衡:使用Feign作客户端负载均衡

Spring Cloud Feign 调用过程分析