基于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 ...
随机推荐
- 7E头的那些事儿(帧格式分析实例)
0. 前言 作为一名嵌入式工程师,经常需要通过UART与外设打交道,而对于串行总线来说,往往我们必须要进行帧同步.通常的做法是把信令包含在2个0x7E的中间. 除此之外还有HDLC.PPP等协议也会到 ...
- 【CMake系列】01-CMake是什么
在很多开源项目中,经常可以看到CMakeLists.txt 这一文件,依靠它才能完成项目的配置运行过程.那它是什么? 接下来,在这个专栏中,我们将系统学习CMake这一个重要工具. 本专栏的实践代码全 ...
- P 问题和 NP 问题的简单理解
P/NP问题 | 维基百科 P 问题 P 问题的定义是:所有可以由一个确定型图灵机在多项式表达的时间内解决的问题 P 代表 Polynomial-time (adj. 多项式时间) 简单理解:答案可以 ...
- Kubernetes-3:使用kubeadm部署k8s环境及常见报错解决方法
k8s集群安装 环境说明: k8s-Master-Centos8 ip:192.168.152.53 k8s-Node1-Centos7 ip:192.168.152.253 k8s-Node2-Ce ...
- vue中代理解决跨域
跨域是什么 简单的讲就是你在一个地方使用另一个地方的资源,被浏览器给挡下来了,不让不用!当然,它挡下来是有自己理由的:为了安全(╬▔皿▔)╯. 解决跨域 我是用vue开发的,就vue代理模式解决跨域说 ...
- c# RSA加密解密,与java代码互通问题
RSA加密解密原本是公开算法,但是和一个java的小伙伴对接却出现了点问题,现在记录一下 首先,RSA的公钥私钥,有2种: 1.pem格式. 2.xml格式. 文章底部有pem格式和对应的xml样本数 ...
- .NET 多版本兼容的精美 WinForm UI控件库
前言 有粉丝小伙伴在后台留言咨询有没有WinForm 控件库推荐,现在就给安排上. .NET 平台进行 Windows 应用程序开发的我们来说,找一个既美观又实用的 WinForm UI 控件库至关重 ...
- JavaScript – 类型转换
介绍 JS 是弱类型语言, 在编程时, 有许多自动类型转换的技巧, 虽然大家都不太鼓励, 尤其是用了 TypeScript 之后, 但无可否认自动转换很方便, 看上去也很干净. 所以这篇还是要介绍一些 ...
- SQL Server – 我常用语句
前言 旧没用又忘记了, 又没有 intellisense, 记入这里吧. Reset Auto Increment DBCC CHECKIDENT ('TableName'); -- check cu ...
- Spring —— 注解开发(依赖注入)
自动装配 引用类型 简单类型 加载properties文件