在了解了动态路由的改造原理、方式后,就可以自实现一个小 demo。可以使用 mysql 作为持久化方式,目的是方面、易于管理。
动态路由实战
Zuul Server
1 | <dependencies> |
1 | spring: |
1 | // zuul 路由实体 |
验证
在数据库中增加三条数据
1 | INSERT INTO `springcloud`.`zuul_route` (`id`, `description`, `enabled`, `path`, `retryable`, `service_id`, `strip_prefix`, `url`) VALUES ('1', '重定向到百度', '\1', '/baidu/**', '\0', NULL, '\1', 'http://www.baidu.com'); |
访问 http://localhost:5555/baidu/get-result 、http://localhost:5555/client/get-result 、http://localhost:5555/client-a/get-result
1 | this is provider service! this port is: 8081 headers: [user-agent]: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36; [cache-control]: no-cache; [postman-token]: a35929aa-9bcf-f5e4-b79a-0e684b1611ed; [token]: E477CA7B8E7CDCDCE3331742544DE9F1; [content-type]: application/x-www-form-urlencoded;charset=UTF-8; [accept]: */*; [accept-encoding]: gzip, deflate, br; [accept-language]: zh-CN,zh;q=0.9; [x-forwarded-host]: localhost:5555; [x-forwarded-proto]: http; [x-forwarded-prefix]: /client; [x-forwarded-port]: 5555; [x-forwarded-for]: 0:0:0:0:0:0:0:1; [host]: localhost:8081; [connection]: Keep-Alive; |
1 | { |
由此可以证明,动态路由配置成功。
灰度发布
灰度发布是指在系统迭代新功能时的一种平滑过渡的上线发布方式。灰度发布是在原有的系统基础上,额外增加一个新版本,在这个新版本中,有需要验证的功能修改或添加,使用负载均衡器,引入一小部分流量到新版本应用中,如果这个新版本没有出现差错,再平滑地把线上系统或服务一步步替换成新版本,直至全部替换上线结束。
灰度发布实现方式
灰度发布可以使用元数据来实现,元数据有两种
- 标准元数据:标准元数据是服务的各种注册信息,如:ip、端口、健康信息、续约信息等,存储于专门为服务开辟的注册表中,用于其他组件取用以实现整个微服务生态
- 自定义元数据:自定义元数据是使用
eureka.instance.metadata-map.{key}={value}
配置,其内部实际上是维护了一个 map 来保存子弹元数据信息,可配置再远端服务,随服务一并注册保存在 Eureka 注册表,对微服务生态没有影响。
灰度发布实战
源码:https://gitee.com/laiyy0728/spring-cloud/tree/master/spring-cloud-zuul/spring-cloud-zuul-metadata
provider
1 | eureka: |
1 |
|
Zuul Server
1 | <dependencies> |
1 | spring: |
1 | // 实现灰度的 Filter |
验证
正常访问: http://localhost:5555/provider/get-result ,查看返回值, port 在 7070 和 7071 之间轮询。
启用 gray_mark header,再次访问,发现 port 始终都是 7072,由此验证灰度成功