Ribbon 知名网站建设定制提供了一套负载均衡的解决方案。
知名网站建设定制目前业界主流的方案可分成两类:
- 知名网站建设定制集中式负载均衡:即在 consumer 和 provider 知名网站建设定制之间使用独立的负载均衡设施(可以是硬件,如 F5, 也可以是软件,如 nginx), 由该设施负责把 访问请求 通过某种策略转发至 provider;
- 进程内负载均衡:将负载均衡逻辑集成到 consumer,consumer 从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的 provider。
负载均衡策略,常见的有:
策略类 | 命名 | 描述 |
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(ribbon默认策略) |
RetryRule | 重试策略 | 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server |
BestAvailableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
ResponseTimeWeightedRule | 响应时间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server |
案例:(由于Ribbon停更,且目前eureka中的负载均衡被loadbalancer取代,下面的是loadbalancer案例)
config增加配置
- package com.example.eurekaclient2.config;
-
- import org.springframework.cloud.client.ServiceInstance;
- import org.springframework.cloud.client.loadbalancer.LoadBalanced;
- import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
- import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
- import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
- import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.core.env.Environment;
- import org.springframework.web.client.RestTemplate;
-
- @Configuration
- public class RibbonConfig {
- @Bean
- @LoadBalanced //启用负载均衡注解
- public RestTemplate getRestTemplate(){
- return new RestTemplate();
- }
-
- /**
- * 策略改为随机
- */
- @Bean
- public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
- LoadBalancerClientFactory loadBalancerClientFactory){
- String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
- return new RandomLoadBalancer(loadBalancerClientFactory
- .getLazyProvider(name, ServiceInstanceListSupplier.class),
- name);
- }
- }
启动类增加修改策略的引用 @LoadBalancerClients
- @LoadBalancerClients(defaultConfiguration = {RibbonConfig.class})
- @SpringBootApplication
- //如果配置文件配置了注册中心相关配置,则默认开启注册中心注解(@EnableEurekaClient)
- public class EurekaClient2Application {
-
- public static void main(String[] args) {
- SpringApplication.run(EurekaClient2Application.class, args);
- }
- }
controller
- @RestController
- public class ClientConntroller {
-
- @Autowired
- private RestTemplate restTemplate;
-
- @RequestMapping("/postRest")
- private String postRest(){
- Persion ps = new Persion();
- ps.setUserName("卢大宝");
- //包含响应的一些信息
- ResponseEntity<Persion> pp = restTemplate.postForEntity("http://LUDB-CLIENT-1/postUser", ps, Persion.class);
- Persion p = pp.getBody();
- return p.getUserName();
- }
- }