Ribbon

 

SpringCloud-整合ribbonjava

1 在customer(服務消費方添加)算法

<!-- 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文件中添加配置文件spring

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  實例化中添加開啓開啓客戶端負載均衡的註解服務器

@Bean
@LoadBalanced  //開啓負載均衡的工具
public RestTemplate getRestTemlate() {
	return new RestTemplate();
}

4 在主啓動類中添加開啓eureka客戶端註解app

@SpringBootApplication
@EnableEurekaClient
public class Customer7001 {

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

}

5 在配置文件中訪問改成eureka微服務名訪問負載均衡

private static final String REST_URL_PREFIX = "http://SPRINGCLOUD04-PRODECT-8001";

 

/**
	 * 自指定負載均衡算法
	 * @author SHF
	 * @version 建立時間:2018年11月29日  下午6:04:28
	 *  @return
	 */
	@Bean
	public IRule myRule() {
		return new RoundRobinRule();//使用隨機數進行負載均衡
	}

 

自定義ribbon的使用()dom

1 自定義負載均衡規則ide

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的對象微服務

/**
	 * 自指定負載均衡算法
	 * @author SHF
	 * @version 建立時間:2018年11月29日  下午6:04:28
	 *  @return
	 */
	@Bean
	public IRule myselfRule() {
		//return new RoundRobinRule();//使用隨機數進行負載均衡
		return new com.shi.rule.MyselfRule();//使用自定義的負載均衡算法
	}

3 在啓動類上面加上註解工具

@RibbonClient(name="SPRINGCLOUD04-PRODECT-8001",configuration=com.shi.rule.MyselfRule.class)
相關文章
相關標籤/搜索