ribbon与传统负载均衡器的区别
传统的服务端负载均衡是通过如nginx他是将接收到请求通过在nginx上配置的信息将请求分配到指定 的服务器上达到负载均衡
客户端负载均衡,需要客户端提前知道服务器的具体信息通过某种算法和规则rule,从而直接定位到需要的服务器。但是客户端必须实时知道服务端集群的实时存活情况和实际数量(包括新增和删除)此时就可以通过ribbon来实现
引入Eureka时已经引入Ribbon
Rule:负载均衡规则
Ping:心跳检测
ServerList:需要再ribbon保存完整服务器IP集合,只有知道了信息集合才能知道如何使用Rule
- RoundRobinRule .轮询规则
- AvailabilityFilteringRule 根据服务是否死掉或者服务处于高并发来分配权重
- WeightedResponseTimeRule 根据响应时间分配权重
- RandomRule 随机原则
- ZoneAvoidanceRule
- BestAvailableRule
- RetryRule 重试次数
ribbon通过负载均衡的RestTemplate成功访问到client
基于Eureka的配置我们做下修改
Server yml文件
spring:
application:
name: service-register-center
mandatory-file-encoding: UTF-8
http:
encoding:
enabled: true
charset: UTF-8
logging: #日志文件
level:
root: info
file:
max-size: 15MB
path: service-register-center-log
pattern:
dateformat: yyyy-MM-dd HH:mm:ss.SSS
server:
port: 10097
undertow:
accesslog:
enabled: true
dir: undertow-access-logs
pattern: common
prefix: service_register_center_access_log.
suffix: log
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
shutdown:
enabled: true
eureka:
instance:
hostname: node1
## 表示为Erureka客户端
client:
## 单台server为服务器需要注册到服务器上 (如果存在多台server需注册)
register-with-eureka: false
## 获取注册列表的信息 道理同上 基本两者参数是一样的
fetch-registry: false
service-url: # Eureka服务提供地址
defaultZone: http://node1:10097/eureka/
client yml文件
server:
port: 9090
spring:
application:
name: eureka-client
eureka:
## 表示为Erureka客户端
client:
## 单台server为服务器不需要注册到服务器上
register-with-eureka: true
## 获取注册列表的信息 道理同上 基本两者参数是一样的
fetch-registry: true
service-url: # Eureka服务提供地址
defaultZone: http://node1:10097/eureka/
student:
information:
address: shanghai
name: zhangsan
重新建个spring-cloud-ribbon项目 配置同client
spring:
application:
name: eureka-ribbon-client
server:
port: 8888
eureka:
## 表示为Erureka客户端
client:
## 单台server为服务器不需要注册到服务器上
register-with-eureka: true
## 获取注册列表的信息 道理同上 基本两者参数是一样的
fetch-registry: true
service-url: # Eureka服务提供地址
defaultZone: http://node1:10097/eureka/
在spring-cloud-ribbon项目中新增
config
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced //增加负载均衡 用于标记要配置为使用LoadBalancerClient的RestTemplate或WebClient bean的注释。
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
service
@Service
public interface RibbonService {
String info();
}
impl
@Service
public class RibbonServuceImpl implements RibbonService {
@Autowired
private RestTemplate restTemplate;
@Override
public String info() {
//我们在微服务调用时不在显式指定其服务ip地址只需要要指定client的服务名称和返回类型即可。
return this.restTemplate.getForObject("http://eureka-client/info ", String.class);
}
}
controller
@RestController
public class RibbonController {
@Autowired
private RibbonService ribbonService;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/info")
public String info() {
return this.ribbonService.info();
}
@GetMapping("/serviceInfo")
public String serviceInfo() {
//获取eureka-client的客户端
ServiceInstance serviceInstance = this.loadBalancerClient.choose("eureka-client");
//获取客户端的端口号
String portInfo = "port: " + serviceInstance.getPort();
return portInfo;
}
}
启动类
@SpringBootApplication
@EnableEurekaClient
public class SpringCloudRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudRibbonApplication.class, args);
}
}
依次启动server,client,ribbon 访问http://node1:10097
访问http://node1:8888/info
此时在启动一个client(端口9091)
此时访问http://node1:8888 /serviceInfo
刷新变成
此时就实现了客户端的负载均衡