总揽

<aside> 💡 提供 Java 与 Go 的 SDK\Agent,帮助用户在同一套Paas平台上实现多语言统一管理。

</aside>

<aside> 💡 Femas将微服务能力标准化封装,提供无关协议的统一接入ApiLayer层,方便将全套能力接入任意协议,实现多框架(SpringCloudDubbo、自研框架)、多协议的统一管理

</aside>

<aside> 💡 Femas将一个微服务应用在运行过程中可能需要用到的能力抽象成了一个个标准API组件,方便扩展,兼容其他开源组件生态

</aside>

<aside> 💡 Femas的底层组件能力插件化标准化,用户可按需要灵活组合搭配微服务能力矩阵

</aside>

<aside> 💡 Femas不绑定任何特定组件,任何组件,按照Femas标准化API扩展都能纳管到Femas平台,方便各个层级的用户学习、使用以及二次开发。

</aside>

<aside> 💡 治理能力下沉式无侵入,用户改造零成本

Untitled

开箱即用的控制台

Femas提供开箱即用的控制台,降低社区用户POC成本,控制台数据持久化默认支持本地嵌入式数据库RocksDB,和外接的mysql数据库,存储外接方式支持控制台的水平扩展。数据持久化支持可扩展,用户可根据抽象的数据操作接口,将治理数据存储到其他K/V数据库或关系型数据库。

Femas SDK 架构三层设计

Untitled

微服务协议接入标准的统一

针对多微服务框架协议多样化的问题,Femas将微服务生命周期抽象为一下几个阶段:初始化、实例注册、服务调用的DNS、流量出站、流量入站、服务销毁。在微服务协议的各个生命阶段做统一拦截,实现不同协议的轻量、低成本接入。

Femas 在这一层将微服务生命周期抽象为几个阶段:

public interface *IExtensionLayer* {
    /**
     * 处理某个服务的初始化工作
     * 包括但不限于 Context,各个治理组件,Config等
     * @param service
     */
    void init(Service service, Integer port);
    void init(Service service, Integer port, String registryUrl);
    /**
     * 处理某个服务的销毁工作
     * 包括但不限于 Context,各个治理组件,Config等
     * @param service
     */
    void destroy(Service service);
    /**
     * 实例注册
     * 实例中应当包含 Service 字段,以及 userTags 等信息
     * @param instance
     */
    void register(ServiceInstance instance);
    /**
     * 实例反注册
     * @param instance
     */
    void deregister(ServiceInstance instance);
    List<ServiceInstance> subscribe(Service service, List<ServiceNotifyListener> listeners);
    /**
     * 此方法中,需要封装
     *  - 熔断
     *  - 路由
     *  - 泳道
     *  - 负载均衡
     *  - 故障注入
     * @param instances
     * @return     */
    ServiceInstance chooseServiceInstance(Request request, List<ServiceInstance> instances);
    /**
     * 封装
     *  - metrics
     *  - 限流
     *  - Auth
     *  - 故障注入
     * @return 返回当前请求的上下文,和整个Context体系无关,为了解决异步模型,以及client覆盖server context的问题
     */
    RpcContext beforeServerInvoke(Request request, IHeaderUtils headerUtils);
    /**
     * 封装
     *  - metrics
     *  - 故障注入
     * @return 返回当前请求的上下文,和整个Context体系无关,为了解决异步模型,以及client覆盖server context的问题
     */
    RpcContext beforeClientInvoke(Request request, IHeaderUtils headerUtils);
    /**
     * 封装
     *  - metrics
     * @param response
     * @param rpcContext 将 beforeInvoke 返回的 RpcContext 传入
     */
    void afterServerInvoke(Response response, RpcContext rpcContext);
    /**
     * 封装
     *  - metrics
     *  - 容错
     *  - 熔断
     * @param response
     * @param rpcContext 将 beforeInvoke 返回的 RpcContext 传入
     */
    void afterClientInvoke(Request request, Response response, RpcContext rpcContext);
}