3.5 开启Eureka认证

Eureka自带了一个Web的管理页面,方便我们查询注册到上面的实例信息,但是有一个问题:如果在实际使用中,注册中心地址有公网IP的话,必然能直接访问到,这样是不安全的。所以我们需要对Eureka进行改造,加上权限认证来保证安全性。

改造我们的eureka-server,通过集成Spring-Security来进行安全认证。

在pom.xml中添加Spring-Security的依赖包,如代码清单3-10所示。

代码清单3-10 spring-Security配置

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

然后在application.properties中加上认证的配置信息:

        spring.security.user.name=yinjihuan #用户名
        spring.security.user.password=123456 #密码

增加Security配置类:

代码清单3-11 Security配置

        @Configuration
        @EnableWebSecurity
        public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                //关闭csrf
                  http.csrf().disable();
                  // 支持httpBasic
                  http.authorizeRequests()
                  .anyRequest()
                  .authenticated()
                  .and()
                  .httpBasic();
            }
        }

重新启动注册中心,访问http://localhost:8761/,此时浏览器会提示你输入用户名和密码,输入正确后才能继续访问Eureka提供的管理页面。

在Eureka开启认证后,客户端注册的配置也要加上认证的用户名和密码信息:

        eureka.client.serviceUrl.defaultZone=
                        http://yinjihuan:123456@localhost:8761/eureka/

3.6 Eureka高可用搭建

3.6.1 高可用原理

前面我们搭建的注册中心只适合本地开发使用,在生产环境中必须搭建一个集群来保证高可用。Eureka的集群搭建方法很简单:每一台Eureka只需要在配置中指定另外多个Eureka的地址就可以实现一个集群的搭建了。

下面我们以2个节点为例来说明搭建方式。假设我们有master和slaveone两台机器,需要做的就是:

❑ 将master注册到slaveone上面。

❑ 将slaveone注册到master上面。

如果是3台机器,以此类推:

❑ 将master注册到slaveone和slavetwo上面。

❑ 将slaveone注册到master和slavetwo上面。

❑ 将slavetwo注册到master和slaveone上面。

3.6.2 搭建步骤

创建一个新的项目eureka-server-cluster,配置跟eureka-server一样。

首先,我们需要增加2个属性文件,在不同的环境下启动不同的实例。增加application-master.properties:

        server.port=8761
        # 指向你的从节点的Eureka
        eureka.client.serviceUrl.defaultZone=
                    http://用户名:密码@localhost:8762/eureka/

增加application-slaveone.properties:

        server.port=8762
        # 指向你的主节点的Eureka
        eureka.client.serviceUrl.defaultZone=
                    http://用户名:密码 @localhost:8761/eureka/

在application.properties中添加下面的内容:

        spring.application.name=eureka-server-cluster
        # 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己
        eureka.client.register-with-eureka=false
        # 由于注册中心的职责就是维护服务实例,并不需要检索服务,所以也设置为 false
        eureka.client.fetch-registry=false

        spring.security.user.name=yinjihuan
        spring.security.user.password=123456
        # 指定不同的环境

        spring.profiles.active=master

在A机器上默认用master启动,然后在B机器上加上--spring.profiles.active= slaveone启动即可。

这样就将master注册到了slaveone中,将slaveone注册到了master中,无论谁出现问题,应用都能继续使用存活的注册中心。

之前在客户端中我们通过配置eureka.client.serviceUrl.defaultZone来指定对应的注册中心,当我们的注册中心有多个节点后,就需要修改eureka.client.serviceUrl.defaultZone的配置为多个节点的地址,多个地址用英文逗号隔开即可:

        eureka.client.serviceUrl.defaultZone=http://yinjihuan:123456@localhost:8761
                        /eureka/, http://yinjihuan:123456@localhost:8762/eureka/

3.7 常用配置讲解

3.7.1 关闭自我保护

保护模式主要在一组客户端和Eureka Server之间存在网络分区场景时使用。一旦进入保护模式,Eureka Server将会尝试保护其服务的注册表中的信息,不再删除服务注册表中的数据。当网络故障恢复后,该Eureka Server节点会自动退出保护模式。

如果在Eureka的Web控制台看到图3-3所示的内容,就证明Eureka Server进入保护模式了。

图3-3 Eureka自我保护

可以通过下面的配置将自我保护模式关闭,这个配置是在eureka-server中:

        eureka.server.enableSelfPreservation=false

3.7.2 自定义Eureka的InstanceID

客户端在注册时,服务的Instance ID的默认值的格式如下:

        ${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.
    instance_id:${server.port}}

翻译过来就是“主机名:服务名称:服务端口”。当我们在Eureka的Web控制台查看服务注册信息的时候,就是这样的一个格式:user-PC:eureka-client-user-service:8081。

很多时候我们想把IP显示在上述格式中,此时,只要把主机名替换成IP就可以了,或者调整顺序也可以。可以改成下面的样子,用“服务名称:服务所在IP:服务端口”的格式来定义:

        eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-
    address}:${server.port}

定义之后我们看到的就是eureka-client-user-service:192.168.31.245:8081,一看就知道是哪个服务,在哪台机器上,端口是多少。

我们还可以点击服务的Instance ID进行跳转,这个时候显示的名称虽然变成了IP,但是跳转的链接却还是主机名,请看图3-4所示界面的左下角。

图3-4 Eureka实例信息默认链接

所以还需要加一个配置才能让跳转的链接变成我们想要的样子,使用IP进行注册,如图3-5所示:

图3-5 Eureka实例信息IP链接

        eureka.instance.preferIpAddress=true

3.7.3 自定义实例跳转链接

在3.7.2中,我们通过配置实现了用IP进行注册,当点击Instance ID进行跳转的时候,就可以用IP跳转了,跳转的地址默认是IP+Port/info。我们可以自定义这个跳转的地址:

        eureka.instance.status-page-url=http://cxytiandi.com

效果如图3-6所示。

图3-6 Eureka实例信息自定义链接

3.7.4 快速移除已经失效的服务信息

在实际开发过程中,我们可能会不停地重启服务,由于Eureka有自己的保护机制,故节点下线后,服务信息还会一直存在于Eureka中。我们可以通过增加一些配置让移除的速度更快一点,当然只在开发环境下使用,生产环境下不推荐使用。

首先在我们的eureka-server中增加两个配置,分别是关闭自我保护和清理间隔:

        eureka.server.enable-self-preservation=false
        # 默认 60000 毫秒
        eureka.server.eviction-interval-timer-in-ms=5000

然后在具体的客户端服务中配置下面的内容:

        eureka.client.healthcheck.enabled=true
        # 默认 30 
        eureka.instance.lease-renewal-interval-in-seconds=5
        # 默认 90 
        eureka.instance.lease-expiration-duration-in-seconds=5

eureka.client.healthcheck.enabled用于开启健康检查,需要在pom.xml中引入actuator的依赖,如代码清单3-12所示。

代码清单3-12 Actuator配置

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

其中:

❑ eureka.instance.lease-renewal-interval-in-seconds表示Eureka Client发送心跳给server端的频率。

❑ eureka.instance.lease-expiration-duration-in-seconds表示Eureka Server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则移除该Instance。

更多的Instance配置信息可参考源码中的配置类:org.springframework.cloud.netfl ix. eureka. EurekaInstanceConfigBean。

更多的Server配置信息可参考源码中的配置类:org.springframework.cloud.netfl ix. eureka. server.EurekaServerConfigBean。