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

news/2024/11/14 0:30:39/文章来源:https://www.cnblogs.com/fanliang11/p/18541040

一、概述

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

      木舟 (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);}

以下是编辑权重

 

2. 热部署中间服务

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

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

 4.支持swagger API文档

 五、分布式链路追踪

支持skywalking 分布式链路追踪

 

七、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PYCHARM-pycharm工具激活

通过百度网盘分享的文件:pojie.zip 链接:https://pan.baidu.com/s/1FGafhVPF4TwL83u9_3sPUw 提取码:sky1

使用 C# 入门深度学习:Pytorch 基础

教程名称:使用 C# 入门深度学习 作者:痴者工良 地址: https://torch.whuanle.cn 1.2 Pytorch 基础 本文内容介绍 Pytorcn 的基础 API,主要是数组的创建方式和运算方式,由于相关内容跟 Numpy 比较相似,并且 Numpy 类型可以转 torch.Tensor,因此对 Numpy 感兴趣的读者可以…

IBM 开源的文档转化利器「GitHub 热点速览」

上周的热门开源项目,Star 数增长犹如坐上了火箭,一飞冲天。短短一周就飙升了 6k Star 的多格式文档解析和导出神器 Docling,支持库和命令行的使用方式。全新的可视化爬虫平台 Maxun,则在刚开源时便轻松斩获了 4k Star。而本地优先的个人理财工具 Actual,支持 Docker 自托管…

百度机器翻译SDK实验

1.先登录 https://ai.baidu.com/ai-doc/index/MT https://console.bce.baidu.com/

Mysql篇-Buffer Pool中的三大链表

为什么要有 Buffer Pool? 虽然说 MySQL 的数据是存储在磁盘里的,但是也不能每次都从磁盘里面读取数据,这样性能是极差的。 要想提升查询性能,那就加个缓存。所以,当数据从磁盘中取出后,缓存内存中,下次查询同样的数据的时候,直接从内存中读取。 为此,Innodb 存储引擎设…

SonarQube 10.5 for macOS, Linux, Windows 下载 - 代码质量、安全与静态分析工具

SonarQube 10.5 for macOS, Linux, Windows 下载 - 代码质量、安全与静态分析工具SonarQube 10.5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具 SonarQube Data Center Edition (Java App for macOS, Linux, Windows) 请访问原文链接:https://sysin.org/blog/sona…

双十一购物攻略:如何利用爬虫技术获取历史价格趋势,理性购物不踩雷

双十一购物狂欢节即将到来,作为程序员,利用爬虫技术查询商品的历史价格趋势,似乎是一个合理的需求,毕竟这只是为了自己参考,不涉及商业用途。然而,小伙伴们在进行爬虫操作时一定要谨慎小心,尤其是在数据采集和使用的过程中,务必遵守相关法律法规与平台的使用规范。 每次…

推荐7款程序员常用的API管理工具

前言 现如今API接口的编写与调试已成为开发人员不可或缺的技能,工欲善其事,必先利其器,选择一款优秀的API管理工具显得尤为重要。本文大姚给大家推荐7款程序员常用的API管理工具,大家可以根据自身和团队情况按需选择一款进行使用。 使用情况投票统计 微信使用情况投票统计:…

QT:报错误信息: Error: QDomNode file not found

QT:报错误信息: Error: QDomNode file not found ; Error: QDomDocument file not foundQT:报Error: QDomNode file not found QT:报错误信息: Error: QDomDocument file not found解决方法: 在项目文件 CH1302.pro 里添加 "XML" QT += core gui sql xml 优…

读数据质量管理:数据可靠性与数据质量问题解决之道01数据质量

数据质量1. 为什么数据质量值得关注 1.1. 数据是你的CEO的首要任务 1.2. 下游数据消费者(包括产品分析师、营销领导者和销售团队)则依赖于数据驱动的工具 1.3. 数据宕机1.3.1. 指数据丢失、不准确或出现错误的情况,它表现为过时的仪表板、不准确的报告,甚至是糟糕的决策1.3…

2024数据采集与融合技术实践-作业3

一、中国气象网单线程与多线程爬取图片码云仓库:作业3/task1 曹星才/2022级数据采集与融合技术 - 码云 - 开源中国(一)步骤 爬取网站:https://p.weather.com.cn/tqxc/index.shtml 1.1 单线程方式爬取 step1:设置为单线程方式爬取,settings.py中注设置最大并发请求数量CO…

Linux环境安装Splunk Enterprise服务端和Windows客户端Splunk Universal Forwarder

Ubuntu 22.04 安装Splunk Enterprise服务端这里采用安装Splunk Enterprise 8.2.5版本下载安装包 wget -O splunk-8.2.5-77015bc7a462-linux-2.6-amd64.deb https://download.splunk.com/products/splunk/releases/8.2.5/linux/splunk-8.2.5-77015bc7a462-linux-2.6-amd64.deb执…