基于springcloud的灰度实现方案(二)

基于springcloud的灰度实现方案(一)

该项目已经上传到github上,地址如下:

https://github.com/yxkong/springboot-gray

项目说明

  • 通过eureka的扩展元数据,标记服务是灰度服务

  • 重写Ribbon的RoundRobinRule轮训算法实现灰度路由

项目结构说明

必须有一个eureka

lb-common 公共包
  • com.yxkong.common 项目公共信息的封装

  • com.yxkong.lb 项目中关于Ribbon相关的封装(注意扫描的域的范围)

  • Label基于RoundRobinRule重写轮询规则实现的路由选择

  • 实现ClientHttpRequestInterceptor 用于spring http调用时添加header将灰度标签向下传递

  • ServletAutoConfiguration 内置interceptor用于springmvc接口前置往HystrixRequestContext中初始化标签以及,请求后的销毁

gateway 网关
  • 基于bootstrap.yml 配置的网关路由,后续可以直接使用配置中心替换

  • AuthGlobalFilter 实现权限的拦截

  • GrayGlobalFilter 实现打灰度标签的功能,基于策略模式实现,配置策略只需要前缀名称即可(后续使用表达式,更方便)

  • RuleStrategy 规则策略接口

  • EqRuleStrategy 等于策略实现

  • Ge/GteRuleStrategy 大于/大于等于策略实现

  • Le/LteRuleStrategy 小于/小于等于策略实现

  • Mod10RuleStrategy 取模策略实现

#启动项目
java -jar  gateway-1.0.jar
api 提供基于原子服务的封装

引入了lb-common,主要就一个DemoController 和service都有一个/demo/hello的接口

//外部定义的包,要么定义为starter,要么指定具体的包,要不然扫描不到
@SpringBootApplication(scanBasePackages={"com.yxkong"})
@EnableDiscoveryClient
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.yxkong.api"})
@Import(EurekaMetadata.class)
@RibbonClients(defaultConfiguration = LoadBalanceAutoConfiguration.class)
public class ApiStarter {

    public static void main(String[] args) {
        SpringApplication.run(ApiStarter.class,args);
    }
}

启动环境

java -jar  api-1.0.jar
service 原子服务

主要通过yml文件来控制服务是否是灰度,以及对应的标签 application-dev.yml 开发环境 application-gray.yml 灰度环境

eureka:
  instance:
    metadata-map:
      version: 2.0
      label: gray

可以自己定义什么样的标签是灰度环境 目前 version=2.0 label=gray 是灰度标签 启动环境

# 启动正常环境
java -jar -Dspring.profiles.active=dev service-1.0.jar
# 启动灰度环境
java -jar -Dspring.profiles.active=gray service-1.0.jar

项目部署与调用情况

调用请求

查看eureka元数据

curl http://127.0.0.1:8765/eureka/apps/

请求直接由网关路由到灰度到service

# 灰度用户
curl  'http://127.0.0.1:9000/service/demo/hello' --header 'token: a'  --header 'Content-Type: application/json'
#返回结果
{"message":"执行成功!","status":"1","data":"service进入的版本号是:2.0","timestamp":1621607340919}
# 非灰用户
curl  'http://127.0.0.1:9000/service/demo/hello' --header 'token: abc'  --header 'Content-Type: application/json'
{"message":"执行成功!","status":"1","data":"service进入的版本号是:","timestamp":1621611780692}

请求直接由网关转发到api再路由到service

# 灰度用户
curl  'http://127.0.0.1:9000/api/demo/hello' --header 'token: a'  --header 'Content-Type: application/json'

{"message":"执行成功!","status":"1","data":"service进入的版本号是:2.0","timestamp":1621611879941}
# 非灰用户
curl  'http://127.0.0.1:9000/api/demo/hello' --header 'token: abc'  --header 'Content-Type: application/json'
#返回结果
{"message":"执行成功!","status":"1","data":"service进入的版本号是:","timestamp":1621611645354}

如果觉得对你有帮助,请关注公众号:5ycode,后续会不断更新哦

公众号图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值