core grpc
1.0.0
궁금한 점이 있으면 QQ: 2292709323, WeChat: yaofengv, 연락처를 직접 추가하세요.
명백한.Core.Grpc v1.0.6
Google의 Grpc.Core 드라이버를 기반으로 콘솔 서비스 시나리오에 적합하며 TCP 긴 연결을 기반으로 마이크로서비스 시나리오를 구현합니다.
|-Config 配置模型
|
|-Client 客户端功能实现,服务发现
|
|-dllconfigs 配置文件保存
|
|-Intercept 拦截器
|-|-IServerTracer 服务端拦截器接口
|-|-IClientTracer 客户端拦截器接口
|
|-Manager 启动、客户端调用类
|-|-GrpcServiceManager.cs 服务端启动类
|-|-GrpcClientManager.cs 客户端获取Client类
|
|-Service 服务端
|
|-GrpcServiceCollectionExtensions.cs netcore注入
- 너겟 버전: v1.0.6
- 프레임워크 지원: Framewok 4.5 - 4.6 / NetStandard 2.0
- 넷표준 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
- 프레임워크 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
우선순위: {타사 구성 센터} > 환경 변수 > 호스트 내부 구성 > 자동으로 IP 인트라넷 가져오기
- 기본 구성 파일 appsettings.json 지원 [Consul 노드가 필요하지 않으며 그렇지 않은 경우 클러스터가 아닙니다.]
{
"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 >
- 이름 지정: [네임스페이스].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 >
- 이름: consulsettings.json 변경하지 마세요.
{
"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 >
- 강제 종속성 주입 모드
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 ) ;
}
}
}
- 구현 수업 작성
原因:服务启动的时候是一个单例,那么所有服务之下的全部是单实例,而数据层需要使用多实例
// 只注入 IServiceProvider
IServiceProvider _provider ;
public GrpcExampleServiceImpl ( IServiceProvider provider )
{
_provider = provider ;
}
// 其他利用provider即时获取
using ( var scope = _provider . CreateSocpe ( ) )
{
var _userService = scope . ServiceProvider . GetService < IUserService > ( ) ;
}
- GrpcServiceManager를 직접 호출하여 시작
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 ( ) ;
}
}
}
- 강제 종속성 주입 모드
- 구성 파일은 기본적으로 [namespace].dll.json을 사용합니다. Nuget 패키지는 vs.menu 도구를 통해 생성할 수 있습니다.
- 주입 중에 다음을 직접 호출합니다.
// 注入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" } ) ;
- Dll로 컴파일된 클라이언트 프록시 클래스, 소스 코드는 다음과 같으며 무시할 수 있습니다.
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
}
- 프록시 클래스를 사용하여 실행
// 自定义配置文件 / 默认使用命名空间.dll.json / 在主进程入口进行配置T为服务Client
ClientManger.Configure<T>("dllconfig/abc.config");
ClientManager.Instance.[Method]
// T为服务Client
ClientManager<T>.Instance.[Method]
- 영사는 토큰을 지원합니다
- 기본 드라이버를 최신 버전으로 업그레이드하세요.
- Grpc => 2.40.0
- 기본 드라이버를 최신 버전으로 업그레이드하세요.
- Google.Protobuf => 3.17.3
- GrpcClientOptions 리팩터링
- 드라이버를 최신 버전으로 업그레이드하세요.
- Tracer는 채널 대상을 수정하여 외부 사용자 정의 노드 선택을 허용하는 기능을 제공합니다.
- 기본 드라이버를 최신 버전으로 업그레이드하세요.
- 사용자 정의 인터셉터 주입 추가
- ServiceStart의 매개변수 구성을 조정하고 GrpcOptions를 사용하여 이를 수행합니다.
- 호출자 커스텀 획득 증가 및 ServiceId 획득 증가
- 프레임워크 버전에 대한 맞춤형 호출자 획득 전략 지원
- services.AddGrpcConfig를 사용하여 확장할 수 있는 apollo와 같은 타사 구성에 대한 지원을 추가합니다(현재는 dotnetcore만 지원됨).
- Consul의 새 버전에 대한 지원 최적화
- 등록 센터는 변경 사항을 감지한 후 블랙리스트를 무시하고 모든 로컬 연결을 재설정합니다.
- 클라이언트는 Consul 등록 센터를 사용하여 단일 서비스 변경 모니터링, 신규 등록 서비스 또는 서비스 실패를 보다 실시간으로 지원합니다.
- 다중 서비스 모드 지원
- 네임스페이스를 수정하고, nuget 패키지를 Overt.Core.Grpc로 업데이트하고, 기본 버전을 1.0.0으로 업데이트합니다.
- 클라이언트가 연결 서비스 최적화에 실패하면 블랙리스트에 올라 노드가 존재하지 않는 문제가 발생한다.
명백한.Core.Grpc.H2 v2.0.1
>= netcoreapp3.0 버전에 사용, http2 프로토콜에 사용, Microsoft의 grpc.net 사용, 웹 서비스 시나리오에 적합, http2 기반 마이크로서비스 시나리오 구현
|-Config 配置模型
|
|-Client 客户端功能实现,服务发现
|
|-dllconfigs 配置文件保存
|
|-Service 服务端
|
|-GrpcServiceCollectionExtensions.cs netcore注入
- 너겟 버전: V 2.0.1
- 프레임워크 지원: 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
우선순위: {타사 구성 센터} > 환경 변수 > 호스트 내부 구성 > 자동으로 IP 획득 + 인트라넷 포트 시작
- 기본 구성 파일 appsettings.json 지원 [Consul 노드가 필요하지 않으며 그렇지 않은 경우 클러스터가 아닙니다.]
{
"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路径
}
}
}
}
- 이름 지정: [네임스페이스].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 "
}
}
}
}
}
- 이름: consulsettings.json 변경하지 마세요.
{
"ConsulServer" : {
"Service" : {
"Address" : " http://consul.g.lan " // 默认8500端口
}
}
}
- 영사 등록
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 ( ) ;
}
- 강제 종속성 주입 모드
- 구성 파일은 기본적으로 [namespace].dll.json을 사용합니다. Nuget 패키지는 vs.menu 도구를 통해 생성할 수 있습니다.
- 주입 중에 다음을 직접 호출합니다.
// 注入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는 하위 채널, Resolver, LoadBalancer 및 사용자 지정을 지원합니다.
- Apollo와 같은 외부 구성 센터 지원
- 지원 코드 변경 파일 구성
- 호스팅 서비스 추가
- 첫 번째 버전은 Microsoft 드라이버 grpc.net을 사용하며 net5.0에 맞게 조정되었습니다.