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

文章目录
  1. 1. 什么是高可用
    1. 1.1. 高可用
  2. 2. Eureka Server的HA
    1. 2.1. Eureka Server的HA
      1. 2.1.1. 两个工程演示HA
      2. 2.1.2. Jar方式演示HA
  3. 3. 安全身份验证
    1. 3.1. 访问Eureka Server安全身份验证
    2. 3.2. 服务提供者注册Eureka Server安全身份验证

摘要:在《跟我学Spring Cloud》中的上一篇文章中简单介绍了使用Eureka实现服务的注册与发现。在这篇文章中主要介绍一下Eureka Server注册中心的HA以及Eureka Server的身份验证。

什么是高可用

高可用

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/

如果您觉得文章不错,可以打赏我喝一杯咖啡!