SpringCloudNetflix(二) 负载均衡Ribbon

Ribbon是什么

Ribbon是Netflix下的组件之一,主要为客户端提供负载均衡策略(客户端负载均衡)。

SpringCloud Ribbon和Ribbon的关系?

同Eureka一样,SpringCloud Ribbon是在Ribbon的基础上进行了封装。

Ribbon的使用

  1. 引入pom依赖 其实可以省略这一步

    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
      
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
    
      <!-- 其实不需要引入 eureka-client依赖中包含Ribbon的依赖 -->
      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
      </dependency>
    </dependencies>    
    
  2. 修改RestTemplate配置,加上@LoadBalanced注解

    @Configuration
    public class RestTemplateConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
        @Bean
        public IRule iRule(){
            // 随机策略
            return new RandomRule();
        }
    }
    
  3. 修改调用方式

    public String select(){
    	return restTemplate.getForObject("http://EUREKA-PRODUCT/product", String.class);
    }
    

IRule 负载均衡策略

IRule为Ribbon的负载均衡策略,其内部有很多中策略,同时支持自定义策略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvdGZufh-1621737376079)(.assets/02-负载均衡Ribbon/image-20210522225751937.png)]

如何自定义负载均衡策略?

这里其实可以参考随机策略。

  1. 继承AbstractLoadBalancerRule类
  2. 重写choose方法
public class RandomRule extends AbstractLoadBalancerRule{
    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }
        Server server = null;
        while (server == null) {
          List<Server> upList = lb.getReachableServers();
            List<Server> allList = lb.getAllServers();
            int serverCount = allList.size();
          // 下面为自定义策略
          //  .....
        }
        return server;
    }

    protected int chooseRandomInt(int serverCount) {
        return ThreadLocalRandom.current().nextInt(serverCount);
    }
	@Override
	public Server choose(Object key) {
		return choose(getLoadBalancer(), key);
	}
	@Override
	public void initWithNiwsConfig(IClientConfig clientConfig) {
		// TODO Auto-generated method stub
	}
}

OpenFeign组件

Feign是什么

Feign是声明式WebService客户端,主要用来简便Ribbon的调用方式,使用接口服务的调用方式。

如何使用Feign

  1. 客户端引入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 在启动类上面加上注解: @EnableFeignClients

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class EurekaConsumerApp {
        public static void main(String[] args) {
            new SpringApplicationBuilder(EurekaConsumerApp.class)
                    .web(WebApplicationType.SERVLET).run(args);
        }
    }
    
  3. 写一个service类加上@FeignClient

    @FeignClient(name = "EUREKA-PRODUCT",path = "/product")
    public interface UserClient {
        @GetMapping
        public String select();
    }
    
  4. 修改调用方式

    @RestController
    @RequestMapping("client")
    public class IndexController {
        @Autowired
        UserClient userClient;
        
        @GetMapping
        public String select(){
            return userClient.select(type);
        }
    }
    

Feign和OpenFeign的区别

OpenFeign是2019年feign停更后出现版本,OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解。

客户端负载均衡和服务端负载均衡的区别

客户端负载均衡: 客户端通过自身负载均衡算法,在调用服务时,声明要调用哪个服务

服务端负载均衡: 客户端url调用经过服务端,服务端(比如Nginx)进行代理,通过服务器算法(轮询,

随机,权重等)来选择代理到哪个服务上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值