Se você tiver alguma dúvida, adicione diretamente QQ: 2292709323, WeChat: yaofengv, entre em contato
Overt.Core.Grpc v1.0.6
Baseado no driver Grpc.Core do Google, é adequado para cenários de serviço de console e implementa cenários de microsserviços baseados em conexões TCP longas.
|-Config 配置模型
|
|-Client 客户端功能实现,服务发现
|
|-dllconfigs 配置文件保存
|
|-Intercept 拦截器
|-|-IServerTracer 服务端拦截器接口
|-|-IClientTracer 客户端拦截器接口
|
|-Manager 启动、客户端调用类
|-|-GrpcServiceManager.cs 服务端启动类
|-|-GrpcClientManager.cs 客户端获取Client类
|
|-Service 服务端
|
|-GrpcServiceCollectionExtensions.cs netcore注入
- Versão do Nuget: v1.0.6
- Suporte de estrutura: Framewok 4.5 - 4.6 / NetStandard 2.0
- NetStandard 2.0
Consul 0.7 .2 .6
Google . Protobuf 3.8 .0
Grpc 1.21 .0
Microsoft . Extensions . Configuration . Json 2.0 .0
Microsoft . Extensions . Options . ConfigurationExtensions 2.0 .0
- Estrutura 4.5-4.7
Consul 0.7 .2 .6
Google . Protobuf 3.8 .0
Grpc 1.21 .0
Install - Package Overt . Core . Grpc - Version 1.0 .6
Prioridade: {Centro de configuração de terceiros} > Variáveis de ambiente > Configuração interna do host > Obter intranet IP automaticamente
- Suporta o arquivo de configuração padrão appsettings.json [o nó Consul não é necessário, caso contrário, não é um cluster]
{
"GrpcServer" : {
"Service" : {
"Name" : " OvertGrpcServiceApp " , // 服务名称使用服务名称去除点:OvertGrpcServiceApp
"Host" : " service.g.lan " , // 专用注册的域名 (可选)格式:ip[:port=default]
"HostEnv" : " serviceaddress " , // 获取注册地址的环境变量名字(可选,优先)环境变量值格式:ip[:port=default]
"Port" : 10001 , // 端口自定义
"Consul" : {
"Path" : " dllconfigs/consulsettings.json " // Consul路径
}
}
}
}
// 添加section
< configSections >
< section name = " grpcServer " type = " Overt.Core.Grpc.GrpcServerSection, Overt.Core.Grpc " />
</ configSections >
// 添加节点
< grpcServer >
< service name = " OvertGrpcServiceApp " port = " 10005 " host = "专用注册的域名(可选)格式:ip[:port=default] " hostEnv = "获取注册地址的环境变量名字(可选)环境变量值格式:ip[:port=default] " >
< registry >
< consul path = " dllconfigs/Consul.config " />
</ registry >
</ service >
</ grpcServer >
- Nomenclatura: pasta [namespace].dll.json (dllconfigs)
{
"GrpcClient" : {
"Service" : {
"Name" : " grpcservice " , // 服务名称与服务端保持一致
"MaxRetry" : 0 , // 最大可重试次数,默认不重试
"Discovery" : {
"EndPoints" : [ // 单点模式
{
"Host" : " 127.0.0.1 " ,
"Port" : 10001
}
],
"Consul" : { // Consul集群,集群优先原则
"Path" : " dllconfigs/consulsettings.json "
}
}
}
}
}
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< configSections >
< section name = " grpcClient " type = " Overt.Core.Grpc.GrpcClientSection, Overt.Core.Grpc " />
</ configSections >
< grpcClient >
< service name = " " maxRetry = " 0 " >
< discovery >
< server >
< endpoint host = " " port = " " ></ endpoint >
< endpoint host = " " port = " " ></ endpoint >
</ server >
< consul path = " dllconfigs/Consul.config " ></ consul >
</ discovery >
</ service >
</ grpcClient >
</ configuration >
- Nome: consulsettings.json Não altere
{
"ConsulServer" : {
"Service" : {
"Address" : " http://consul.g.lan " // 默认8500端口
}
}
}
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< configSections >
< section name = " consulServer " type = " Overt.Core.Grpc.ConsulServerSection, Overt.Core.Grpc " />
</ configSections >
< consulServer >
< service address = " http://consul.g.lan " ></ service >
</ consulServer >
</ configuration >
- Forçar modo de injeção de dependência
services . AddSingleton < GrpcExampleService . GrpcExampleServiceBase , GrpcExampleServiceImpl > ( ) ; // Grpc服务的实现
services . AddSingleton < IHostedService , GrpcExampleHostedService > ( ) ; // Grpc服务启动服务类:如下
services . AddGrpcTracer < ConsoleTracer > ( ) ; // Grpc注入拦截器,继承IServerTracer(可选)
// 使用第三方配置
services . AddGrpcConfig ( config =>
{
// 以配置中心apollo为例
config . AddApollo ( context . Configuration . GetSection ( "apollo" ) ) . AddDefault ( ) ;
} ) ;
using Microsoft . Extensions . Hosting ;
using Overt . Core . Grpc ;
using Overt . GrpcExample . Service . Grpc ;
using System . Threading ;
using System . Threading . Tasks ;
namespace Overt . GrpcService . App
{
public class GrpcService : IHostedService
{
GrpcExampleService . GrpcExampleServiceBase _grpcServiceBase ;
IServerTracer _tracer ;
public GrpcService ( GrpcExampleService . GrpcExampleServiceBase serviceBase , IServerTracer tracer ) // 依赖注入Grpc服务基础类
{
_serviceBase = serviceBase ;
_tracer = tracer ;
}
public Task StartAsync ( CancellationToken cancellationToken )
{
return Task . Factory . StartNew ( ( ) =>
{
GrpcServiceManager . Start ( GrpcExampleService . BindService ( _serviceBase ) , _tracer ) ;
} , cancellationToken ) ;
}
public Task StopAsync ( CancellationToken cancellationToken )
{
return Task . Factory . StartNew ( ( ) =>
{
GrpcServiceManager . Stop ( ) ;
} , cancellationToken ) ;
}
}
}
- Escrita da aula de implementação
原因:服务启动的时候是一个单例,那么所有服务之下的全部是单实例,而数据层需要使用多实例
// 只注入 IServiceProvider
IServiceProvider _provider ;
public GrpcExampleServiceImpl ( IServiceProvider provider )
{
_provider = provider ;
}
// 其他利用provider即时获取
using ( var scope = _provider . CreateSocpe ( ) )
{
var _userService = scope . ServiceProvider . GetService < IUserService > ( ) ;
}
- Chame diretamente GrpcServiceManager para iniciar
using Grpc . Core ;
using Overt . Core . Grpc ;
using Overt . Log ;
using System ;
namespace Overt . GrpcService
{
public class MainService
{
public MainService ( )
{
}
public void Start ( string serviceName ) // 启动服务
{
GrpcServiceManager . Start ( Library . GrpcService . BindService ( new GrpcServiceImpl ( ) ) , tracer : new ConsoleTracer ( ) , whenException : ( ex ) =>
{
LogHelper . Info ( "" , ex ) ;
} ) ;
}
public void Stop ( string serviceName ) // 停止服务
{
GrpcServiceManager . Stop ( ) ;
}
public void ShutDown ( string serviceName )
{
GrpcServiceManager . Stop ( ) ;
}
}
}
- Forçar modo de injeção de dependência
- O arquivo de configuração usa [namespace].dll.json por padrão. Os pacotes Nuget podem ser gerados por meio da ferramenta vs.menu.
- Chame diretamente o seguinte durante a injeção:
// 注入Grpc客户端
services . AddGrpcClient ( ) ;
// 自定义配置文件 / 默认使用命名空间.dll.json
services . Configure < GrpcClientOptions < GrpcExampleServiceClient > > ( ( cfg ) =>
{
cfg . ConfigPath = "dllconfig/Overt.GrpcExample.Service.Grpc.dll.json" ; // 可不传递
} ) ;
// 使用第三方配置
services . AddGrpcConfig ( config =>
{
// 以配置中心apollo为例
config . AddApollo ( context . Configuration . GetSection ( "apollo" ) ) . AddDefault ( ) ;
} ) ;
// 获取注入的对象
IGrpcClient < GrpcExampleServiceClient > _grpcClient ;
public IndexModel ( IGrpcClient < GrpcExampleServiceClient > grpcClient )
{
_grpcClient = grpcClient ;
}
var res = _grpcClient . Client . Ask ( new Service . Grpc . AskRequest ( ) { Key = "abc" } ) ;
- A classe proxy do cliente, compilada em DLL, o código-fonte é o seguinte, pode ser ignorada
using Grpc . Core ;
using Overt . Core . Grpc ;
using Overt . Core . Grpc . Intercept ;
using System ;
using System . Collections . Concurrent ;
using System . IO ;
using __GrpcService = Overt . GrpcExample . Service . Grpc . GrpcExampleService ;
namespace Overt . GrpcExample . Service . Grpc
{
#if NET45 || NET46 || NET47
public class ClientManager
{
public static IClientTracer Tracer { get ; set ; } = default ( IClientTracer ) ;
private static string DefaultConfigPath { get ; set ; } = "dllconfigs/Overt.GrpcExample.Service.Grpc.dll.config" ;
public static __GrpcService . GrpcExampleServiceClient Instance
{
get
{
return ClientManager < __GrpcService . GrpcExampleServiceClient > . Instance ;
}
}
private static readonly ConcurrentDictionary < Type , string > configMap = new ConcurrentDictionary < Type , string > ( ) ;
public static void Configure < T > ( string configPath ) { configMap . AddOrUpdate ( typeof ( T ) , configPath , ( t , s ) => configPath ) ; }
public static string GetConfigure < T > ( ) { if ( configMap . TryGetValue ( typeof ( T ) , out string configPath ) ) return configPath ; return DefaultConfigPath ; }
}
public class ClientManager < T > : ClientManager where T : ClientBase
{
public static new T Instance
{
get
{
var configPath = GetConfigure < T > ( ) ;
var abConfigPath = Path . Combine ( AppDomain . CurrentDomain . BaseDirectory , configPath ) ;
return GrpcClientManager < T > . Get ( abConfigPath , Tracer ) ;
}
}
}
#endif
}
- Executar usando classe proxy
// 自定义配置文件 / 默认使用命名空间.dll.json / 在主进程入口进行配置T为服务Client
ClientManger.Configure<T>("dllconfig/abc.config");
ClientManager.Instance.[Method]
// T为服务Client
ClientManager<T>.Instance.[Method]
- cônsul apoia Token
- Atualize o driver subjacente para a versão mais recente
- Grpc => 2.40.0
- Atualize o driver subjacente para a versão mais recente
- Google.Protobuf => 3.17.3
- Refatorar GrpcClientOptions
- Atualize o driver para a versão mais recente
- O Tracer fornece a capacidade de modificar o Channel Target, permitindo a seleção externa personalizada de nós;
- Atualize o driver subjacente para a versão mais recente
- Adicionar injeção personalizada do Interceptor
- Ajuste a configuração dos parâmetros do ServiceStart e use GrpcOptions para realizá-lo.
- Aumente a aquisição personalizada de invocadores e aumente a aquisição de ServiceId
- Oferece suporte à estratégia de aquisição de invocador personalizado para versão da estrutura
- Adicione suporte para configuração de terceiros, como Apollo, que pode ser expandido usando services.AddGrpcConfig (atualmente apenas dotnetcore é compatível)
- Otimize o suporte para novas versões do Consul
- Após o centro de registro detectar as alterações, ele ignora a lista negra e redefine todas as conexões locais.
- O cliente utiliza a central de registro da Consul para suporte ao monitoramento de alterações de serviço único, novos serviços de registro ou falha de serviço, mais em tempo real
- Suporta modo multisserviço
- Modifique o namespace, atualize o pacote nuget para Overt.Core.Grpc e atualize a versão padrão para 1.0.0
- Quando o cliente não consegue otimizar o serviço de conexão, ele entra na lista negra, resultando no problema de o nó não existir.
Overt.Core.Grpc.H2 v2.0.1
Usado para versão >= netcoreapp3.0, usado para protocolo http2, contando com grpc.net da Microsoft, adequado para cenários de serviços da Web, implementando cenários de microsserviços baseados em http2
|-Config 配置模型
|
|-Client 客户端功能实现,服务发现
|
|-dllconfigs 配置文件保存
|
|-Service 服务端
|
|-GrpcServiceCollectionExtensions.cs netcore注入
- Versão Nuget: V 2.0.1
- Suporte de estrutura: netstandard2.1/netcoreapp3.0/net5.0/net6.0
Consul 1.6 .10 .7
Google . Protobuf 3.21 .5
Grpc . Net . Client 2.47 .0
Microsoft . Extensions . Configuration . Json 5.0 .0
Microsoft . Extensions . Options . ConfigurationExtensions 5.0 .0
Install - Package Overt . Core . Grpc . H2 - Version 2.1 .0
Prioridade: {Centro de configuração de terceiros} > Variáveis de ambiente > Configuração interna do host > Obter IP automaticamente + iniciar intranet da porta
- Suporta o arquivo de configuração padrão appsettings.json [o nó Consul não é necessário, caso contrário, não é um cluster]
{
"GrpcServer" : {
"Service" : {
"Name" : " OvertGrpcServiceApp " , // 服务名称使用服务名称去除点:OvertGrpcServiceApp
"Host" : " service.g.lan " , // 专用注册的域名 (可选)格式:ip[:port=default]
"HostEnv" : " serviceaddress " , // 获取注册地址的环境变量名字(可选,优先)环境变量值格式:ip[:port=default]
"Port" : 10001 , // 端口自定义
"Consul" : {
"Path" : " dllconfigs/consulsettings.json " // Consul路径
}
}
}
}
- Nomenclatura: pasta [namespace].dll.json (dllconfigs)
{
"GrpcClient" : {
"Service" : {
"Name" : " grpcservice " , // 服务名称与服务端保持一致
"Scheme" : " http " , // foraddress 协议 http/https
"Discovery" : {
"EndPoints" : [ // 单点模式
{
"Host" : " 127.0.0.1 " ,
"Port" : 10001
}
],
"Consul" : { // Consul集群,集群优先原则
"Path" : " dllconfigs/consulsettings.json "
}
}
}
}
}
- Nome: consulsettings.json Não altere
{
"ConsulServer" : {
"Service" : {
"Address" : " http://consul.g.lan " // 默认8500端口
}
}
}
- Cadastrar Cônsul
public void ConfigureServices ( IServiceCollection services )
{
.. .
// 其他
.. .
services . AddGrpcService ( ) ; // 应用关闭时,节点可自动移除
// 按需使用第三方配置
services . AddGrpcConfig ( config =>
{
// 以配置中心apollo为例
config . AddApollo ( context . Configuration . GetSection ( "apollo" ) ) . AddDefault ( ) ;
} ) ;
}
public void Configure ( IApplicationBuilder app , IWebHostEnvironment env )
{
.. .
// 其他
.. .
app . UseGrpcRegister ( ) ;
}
- Forçar modo de injeção de dependência
- O arquivo de configuração usa [namespace].dll.json por padrão. Os pacotes Nuget podem ser gerados por meio da ferramenta vs.menu.
- Chame diretamente o seguinte durante a injeção:
// 注入Grpc客户端
services . AddGrpcClient ( ) ;
// 自定义配置文件 / 默认使用命名空间.dll.json
services . Configure < GrpcClientOptions < GrpcExampleServiceClient > > ( ( cfg ) =>
{
cfg . ConfigPath = "dllconfig/Overt.GrpcExample.Service.Grpc.dll.json" ; // 可不传递
} ) ;
// 使用第三方配置
services . AddGrpcConfig ( config =>
{
// 以配置中心apollo为例
config . AddApollo ( context . Configuration . GetSection ( "apollo" ) ) . AddDefault ( ) ;
} ) ;
// 获取注入的对象
IGrpcClient < GrpcExampleServiceClient > _grpcClient ;
public IndexModel ( IGrpcClient < GrpcExampleServiceClient > grpcClient )
{
_grpcClient = grpcClient ;
}
var res = _grpcClient . Client . Ask ( new Service . Grpc . AskRequest ( ) { Key = "abc" } ) ;
1.NET5_0_OR_GREATER suporta subcanal, Resolver e LoadBalancer e personalização
- Apoie centros de configuração externos, como Apollo
- Configuração do arquivo de alteração de código de suporte
- AdicionarHostedService
- A primeira versão depende do driver grpc.net da Microsoft e está adaptada para net5.0