Spring Cloud 注册中心 Eureka(集群和权限)

集群

单节点的注册中心实在是不保险,一旦注册中心出问题,整个微服务都受牵连,所以我们接下来要实现多个节点的注册中心,网上很多文章,弄2个节点互相注册,为了体现不一样,我们弄3个节点。

权限

上一篇的 Eureka 太low了,连个权限验证都没有,如果被人发现了eureka的地址是可以随意向其注册服务的,而且提供的web界面也将随意访问,这一篇给它加上个权限验证。

先来实现权限验证,这个可以借助Spring自家的Security子项目来实现。

在pom中添加新的依赖

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

在application.properties添加新的配置

spring.application.name=eureka
server.port=8080

spring.security.user.name=admin
spring.security.user.password=1234

#服务注册中心实例的主机名
eureka.instance.hostname=eureka
#是否向服务注册中心注册自己
eureka.client.register-with-eureka=false
#是否检索服务
eureka.client.fetch-registry=false

此时再访问Eureka时会跳转到 http://localhost:8080/login 提示你输入密码,否则进入不了主页,用application.properties配置文件中的账号登录即可访问主页。

如果想退出,访问http://localhost:8080/logout。

此处有坑,如果你开启了权限验证,那么默认开启了CSRF,你向注册中心注册服务时会被拦截,你提供了账号和密码也不行,需要关闭csrf才可以。关闭代码:

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}

@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
// Spring Security 默认开启了所有 CSRF 攻击防御,需要禁用 /eureka 的防御
httpSecurity.csrf().ignoringAntMatchers("/eureka/**");

super.configure(httpSecurity);
}
}
}

指定注册中心地址时需要携带账号和密码:

eureka.client.serviceUrl.defaultZone=http://admin:1234@localhost:8080/eureka/

现在我们的注册中心相对安全私密了一些,接下来我们要实现集群,打算启动3个节点,为了方便测试在hosts中添加了

127.0.0.1 eureka1
127.0.0.1 eureka2
127.0.0.1 eureka3

由于在同一台主机上测试,需要用不同的端口来区分服务,因此创建了:application-eureka1.properties,application-eureka2.properties,application-eureka3.properties。每个环境的配置文件维护自己的端口和其它服务的地址信息。

application-eureka1.properties

spring.application.name=eureka1
server.port=8081

spring.security.user.name=admin
spring.security.user.password=1234

eureka.instance.hostname=eureka1
eureka.client.serviceUrl.defaultZone=http://admin:1234@eureka2:8082/eureka/,http://admin:1234@eureka3:8083/eureka/

application-eureka2.properties

spring.application.name=eureka2
server.port=8082

spring.security.user.name=admin
spring.security.user.password=1234

eureka.instance.hostname=eureka2
eureka.client.serviceUrl.defaultZone=http://admin:1234@eureka1:8081/eureka/,http://admin:1234@eureka3:8083/eureka/

application-eureka3.properties

spring.application.name=eureka3
server.port=8083

spring.security.user.name=admin
spring.security.user.password=1234

eureka.instance.hostname=eureka3
eureka.client.serviceUrl.defaultZone=http://admin:1234@eureka1:8081/eureka/,http://admin:1234@eureka2:8082/eureka/

启动,分别执行下面3条命令启动3个服务

java -jar ./ms-spring-cloud-eureka/target/ms-spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka1
java -jar ./ms-spring-cloud-eureka/target/ms-spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka2
java -jar ./ms-spring-cloud-eureka/target/ms-spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka3

启动成功后,访问 http://eureka1:8081/

看到这个画面就成功了,在DS Replicas里有其它节点的信息。

分享到