前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Ribbon

作者头像
用户5927264
发布2019-08-01 10:56:43
4530
发布2019-08-01 10:56:43
举报
文章被收录于专栏:OSChinaOSChina

SpringCloud-整合ribbon

1 在customer(服务消费方添加)

代码语言:javascript
复制
<!-- Ribbon相关 (ribbon需要和eureka配合使用) -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</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-config</artifactId>
		</dependency>

2 在yml文件中添加配置文件

代码语言:javascript
复制
eureka: 
  client: 
    register-with-eureka: false
    service-url: 
      defaultZone: http://eureka9001.com:9001/eureka/,http://eureka9002.com:9002/eureka/,http://eureka9003.com:9003/eureka/

3 在RestTemplate 实例化中添加开启开启客户端负载均衡的注解

代码语言:javascript
复制
@Bean
@LoadBalanced  //开启负载均衡的工具
public RestTemplate getRestTemlate() {
	return new RestTemplate();
}

4 在主启动类中添加开启eureka客户端注解

代码语言:javascript
复制
@SpringBootApplication
@EnableEurekaClient
public class Customer7001 {

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

}

5 在配置文件中访问改为eureka微服务名访问

代码语言:javascript
复制
private static final String REST_URL_PREFIX = "http://SPRINGCLOUD04-PRODECT-8001";
代码语言:javascript
复制
/**
	 * 自指定负载均衡算法
	 * @author SHF
	 * @version 创建时间:2018年11月29日  下午6:04:28
	 *  @return
	 */
	@Bean
	public IRule myRule() {
		return new RoundRobinRule();//使用随机数进行负载均衡
	}

自定义ribbon的使用()

1 自定义负载均衡规则

代码语言:javascript
复制
package com.shi.rule;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

/**
 * 自定义我们的LB算法规则
 * 注意:不能把该类放在@ComponentScan注解包含的所有包及子包下面
 * MySelfRule必须不能是spring所扫描的包,
 * @author SHF
 * @version 创建时间:2018年11月30日  上午11:32:23
 */
public class MyselfRule extends AbstractLoadBalancerRule {

    private static Logger log = LoggerFactory.getLogger(MyselfRule.class);
    
    /*
     *  需求:让每个服务被调用5次之后再切换到下一台服务器
     */
    private int total = 0; //总共被调用的次数,目前要求每台被调用5次
    private int currentIndex = 0; //当前提供服务的机器号

    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }
        Server server = null;

        while (server == null) {
            if (Thread.interrupted()) {
                return null;
            }
            List<Server> upList = lb.getReachableServers();
            List<Server> allList = lb.getAllServers();//获取所有的服务器

            int serverCount = allList.size();
            if (serverCount == 0) {
                return null;
            }

            //int index = chooseRandomInt(serverCount);
            if(total < 5) {
            	server = upList.get(currentIndex);
            	total++;
            }else {
            	total = 0;
            	currentIndex++;
            	if(currentIndex >= upList.size()) {
            		currentIndex = 0;
            	}
            }
            

            if (server == null) {
                /*
                 * The only time this should happen is if the server list were
                 * somehow trimmed. This is a transient condition. Retry after
                 * yielding.
                 */
                Thread.yield();
                continue;
            }

            if (server.isAlive()) {
                return (server);
            }

            // Shouldn't actually happen.. but must be transient or a bug.
            server = null;
            Thread.yield();
        }

        return server;

    }


    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {
    }
}

2 配置rule的对象

代码语言:javascript
复制
/**
	 * 自指定负载均衡算法
	 * @author SHF
	 * @version 创建时间:2018年11月29日  下午6:04:28
	 *  @return
	 */
	@Bean
	public IRule myselfRule() {
		//return new RoundRobinRule();//使用随机数进行负载均衡
		return new com.shi.rule.MyselfRule();//使用自定义的负载均衡算法
	}

3 在启动类上面加上注解

代码语言:javascript
复制
@RibbonClient(name="SPRINGCLOUD04-PRODECT-8001",configuration=com.shi.rule.MyselfRule.class)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档