lms微服务框架介绍
lms 框架简介
Lms是一个旨在通过.net平台快速构建微服务开发的框架。具有稳定、安全、高性能、易扩展、使用方便的特点。lms内部通过dotnetty实现高性能的rpc通信,使用zookeeper作为服务注册中心。RPC通信支持随机轮询、哈希一致性、随机路由等负载均衡算法。
您还可以很方便的与CAP或是MassTransit集成,使用事件总线进行内部通信。
开源地址
该框架现在还正在开发过程中,如果您也认可该框架,您可以给个star,或是提交pr参与贡献,如果遇到问题,您也可以通过issues需求帮助。
快速开始
LMS框架集成与服务托管
使用通用主机注册和托管LMS服务
使用LMS框架非常简单,您只需要使用.net提供的通用主机注册LMS框架,同时指定启动的模块,在启动的模块中,通过DependsOn
特性依赖必要的组件。
通用主机注册LMS框架主要用于一般情况下对服务的托管,配置的token
保证的集群通信的安全性,避免用户直接通过RPC端口访问集群内部,
(1) 只有请求来源于网关,才被认为是合法的请求。集群外部无法通过rpc端口与主机直接通信。
(2) 服务内部通信过程中,同一个集群只有配置的token一致, 通信才会被被认为是合法的。
- 注册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服务,并指定启动的模块
;
}
}
- 指定启动模块
[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
方法在应用结束时执行释放资源的方法。
- 配置
您可以使用json
或是yml
格式对服务进行配置。如下所示,列举了lms服务必要的最少配置。
rpc:
host: 0.0.0.0 # 主机地址
rpcPort: 2201 # rpc通信端口号
token: ypjdYOzNd4FwENJiEARMLWwK0v7QUHPW # token令牌
registrycenter:
connectionStrings: 127.0.0.1:2181 # 服务注册中心地址
registryCenterType: Zookeeper # 服务注册中心类型
- 完成主机构建后,您可以引用各个微服务模块的应用接口,或是托管服务自身的应用服务。集群内部使用dotntty实现的RPC框架进行通信。
使用Web主机注册和托管LMS服务
您可以使用.net的web主机来注册和托管lms服务,通过这种形式构建的服务主机,可以通过引用各个微服务模块的应用接口,通过web主机指定的http端口对外提供访问。web主机可以通过应用接口生成的代理与微服务集群内部各个服务主机进行通信。
通过web主机注册LMS服务时,一般不需要实现应用接口(即,不需要托管应用服务),只需要引用各个微服务模块的应用接口,通过HTTP端口提供一个与集群外部通信的方式。
- 注册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>(); });
}
- 启动模块
[DependsOn(typeof(RpcProxyModule),
typeof(ZookeeperModule),
typeof(HttpServerModule),
typeof(DotNettyModule),
typeof(MessagePackModule)
)]
public class GatewayModule : LmsModule
{
}
与通用主机的指定的启动模块相比,需要额外依赖HttpServerModule
模块。
- 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通信过程中,您可以使用缓存拦截。通过使用缓存拦截,可以大大提升系统的性能。在一个应用接口方法配置了缓存拦截,那么在方法执行前,如果存在缓存,则会从缓存中取出数据。
您可以在服务条目的方法上通过如下特性对缓存拦截进行配置。
GetCachingInterceptAttribute
优先从缓存中读取缓存数据,如果缓存中不存在,才执行本地或是远程方法。UpdateCachingInterceptAttribute
执行本地或远程方法并更新缓存数据。RemoveCachingInterceptAttribute
执行本地或远程方法,并删除相应的缓存数据。
更对缓存拦截的使用和配置请查看缓存拦截文档。
lms微服务框架介绍的更多相关文章
- lms微服务框架主机介绍
目录 概念 .net的通用主机 .net的web主机 lms的业务主机类型 用于托管业务应用的普通主机 1. 创建一个应用台程序 2. 安装Silky.Lms.NormHost包 3. 注册LMS服务 ...
- 通过lms.samples熟悉lms微服务框架的使用
经过一段时间的开发与测试,终于发布了Lms框架的第一个正式版本(1.0.0版本),并给出了lms框架的样例项目lms.samples.本文通过对lms.samples的介绍,简述如何通过lms框架快速 ...
- 【GoLang】golang 微服务框架 介绍
原文如下: rpcx是一个类似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服务框架,基于Golang net/rpc实现. 谈起分布式的RPC框架,比较出名的是阿里巴巴的dubbo,包括 ...
- Spring Cloud微服务框架介绍
Spring Cloud为开发人员提供了一整套的快速构建分布式应用的工具,入服务注册.服务发现.熔断.负载均衡.路由等,提供了开箱即用的各种依赖以及良好的可扩展机制. 目前在Spring Cloud的 ...
- 面试都在问的微服务、服务治理、RPC、下一代微服务框架... 一文带你彻底搞懂!
文章每周持续更新,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- 微服务架构介绍和RPC框架对比
微服务架构介绍和RPC框架对比 1.微服务架构 1.1 特征 自动化部署,端点智能化,语言和数据的去中心化控制. 1.2架构 一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中 ...
- 微服务框架Lagom介绍之一
背景 Lagom是JAVA系下响应式 微服务框架,在阅读本文之前请先阅读微服务架构设计,Lagom与其他微服务框架相比,与众不同的特性包括: 目前,大多数已有的微服务框架关注于简化单个微服务的构建-- ...
- go微服务框架go-micro深度学习(一) 整体架构介绍
产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以维护,后期的每次产品迭代上线都会牵一发而动全身.项目 ...
随机推荐
- 5. Linux文件目录管理和打包压缩与搜索命令
1.touch:用于创建空白文件或设置文件的时间 举例:使用ls 命令查看一个文件的修改时间,然后修改这个文件,最后再通过touch命令把修改后的文件时间设置成修改之前的时间(很多黑客就是这样做的): ...
- php小程序-文章发布系统
php小程序-文章发布系统 一 项目相关视图 二 项目经验 主要用于熟悉php与mysql的相关操作 三 源码下载地址 http://files.cnblogs.com/files/qiujun/ar ...
- 既有Nginx重新动态编译增加http2.0模块
1.HTTP2.0 HTTP2.0相较于http1.x,大幅度的提升了web性能,在与http1.1完全语义兼容的基础上,进一步减少了网络延时.我们现在很多对外的网站都采用https,但是F12一下看 ...
- TDH社区版搭建总结
在安装之前需要对docker分区进行格式化处理: Redhat/CentOS 在Redhat/CentOS上,docker分区必须采用XFS格式,实现的步骤如下: 1. 创建目录/var/lib/do ...
- 【uva 1658】Admiral(图论--网络流 最小费用最大流)
题意:有个N个点M个边的有向加权图,求1~N的两条不相交路径(除了起点和终点外没有公共点),使得权和最小. 解法:不相交?也就是一个点只能经过一次,也就是我后面博文会讲的"结点容量问题&qu ...
- P1108 低价购买(DP)
题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买".每次你购买一支股 ...
- POJ1087 A Plug for UNIX(网络流)
在会议开始之前,你收集所有记者想要使用的设备,并尝试设置它们.你注意到有些设备使用没有插座的插头.你想知道这些设备是否来自建造这个房间时并不存在的国家.对于一些插座,有几个设备使用相应的插头.对于其他 ...
- POJ2429 GCD & LCM Inverse pollard_rho大整数分解
Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and t ...
- Light Bulb ZOJ - 3203 三分
三分: 和二分非常类似的一个算法,与二分不同的是 二分是单调的,而三分是一个先增后减或者先减后增 三分可以求出峰值. 注意三分一定是严格单调的,不能有相等的情况. 讲个例题: 题目 题意: 一个人发现 ...
- Keywords Search HDU - 2222 AC自动机板子题
In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey al ...