注册中心多环境隔离
- 不同的环境使用不同的注册中心
- 在本地开发环境和QA环境使用同一个注册中心时,使用不同的名称注册,比如商品服务的本地开发环境注册为product-api-dev, QA环境注册为product-api.
注册中心本地开发环境中,开发人员之间也需要隔离
开发人员之间如何隔离呢?命名为类似这种名字product-api-dev-zhangsan?这种方法行不通。因为我们是通过@FeignClient的方式来实现的,为了代码重用,我们会将dto和api定义到一个单独的模块,并将构件发布到maven私服中。如果在本地开发阶段,我们使用到的接口是类似这种@FeignClient("product-api"), 所以这样就会调用QA的服务。
对于开发人员来说,自己负责的模块就调用自己的,其他同事负责的就调用已发布到QA环境的,这样看来会顺畅很多,方便很多。
解决方案:@FeignClient支持属性占位符
官方文档原文:Placeholders are supported in the name and url attributes.
@FeignClient(name = "${feign.name}", url = "${feign.url}")
public interface StoreClient {
//..
}
基于这一点,我们可以在不同的微服务中定义不同的命名空间,比如在一个有四个模块的项目中我们可以定义如下:
- xx.api.basis.namespace=james.h.fu
- xx.api.item.namespace=james.h.fu
- xx.api.order.namespace=james.h.fu
- xx.api.finance.namespace=james.h.fu
然后参考以下两步来解决这个问题。
1. 服务生产者
- application-dev.properties中增加namespace
###模块服务命名空间定义###
xxx.basis.namespace =
xxx.item.namespace =
xxx.order.namespace = dev-
xxx.account.namespace =
###模块服务命名空间定义###
spring.application.name = ${xxx.order.namespace}xxx-order-api
- feign contract中增加namespace
/**
* 采购商退货服务契约
*
* @author : jamesfu
* @date : 2/2/2019
* @time : 4:30 PM
*/
@FeignClient("${xxx.order.namespace:}xxx-order-api")
@RequestMapping("v1/purchaser/tradeReturn")
2. 服务消费者
- 在本地开发需要调用自己本机的服务时增加启动参数
--xxx.order.namespace=james.h.fu
--xxx.basis.namespace=james.h.fu, 不增加启动参数默认调用QA的服务。
注意:在QA环境的application-qa.properties中将本模块的命名空间设置为空。
###模块服务命名空间定义###
xxx.basis.namespace =
xxx.item.namespace =
xxx.order.namespace =
xxx.account.namespace =
###模块服务命名空间定义###
Spring Cloud版本说明
- Spring Boot 2.0.6.RELEASE
- Spring Cloud Finchley.RELEASE
- Spring Cloud OpenFeign 2.0.2.RELEASE
项目架构图
Spring Cloud 项目架构图
关注公众号交流学习
关注Java分布式架构实战, 持续精进
联系我,学习交流












网友评论