随着微服务化, 服务间的调用也会越来越复杂, 一个服务可能要调用其他多个服务;如 Spring cloud开发的时候要配合测试(或开发环境)环境 eureka注册中心和 config , 但是这时候 不能让其他同事通过这个 eureka 发现到你的本地机器,不然他们调试就gg了; 还有你可能同时负责多个服务,完成产品需求的时候,你得保证你本地启服务A能直接调用到你本地启的服务B,而不是测试环境的那个服务实例
1. 在本地开发阶段, 如何不能让其他人访问你本机 ?
- 将 spring.application.name 加上环境
${spring.profiles.active}
来将服务名称给区分开
但是这样的话,就拉取不到测试环境 spring cloud config的配置了, 因为都是通过服务名来匹配的 - bootstrap.yml 建一个本地专门的副本 , 如 bootstrap-local.yml 在这里只重写需要改的配置, 不注册到eureka 上, registerWithEureka = false; 这样 别人就不会调用到你的开发机器了 => 需要你启动的时候指定 jvm 参数
-Dspring.profiles.active=local
image.png
2. 如果你同时开发相互调用的几个服务,如何本地直接调用 调试?
image.png微服务项目,服务间的调用是比较复杂的, 比如有 A、B、C 三个服务, 其中 A和B都是你自己负责的; 当新需求要同时修改服务 A 和 B 的时候 你就需要在本地调试 A 到 B 的调用,而且你还需要调用部署在测试环境的服务C 但是 Feign 本身是走 ribbon 负载均衡的,而你本地开发的时候 服务又不能注册上去(注册上去的话,别人就有可能调用到你本地机器 出现各种奇怪的问题),注册上去也可能调用到测试服务器的实例
FeignClient 的属性 name/serviceId 是指定你要调用的服务名, 如果 url 属性值是空 那么就不会走 ribbon 负载均衡的逻辑(从eureka拉取服务实例列表,然后ribbon进行负载均衡选择 机器ip), so~ 我想到的是 加一个配置 ,且 默认值是 “” , 如下: 注意那个 冒号 !!!
@FeignClient(name = "ServiceA",
url = "${feign.client.config.serviceA.url:}",
fallbackFactory = ServiceAFallbackFactory.class)
public interface ServiceAClient extends ServiceAInterface {}
然后本地开发的时候 调试的时候 指向本地启动的另一个项目
feign:
client:
config:
serviceA:
url: http://localhost:8080
ps: xx-local.yml 这种文件可以 gitignore 掉; local 单词也是直接用你自己专属id的~ 如 bootstrap-holysu.yml
最终的配置
bootstrap.yml
bootstrap-local.yml
所有常规的配置在 bootstrap.yml 中保持不动, 本地调试需要的配置都在 bootstrap-local.yml 中 这样也不用担心调试使用的配置忘记改回去的时候 不小心推到 git 仓库上去,造成测试环境或生产环境部署失败
这样,就可以防止测试环境调用到你本机,也可以指定某个服务调用到本地另一机器 , 而且也不用担心不小心 设置 FeignClient 的url后 忘记去掉就把代码推到仓库上的尴尬 => 完美啊
网友评论