序文
領事のコア機能は、領事のサーバークラスタに自分自身を登録し、登録と発見、領事のクライアントにサービスを提供して、サービスを発見するために、発信者を待つことで、エージェントに転送され、1を学習し、現在登録サービス・ディスカバリ・リンクになってきたした後、実際のビジネスシステムは、あなたはまた、負荷分散ベースのサービス検出を行うことができ、さらには、最終的にサービスの前に傍受、認証、前向きな仕事が制限など、いくつかの基本的な作業を、行う、ヒューズなどの業務システムにするために、クライアントを要求することができます。
サービス登録
クライアントの参照Consul.net
.NETCoreプラットフォームでは、ビジネスシステムなどのサービス登録、ヘルスチェック、自動補完に埋め込まれた、これらの自動化機能を使用するためには、nugetパッケージの必要性がプロジェクトで参照すること、クライアントコンポーネントの領事を使用することができます
この投稿の時点で、NETStandard領事最新バージョンは0.7.2.6、ビュー、非常に頻繁に更新頻度の点からバージョン番号であるが、その数は.NETCoreコミュニティを意味または領事の注目内のGithub上の多くのスター、ではありません非常に少数。
Program.csの改革プログラムのエントリー
次のように、領事のヘルスチェック、Program.csの単純な変換の必要性として、リスニングサービス実行時のアドレスとポートアドレスを使用するには:
public static IWebHost BuildWebHost(string[] args)
{
var config = new ConfigurationBuilder().AddCommandLine(args).Build();
var url = $"{config["scheme"]}://{config["ip"]}:{config["port"]}";
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseConfiguration(config)
.UseUrls(url)
.Build();
}
以下に示すように上記のコードは、これらのパラメータは、デバッグを容易にするために、私は、一回のプロパティ\ launchSettings.jsonファイルを書き込むプロファイルオブジェクトのコマンドラインパラメータをコンパイルします。
launchSettings.jsonファイル内の症状は次のよう:
{
"profiles": {
"Ron.Consul": {
"commandName": "Project",
"commandLineArgs": "--scheme http --ip 172.16.10.227 --port 51800"
}
}
}
StartupExtension.csを確立
私たちは、サービスを開始する必要があり、サービスは自動的にパッケージがいくつかの簡単な登録コードを再利用する必要があるため領事プロキシサーバーのクラスタに登録されます
public static class StartupExtension
{
/// <summary>
/// 定义服务健康检查的url地址
/// </summary>
public const string HEALTH_CHECK_URI = "/consul/health/check";
/// <summary>
/// 读取 Consul 配置,注入服务
/// </summary>
/// <param name="service"></param>
/// <param name="configuration"></param>
/// <returns></returns>
public static IServiceCollection AddConsulConfig(this IServiceCollection service,
IConfiguration configuration)
{
var clientConfig = configuration.GetSection("Consul").Get<ConsulConfig>();
service.Configure<ConsulConfig>(configuration.GetSection("Consul"));
return service;
}
/// <summary>
/// 将 ConsulClient 注入管道
/// </summary>
/// <param name="app"></param>
/// <param name="configuration"></param>
/// <param name="lifetime"></param>
/// <param name="cc"></param>
/// <returns></returns>
public static IApplicationBuilder UseConsul(this IApplicationBuilder app,
IConfiguration configuration,
IApplicationLifetime lifetime,
IOptions<ConsulConfig> cc)
{
var clientConfig = cc.Value;
//获取服务运行侦听的地址和端口作为健康检查的地址
var clientIP = new Uri($"{configuration["scheme"]}://{configuration["ip"]}:{configuration["port"]}");
var serviceId = $"{clientConfig.ClientName}-{clientIP.Host}-{clientIP.Port}";
var ipv4 = clientIP.Host;
var consulClient = new ConsulClient(config =>
{
config.Address = new Uri(clientConfig.Server);
config.Datacenter = clientConfig.DataCenter;
});
var healthCheck = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(7), // 服务启动 7 秒后注册服务
Interval = TimeSpan.FromSeconds(9), // 健康检查的间隔时间为:9秒
HTTP = $"{clientIP.Scheme}://{ipv4}:{clientIP.Port}{HEALTH_CHECK_URI}"
};
var regInfo = new AgentServiceRegistration()
{
Checks = new[] { healthCheck },
Address = ipv4,
ID = serviceId,
Name = clientConfig.ClientName,
Port = clientIP.Port
};
consulClient.Agent.ServiceRegister(regInfo).GetAwaiter().GetResult();
lifetime.ApplicationStopped.Register(() =>
{
consulClient.Agent.ServiceRegister(regInfo);
});
return app;
}
/// <summary>
/// 实现健康检查输出,无需另行定义 Controller
/// </summary>
/// <param name="app"></param>
/// <returns></returns>
public static IApplicationBuilder MapHealthCheck(this IApplicationBuilder app)
{
app.Map(HEALTH_CHECK_URI, s =>
{
s.Run(async context =>
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("Health check {0}", DateTime.Now);
Console.ForegroundColor = ConsoleColor.Gray;
await context.Response.WriteAsync("ok");
});
});
return app;
}
}
上記のコード、実装は次のスタート有効Startup.csに、説明するにはあまりにも多くはありません、非常に明確にする必要があり、それぞれの方法は、その頭のノートを持っている、コードは比較的単純で、論理的なサービス登録とヘルスチェックですConsulClient。
サービスの注入
public void ConfigureServices(IServiceCollection services)
{
services.AddConsulConfig(this.Configuration);
...
}
パイプは、要求キューに参加します
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
IApplicationLifetime lifetime,
IOptions<ConsulConfig> cc)
{
app.UseConsul(this.Configuration, lifetime, cc);
app.MapHealthCheck();
...
}
定義されたサービス・インターフェース
コントローラーの次の簡単な実装は、簡単に呼び出しのように、内部のコントローラで2つのサービス・インターフェースを追加します
[HttpGet("index")]
public ActionResult<string> Index()
{
return "Hello wrold";
}
[HttpGet("add/{x:int}/{y:int}")]
public ActionResult<int> Add(int x, int y)
{
var result = x + y;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("x+y={0}", result);
Console.ForegroundColor = ConsoleColor.Gray;
return result;
}
登録を行い、サービスを開始
さて、ここでは、サービスレジストリ準備作業は基本的に完了し、その後、F5キーを押してプログラムを開始するには、プログラムが自動的に登録されるサービス作業
青で示され、サービス、ヘルスチェックのみ1原則、httpリクエストの実装を行って現在の健康チェックの領事プロキシサーバのクラスタで、オープン領事のWebコンソールインタフェースは、実際のを見るために、健康的な考えられてはhttpStatus = 200を返します。サービスの状態
あなたは上の図から見ることができ、サービスのステータスが(緑)が正常です
サービス検出
サービスゲートウェイ(またはプロキシ)のためのコンサル系の多くのAPIインターフェースは、次のアドレスのAPIとして、領事から登録された医療サービスを得るために
登録されているすべての保健サービスを取得します。
http://172.16.1.218:8500/v1/agent/services
指定されたサービスを取得します。
http://172.16.1.218:8500/v1/agent/service/node-1-172.16.10.227-51800
上記画像の内容、個々のサービスについての情報を登録することである。赤い部分がホストアドレスと実際のリスニングサービスポートでは、ゲートウェイプロキシはビジネスコールのルートを指定したアドレスに転送することができます。
結論
サービスゲートウェイを呼び出して、我々、そのサービス・ゲートウェイ:これまでのところ、我々は、プロキシサーバークラスターの展開コンサル、サービス登録、発見、しかし今のところ、完全に、今、ビジネスコールを実装し、まだ重要な部分が欠落していないを達成しています次の
ソースコードのダウンロード
この例のコードはGitHubのにすべてのホスティングされている、ダウンロードして歓迎:https://github.com/lianggx/Examples/tree/master/Ron.Consul