Spring Cloud中国社区博客

SC中Eureka Server的HA和安全身份验证

什么是高可用

高可用

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安全身份验证

  1. 如工程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>
  2. 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/