lms 框架简介

Lms是一个旨在通过.net平台快速构建微服务开发的框架。具有稳定、安全、高性能、易扩展、使用方便的特点。lms内部通过dotnetty实现高性能的rpc通信,使用zookeeper作为服务注册中心。RPC通信支持随机轮询、哈希一致性、随机路由等负载均衡算法。

您还可以很方便的与CAP或是MassTransit集成,使用事件总线进行内部通信。

开源地址

https://github.com/liuhll/lms

该框架现在还正在开发过程中,如果您也认可该框架,您可以给个star,或是提交pr参与贡献,如果遇到问题,您也可以通过issues需求帮助。

快速开始

LMS框架集成与服务托管

使用通用主机注册和托管LMS服务

使用LMS框架非常简单,您只需要使用.net提供的通用主机注册LMS框架,同时指定启动的模块,在启动的模块中,通过DependsOn特性依赖必要的组件。

通用主机注册LMS框架主要用于一般情况下对服务的托管,配置的token保证的集群通信的安全性,避免用户直接通过RPC端口访问集群内部,

(1) 只有请求来源于网关,才被认为是合法的请求。集群外部无法通过rpc端口与主机直接通信。

(2) 服务内部通信过程中,同一个集群只有配置的token一致, 通信才会被被认为是合法的。

  1. 注册LMS服务
    public class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
} private static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.RegisterLmsServices<NormModule>() //注册lms服务,并指定启动的模块
; }
}
  1. 指定启动模块
    [DependsOn(typeof(ZookeeperModule),
typeof(DotNettyTcpModule),
typeof(RpcProxyModule),
typeof(MessagePackModule))]
public class NormModule : LmsModule
{ }

启动模块必须要继承LmsModule基类,通过DependsOn特性指定依赖的模块组件,一般的,您需要依赖服务注册中心组件(ZookeeperModule)、和通信框架组件(DotNettyTcpModule)、Rpc通信代理组件(RpcProxyModule),也可以指定编解码组件(MessagePackModule或是ProtoBufferModule),如果未指定编解码组件,则默认使用json作为rpc内部的通信编解码格式。同一个集群内部,必须要保证使用的编解码一致。

在启动模块中,您也可以通过重写RegisterServices来注册需要注入ioc的类,通过重写Initialize方法在应用启动时执行初始化方法,重写Shutdown方法在应用结束时执行释放资源的方法。

  1. 配置

您可以使用json或是yml格式对服务进行配置。如下所示,列举了lms服务必要的最少配置。

rpc:
host: 0.0.0.0 # 主机地址
rpcPort: 2201 # rpc通信端口号
token: ypjdYOzNd4FwENJiEARMLWwK0v7QUHPW # token令牌
registrycenter:
connectionStrings: 127.0.0.1:2181 # 服务注册中心地址
registryCenterType: Zookeeper # 服务注册中心类型
  1. 完成主机构建后,您可以引用各个微服务模块的应用接口,或是托管服务自身的应用服务。集群内部使用dotntty实现的RPC框架进行通信。

使用Web主机注册和托管LMS服务

您可以使用.net的web主机来注册和托管lms服务,通过这种形式构建的服务主机,可以通过引用各个微服务模块的应用接口,通过web主机指定的http端口对外提供访问。web主机可以通过应用接口生成的代理与微服务集群内部各个服务主机进行通信。

通过web主机注册LMS服务时,一般不需要实现应用接口(即,不需要托管应用服务),只需要引用各个微服务模块的应用接口,通过HTTP端口提供一个与集群外部通信的方式。

  1. 注册LMS服务
    public class Program
{
public async static Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.RegisterLmsServices<GatewayModule>()
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}
  1. 启动模块
    [DependsOn(typeof(RpcProxyModule),
typeof(ZookeeperModule),
typeof(HttpServerModule),
typeof(DotNettyModule),
typeof(MessagePackModule)
)]
public class GatewayModule : LmsModule
{
}

与通用主机的指定的启动模块相比,需要额外依赖HttpServerModule模块。

  1. StartUp类

StartUp类中,您可以通过ConfigureServices配置服务的注入,以及在Configure方法中配置Http请求中间件。例如: 您可以在StartUp类中配置mvc路由、SwaggerAPI稳定等。

需要注意的是必须在Configure中必须要配置app.ConfigureLmsRequestPipeline(),只有这样Http请求才可以通过lms框架预先设置的中间件。

    public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {Title = "Lms Gateway", Version = "v1"});
c.MultipleServiceKey();
});
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Lms Gateway Demo v1"));
} app.UseHttpsRedirection(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.ConfigureLmsRequestPipeline();
}
}

应用接口与服务条目

在一个微服务模块中,您可以通过定义应用接口来提供相应的服务条目,应用接口只需要通过ServiceRoute特性进行描述。每个应用接口定义的方法都会生成一个服务条目,应用接口就相当于MVC的Controller,服务条目相当于Action。

一般的,我们会将应用接口单独定义在一个独立的程序集,应用接口的实现定义在另外一个单独的程序集。应用接口程序集可以被其他微服务模块引用,在其他微服务模块中可以通过引用的应用接口生成代理,通过应用接口代理可以方便与服务提供者进行rpc通信。

    [ServiceRoute]
public interface ITestAppService
{
// 应用接口
// 每个方法都会生成一个服务条目
[HttpGet("{name:string}")]
[Governance(ShuntStrategy = AddressSelectorMode.HashAlgorithm)]
[GetCachingIntercept("ITestAppService.TestOut", "name:{0}")]
Task<TestOut> Get([HashKey][CacheKey(0)] string name);
}

更多应用接口的说明和配置请参考

配置

Lms支持通过json或是yml格式的对框架进行配置。一般的,您可以通过appsettings.json或是appsettings.yml文件对系统进行配置,并且您可以通过appsettings.{Environment}.yml或是appsettings.{Environment}.json指定在不同的运行环境中加载相应的环境变量。有关详细信息,请参阅在 ASP.NET Core 中使用多个环境

RPC通信参数配置

配置项 名称 缺省值 备注
Host 主机地址 0.0.0.0 缺省配置则自动获取当前服务器的IP为rpc服务IP
RpcPort Rpc通信端口 2200 指定的rpc通信端口号
MqttPort mqtt协议通信端口 2300 当前暂未实现mqtt通信协议
UseLibuv 使用libuv 2300 dotnetty通信是否使用libuv网络库,缺省值为true
IsSsl 使用Ssl加密 false
SslCertificateName Ssl证书名称 Ssl证书的相对路径全名称
SslCertificatePassword Ssl证书密码
SoBacklog dotnetty SoBacklog 8192 过大或过小会影响性能
RemoveUnhealthServer 移除不健康服务 true 是否从服务注册中心移除不健康的服务提供者

服务注册中心配置

配置项 名称 缺省值 备注
RegistryCenterType 服务注册中心类型 RegistryCenterType.Zookeepe 当前仅实现了zookeeper作为服务注册中心
ConnectionTimeout 连接超时 20 单位(秒)
SessionTimeout session会话超时 30 单位(秒)
OperatingTimeout 操作超时 60 单位(秒)
ConnectionStrings 服务注册中心地址 支持多服务注册中心,通一个集群的地址使用逗号(,)分割,多个服务注册中心使用(;)进行分割。例如:zookeeper1:2181,zookeeper1:2182,zookeeper1:2183;zookeeper2:2181,zookeeper2:2182,zookeeper2:2183
RoutePath 服务条目的路由地址 /services/serviceroutes 当服务启动时会自动注册路由信息到服务注册中心
MqttPtah Mqtt协议的服务条目的路由地址 /services/serviceroutes 暂未实现
HealthCheckInterval 暂未实现心跳检查
服务治理相关配置

可以通过Governance配置节点统一的rpc通信过程进行配置,但是该配置的可以被服务条目的GovernanceAttribute特性进行改写。

配置项 名称 缺省值 备注
ShuntStrategy 负载分流策略 rpc通信过程中的服务路由的地址选择器
ExecutionTimeout 执行超时时间 -1 单位(ms),0或-1表示不会超时,建议值:1000
MaxConcurrent 允许的最大并发量 100 超过最大的并发量则会路由到其他的服务提供者实例,如果不存在则会发生熔断保护
FuseSleepDuration 熔断休眠时间 60 单位(s),熔断期间不会被路由到服务提供者实例
FuseProtection 是否开启熔断保护 true 服务提供者无法到达时,开启熔断保护则不会立即将该服务提供者的实例标识为不健康,但是在熔断休眠时间内该实例不会被路由
FuseTimes 熔断几次之后标识服务提供者实例不健康
FailoverCount 故障转移次数 服务提供者不可达时,允许的重新路由的次数,缺省值为0,则服务提供者实例有几个,则会重试几次

更对关于服务通信的治理请查看服务治理节点相关文档。

缓存拦截

在rpc通信过程中,您可以使用缓存拦截。通过使用缓存拦截,可以大大提升系统的性能。在一个应用接口方法配置了缓存拦截,那么在方法执行前,如果存在缓存,则会从缓存中取出数据。

您可以在服务条目的方法上通过如下特性对缓存拦截进行配置。

  1. GetCachingInterceptAttribute 优先从缓存中读取缓存数据,如果缓存中不存在,才执行本地或是远程方法。

  2. UpdateCachingInterceptAttribute 执行本地或远程方法并更新缓存数据。

  3. RemoveCachingInterceptAttribute 执行本地或远程方法,并删除相应的缓存数据。

更对缓存拦截的使用和配置请查看缓存拦截文档

lms微服务框架介绍的更多相关文章

  1. lms微服务框架主机介绍

    目录 概念 .net的通用主机 .net的web主机 lms的业务主机类型 用于托管业务应用的普通主机 1. 创建一个应用台程序 2. 安装Silky.Lms.NormHost包 3. 注册LMS服务 ...

  2. 通过lms.samples熟悉lms微服务框架的使用

    经过一段时间的开发与测试,终于发布了Lms框架的第一个正式版本(1.0.0版本),并给出了lms框架的样例项目lms.samples.本文通过对lms.samples的介绍,简述如何通过lms框架快速 ...

  3. 【GoLang】golang 微服务框架 介绍

    原文如下: rpcx是一个类似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服务框架,基于Golang net/rpc实现. 谈起分布式的RPC框架,比较出名的是阿里巴巴的dubbo,包括 ...

  4. Spring Cloud微服务框架介绍

    Spring Cloud为开发人员提供了一整套的快速构建分布式应用的工具,入服务注册.服务发现.熔断.负载均衡.路由等,提供了开箱即用的各种依赖以及良好的可扩展机制. 目前在Spring Cloud的 ...

  5. 面试都在问的微服务、服务治理、RPC、下一代微服务框架... 一文带你彻底搞懂!

    文章每周持续更新,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( ...

  6. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  7. 微服务架构介绍和RPC框架对比

    微服务架构介绍和RPC框架对比 1.微服务架构 1.1 特征 自动化部署,端点智能化,语言和数据的去中心化控制. 1.2架构 一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中 ...

  8. 微服务框架Lagom介绍之一

    背景 Lagom是JAVA系下响应式 微服务框架,在阅读本文之前请先阅读微服务架构设计,Lagom与其他微服务框架相比,与众不同的特性包括: 目前,大多数已有的微服务框架关注于简化单个微服务的构建-- ...

  9. go微服务框架go-micro深度学习(一) 整体架构介绍

    产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以维护,后期的每次产品迭代上线都会牵一发而动全身.项目 ...

随机推荐

  1. okhttp踩坑

    ResponseBody.string()   平常我们用的客户端http调用工具一般是RestTemplate,HttpClient,okhttp,以前使用过前两者,没咋接触过okhttp,我看公司 ...

  2. 收集整理Idea常用配置及插件

    收集整理Idea常用配置及插件 一.IDEA配置 1.1 代码智能提示,忽略大小写 二.IDEA插件 2.1 Background Image Plus 2.2 Codota-代码智能提示 2.3 S ...

  3. python模块----configpaser (key:value型 配置文件解析器)

    configparser是用来读取配置文件的包,配置文件的格式类似:[section]+内容(键=值) 标准库网址:https://docs.python.org/3/library/configpa ...

  4. Deep Learning论文翻译(Nature Deep Review)

    原论文出处:https://www.nature.com/articles/nature14539 by Yann LeCun, Yoshua Bengio & Geoffrey Hinton ...

  5. MDK中用C++开发STM32

    ​作者:良知犹存 转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN 前言     最近想开发一段单片机的代码,代码本身有很多的重复元素,这重复定义的一些结构体使用起来有些繁琐, ...

  6. C语言简介与第一个C语言程序

    一.C语言产生的背景 C语言的出现与操作系统Unix是分不开的.Unix是1969年由美国贝尔实验室的K. Thompson和D. M. Ritchie两人用汇编语言编写,它存在许多不足,因此,需要一 ...

  7. BZOJ4668: 冷战 (并查集 + LCA)

    题意:动态给点连边 询问两个点之间最早是在第几个操作连起来的 题解:因为并查集按秩合并 秩最高是logn的 所以我们可以考虑把秩看作深度 跑LCA #include <bits/stdc++.h ...

  8. 【poj 1182】食物链(图论--带权并查集)

    题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...

  9. python爬取QQVIP音乐

    QQ音乐相比于网易云音乐加密部分基本上没有,但是就是QQ音乐的页面与页面之间的联系太强了,,导致下载一个音乐需要分析前面多个页面,找数据..太繁琐了 1.爬取链接:https://y.qq.com/ ...

  10. Redis 数据迁移 & 数据审计

    Redis 数据迁移 安装迁移工具 # 安装依赖 [root@dbtest03 ~]# yum install -y automake libtool autoconf bzip2 git # 拉取工 ...