网站空间控制面板,珠海网站制作推广公司,电商网站设计价格,以公司做网站其实在项目中直接使用ribbon时不多#xff0c;大多是使用feign的#xff0c;其实feign底层也是通过ribbon构建的#xff0c;主要记忆一下计算规则#xff0c;ribbon的源码还是很不错的#xff0c;还是值得学习的。
1、添加pom
dependencygroupIdorg.spr…其实在项目中直接使用ribbon时不多大多是使用feign的其实feign底层也是通过ribbon构建的主要记忆一下计算规则ribbon的源码还是很不错的还是值得学习的。
1、添加pom
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-ribbon/artifactId
/dependency2、启动类注解
我没有在启动类添加注解直接另外一个配置类Configuration添加
3、添加配置
# 默认是轮训都有随机、加权响应时间、重试看具体业务和服务器搭配
#eureka-client.ribbon.NFLoadBalancerRuleClassNamecom.netflix.loadbalancer.RoundRobinRule4、参照源码规则自己编写规则
这里是通过hashcode在hash闭环定义的当每台服务器hashcode在hash闭环的对应位置后每次请求直接定位到hash中顺时针寻找最近的服务器
package com.xl.ribbon.consumer.rules;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.condition.RequestConditionHolder;import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;NoArgsConstructor
public class MyRule extends AbstractLoadBalancerRule implements IRule {Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}Overridepublic Server choose(Object key) {HttpServletRequest request ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();String uri request.getServletPath() ? request.getQueryString();return route(uri.hashCode(), getLoadBalancer().getAllServers());}public Server route(int hashId, ListServer servers) {if (CollectionUtils.isEmpty(servers)) {return null;}TreeMapLong, Server serverMap new TreeMap();servers.forEach(server - {// 虚化若干个服务节点到环上for (int i 0; i 8; i) {long hash hash(server.getId() i);serverMap.put(hash, server);}});long hash hash(String.valueOf(hashId));SortedMapLong, Server last serverMap.tailMap(hash);// 当request URL的hash值大于任意一个服务器对应的hashKey// 取serverMap中的第一个节点if (last.isEmpty()) {Server value serverMap.firstEntry().getValue();last.put(hash, value);}return last.get(last.firstKey());}public long hash(String key) {MessageDigest md5;try {md5 MessageDigest.getInstance(MD5);} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}byte[] keyBytes null;try {keyBytes key.getBytes(UTF-8);} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}md5.update(keyBytes);byte[] digest md5.digest();long hash (digest[2] 0xFF 16) | (digest[1] 0xFF) 8 | (digest[0] 0xFF);return hash 0xffffffffL;}
}
5、规则配置
其实直接配置在application.properties也可以这里我是在一个配置文件
package com.xl.ribbon.consumer;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.xl.ribbon.consumer.rules.MyRule;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Created by lig on 2024/10/12.*/
Configuration
//RibbonClient(name eureka-client, configuration com.netflix.loadbalancer.RandomRule.class)
RibbonClient(name eureka-client, configuration MyRule.class)
public class RibbonConfiguration {
//
// Bean
// public IRule defaultLBStrategy() {
// return new RandomRule();
// }}
6、接口
package com.xl.ribbon.consumer;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;/*** Created by lig on 2024/10/12.*/
RestController
public class RibbonController {Autowiredprivate RestTemplate restTemplate;GetMapping(/sayHi)public String sayHi() {return restTemplate.getForObject(http://eureka-client/sayHi, String.class);}}
总结
其实在实际项目中ribbon编写符合自己业务的规则还是挺复杂的用途还是挺广的.