简体中文 | English
silky框架旨在帮助开发者在.net平台下,通过简单代码和配置快速构建一个微服务应用的开发框架。它提供了 RPC通信 与 微服务治理 两大关键能力。这意味着,使用 silky 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 silky 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。同时 silky 是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。
silky微服务有着如下的优势:
开箱即用
超大规模微服务集群实践
企业级微服务治理能力
数据一致性的保证
Fabllback
指定的方法达到服务容错的目的账号信息(租户silky)
推荐使用docker-compose
安装部署基础服务.
docker-compose -f docker-compose.zookeeper.yml up -d
docker-compose -f docker-compose.redis.yml up -d
Silky.Agent.Host
包,并在Program.cs
类中新增创建托管网关应用主机的代码;using Gateway;
var hostBuilder = Host.CreateDefaultBuilder()
.ConfigureSilkyGatewayDefaults(webHostBuilder => webHostBuilder.UseStartup<Startup>());
await hostBuilder.Build().RunAsync();
Startup.cs
类,并添加如下代码;namespace Gateway;
public class Startup
{
public void ConfigureService(IServiceCollection services)
{
services.AddSilkyHttpServices()
.AddRouting()
.AddSwaggerDocuments()
.AddMiniProfiler();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseSwaggerDocuments();
app.UseMiniProfiler();
}
app.UseRouting();
app.UseEndpoints(endpoints => { endpoints.MapSilkyRpcServices(); });
}
}
.json
的配置文件,并新增appsetiings.yaml
配置文件,并添加如下配置:rpc:
token: ypjdYOzNd4FwENJiEARMLWwK0v7QUHPW
registrycenter:
type: Zookeeper
connectionStrings: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183;127.0.0.1:2184,127.0.0.1:2185,127.0.0.1:2186
distributedCache:
redis:
isEnabled: true
configuration: 127.0.0.1:6379,defaultDatabase=0
Silky.Agent.Host
包,并在Program.cs
类中新增创建托管应用主机的代码;using Microsoft.Extensions.Hosting;
var hostBuilder = Host.CreateDefaultBuilder().ConfigureSilkyGeneralHostDefaults();
await hostBuilder.Build().RunAsync();
appsettings.yaml
配置文件,并添加如下配置:rpc:
token: ypjdYOzNd4FwENJiEARMLWwK0v7QUHPW
port: 2200
registrycenter:
type: Zookeeper
connectionStrings: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183;127.0.0.1:2184,127.0.0.1:2185,127.0.0.1:2186
distributedCache:
redis:
isEnabled: true
configuration: 127.0.0.1:6379,defaultDatabase=0
IHellAppService
接口:[ServiceRoute]
public interface IHelloAppService
{
Task<string> SayHi([FromQuery]string name);
}
HellAppService
类,并实现IHellAppService
接口:public class HelloAppService : IHelloAppService
{
public Task<string> SayHi(string name)
{
return Task.FromResult($"Hello {name ?? "World"}");
}
}
例如: 在Silky.Hero项目中的权限管理器PermissionManager.cs
public class PermissionManager : IPermissionManager, IScopedDependency
{
private readonly IUserAppService _userAppService;
private readonly IRoleAppService _roleAppService;
public PermissionManager(IUserAppService userAppService,
IRoleAppService roleAppService)
{
_userAppService = userAppService;
_roleAppService = roleAppService;
}
public async Task<ICollection<string>> GetUserRoleNamesAsync(long userId)
{
var userRoleOutput = await _userAppService.GetRolesAsync(userId);
return userRoleOutput.RoleNames;
}
public async Task<ICollection<long>> GetUserRoleIdsAsync(long userId)
{
var userRoleIds = await _userAppService.GetRoleIdsAsync(userId);
return userRoleIds;
}
public async Task<ICollection<string>> GetRolePermissionsAsync(long roleId)
{
var rolePermissions = await _roleAppService.GetPermissionsAsync(roleId);
return rolePermissions;
}
}
IInvokeTemplate
提供的API,实现远程服务调用,该接口支持通过服务条目Id或是WebAPI的方式路由到具体的服务提供者方法;例如: 在Silky.Hero项目中,网关的权限认证处理器AuthorizationHandler通过IInvokeTemplate
调用权限应用服务提供的权限服务判断当前请求的接口是否有访问权限:
public class AuthorizationHandler : SilkyAuthorizationHandlerBase
{
private readonly IInvokeTemplate _invokeTemplate;
private const string CheckPermissionServiceEntryId =
"Silky.Permission.Application.Contracts.Permission.IPermissionAppService.CheckPermissionAsync.permissionName_Get";
private const string CheckRoleServiceEntryId =
"Silky.Permission.Application.Contracts.Permission.IPermissionAppService.CheckRoleAsync.roleName_Get";
public AuthorizationHandler(IInvokeTemplate invokeTemplate)
{
_invokeTemplate = invokeTemplate;
}
protected override async Task<bool> PolicyPipelineAsync(AuthorizationHandlerContext context,
HttpContext httpContext,
IAuthorizationRequirement requirement)
{
if (requirement is PermissionRequirement permissionRequirement)
{
if (EngineContext.Current.HostEnvironment.EnvironmentName == SilkyHeroConsts.DemoEnvironment &&
httpContext.Request.Method != "GET")
{
throw new UserFriendlyException("演示环境不允许修改数据");
}
var serviceEntryDescriptor = httpContext.GetServiceEntryDescriptor();
if (serviceEntryDescriptor.GetMetadata<bool>("IsSilkyAppService"))
{
// todo
return true;
}
return await _invokeTemplate.InvokeForObjectByServiceEntryId<bool>(CheckPermissionServiceEntryId,
permissionRequirement.PermissionName);
}
return true;
}
protected override async Task<bool> PipelineAsync(AuthorizationHandlerContext context, HttpContext httpContext)
{
var serviceEntryDescriptor = httpContext.GetServiceEntryDescriptor();
var roles = serviceEntryDescriptor
.AuthorizeData
.Where(p => !p.Roles.IsNullOrEmpty())
.SelectMany(p => p.Roles?.Split(","))
.ToList();
foreach (var role in roles)
{
if (!await _invokeTemplate.InvokeForObjectByServiceEntryId<bool>(CheckRoleServiceEntryId, role))
{
return false;
}
}
return true;
}
}
备注:
使用模板调用的方式优势在于微服务应用与应用之间不用引用其他微服务应用定义的应用接口,应用与应用完全解耦,互相不依赖;缺点在于并不支持分布式事务的使用场景;
silky提供了模板silky.app
模板可以快速的创建应用,开发者可以在安装模板后使用模块快速创建silky微服务应用。
> dotnet new --install Silky.App.Template
使用项目模板创建微服务应用。
PS> dotnet new silky.app -h
Silky App (C#)
作者: Liuhll
Usage:
dotnet new silky.app [options] [模板选项]
Options:
-n, --name <name> 正在创建的输出名称。如未指定名称,则使用输出目录的名称。
-o, --output <output> 要放置生成的输出的位置。
--dry-run 如果运行给定命令行将导致模板创建,则显示将发生情况的摘要。
--force 强制生成内容 (即使它会更改现有文件)。
--no-update-check 在实例化模板时,禁用对模板包更新的检查。
--project <project> 应用于上下文评估的项目。
-lang, --language <C#> 指定要实例化的模板语言。
--type <project> 指定要实例化的模板类型。
模板选项:
-t, --param:type <param:type> Set the silky host type, optional values: webhost, generalhost ,wshost, gateway
类型: string
默认: generalhost
-do, --dockersupport Add docker support for Silky
类型: bool
默认: true
-r, --rpcport <rpcport> Set the port for rpc listening
类型: int
默认: 2200
-in, --infrastr only include basic service orchestration files
类型: bool
默认: false
-e, --env <env> Set dotnet env
类型: string
默认: Development
-m, --module Is it a module project
类型: bool
默认: false
-p:i, --includeinfr Whether to include the basic orchestration service.
类型: bool
示例:
# 创建网关
> dotnet new silky.app -t gateway -n Silky.Gateway
# 创建业务微服务
> dotnet new silky.app -t generalhost -n Silky.Demo
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型