framework
项目架构基本思路
- 减少io
- 提升相应速度
- 最终一致性
- 移动端的开发需要考虑 移动端和服务器的时间问题
- 价格可以用分来计算
- 程序员的高效率来自明确的需求
- 需求不明确,项目我们不接
- 项目接了,需求不能改,只能放在下一个版本
- 减少io或者合并io
- 比如数据库的读取,放在一起调用,一次commit
- 比如服务间的请求,放在一起调用
- 设计系统考虑下:原料和流程
- 微服务要考虑服务的无状态(每次调用,微服务是对调用前后状态无感知的)
- 识别系统的变化点
- 升级发布
- 蓝绿发布(需要两倍的服务器)费钱
- 滚动发布(新版本和老版本会在一段时间内同时在线,容易出现问题)
- 灰度发布-金丝雀发布()
- 网关到服务
- 通过在网关配置不同的参数做区分,路由到不同的地址 使用RibboFilterContextHolder
- 服务到服务
- 自定义ribbo的rule的规则
- 可以支持A/B测试
- 制定灰度测试规则,区分哪些用户走哪些服务( 规则都写到数据库里面,boss后台录入规则,这样测试的时候就不用重启机器了)
- 使用ribbon 或者一起框架路由到对应的微服务
- 网关到服务
- 允许失败,允许适度浪费,鼓励内部良性竞争
- zuul(网关可以做什么)
- 分发服务
- 身份认证
- 过滤请求
- 监控
- 路由
- 限流
- 当你有拷贝欲望的时候 就该考虑设计的合理性
- 最小知道原则,安全规则
- 过滤器的执行顺序,节省计算的资源
- 网关接口容错
- 创建一个对象实现 FallbackProvider
- 生产中小技巧
- db中存储:过滤器开关
- 配合 spring-boot-starter-actuator 更清爽
- db中存储:过滤器开关
项目中遇到的问题
-
使用zuul cookie 和token 不能向后传递的问题
-
通过在yml里面配置下 ,把敏感信息制成空
zuul: # 以下配置,表示忽略下面的值向微服务传播,以下配置为空表示:所有请求头都透传到后面微服务。 # sensitive-headers: routes: # 此处名字随便取 custom-zuul-name: path: /zuul-custom-name/** service-id: service-sms
-
-
老项目改造中路由问题
- 方式一 yml配置
RibbonXXXFilter 路由到其他服务 SimpleHostRoultFilter 路由到其他url SendForewordFilter 路由到自己的路径 zuul: routes: xxx: path: /forword1/** url: forward:/myController # # 配合 风雨冷人 # xxxx: /zuul-api-driver/** ## 此处名字随便取 # custom-zuul-name: # path: /zuul-api-driver/** # url: http://localhost:8003/
-
方式二,使用zuul的Filter
1.过滤器 route 2.获取请求过来的url(请求) 3.url(请求) = url(目的地)映射 4.设置RequestContext中的 serviceid url ==== 开发之前,想清楚步骤 技术和业务做选择和取舍。(100种方法,你去其中一种,出问题自己扛)
-
动态路由(根据不同的用户路由到不同的服务)
- 路由到服务
- 路由到具体地址
-
微服务404的原因
- url是从哪里拿到的
- 从eureka中拿到
- 从配置文件中拿到
- url是从哪里拿到的
-
2核4G 并发量可以达到1000qps
实际开发中的技巧
- 做IP次数限制,
- 结合redis 一起使用 将key设置为ip,value设置为请求次数,并设置过期时间
- 网关限流和服务限流
- 结合gavaca 使用
- currentContext.setSendZuulResponse(false)
- 系统中默认的route post error过滤器不会执行,因为源码中有对应的判断
- 自定义的 route post error 还是会走,需要做对应的判断,可以再根据自己的业务做判断
- 表示本过滤器(比如pre)不向后面的route post error过滤器转发,但是所有的pre过滤还是会挨个执行
- 所以 在shouldFilter() 方法中 将返回值设置为 currentContext.getSendZuulResponse() 可以将其他的pre也过滤掉,不再向下执行
接口管理
- yapi
- 小幺鸡
缓存
- map
- gavage
- redis
- memcache
项目中优化的点
-
开发时用快照版本 生产环境不能用快照版本
- 通过将数据从堆移到栈中提升效率
- 常用不变的用缓存,不要用db(把内存用起来减少io ,io是瓶颈,比如网络io,磁盘io)
- 提高QPS
- 提高并发数
- 能用多线程就使用多线程
- 增加各种连接数,tomcat,mysql,redis等等
- 服务无状态:便于横向扩展,扩机器
- 让服务能力怼等(serviceUrl,打乱顺序)
- 减少相应时间
- 异步(最终一致性)
- 缓存
- 数据库优化
- 多的数据,分批次返回
- 减少 调用链(但是通常会被共用工具类打破)
- 能用长连接不用轮询,能不用长连接也不用
- 提高并发数
简历
- 传统项目改成微服务
- 兼容老的url,zuul,过滤器
- 根据用户做动态路由