基于surging的木舟平台如何构建起微服务

一、概述

木舟平台分为微服务平台和物联网平台, 上面几篇都是介绍如何通过网络组件接入设备,那么此篇文章就细致介绍下在木舟平台下如何构建微服务。

木舟 (Kayak) 是什么?

木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的, 平台包含了微服务和物联网平台。支持异步和响应式编程开发,功能包含了物模型,设备,产品,网络组件的统一管理和微服务平台下的注册中心,服务路由,模块,中间服务等管理。还有多协议适配(TCP,MQTT,UDP,CoAP,HTTP,Grpc,websocket,rtmp,httpflv,webservice,等),通过灵活多样的配置适配能够接入不同厂家不同协议等设备。并且通过设备告警,消息通知,数据可视化等功能。能够让你能快速建立起微服务物联网平台系统。

那么下面就为大家介绍如何从创建组件、协议、设备网关,设备到设备网关接入,再到设备数据上报,把整个流程通过此篇文章进行阐述。

二、构建服务

创建服务接口,继承IServiceKey,添加特性[ServiceBundle("api/{Service}/{Method}")] 配置routepath,代码如下:

复制代码
   [ServiceBundle("api/{Service}/{Method}")]
   public interface ITestApiService:IServiceKey
   { 
       public Task<string> SayHello(string name);
   }

创建服务实例,继承ProxyServiceBase, ITestApiService, ISingleInstance,如果只是业务处理只需继承ProxyServiceBase,继承ISingleInstance表示注入的生命周期 为单例模式,添加特性ModuleName标识一个服务多个实例,可以在调用的时候传入ServiceKey

复制代码
    [ModuleName("Test")]
    public class TestService : ProxyServiceBase, ITestApiService, ISingleInstance
    {
        public Task<string> SayHello(string name)
        {
            return Task.FromResult($"{name} say:hello world");
        }
    }

二、身份鉴权

webapi调用必然会牵涉到身份鉴权,用户登录问题,而surging 已经集成了一套jwt验证机制

然后在Stage配置节上配置ApiGetWay

复制代码
   "ApiGetWay": {
     "AccessTokenExpireTimeSpan": "240",
     "AuthorizationRoutePath": "api/sysuser/authentication",//身份鉴权服务的routepath
     "AuthorizationServiceKey": null,
     "TokenEndpointPath": "api/oauth2/token",//映射调用的routepath
     "CacheMode": "MemoryCache" //MemoryCache or  gateway.Redis save token
   }

然后在接口方法上加上 [Authorization(AuthType = AuthorizationType.JWT)] 特性,服务调用就要进行身份鉴权

复制代码
    public interface IModuleService : IServiceKey
    {
        [Authorization(AuthType = AuthorizationType.JWT)]
        Task<ApiResult<bool>> Add(ModuleModel model);

        [Authorization(AuthType = AuthorizationType.JWT)]      
        Task<ApiResult<bool>> Modify(ModuleModel model);

        [Authorization(AuthType = AuthorizationType.JWT)]
        Task<ApiResult<Page<ModuleModel>>> GetPageAsync(ModuleQuery query);

    }

三、缓存拦截

surging 可以支持拦截缓存,可以通过ServiceCacheIntercept特性进行配置,获取缓存可以通过CachingMethod.Get, 删除缓存可以通过CachingMethod.Remove,可以支持MemoryCache,Redis, 可以支持一,二级缓存,

启用EnableStageCache表示网关调用也可以走缓存拦截(注:不支持模型参数)

复制代码
 [ServiceBundle("api/{Service}/{Method}")]
 public interface IProductService : IServiceKey
 {
     [Authorization(AuthType = AuthorizationType.JWT)]
     [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
     Task<ApiResult<bool>> Add(ProductModel model);

     [Authorization(AuthType = AuthorizationType.JWT)]
     Task<ApiResult<ProductModel>> GetProduct(int id);

     [Authorization(AuthType = AuthorizationType.JWT)]
     Task<ApiResult<Page<ProductModel>>> GetPageAsync(ProductQuery query);

     [Authorization(AuthType = AuthorizationType.JWT)]
     Task<ApiResult<List<ProductModel>>> GetProductByCondition(ProductQuery query);

     [Authorization(AuthType = AuthorizationType.JWT)]
     [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
     [ServiceLogIntercept]
     Task<ApiResult<bool>> DeleteById(List<int> ids);

     [Authorization(AuthType = AuthorizationType.JWT)]
     [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
     Task<ApiResult<bool>> Modify(ProductModel model);


     [Authorization(AuthType = AuthorizationType.JWT)]
     Task<ApiResult<bool>> Validate(ProductModel model);

     [Authorization(AuthType = AuthorizationType.JWT)]
     [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts",  CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
     Task<ApiResult<bool>> Stop(List<int> ids);

     [Authorization(AuthType = AuthorizationType.JWT)]
     [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
     Task<ApiResult<bool>> Open(List<int> ids);

     [Authorization(AuthType = AuthorizationType.JWT)]
     [ServiceCacheIntercept(CachingMethod.Get, Key = "GetProducts", CacheSectionType = "ddlCache", EnableL2Cache = false, Mode = CacheTargetType.MemoryCache, Time = 480, EnableStageCache = true)]
     Task<ApiResult<List<ProductModel>>> GetProducts();


 }

参数如果是非模型集合类型的参数,缓存key 会取第一个参数值,如果是模型参数就需要添加CacheKey特性,代码如下:

复制代码
    public class PropertyThresholdQuery
    {
        [CacheKey(1)]
        public string PropertyCode {  get; set; }
        [CacheKey(2)]
        public string ProductCode { get; set; }
        [CacheKey(3)]
        public string DeviceCode { get; set; }
    }

四、服务管理

1.平台是支持服务路由管理,此项功能除了可以查看元数据,服务节点,服务规则外,还可以在权重轮询负载算法情况下,改变权重可以让更多的访问调用到此服务节点上,还有可以优雅的移除服务节点

选择权重轮询负载分流算法,代码如下:

复制代码
    [ServiceBundle("api/{Service}/{Method}")]
    public interface ITestApiService:IServiceKey
    {
        // [Authorization(AuthType = AuthorizationType.JWT)]
        [Command(ShuntStrategy =AddressSelectorMode.RoundRobin)]
        public Task<string> SayHello(string name);
    }

以下是编辑权重

  1. 热部署中间服务
  1. 黑白名单,添加IP地址或者IP段就能限制相关IP访问

就比如访问api/testapi,结果如下:

4.支持swagger API文档

五、分布式链路追踪

支持skywalking 分布式链路追踪

七、总结

以上是木舟平台如何构建服务,平台定于11月20日发布1.0社区版本。也请大家到时候关注捧场。

相关推荐
fanly112 天前
基于木舟平台浅谈surging 的热点KEY的解决方法
surging microservice
fanly1112 天前
基于surging 的木舟平台如何通过Tcp或者UDP网络组件接入设备
surging microservice
fanly1117 天前
基于surging 的木舟平台如何通过HTTP网络组件接入设备
surging microservice
fanly111 个月前
基于surging的木舟平台如何上传模块热部署
surging microservice
fanly113 个月前
基于surging 如何利用peerjs进行语音视频通话
surging microservice
fanly113 个月前
基于surging的木舟IOT平台如何添加网络组件
surging microservice
fanly113 个月前
基于surging的产品项目-木舟开源了!
surging microservice
fanly115 个月前
解读surging 的内存过高的原因
surging microservice
fanly117 个月前
如何基于surging跨网关跨语言进行缓存降级
surging microservice