翼度科技»论坛 编程开发 .net 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
一、概述

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

创建服务接口,继承IServiceKey,添加特性[ServiceBundle("api/{Service}/{Method}")] 配置routepath,代码如下:
  1.    [ServiceBundle("api/{Service}/{Method}")]
  2.    public interface ITestApiService:IServiceKey
  3.    {
  4.        public Task<string> SayHello(string name);
  5.    }
复制代码
创建服务实例,继承ProxyServiceBase, ITestApiService, ISingleInstance,如果只是业务处理只需继承ProxyServiceBase,继承ISingleInstance表示注入的生命周期 为单例模式,添加特性ModuleName标识一个服务多个实例,可以在调用的时候传入ServiceKey
  1.     [ModuleName("Test")]
  2.     public class TestService : ProxyServiceBase, ITestApiService, ISingleInstance
  3.     {
  4.         public Task<string> SayHello(string name)
  5.         {
  6.             return Task.FromResult($"{name} say:hello world");
  7.         }
  8.     }
复制代码
 
二、身份鉴权

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

然后在Stage配置节上配置ApiGetWay
  1.    "ApiGetWay": {
  2.      "AccessTokenExpireTimeSpan": "240",
  3.      "AuthorizationRoutePath": "api/sysuser/authentication",//身份鉴权服务的routepath
  4.      "AuthorizationServiceKey": null,
  5.      "TokenEndpointPath": "api/oauth2/token",//映射调用的routepath
  6.      "CacheMode": "MemoryCache" //MemoryCache or  gateway.Redis save token
  7.    }
复制代码
 
然后在接口方法上加上  [Authorization(AuthType = AuthorizationType.JWT)] 特性,服务调用就要进行身份鉴权
  1.     public interface IModuleService : IServiceKey
  2.     {
  3.         [Authorization(AuthType = AuthorizationType.JWT)]
  4.         Task<ApiResult<bool>> Add(ModuleModel model);
  5.         [Authorization(AuthType = AuthorizationType.JWT)]      
  6.         Task<ApiResult<bool>> Modify(ModuleModel model);
  7.         [Authorization(AuthType = AuthorizationType.JWT)]
  8.         Task<ApiResult<Page<ModuleModel>>> GetPageAsync(ModuleQuery query);
  9.     }
复制代码
三、缓存拦截

surging 可以支持拦截缓存,可以通过ServiceCacheIntercept特性进行配置,获取缓存可以通过CachingMethod.Get, 删除缓存可以通过CachingMethod.Remove,可以支持MemoryCache,Redis, 可以支持一,二级缓存,
启用EnableStageCache表示网关调用也可以走缓存拦截(注:不支持模型参数)
  1. [ServiceBundle("api/{Service}/{Method}")]
  2. public interface IProductService : IServiceKey
  3. {
  4.      [Authorization(AuthType = AuthorizationType.JWT)]
  5.      [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
  6.      Task<ApiResult<bool>> Add(ProductModel model);
  7.      [Authorization(AuthType = AuthorizationType.JWT)]
  8.      Task<ApiResult<ProductModel>> GetProduct(int id);
  9.      [Authorization(AuthType = AuthorizationType.JWT)]
  10.      Task<ApiResult<Page<ProductModel>>> GetPageAsync(ProductQuery query);
  11.      [Authorization(AuthType = AuthorizationType.JWT)]
  12.      Task<ApiResult<List<ProductModel>>> GetProductByCondition(ProductQuery query);
  13.      [Authorization(AuthType = AuthorizationType.JWT)]
  14.      [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
  15.      [ServiceLogIntercept]
  16.      Task<ApiResult<bool>> DeleteById(List<int> ids);
  17.      [Authorization(AuthType = AuthorizationType.JWT)]
  18.      [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
  19.      Task<ApiResult<bool>> Modify(ProductModel model);
  20.      [Authorization(AuthType = AuthorizationType.JWT)]
  21.      Task<ApiResult<bool>> Validate(ProductModel model);
  22.      [Authorization(AuthType = AuthorizationType.JWT)]
  23.      [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts",  CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
  24.      Task<ApiResult<bool>> Stop(List<int> ids);
  25.      [Authorization(AuthType = AuthorizationType.JWT)]
  26.      [ServiceCacheIntercept(CachingMethod.Remove, "GetProducts", CacheSectionType = "ddlCache", Mode = CacheTargetType.MemoryCache, EnableStageCache = true)]
  27.      Task<ApiResult<bool>> Open(List<int> ids);
  28.      [Authorization(AuthType = AuthorizationType.JWT)]
  29.      [ServiceCacheIntercept(CachingMethod.Get, Key = "GetProducts", CacheSectionType = "ddlCache", EnableL2Cache = false, Mode = CacheTargetType.MemoryCache, Time = 480, EnableStageCache = true)]
  30.      Task<ApiResult<List<ProductModel>>> GetProducts();
  31. }
复制代码
参数如果是非模型集合类型的参数,缓存key 会取第一个参数值,如果是模型参数就需要添加CacheKey特性,代码如下:
  1.     public class PropertyThresholdQuery
  2.     {
  3.         [CacheKey(1)]
  4.         public string PropertyCode {  get; set; }
  5.         [CacheKey(2)]
  6.         public string ProductCode { get; set; }
  7.         [CacheKey(3)]
  8.         public string DeviceCode { get; set; }
  9.     }
复制代码
四、服务管理

1.平台是支持服务路由管理,此项功能除了可以查看元数据,服务节点,服务规则外,还可以在权重轮询负载算法情况下,改变权重可以让更多的访问调用到此服务节点上,还有可以优雅的移除服务节点
选择权重轮询负载分流算法,代码如下:
  1.     [ServiceBundle("api/{Service}/{Method}")]
  2.     public interface ITestApiService:IServiceKey
  3.     {
  4.         // [Authorization(AuthType = AuthorizationType.JWT)]
  5.         [Command(ShuntStrategy =AddressSelectorMode.RoundRobin)]
  6.         public Task<string> SayHello(string name);
  7.     }
复制代码
以下是编辑权重

 
2. 热部署中间服务

 3. 黑白名单,添加IP地址或者IP段就能限制相关IP访问

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

 4.支持swagger API文档

 五、分布式链路追踪

支持skywalking 分布式链路追踪

 六 、构建发布

1. 微服务发布:
发布微服务的时候,需要引用的是微服务,不要引用stage, 如下图

 2. 网关发布, 引用服务接口和聚合服务(中间服务)模块,还有stage 模块

 

 
七、总结

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

来源:https://www.cnblogs.com/fanliang11/p/18541040
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具