灰度实现原理最关键的还是判断灰度用户这一步操作,可以在请求发出去前进行判断,然后直接请求对应的资源,也可以请求到了服务端后,服务端先区别出用户是否属于灰度名单内,再返回对应资源内容,具体还要看前端应用是怎样的形式部署的,服务端渲染或者是客户端渲染均有关系。
前端灰度发布的几种方式
1.服务端渲染应用
服务端渲染应用会在返回客户端之前将静态模板渲染好,知道这个是非常重要的,这意味着前端灰度这个过程要在用户的请求返回之前就完成,在客户端不处理任何灰度相关的内容。
代码示例:
// 服务端代码// 静态模板const model1 = () => { return ` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> </head> <body> <div id="mydiv">我是A界面</div> </body> </html> `}const model2 = () => { return ` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> </head> <body> <div id="mydiv">我是B界面</div> </body> </html> `}const isPass = getRule(req.uid) // 查询规则if (isPass) { // 在白名单 res.render(model2)} else { res.render(model1)}
2.前后端半分离的应用
这里前后端半分离的应用是指在有一部分前端应用的html文件依旧在服务端上,但是实际上却在客户端渲染的,相信大家见的比较多,例如下面的这段代码。
代码示例:
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"></head><body><div id="react-content"></div></body><script src="http://cdn.com/1.0.1/my.js"></script></html>
3. 客户端渲染的前端应用
代码示例:
const component1 = () => { return (<div>我是A组件</div>)}const component2 = () => { return (<div>我是B组件</div>)}const isPass = $.ajax("/getRule?uid") // 查询规则...render() { if (isPass) { // 在白名单 return model2() } else { return model1() }}
上面的这段客户端代码即可完成用户灰度,但是有一个问题,当后期需求增多的时候前端代码将非常庞大,而且每次的新需求发布的时候势必要去测试回归旧的版本是否被改动了,将维护两套内容,随着应用体积变大维护将变得非常累。
如上内容均为自己总结,难免会有错误或者认识偏差,如有问题,希望大家留言指正,以免误人,若有什么问题请留言