1.Ribbon 是什么?
一套客户端负载均衡工具.
举例:窗口点餐,点餐时会分好几个窗口,就是为了让人员分摊到不同的窗口,来避免人员堆积,我们点餐的时候,作为客户消费者会主动地选择人员最少的窗口的去点餐.和客户端结合实现负载均衡。
2.能做什么?
负载均衡的工具,将用户的请求分摊到多个服务器上,从而达到高可用.,负载均衡算法可以自定义.
LB集成到消费方,消费方通过Ribbon,从服务注册中获知哪些服务可用,然后根据算法从这些可用的地址中选择一台合适的服务器.
3.配置
1.新建consumer消费者项目
2.pom文件添加Ribbon坐标
<!--Ribbon 相关需要与eureka整合-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2.配置consumer的yml文件,追加Eureka的服务器注册地址
server:
port: 8085
spring:
application:
name: client-consumer
#告诉consumer不要直接去找8001端口了,有个eureka集群
eureka:
client:
register-with-eureka: false #不向注册中心注册自己
fetch-registry: false #false 表示自己就是注册中心,我的职责就是维护服务实例,并不需
server-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
#注册到eureka后,status的名字(服务在eureka的唯一标志)
instance-id: ${spring.application.name}:${server.port}
#访问路径可以显示IP地址
prefer-ip-address: true
3.consumer通过RestTemplate访问服务端,要求RestTemplate访问服务端的时自带负载均衡。
3.1添加@LoadBalanced负载均衡 注解(LoadBalance默认算法是轮询算法),在获得Rest时加入Ribbon的配置
@Configuration //相当于applicationContext.xml
public class ConfigBean {
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3.2将访问后端provider的地址信息改为服务器名称
provider集群对外暴漏的服务名称是相同的,provider和consumer都注册进入Eureka,consumer根据算法 通过微服务服务的名称从Eureka 上找到provider并对其进行访问。
@RestController
@Api(tags = {"部门表接口"})
@RequestMapping(value="/Dept")
public class DeptController_Consumer {
//单机版
// private static final String REST_URL_PREFIX="http://localhost:8001";
//通过微服务名称访问微服务
private static final String REST_URL_PREFIX="http://MICROSERVICECLOUD-DEPT8001";
@Autowired
private RestTemplate restTemplate;
@PostMapping(value="/dept/add")
public boolean addDept(Dept dept){
return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
}
@GetMapping(value="/dept/findById/{id}")
public Dept findById(Long id){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/findById/id",Dept.class);
}
@GetMapping(value="/findAll")
public List<Dept> findAll(){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/findAll",List.class);
}
}
多个Eureka集群,多个微服务集群负载均衡架构图:
Ribbon是怎么实现负载均衡的?
1.先选择EurekaServer,优先选择在同一个区域内负载较少的server.
2.根据用户指定的策略(Ribbon算法,如轮询,随机等),再从server中取到的服务注册列表中选择一个地址。
下图是一个Eureka集群,7001,7002,7003
Consumer消费端
Microservicecloud-dept8001微服务集群,后面的8001,8003是集群的结点.为了测试负载均衡,我们给8001设置的数据库是clouddb01,8003设置的数据库是clouddb03.
在consumer 配置swagger,访问consumer可以直接实现对Microservicecloud-dept8001微服务的访问,结果如下每进行一次都会进行轮训访问不同的结点