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