背景
目前微服务体系下请求的过程:
web -> gateway -> 业务服务(实例1、实例2...)
从浏览器发出的请求通过网关转发到业务服务, 当业务服务有多个实例时, 网关会随机(或轮询等策略)转发到某个服务实例;
当线上和本地各有一个实例时, 前端发出的请求会在本地和线上随机发送, 既影响线上用户使用, 也影响开发人员调试;
所以本地启动服务实例时, 通常需要修改服务名, 用swagger或postman调试, 不能通过前端页面来调试.
我们希望实现的效果: 本地服务不修改服务名, 从开发人员浏览器发出的请求只会被转发到开发人员本机的实例, 线上其他用户发出的请求正常请求到线上的服务, 开发调试和正常使用都不影响;
灰度发布概念:
灰度发布_百度百科
操作步骤
总体思路: 给后端服务和前端请求加上标签, 网关通过标签选择实例;
后端服务增加元数据
本地服务不需要修改服务名, 增加metadata
配置:
spring:
cloud:
nacos:
discovery:
metadata:
GROUP: QXX
其中GROUP
是固定key, 必须大写; QXX
是自定义的名称; 服务启动后可以在nacos里看到:
也可以通过环境变量配置:
SPRING_APPLICATION_JSON={"spring.cloud.nacos.discovery.metadata.GROUP": "QXX"}
下面配置是无效的, 因为"GROUP"会被转换成小写:
SPRING_CLOUD_NACOS_DISCOVERY_METADATA_GROUP: QXX
用浏览器插件给前端请求添加header
浏览器安装插件, 给所有请求自动添加header, 以ModHeader
插件为例:
其中的X-Eureka-Label
是固定的header名, 大小写任意; QXX
和服务端定义的元数据相对应.
此时浏览器发出的请求都会被带上X-Eureka-Label
的header;
验证效果
打开前端, 本地发出的请求会全部转发到本地服务; 关闭ModHeader插件, 会转发到线上服务;