03_Consul服务注册与发现、Ribbon负载均衡服务调用
4、Consul服务注册与发现
4.1 Consul简介
4.1.1 是什么
https://www.consul.io/intro/index.html
-
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。 -
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。 -
它具有很多优点。包括: 基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows
4.1.2 能干嘛
4.1.3 去哪下
https://www.consul.io/downloads.html
4.1.4 怎么玩
https://www.springcloud.cc/spring-cloud-consul.html
4.2 安装并运行Consul
4.2.1 官网安装说明
https://learn.hashicorp.com/consul/getting-started/install.html
4.2.2 下载完成后只有一个consul.exe文件,
硬盘路径下双击运行,查看版本号信息
4.2.3 使用开发模式启动
- consul agent -dev
- 通过以下地址可以访问Consul的首页:http://localhost:8500
- 结果页面
4.3 服务提供者
- 新建Module支付服务provider8006
cloud-providerconsul-payment8006 - POM
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
- 主启动类
@EnableDiscoveryClient - 业务类Controller
- 验证测试
http://localhost:8006/payment/consul
4.4 服务消费者
- 新建Module消费服务order80
cloud-consumerconsul-order80 - POM
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
server:
port: 80
spring:
application:
name: cloud-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
- 主启动类
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务 - 配置Bean
@Configuration
public class ApplicationContextBean
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
- Controller
- 验证测试
- 访问测试地址
http://localhost/consumer/payment/consul
4.5 三个注册中心异同点
4.5.1 CAP
- C:Consistency(强一致性)
- A:Availability(可用性)
- P:Partition tolerance(分区容错性)
- CAP理论关注粒度是数据,而不是整体系统设计的策略
4.5.2 经典CAP图
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
- AP(Eureka)
AP架构 当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。 结论:违背了一致性C的要求,只满足可用性和分区容错,即AP - CP(Zookeeper/Consul)
CP架构 当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性 结论:违背了可用性A的要求,只满足一致性和分区容错,即CP
5、Ribbon负载均衡服务调用
5.1 概述
5.1.1 是什么
-
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。 -
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
5.1.2 官网资料
https://github.com/Netflix/ribbon/wiki/Getting-Started
5.1.3 能干吗
LB负载均衡(Load Balance)是什么
- 简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。
常见的负载均衡有软件Nginx,LVS,硬件 F5等。
Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别
- Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
- Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
-
集中式LB 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方; -
进程内LB 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。 Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。 负载均衡+RestTemplate调用
5.2 Ribbon负载均衡演示
5.2.1 架构说明
Ribbon在工作时分成两步
- 第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.
- 第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。 总结: Ribbon其实就是一个软负载均衡的客户端组件, 他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
5.2.2 二说RestTemplate的使用
- POST请求方法
5.3 Ribbon核心组件IRule
5.3.1 IRule:根据特定算法中从服务列表中选取一个要访问的服务
- com.netflix.loadbalancer.RoundRobinRule
轮询 - com.netflix.loadbalancer.RandomRule
随机 - com.netflix.loadbalancer.RetryRule
先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务 - WeightedResponseTimeRule
对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择 - BestAvailableRule
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务 - AvailabilityFilteringRule
先过滤掉故障实例,再选择并发较小的实例 - ZoneAvoidanceRule
默认规则,复合判断server所在区域的性能和server的可用性选择服务器
5.3.2 如何替换
5.4 Ribbon负载均衡算法
5.4.1 原理
5.4.2 RoundRobinRule源码
5.4.3 手写
|