0
点赞
收藏
分享

微信扫一扫

自定义Ribbon规则--客户端写法


自定义Ribbon规则--客户端写法

  • ​​代码结构​​
  • ​​controller的代码​​
  • ​​自定义配置文件​​
  • ​​==自定义的规则==:​​
  • ​​application.yml​​
  • ​​效果如下:​​

代码结构

自定义Ribbon规则--客户端写法_.net

controller的代码

package com.demo.springcloud.controller;

import com.demo.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
public class DeptConsumerController {

@Autowired
private RestTemplate restTemplate;

// private static final String REST_URI_PREFIX = "http://localhost:8001";
private static final String REST_URI_PREFIX = "http://springcloud-provider-dept";


@GetMapping("/consumer/dept/queryAll")
public List<Dept> queryAll(){
return restTemplate.getForObject(REST_URI_PREFIX+"/dept/queryAll", List.class);
}

}

springcloud-provider-dep是服务提供者的id:

自定义Ribbon规则--客户端写法_spring_02

自定义配置文件

自定义Ribbon规则--客户端写法_spring_03

自定义的规则:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.demo.springcloud.myRule;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;

/**
* 自定义的规则:
* 每个服务走5次,然后才切换到另一个服务上
*/
public class HflRandomRule extends AbstractLoadBalancerRule {

private int total;
private int curentIndex;
public HflRandomRule() {
}

// @SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"})
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
} else {
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;
}

if(total<5){
server = upList.get(curentIndex);
}else{
total = 0;
curentIndex ++;
if(curentIndex > upList.size()){
curentIndex = 0;
}
server = upList.get(curentIndex);
}
total++;



if (server == null) {
Thread.yield();
} else {
if (server.isAlive()) {
return server;
}

server = null;
Thread.yield();
}
}

return server;
}
}


public Server choose(Object key) {
return this.choose(this.getLoadBalancer(), key);
}

public void initWithNiwsConfig(IClientConfig clientConfig) {
}
}

application.yml

自定义Ribbon规则--客户端写法_自定义_04

效果如下:

自定义Ribbon规则--客户端写法_spring_05


举报

相关推荐

0 条评论