什么是高可用
高可用
High Availability,即高可用HA。在分布式情况下,我们经常说4个9
(99.99%)或者5个9
(99.999%)。举个简单例子,如果一个微服务分布式系统依赖于30个微服务,每个微服务可用性是99.99%,那么整个微服务系统的可用性就是99.99%的30次方 ≈ 99.7% ,也就是说有0.3%系统是不可用的,0.3%意味着如果Qps很高
,有一亿次请求的话,那么就会有30万
次失败。换算成时间大约每月有2个小时服务不稳定
。特别是随着服务依赖数量的变多,微服务不稳定的概率会成指数性上升。因此要保证微服务应用的HA需要从各方面入手,下面会介绍一下如何实现Eureka Server的HA。参考工程如下所示。
Tips
:代码示例:https://github.com/SoftwareKing/spring-cloud-study/tree/master/sc-eureka-ha
参考工程
Eureka Server的HA
Eureka Server的HA
两个工程演示HA
如示例工程所示,我新建了两个Project分别为sc-eureka-ha-server1,sc-eureka-ha-server2, 我们知道在Eureka Server的Standalone模式下面,由于只有一个Eureka Server,所以我们通过配置如下信息关闭Eureka Server的自我注册和抓取注册信息,但是两个Eureka Server之间需要设置为True,相互注册相互感知对方注册信息的变化,从而实现信息同步。
1.sc-eureka-ha-server1的application.yml配置Info 如下:
1 2 3 4 5 6 7 8 9
| spring: application: name: sc-eureka-ha-server1 server: port: 8761 # 指定该Eureka实例的端口 eureka: client: serviceUrl: defaultZone: http://localhost:8762/eureka/
|
2.sc-eureka-ha-server2的application.yml配置Info 如下
1 2 3 4 5 6 7 8 9 10
| spring: application: name: sc-eureka-ha-server2 server: port: 8762 # 指定该Eureka实例的端口 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
|
3.主程序入口代码没什么区别如下:
1 2 3 4 5 6 7
| @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
|
4.分别启动sc-eureka-ha-server1和sc-eureka-ha-server2,访问http://localhost:8761/ ,http://localhost:8762/ ,如下:
启动Eureka Server01
启动Eureka Server02
5.服务提供者sc-eureka-ha-provider其它代码见工程,application.yml如下所示。
1 2 3 4 5 6 7 8 9 10 11
| server: port: 8000 spring: application: name: sc-eureka-ha-provider eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
|
tips:
把服务提供者的服务注册信息,注册到Eureka Server 01上。
启动服务提供者,见如下图所示。
服务提供者注册Eureka Server01
片刻服务提供者的信息也同步到Eureka Server02上面
服务提供者信息同步到Eureka Server02
Jar方式演示HA
Eureka Server的HA,其实可以通过jar的方式
指定使用不同的profile配置
的方式,在本地运行两个Eureka Server
。只需将Eureka server的application.yml修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| spring: application: name: sc-eureka-ha-server --- spring: profiles: peer1 server: port: 8761 eureka: instance: hostname: peer1.xujin.org client: serviceUrl: defaultZone: http://peer2.xujin.org:8762/eureka/ --- spring: profiles: peer2 server: port: 8762 eureka: instance: hostname: peer2.xujin.org client: serviceUrl: defaultZone: http://peer1.xujin.org:8761/eureka/
|
通过配置switcHosts或者自行配置HostName对应的IP地址,把工程打成jar之后,运行如下命令
1 2 3
| java -jar sc-eureka-ha-server1-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2 java -jar sc-eureka-ha-server1-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
|
测试如下:
访问Eureka Server HA验证
访问Eureka Server HA验证
安全身份验证
如果客户端的eureka.client.serviceUrl.defaultZone参数值(即Eureka Server的地址)中包含HTTP Basic Authentication信息,如http://user:password@localhost:8761/eureka,那么客户端就会自动使用该用户名、密码信息与Eureka服务端进行验证。如果你需要更复杂的验证逻辑,你必须注册一个DiscoveryClientOptionalArgs组件,并将ClientFilter组件注入,在这里定义的逻辑会在每次客户端向服务端发起请求时执行。
Tips
:代码示例:https://github.com/SoftwareKing/spring-cloud-study/tree/master/sc-eureka-security
访问Eureka Server安全身份验证
如工程sc-eureka-securit中的sc-eureka-security-server工程所示,在pom.xml中增加依赖如下:
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
|
application.yml如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| server: port: 8761 # 指定该Eureka实例的端口 eureka: client: #表示是否将自己注册到Eureka Server上,默认为true,当前应用为Eureka Server所以无需注册 registerWithEureka: false #表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false。 fetchRegistry: false #Eureka Server的访问地址,服务注册和client获取服务注册信息均通过该URL,多个服务注册地址用,隔开 serviceUrl: defaultZone: http://localhost:8761/eureka/ security: basic: enabled: true user: name: xujin password: 123
|
3.启动Eureka server测试,如下图所示
访问Eureka Server安全验证
服务提供者注册Eureka Server安全身份验证
1.服务提供者只需注册时修改application.yml
1 2 3 4 5 6 7 8 9 10 11
| server: port: 8000 spring: application: name: sc-eureka-security-provider eureka: client: service-url: defaultZone: http://xujin:123@localhost:8761/eureka/
|
Tips:如上所示:http://用户名:密码@localhost:8761/eureka/
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。