Ribbon是什么
Ribbon是Netflix下的组件之一,主要为客户端提供负载均衡策略(客户端负载均衡)。
SpringCloud Ribbon和Ribbon的关系?
同Eureka一样,SpringCloud Ribbon是在Ribbon的基础上进行了封装。
Ribbon的使用
-
引入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>
-
修改RestTemplate配置,加上
@LoadBalanced
注解@Configuration public class RestTemplateConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } @Bean public IRule iRule(){ // 随机策略 return new RandomRule(); } }
-
修改调用方式
public String select(){ return restTemplate.getForObject("http://EUREKA-PRODUCT/product", String.class); }
IRule 负载均衡策略
IRule为Ribbon的负载均衡策略,其内部有很多中策略,同时支持自定义策略
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvdGZufh-1621737376079)(.assets/02-负载均衡Ribbon/image-20210522225751937.png)]
如何自定义负载均衡策略?
这里其实可以参考随机策略。
- 继承AbstractLoadBalancerRule类
- 重写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
-
客户端引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
-
在启动类上面加上注解:
@EnableFeignClients
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class EurekaConsumerApp { public static void main(String[] args) { new SpringApplicationBuilder(EurekaConsumerApp.class) .web(WebApplicationType.SERVLET).run(args); } }
-
写一个service类加上
@FeignClient
@FeignClient(name = "EUREKA-PRODUCT",path = "/product") public interface UserClient { @GetMapping public String select(); }
-
修改调用方式
@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)进行代理,通过服务器算法(轮询,
随机,权重等)来选择代理到哪个服务上。