基于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);
}
以下是编辑权重

2. 热部署中间服务

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

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

4.支持swagger API文档

五、分布式链路追踪
支持skywalking 分布式链路追踪

七、总结
以上是木舟平台如何构建服务,平台定于11月20日发布1.0社区版本。也请大家到时候关注捧场。
基于surging的木舟平台如何构建起微服务的更多相关文章
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- 微服务架构:构建PHP微服务生态
微服务架构:构建PHP微服务生态 Linux系统技术交流QQ群(1675603)验证问题答案:刘遄 导读 诞生于 2014 年的“微服务架构”,其思想经由 Martin Fowler 阐述后,在近 ...
- Spring Cloud与微服务构建:微服务简介
Spring Cloud与微服务构建:微服务简介 单体架构及其不足 1.单体架构简介 在软件设计中,经常提及和使用经典的3曾模型,即表示层.业务逻辑层和数据访问层. 表示层:用于直接和用户交互,也成为 ...
- Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战
Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战 说明: Java生鲜系统中微服务的拆分应该如何架构设计与分析呢?以下是我的实战中的设计与经验分析. 目录 1. 微服务简介2. 当前现状3. ...
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...
- 使用http://start.spring.io/构建maven微服务项目的几个坑及eclipse构建spring boot微服务项目
一,使用http://start.spring.io/构建maven微服务项目 本来嘛,直接构建的项目导入时没有任何问题的导入就可以运行,可是最近构建好项目,然后导入,种种报错 1.导入之后POM报错 ...
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...
- 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践
由于最近公司业务需要,需要搭建基于Spring Cloud的微服务系统.遍访各大搜索引擎,发现国内资料少之又少,也难怪,国内Dubbo正统治着天下.但是,一个技术总有它的瓶颈,Dubbo也有它捉襟见肘 ...
- 基于spring boot2.0+spring security +oauth2.0+ jwt微服务架构
github地址:https://github.com/hankuikuide/microservice-spring-security-oauth2 项目介绍 该项目是一个演示项目,主要演示了,基于 ...
- Docker1.12 + Swarm 构建动态微服务应用
导读 我们在之前提到过一个示例,即一款由前端与多项后端服务共同构成的微服务应用.其中前端为Traefik HTTP代理,负责将各项请求路由至后端服务.而后端则非常简单,是一套基于Go的HTTP Web ...
随机推荐
- 【工程应用十二】Bayer图像格式中Hamilton-Adams及Zhang Wu 基于LMMSS算法的Demosaic过程优化。
Demosaic,中文直接发翻译为去马赛克, 但是其本质上并不是去除马赛克,这让很多第一次接触这个名词或者概念的人总会想的更多.因此,一般传感器在采集信息时一个位置只采集RGB颜色中的一个通道,这样可 ...
- ptmalloc2涉及的基础知识与基本数据结构
随笔来源:ctfwiki CSDN 本随笔只为记录分析总结的自己学习的结论,方便未来回顾,以及为他人提供一个理解的思路,不保证正确.如有谬误,请大家指出. 1.堆相关的操作 malloc:返回对应大小 ...
- 【YashanDB数据库】YAS-02079 archive log mode must be enabled when database is in replication mode
[标题]错误码处理 [问题分类]调整归档 [关键字]关闭归档.YAS-02079.replication mode [问题描述]执行alter database noarchivelog 关闭归档时, ...
- C++17: 用折叠表达式实现一个IsAllTrue函数
前言 让我们实现一个 IsAllTrue 函数,支持变长参数,可传入多个表达式,必须全部计算为true,该函数才返回true. 本文记录了逐步实现与优化该函数的思维链,用到了以下现代C++新特性知识, ...
- 前端解决Long类型精度丢失的问题
问题 数据库数据: 前端得到的数据: 出现了Long类型的数据出现精度丢失问题! 原因 JS中Long最大值:9007199254740992 JAVA中Long最大值:922337203685477 ...
- 聊聊 iframe, CSP, 安全, 跨域
refer : https://www.cnblogs.com/kunmomo/p/12131818.html (跨域) https://segmentfault.com/a/119000000450 ...
- GPUStack正式发布: 为大模型而生的开源GPU集群管理器
经过 Seal 研发团队几个月来持续的开发和测试,我们满怀期待及热情地发布新的产品 GPUStack,GPUStack 是一个用于运行 LLM(大型语言模型)的开源 GPU 集群管理器.尽管如今大语言 ...
- QT数据可视化框架编程实战之三维曲面图QML组件 使用高度图生成三维曲面图 补天云QT技术培训专家
QT数据可视化框架编程实战之三维曲面图 使用高度图生成三维曲面图 补天云QT技术培训专家 简介 本文将介绍如何使用QT数据可视化框架中的QT三维曲面图QML组件,通过一幅高度图的图片来生成三维曲面图. ...
- Avalonia upgrade from 0.10 to 11.x
Avalonia 从0.10版本升级到11.x版本.由于11.x新版本与旧版本对比发生了破坏性的变化,因此官方给出了升级的攻略可以参考. https://docs.avaloniaui.net/doc ...
- Qt中当程序结束时线程的退出
在Qt程序结束时应该如何退出正在运行的任务子线程? 因个人经验和能力有限,本文仅供参考,有错误或者考虑不完善的地方请各位批评指正. 一.正常情况下如何创建和退出线程 1.继承QThread,重写run ...