https://www.cnblogs.com/dadadechengzi/p/9373069.html
https://blog.csdn.net/wo18237095579/article/details/83543592
比较完整的现代微服务架构,从外到内依次分为:前端用户体验层->网关层->BFF层->微服务层。整个架构层次清晰,职责分明,是一种灵活的能够支持业务不断创新的演化式架构。
1、BFF按团队或业务线进行解耦拆分,拆分成若干个BFF微服务,每个业务线可以并行开发和交付各自负责的BFF微服务。
聚合:某一个功能需要同时调用几个后端API进行组合,比如首页需要显示分类和产品细节,就要同时调用分类API和产品API,不能一次调用完成。
裁剪:后端服务返回的Payload一般比较通用,App需要根据设备类型进行裁剪,比如手机屏幕小,需要多裁掉一些不必要的内容,Pad的屏幕比较大,可以少裁掉一些内容。
适配:一种常见的适配场景是格式转换,比如有些后台服务比较老,只支持老的SOAP/XML格式,不支持新的JSON格式,则无线App需要适配处理不同数据格式。
注:在前后端之间通过引入BFF层,实现前后端解耦。BFF实现聚合、裁剪和适配,可以让前端减少工作量。对前端而言,BFF屏蔽了后端的接口。
2、网关在无线设备和BFF之间又引入了一层,让两边可以独立变化,特别是当后台BFF在升级或迁移时,可以做到用户端应用不受影响。网关隐藏内部架构。管理大量的API接口,对接客户,适配协议,进行安全认证,转发路由,限流,监控日志,防止爬虫,进行灰度发布,压力测试/金丝雀测试,服务迁移等。
网关一般由独立的框架团队负责运维,专注跨横切面(Cross-Cutting Concerns)的功能,包括:
路由,将来自无线设备的请求路由到后端的某个微服务BFF集群。实现容错和回退。实现智能路由和负载均衡。
认证,对涉及敏感数据的API访问进行集中认证鉴权。身份认证和权限认证。阻止非法请求。
流量监控,对API调用进行性能监控。实现服务降级。
限流熔断,当出现流量洪峰,或者后端BFF/微服务出现延迟或故障,网关能够主动进行限流熔断,保护后端服务,并保持前端用户体验可以接受。
安全防爬,收集访问日志,通过后台分析出恶意行为,并阻断恶意请求。
注:网关更注重跨横切面逻辑,比如安全认证,日志监控,限流熔断等。引入网关层,实现前端和BFF层的解耦。BFF层可以按照业务需要,按照业务线或产品线进行拆分。
按照业务需要,网关层可以进一步拆分,比如按照接入类型,拆分为支持第三方开放API的网关,面向H5应用的网关,面向移动端的网关。
前置过滤器:在http请求到达实际服务之前对http请求进行拦截和修改。
身份验证和授权;请求头校验(比如统一的格式校验,必须包含x-corelation-id等,和业务无关);
路由过滤器:可以更改服务所指向的目的地。
确定是否需要进行某些级别的动态路由,比如在同一个服务的不同版本之间进行路由(灰度发布,A/B测试);
后置过滤器:可以检查和更改来自被调用服务的响应;
记录响应;处理(响应中的)错误;审核敏感信息;
华侨永亨的BFF,
一是拦截请求,实现sessionID的管理(生成,校验,applicationID的映射);二是实现到ms-rao的API的路由转发。
Ms-Rao实现了业务组装,相当于业务和API的聚合。
Domain层实现了对老系统,特别是soap接口的适配。
边缘网关
一般而言,网关一般是工作在请求和微服务之间。实际上,微服务可能需要调用第三方服务。可以在微服务和第三方服务之间设置网关,这些网关工作在微服务的边缘,称之为边缘网关。
网关B的作用可以是统计对第三方服务的调用,服务降级熔断。
20200927
BFF常用场景:
聚合:合并多次调用
裁剪:对payload的内容进行裁剪
适配:适配不同的前端,对数据格式进行调整。
BFF的实现方式:利用工厂模式+spring的自动注入
https://blog.csdn.net/coqcnbkggnscf062/article/details/104061750
1、创建AbstractService类或接口,抽象方法method();
2、具体工厂类ServiceA继承或者实现AbstractService
3、在配置类ServiceHolder中定义
@Autowired
Private Map<String, AbstractService> serviceMap; // 默认的key是具体工厂类的bean name
调用类:
serviceHolder.getServiceMap(“serviceA”).method();
4、可以利用配置文件,实现更灵活的配置
Otp:
aliasMap:
bvweb: serviceA
bvmobile: serviceB
1)实现配置类AudAlias
@Component
@EnableConfigurationProperties
@ConfigurationProperties(“Otp”)
Public class AudAlias {
Private Map<String, String> aliasMap;
}
2)修改serviceHolder类的getServiceMap方法,实现
Aud -> service name -> service class
3)调用者:
serviceHolder.getServiceMap(aud).method(); // 变量aud的取值为bvweb或bvmobile