编辑推荐: |
文章主要介绍了Jimu 功能技术、框架简图、如何使用、使用方式 及图解。
本文来自于博客园,由火龙果软件Anna编辑、推荐。 |
|
.Net Core 分布式微服务框架介绍 - Jimu
一、前言
近些年一直浸淫在 .Net 平台做企业应用开发,用过的 .Net 框架不多(具体数量不清,印象深刻的有
Asp.Net MVC,WPF,其他很多都是基于微软开发的框架做些封装而形成新的框架,大都是还没起好名就湮灭在历史长河中),而自己开发的框架倒是不少(5
- 8 套吧), 换框架与换公司成正比(每换一家公司,至少换一套框架),很多都见不得人(当时觉得高大上,后来觉得很low)。
随波逐流从 winform 年代到现在热火朝天的微服务,网上阅读各式各样的博客、新闻、评论、代码,懂了点微服务的概念,结合网上开源代码和思想,勉强拼凑出一个没什么特色的微服务框架
- Jimu (中文名:积木)。
不过框架的特色就像乳沟,挤挤还是有的:Jimu 是一个基于.Net Core 2.0 简单易用的微服务框架,使用了大量的开源库,
支持分布式、高并发和负载均衡, 实现了服务治理和 RPC 调用。Jimu 在持续迭代开发中,很多功能还在排期(如可视化监控和管理工具,热更新,服务熔断、限流和降级
...),如非爱折腾的高手,不建议上生产环境。正如其中文名 - 积木,希望用她来开发项目像搭积木一样简单快速可控,使项目安全可靠稳定,整体架构可拓展、高并发、分布式。
二、功能技术
服务注册:指定服务器地址,或通过扩展支持其他应用(如 consul - 已支持,redis, zookeeper)
服务发现:指定服务器地址,或通过扩展支持其他应用(如 consul - 已支持,redis ,zookeeper)
服务调用:使用 DotNetty 或 Flurl.Http 实现 RPC 调用
服务代理:Microsoft.CodeAnalysis 解析服务接口生成动态代理
健康监测:Quartz.Net 定时调度 Socket 任务检查服务器心跳
负载均衡:轮询算法(未实现的有: 加权轮询法, 最小连接数法,随机法,加权随机法,源地址哈希法)
授权认证:jose-jwt 实现 JWT 授权
序 列 化:Json.Net
系统日志:log4net、NLog
三、框架简图
如图所示,这里有四种角色:
Client:各种客户端, 这是抽象的说法,只要访问了 ApiGateway 都属于客户端(手机、电脑
..., 如果 Service Server1 和 Service Server2 访问了 ApiGateway
也属于客户端)
ApiGateway: 服务网关,外部要经过它才可访问内部的服务。网关是非常重要的一个角色,他相当于外部和内部服务之间的中介,负责接受和响应外部请求,以及调用内部服务,还有服务治理等功能
Service Discovery Server:负责保存已注册的服务,相当于服务的花名册, Service
Server 注册服务就是向花名册记录自己的名称, ApiGateway 发现服务就是去花名册找有哪些已注册的服务
Service Server:这就是微服务,所有业务需求都在这里实现
四、如何使用
服务注册与发现, 已经实现了两种方式:
不依赖第三方应用,直接注册到本地服务, 可参看 github 上的 Quick Start
依赖于 consul, 需要先启动 consul,然后服务注册 consul, ApiGateway
访问 consul 发现服务
下面用 consul 作为服务容器,演示怎么用 Jimu 实现一个分布式的微服务
1. 启动 consul
下载安装 consul
启动
2. 微服务项目
创建一个基于 .Net Core 2.0 的类库项目,并添加 jimu
依赖
添加服务,引用空间: using Jimu;
[JimuServiceRoute("api/{Service}")]
// RPC 调用路径
public class UserService : IJimuService
{
[JimuService (CreatedBy = "grissom")]
// 指定服务的元数据, 该服务调用路径为 api/user/getname?id=
public string GetName(string id)
{
return $"user id {id}, name enjoy!";
}
}
|
3. 微服务服务端项目
创建一个基于 .Net Core 2.0 的控制台项目, 并添加
Jimu.Server 和 Jimu.Common.Discovery.ConsulIntegration
依赖
Install-Package
Jimu.Server
Install-Package Jimu.Common.Discovery.ConsulIntegration |
在 Main 函数中添加服务器启动代码,引用空间: using Jimu.Server;
static void Main(string[]
args)
{
var hostBuilder = new ServiceHostServerBuilder(new
Autofac.ContainerBuilder())
.UseLog4netLogger()
.LoadServices ("QuickStart.Services")
.UseDotNettyForTransfer ("127.0.0.1",
8001)
.UseConsulForDiscovery ("127.0.0.1",
8500, "JimuService")
;
using (var host = hostBuilder.Build())
{
host.Run();
Console.ReadLine();
}
} |
4. 微服务客户端(ApiGateway)项目
创建一个基于 .Net Core 2.0 的 Asp.Net Core
Web 应用程序(可选择 API 项目模版),并添加 Jimu.Client 和Jimu.Common.Discovery.ConsulIntegration
依赖
Install-Package
Jimu.Client
Install-Package Jimu.Common.Discovery.ConsulIntegration
|
修改 Startup.cs 类的代码, 以便添加对 jimu 的支持
using Jimu.Client;
using Jimu.Client.ApiGateway;
public class Startup
{
public Startup (IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get;
}
// This method gets called by the runtime.
Use this method to add services to the container.
public void ConfigureServices (IServiceCollection
services)
{
//services.AddMvc();
services.UseJimu();
}
// This method gets called by the runtime.
Use this method to configure the HTTP request
pipeline.
public void Configure (IApplicationBuilder app,
IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//app.UseMvc();
var host = new ServiceHostClientBuilder (new
Autofac.ContainerBuilder())
.UseLog4netLogger()
.UsePollingAddressSelector()
.UseDotNettyForTransfer()
.UseServerHealthCheck(1)
.SetDiscoveryAutoUpdateJobInterval(1)
.UseConsulForDiscovery ("127.0.0.1",
8500, "JimuService")
.Build();
app.UseJimu(host);
host.Run();
}
} |
5. 同时启动 服务端 和 客户端
然后在浏览器访问: http://localhost:58156/
api/user/getname?id=666
6. 更多 demo
更多强悍的功能使用,请自己看 demo 领悟,由于时间有限,这里就不一一详解了,如果大家有兴趣,日后或者会有多篇幅和文档来介绍。
请下载 Jimu 源码, 或者下载项目 jimu.demo
.Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持
一、前言
最近有空就优化 Jimu (一个基于.Net Core 的分布式微服务框架),考虑到现在的开发组织都向前后端分离发展,前后端各司其职,好的
api 文档可以减少大家沟通的时间成本,所以优先给 Jimu 添加对 api 文档生成的支持。市面上非常著名和牛逼的的
api 文档生成框架非 swagger 莫属。 它可以用来生成、描述、调用可视化的 Web 服务。花了
二天多的时间把它集成到 Jimu 的 apigateway。
如图
api 列表
api 明细
二、使用方式
1. 环境
Net Core 2.0
基于Jimu 框架的 ApiGateway
2. 添加引用
Install-Package
Jimu.Client.ApiGateway .SwaggerIntegration |
3. 启动代码
在 Startup 里添加 UseJimuSwagger()
public void
ConfigureServices (IServiceCollection services)
{
services.UseJimuSwagger(); // 添加 Swagger 支持
}
public void Configure (IApplicationBuilder app,
IHostingEnvironment env)
{
app.UseJimuSwagger(); // 添加 Swagger 支持 |
4. 定义接口(服务/方法)
接口定义可以添加三种标注,这些标注最终会显示在 swagger 生成的文档。
a. JimuService 标注是对接口元数据的定义和描述,如创建人、时间、描述、访问角色限制等。
b. JimuFieldComment 标注是对形式参数的注释。
c. JimuReturnComment 标注是对接口的返回类型做注释。
[JimuService(EnableAuthorization
= true, CreatedBy = "grissom", CreatedDate
= "2018-07-17", Comment = "根据新闻
id 获取新闻内容")]
[JimuFieldComment("id", "新闻id")]
[JimuReturnComment("一篇新闻内容")]
News GetNews(string id); |
5. 定义对象 (DTO)
如果接口参数或返回类型是一个用户定义的类,对应的属性也可以添加注释标注
JimuFieldComment, 这些标注最终会显示在 swagger 生成的文档。
public class
News
{
[JimuFieldComment("新闻id")]
public string Id { get; set; }
[JimuFieldComment("新闻标题")]
public string Title { get; set; }
[JimuFieldComment("作者")]
public string Director { get; set; }
[JimuFieldComment("发布时间")]
public string PostTime { get; set; }
[JimuFieldComment("新闻内容")]
public string Content { get; set; }
} |
三、图解
四、总结
支持开源是很累和很耗时间的活,不过开源过程中自己也学到很多知识,希望可以一直坚持下去。
|