一. SpringCloud
1. 微服务技术栈有哪些?
服务治理 | 落地技术 |
---|---|
服务开发 | SpringBoot、Spring、SpringMVC |
服务配置与管理 | Netflix公司的Archaius、阿里的Diamond等 |
服务注册与发现 | Eureka、Consul、Zookeeper等 |
服务调用 | Rest、RPC、gRPC |
服务熔断器 | Hystrix、Envoy等 |
负载均衡 | Ribbon、Nginx |
服务接口调用(客户端调用服务端的简化工具) | Feign |
消息队列 | Kafka、RabbitMQ、ActiveMQ |
服务配置中心管理 | SpringCloudConfig、Chef |
服务路由(API网关) | Zuul等 |
服务监控 | Zabbix、Nagios、Metricx、Spectator |
全链路追踪 | Zipkin、Brave、Dapper |
服务部署 | Docker、OpenStack、Kubernetes |
数据流操作开发包 | SpringCloud Stream |
事件消息总线 | SpringCloud Bu |
2. SpringCloud是什么?
SpringCloud是一个微服务全家桶,是基于SpringBoot提供的一整套微服务解决方案。
3. Springboot和SpringCloud的区别?
Springboot专注于快速方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
4. Dubbo和SpringCloud是怎么做技术选型的?优缺点?
- 开源社区活跃度:SpringCloud活跃、Dubbo不活跃
- 通信方式:SpringCloud抛弃了Dubbo的RPC通信,使用基于Http的REST通信。(REST方式在一定程度上牺牲了服务调用的性能,但是使用上更加灵活。)
- 使用方式:SpringCloud可以看做品牌机,有一整套的解决方案,有更高的稳定性;Dubbo可以看做组装机,自由度更高,但是可能因为一个部分不行就不好用了。
二. Eureka服务注册与发现
1. Eureka架构和Dubbo架构
【Eureka架构三大角色】
Euraka Server:提供服务注册与发现
Service Provider : 服务提供方将自身注册到Eureka,从而使服务消费方能找到
Service Consumer:服务消费方从Eureka获取服务注册列表,从而能够消费服务
【Eureka包含两个组件:Euraka Server 和 Eureka Client】
Euraka Server:服务节点启动后需要在Eureka Server进行注册,Euraka Server的服务注册列表会保存所有可用服务节点的信息,比如服务名、ip、端口。
Eureka Client:是一个java客户端,用于简化和Euraka Server的交互。Eureka Client会内置一个负载均衡算法器,从Euraka Server获取服务列表后进行负载均衡调用。在应用启动后,Client会向Server发送心跳包(默认30秒),如果Server一定时间内没收到(默认90秒),Server将会从服务注册列表中把Client移除。
【 Dubbo架构】
2. Eureka的自我保护机制
某时刻某个微服务不可用了,eureka不会立即清理,依旧会对该微服务的信息进行保存。(设计哲学是:宁可保留错误的服务注册信息,也不盲目注销任何可能是健康的服务实例)
如果在15分钟内,超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时Eureka会这样处理:
- Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
- Eureka仍然能够接受新服务的注册和查询请求,但是不会同步到其他节点上
- 当网络稳定时,当前实例的新注册信息会被同步到其他节点上
3. 服务注册中心
(1)添加pom依赖
<!--eureka-server服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 修改后立即生效,热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
(2)YML配置
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
(3)在主启动类上加上@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer//EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001_App
{
public static void main(String[] args)
{
SpringApplication.run(EurekaServer7001_App.class, args);
}
}
4. 服务注册
(1)添加POM依赖
<!-- 将微服务provider侧注册进eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
(2)YML配置
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
(3)在主启动类上加上@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
public class DeptProvider8001_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
5. 服务发现
对于注册进Eureka里的微服务,可以通过服务发现来获得该服务的信息。DiscoveryClient
6. Eureka比Zookeeper好在哪?
Eureka遵守AP原则,Zookeeper遵守CP原则
- Zookeepermaster挂掉会进行选举,但是leader选举时间太长,30~120s,选举期间整个zk集群都不可用。
- Eureka各个节点都是平等的,其中一个节点挂掉,其他节点依然能够提供服务。并且Eureka有自我保护机制,能够很好的应对因为网络故障导致部分节点失去联系的情况。
CAP原则:分布式系统
- C(Consistency) 强一致性
- A(Availability) 可用性
- P(Partition Tolerance) 分区容错性:系统容忍节点之间通信故障
ACID原则:传统数据库,如MySQL
- A(Atomicity) 原子性
- C(Consistency) 一致性
- I (Isolation) 独立性
- D(Duranbility) 持久性
7.Eureka集群配置
(1)修改hosts文件
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
(2)修改3台Eureka服务器的yml配置
【7001】
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
【7002】
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
【7003】
server:
port: 7003
eureka:
instance:
hostname: eureka7003.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
(3)把微服务发布到上面3台eureka集群配置中 microservicecloud-provider-dept-8001
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml #mybatis所在路径
type-aliases-package: com.atguigu.springcloud.entities #entity别名类
mapper-locations:
- classpath:mybatis/mapper/**/*.xml #mapper映射文件
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/cloudDB01
username: root
password: 123456
dbcp2:
min-idle: 5
initial-size: 5
max-total: 5
max-wait-millis: 200
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8001 #自定义服务名称信息
prefer-ip-address: true #访问路径可以显示IP地址
info:
app.name: atguigu-microservicecloud
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
三. Ribbon负载均衡
1. Ribbon是什么?
SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡。能够将用户的请求平摊的分配到多个服务上。
Ribbon结合Eureka的作用:
Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号。
Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
2. Ribbon配置
(1)添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
(2)修改application.yml 追加eureka的服务注册地址
server:
port: 80
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
(3)对ConfigBean进行新注解@LoadBalanced(获得Rest时加入Ribbon的配置)
@Configuration
public class ConfigBean
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
(4)主启动类添加@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer80_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptConsumer80_App.class, args);
}
}
(5)修改客户端访问类:通过微服务名访问Eureka
3. Ribbon和Nigix的区别
- Nigix是集中式的负载均衡:即在服务的消费方和提供方之间使用独立的负载均衡设施, 由该设施负责把访问请求通过某种策略转发至服务的提供方。
- Ribbon是一个进程内的负载均衡:Ribbon只是一个类库,它把负载均衡设备集成到消费端,消费方从服务注册中心获知服务节点列表,然后从列表选择出一个合适的服务器进行调用。
4. 负载均衡
架构说明
Ribbon在工作时分成两步:
- 第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.
- 第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。
5. Ribbon核心组件IRule
IRule:根据特定算法从服务列表中选一个要访问的服务。如轮训、随机、根据响应时间权重