前提
基于Spring Cloud构建的应用如果需要跨Agent调用,还需要配置不同的规则,在这里记录下踩坑。
构建项目
创建一个应用,起名cloud-service-two, 只需要注册cloud-service-two即可,相关配置
1 | =cloud-service-two |
ACL配置
- service two 配置
因为service需要注册,所以需要Agent的写权限。创建一个services-write的策略
1 | service "cloud-service-two" { policy = "write" } |
然后分配token,填写在配置文件里面,这样应用就可以去向Consul注册了
- service one配置
注意:这里就是踩坑点,本以为给配置对应node和service的read策略就可以,远没有想象的那么简单。
先看下ConsulDiscoveryClient类,当前类会实现DiscoveryClient接口,当有操作需要做服务发现调用时,直接使用这个接口即可。(这里可能理解有误,欢迎指正!),调用关系如下
1 |
|
通过传入应用名(serviceName)来获取对应服务的IP端口集合,具体代码如下所示:
1 | private void addInstancesToList(List<ServiceInstance> instances, String serviceId, |
1处指出,Spring Cloud是通过健康检查服务(地址:/v1/health/service/:serviceName)去获取当前服务名下注册的所有服务,具体请看:List Nodes for Service接口详解
从官方文档可以看到,这里ACL需要节点可读,服务可读,所以我们的策略也应该这么去写。(之前就是只给了单独服务的可读权限一直就获取不到),策略如下:
1 | # 安全性低, 所有节点和服务名都可以暴露,基本等同于Mater Token |
使用这个策略生成一个Token,测试一下:
1 | http :8500/v1/health/service/cloud-service-two X-Consul-Token:55aacb1b-8d85-0289-8c13-d85c cf55fd2e |
顺利通过!
相关官方文档
[1] ACL Rules:https://www.consul.io/docs/acl/acl-rules.html
[2] ACL System: https://www.consul.io/docs/acl/acl-system.html
[3] Configuration: https://www.consul.io/docs/agent/options.html
[4] Authentication: https://www.consul.io/api/index.html#authentication
结束!🔚
