- Spring Cloud微服务:入门、实战与进阶
- 尹吉欢
- 315字
- 2023-07-20 10:35:54
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。