这是本人自己记录的springcloud知识,相应源码在https://github.com/shijingfeng/spring-cloud-actual.git
一 什么是 Spring Cloud
Spring Cloud,基于 Spring Boot 提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监 控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型 中立的开源组件。
官方译文:构建分布式系统不用特别的复杂且避免容易出现的错误。Spring Cloud为常见的分布式系统模式 提供了一个简单和可访问的编程模型,帮助开发人员构建弹性、可靠和协调的应用程序。SpringCloud构建在 SpringBoot之上,使开发人员很容易开始工作并迅速提高生产力。
spring cloud架构图
2 breaker dashboard 服务监控(Hystrix)
3 service registry 服务注册(Eureka)
4 config dashboard 配置中心(springcloud config)
5 distributed tracing 服务跟踪(springcloud sleuth)
Eureka服务的注册与发现
问题:系统会根据业务被拆分成了很多的微服务,微服务的信息如何管理? Spring Cloud中提供服务注册中心来管理微服务信息。
- 1. 微服务数量众多,要进行远程调用就需要知道服务端的ip地址和端口,注册中心帮助我们管理这些服务 的ip和端口。
- 2. 微服务会实时上报自己的状态,注册中心统一管理这些微服务的状态,将存在问题的服务踢出服务列 表,客户端获取到可用的服务进行调用。
Eureka介绍
Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka 提供 Eureka Server 服务端与 Eureka Client 客户端 ,服务端即是Eureka服务注册中心,客户端完成 微服务向Eureka服务的注册与发现。
如果没有用eureka的时候,有1000个微服务,当你要找某一个微服务时特别繁琐。eureka服务注册管理中心可以解决这种问题,客户端先去eureka服务去服务查找,获取想要的服务信息后,再去请求微服务。
EureKa采用C-S的设计架构,即包括了Eureka Server(服务端),EureKa client(客户端/微服务)。
1.EureKa Server 提供服务注册,各个节点启动后,在EureKa server中进行注册;
2 EureKa Client 是一个Java客户端,用于和服务端进行交互,同时客户端也是一个内置的默认使用轮询负载均衡算法的负载均衡器。在应用启动后,会向Eueka Server发送心跳(默认30秒)。如果EUR额卡 Server在多个心跳周期内没有接受到某个节点的心跳,EureKa Server将会从服务注册表中将这个服务移出(默认90秒)。
Eureka server服务注册中心(单机版搭建)
在 src/main/resources下新建application.yml文件,配置如下:
访问:http://localhost:6001/ ,效果如下:
微服务注册到服务中心
4.功能测试
Eureka自我保护机制
如果长时间(90秒)没有访问、监测不到心跳,或者修改实例名称,eureka启动保护机制
什么是自我保护机制
当Eureka Server 在一定时间内(默认90秒)没有接收到某个微服务的心跳,Eureka Server会从服务列表将此服 务实例注销。但是如果出现网络异常情况(微服务本身是正常的),微服务与Eureka Server之间无法正常通信, 以上行为可能变得非常危险了——因为微服务本身其实是正常的,此时本不应该注销这个微服务。 Eureka Server有一种 “自我保护模式” 来解决这个问题——当Eureka Server在短时间内丢失过多客户端时(可能发 生了网络故障),此时Eureka Server会进入自保护模式,一旦进入该模式,Eureka Server就会保护服务注册表中 的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server会 自动退出自我保护模式。
所以, 自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服 务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的 健壮、稳定。
自我保护配置
搭建集群版 Eureka Server 服务注册中心
为了避免 Eureka Server的失效,Eureka Server 高可用环境需要部署两个及以上Eureka Server,它们互相向对方注册。如果在本机启动两个Eureka需要 注意两个Eureka Server的端口要设置不一样,如下图:
- 在实际使用时Eureka Server至少部署两台服务器,实现高可用。
- 两台Eureka Server互相注册。
- 微服务需要连接两台Eureka Server注册,当其中一台Eureka死掉也不会影响服务的注册与发现。
- 微服务会定时向Eureka Server发送心跳,报告自己的状态。
- 微服务从注册中心获取服务地址以RESTful方式发起远程调用
创建两个Eureka Server模块
配置 pom.xml
将 6001 中的 pom.xml 依赖复制到 6002 模块中
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
主启动类
将 6001 中的主启动类 复制到 6002 模块中,并将类名重命名。
IP与域名绑定
1.找到 C:\Windows\System32\drivers\etc 目录下的hosts文件
Eureka Server组成高可用,两个Eureka Server互相向对方注册,这里需要通过域名访问,这里我们设置两个Eureka Server的域名分别为 eureka6001.com、eureka6002.com。
127.0.0.1 eureka6001.com
127.0.0.1 eureka6002.com
application.yml
6001
server:
port: 6001 # 服务端口
eureka:
instance:
hostname: eureka6001.com # eureka服务端的实例名称
client:
registerWithEureka: false # 服务注册,false表示不将自已注册到Eureka服务中
fetchRegistry: false # 服务发现,false表示自己不从Eureka服务中获取注册信息
serviceUrl: # Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自己(如果不配置则默认本机8761端口)
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#集群版
defaultZone: http://eureka6002.com:6002/eureka/
server:
enable-self-preservation: false # 禁用自我保护机制
server:
port: 6002 # 服务端口
eureka:
instance:
hostname: eureka6002.com # eureka服务端的实例名称
client:
registerWithEureka: false # 服务注册,false表示不将自已注册到Eureka服务中
fetchRegistry: false # 服务发现,false表示自己不从Eureka服务中获取注册信息
serviceUrl: # Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自己(如果不配置则默认本机8761端口)
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#集群版
defaultZone: http://eureka6001.com:6001/eureka/
server:
enable-self-preservation: false # 禁用自我保护机制
服务提供着注册到eureka中
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.sjf # 所有Entity别名类所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
#应用名称
application:
name: server02-product #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
#连接数据库设置
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包
url: jdbc:mysql://127.0.0.1:3306/springcloud_db01?serverTimezone=GMT%2B8 # 数据库名称
username: root
password: 123456
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 150 # 等待连接获取的最大超时时间
eureka:
client:
registerWithEureka: true # 服务注册开关
fetchRegistry: true # 服务发现开关
serviceUrl: # 客户端(服务提供者)注册到哪一个Eureka Server服务注册中心,多个用逗号分隔
defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
instance:
instanceId: ${spring.application.name}:${server.port} # 指定实例ID,就不会显示主机名了
hostname: localhost
prefer-ip-address: true #访问路径就会显示成IP地址
效果测试
1. 先启动 2个 Eureka Server 集群 (6001、6002)