spring cloud 如何搭建高可用的安全框架。

来源:互联网 发布:知乎怎么邮箱注册 编辑:程序博客网 时间:2024/05/16 18:04

注册中心单点肯定是不牢靠的,可以参考下面的方案做成注册中心集群:

弄成3个节点,每个节点向其它节点注册,这样只要集群中有一个节点正常工作即可。为了方便在本机弄出这种效果,我们先修改下host文件

127.0.0.1  localhost server1 server2 server3

相当于给本机ip绑了3个hostname。然后在项目中,创建3个profile,参考下图:

application.yml:

1
2
3
4
5
spring:
  application:
    name: eureka-server-cluster
  profiles:
    active: server1

application-server1.yml:

1
2
3
4
5
6
7
8
9
10
server:
  port: 8100
 
eureka:
  instance:
    hostname: server1
    instance-id: ${spring.application.name}:${server.port}
  client:
    service-url:
      defaultZone: http://server2:8200/eureka,http://server3:8300/eureka

application-server2.yml:

1
2
3
4
5
6
7
8
9
10
server:
  port: 8200
 
eureka:
  instance:
    hostname: server2
    instance-id: ${spring.application.name}:${server.port}
  client:
    service-url:
      defaultZone: http://server1:8100/eureka,http://server3:8300/eureka

application-server3.yml:

1
2
3
4
5
6
7
8
9
10
server:
  port: 8300
 
eureka:
  instance:
    hostname: server3
    instance-id: ${spring.application.name}:${server.port}
  client:
    service-url:
      defaultZone: http://server1:8100/eureka,http://server2:8200/eureka  

其它不用改,idea中启用时,指定3个不同的profile,参考下图:

启用3个实例,分别应对server1,server2,server3 这三个profile后,看下UI

可以看到,每个eureka server都向其它节点注册了。

其它服务向eureka server集群注册时,参考下面的配置:

1
2
3
4
5
6
7
8
9
10
11
12
server:
  port: 8001
 
spring:
  application:
    name: "service-provider-demo"
eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://localhost:8100/eureka/,http://localhost:8200/eureka/,http://localhost:8300/eureka/

 

再来看另一个问题:

注册中心的管理界面以及服务注册时,没有任何认证机制,安全性比较差,如果其它服务恶意注册一个同名服务,但是实现不同,可能就有风险了,可以参考下面的配置改进:

先添加:compile 'org.springframework.boot:spring-boot-starter-security' 依赖,然后在eureka server的application.yml中增加

1
2
3
4
5
6
security:
  basic:
    enabled: true
  user:
    name: yjmyzz #用户名
    password: 123456 #密码

这样就添加了1个用户名及密码(注:其原理就是spring-security,熟悉spring-security的朋友,也可以改成把用户名/密码存储在数据库中)

启动后,再浏览eureka server就用输入用户名,密码了。

 

然后其它服务注册时,相应的defautZone也要改成类似:

defaultZone: http://yjmyzz:123456@server1:8100/eureka,http://yjmyzz:123456@server2:8200/eureka 这种格式。  


见到的问题:

在本机单机环境中,注册中心由一个spring boot应用组成, 分成三个不同的profile,通过启动不同的profile来启动不同的注册中心实例,我的注册中心配置中,每个profile对应的主机都是localhost(未修改hosts映射 ),不同profile通过设置不同的端口来达到启动多个注册中心的目的。下面问题就来了:

启动结果 :

    三台服务注册中心都可以正常启动,且在启动后的几分钟(大概2-3分钟)内,每一个注册中心上的服务实例(由其它注册中心作为客户端注册进来的)都正常。

    不正常结果 :几分钟之后,各注册中心上注册的其他服务实例都会被莫名其妙的剔除,即使开启eureka的自我保护机制,依然不能阻止服务被剔除,在这个过程中并没有任务异常抛出,查看各注册中心控制台输出日志,发现服务实例续约心跳请求也正常,服务不应该被剔除。而且新注册的服务提供者实例也无法进行数据同步,所以找了很多资料,对照源码分析,发现服务注册,续约,失效剔除等功能貌似都没有问题,能做的配置尝试也基本都做了,依然解决不了问题。

 正题: 直接上最终的解决结果: 修改注册中心配置,配置eureka.instance.preferIpAddress = true。问题解决。。。

 三个不同的profile上的eureka.instance.hostname 都设为localhost ,就会出现上述服务被剔除且无法同步,why ? 算不算eureka内部bug呢?


原创粉丝点击