I.はじめに
この記事では、もともと共有していきましたIdentityServer4
ボーフレンドについて私に尋ねる前にあるため、関連する記事を微服务
関連する問題、私はスキップうIdentityServer4
共有、微服务
関連する技術的な学習と共有を。微服务
私はディレクトリが低く、事前に配置されて最初のパスで、ここで、一連の記事を共有するために4月の初めに配置されている共有微服务
オープニング記事のアプリケーション电商系统升级之微服务架构的应用
。
このブログは、公共の数シェア技術へのアーキテクチャの考え方に準拠し、シェアがより単純なデモよりもどのように使用します。
二、シーン
上の私の記事の最初の口コミを書いて下のAsp.NetコアIdentityServer4は、実際の戦闘でセンター認可アプリケーションアーキテクチャにより、電気の供給を单体式架构
分割へのアップグレードを多网关架构
あなたはアップグレードする前に
アップグレード後:
しかし、代理店の前に増加し、ビジネスのために再度アップグレードの問題、後授权中心
と支付网关
我々は解決策が見つからない場合になり別々に分割し、同社のビジネスの受注は、数回、全体の電力供給システムがボトルネックに達し、この時間になってあなたは、システムがダウンしているプログラミングする必要があります。
2.1問題と解決策
研究と技術的な問題の分析を通じて、次のような理由で主に問題を引き起こしてボトルネックは、ちょうどあなたは素晴らしいパフォーマンスの向上を得ることができ、次の問題を解決する必要があります
- 多くの注文データに得日当たりサージ注文は、しかし、全体の電気システムデータは、サプライヤデータベースに格納されており
单表
、单数据库
(いないデータが連続サージようにするために、読み取り及び書き込み分離を)。 - 関連企業は、注文に関するお問い合わせ、遅いデータベースクエリの崩壊を引き起こした注文を依存する必要があり
- 全体のビジネスシステムは、(サーバが資金を提供、より多くの賃金を消費し、お金のための最高値に達し、すでに分散配置)の電気的接続のボトルネックを達成するために
一度、すべての上記の問題を解決するために、研究と技術を通じて、次の順序のビジネスのアップグレードを作ることにしました。
- 分割発注の独立したマイクロサービス(このセクションでは、共有に焦点を当てて)
- 使用して
ES
データ移行(年によって分割さを、そして読み取りと書き込みの分離するために、次の時間が学び、あなたと共有する方法を、そこに集中されていません) - 増加
分布式缓存
(これは学び、あなたと共有するために来るのフォローアップの焦点ではありません)
次のようにチャートの後にアップグレード:
チャートの説明:
- 同じ色または以前の電力供給システムの右側に代わって
单体式架构
分割単一のビジネス・アーキテクチャのため、分散キャッシュ処理の中の混合層のビジネス・プロセス - 左側は、マイクロアーキテクチャのサービスであり、このアップグレードは、データベースとESクラスタに元のデータベース分割から移動データ、及び別読み取りおよび書き込みを有するスプリット・アーキテクチャです。
- 分散サービス、ツールの数によるサポートサービスおよびサーバーの動的な拡張への進出への無料ご注文サービス。
- フォローアップ事業の右側にも、さまざまなビジネスサービスに分割、分割することができます。
- その後のアップグレードはまた、アーキテクチャ図意図しない、など、メッセージキュー関連する態様と考えることができる(従来のアップグレードを共有するために、後続のリターンに使用する、物品のコアへの復帰があります
微服务
)
第三に、マイクロサービスの概要
微服务
コンセプトは、私は簡単な概要によってもたらされる最初のマイクロサービスの長所と短所についてより、以下の言うことはありません。
マイクロサービスの利点3.1
- 大規模、複雑なアプリケーションは、持続的かつ継続的な展開を実現することができます:連続配信と継続的デプロイは、DevOpsチームの一部であり、DevOpsチームを速く、頻繁かつ信頼性の高いソフトウェア・デリバリーの実践です。効率的なDevOpsチームの組織は、多くの場合、生産に少ない問題や障害に直面しているソフトウェアを展開します。ツールDevOpsチーム
Docker
、Kubernets
、Jenkins
、Git
などなど。 - 各サービスは比較的小さく、保守が容易である:マイクロサービスアーキテクチャアプリケーションモノマーは、より多くの開発者がより簡単にロジックコードサービスを理解するに比べて小さいです。小さなコードベース、梱包、迅速なサービスを開始します。
- サービスは、独立して展開することができます。各サービスは他のサービスとは独立して展開することができます
- 独立してサービスを拡張することができる:サービスは、独立して拡張することができ、X軸は、Z軸または分割フロー例のクローニングを拡張するかどうか。また、各サービスは、自分のニーズに合わせてハードウェアの上に展開することができます
- マイクロサービスアーキテクチャは、自治チームを達成することができます:チームは、サービスに応じて分割することができます。各チームは、彼らがサービスを担当しないことを心配せずに、独自のマイクロ責任のサービスを提供しています。
- テストに簡単に、新技術を採用:最後に、マイクロ・サービスは、テクノロジー・スタック上の長期的な信頼をなくすことができます。サービスが小さいため、サービスの交換を書き換えるためのプログラミング言語や技術の使用が可能となり、これはまた、そのことを意味、新しい技術に失敗した後、あなたは直接仕事のこの部分は、全帯域には適用されません破棄することができます失敗のリスクへ。
- より良いフォールトトレランス:マイクロサービスアーキテクチャはまた、障害分離の交換を達成することができます。たとえば、致命的なエラーを引き起こしたサービスは他のサービスには影響しません。その他のサービスは引き続き正常に動作しています。
- サービスは、独立して拡張することができます。全体の構造については、それが関連する技術のツールダイナミックランダムの拡大を通じて行わ、事業を拡大し、負荷に関連するかを選択できます
3.2マイクロ劣っサービス
- マイクロサービスアーキテクチャのクマの使用は、問題の矛先は誰の特定がないことである、明確に定義されたアルゴリズムの分割作業のサービスを完了することができます:スプリットやサービスの定義が課題です。ソフトウェア開発、分割、およびサービスの定義と同じように多くの芸術のようなものです。サービスシステムは、分割偏差の可能性が高い分散アプリケーションのモノマーを構築することです登場した場合、さらに悪いことには、各サービス間の密結合の多くが含まれていますが、一緒に展開する必要がありますいわゆる分散型システム。これは、1つにロールバックモノマーアーキテクチャとマイクロアーキテクチャの両方のサービスの欠点を配置します。
- 複雑な性質への分散システムは、開発、テスト、展開がより困難になる:マイクロサービスアーキテクチャのもう一つの問題は、分散システムの複雑さに対処しなければならない追加の開発者が作成することです。サービスには、プロセス間通信でなければなりません。これは、はるかに複雑簡単なメソッド呼び出しを超えています。
- マイクロサービスアーキテクチャを使用することは、もう一つの課題は、複数の機能間でのサービスを展開する際に、より慎重に開発チームを調整する必要がある:より多くの複数の機能間でのサービスを展開する際に慎重に調整された開発チームにする必要があります。リリース計画を策定しなければならない、サービスの依存関係に応じてソート。これは、異なるモノマーアーキテクチャの複数のコンポーネントを展開する方法の下になりました。
- 開発者は、アプリケーションのどの段階でマイクロサービスアーキテクチャを使用する必要があり、最終的に考える必要があります:マイクロサービスアーキテクチャのもう一つの問題は、アプリケーションのライフサイクルのどの段階でこのアーキテクチャを使用して開始することが決定されます。
- クロス・サービス・データの問題:モノマーのアプリケーションでは、1つのデータベース内のすべてのデータ、マイクロサービスアーキテクチャながら、各サービスが独自のデータベースを持っている、あなたが取得したい、他のデータサービスを運営、唯一通じサービスは、このような問題をもたらし、APIコールを提供してコミュニケーションのプロセス、問題である、それがビジネスに来る場合、あなたはまた、開発の難易度が高く、業務の佐賀を管理する必要があります。
3.3 microService分割原理
それがに来るとき单体架构
、分割、それはスプリットに無料ではない、特定の原則を持っている、良い分割の利点である、分割は混沌ではありません。以下は、同様に私の経験は、分割の原則をまとめたような情報へのアクセスの私です
- 図1に示すように、単一の責任、高い凝集力と低い結合
- 2、中程度の微小サイズのサービス
- 3、チームの構造を考えます
- 4、ビジネスモデルにカットするために、
- 図5に示すように、進化した分割
- 図6に示すように、環状回避依存性および依存双方向
- 7、DDD(使用を検討して
领域驱动设计
フォローアップ個々のデザインについての記事を分析し、基本的なサービスの設計を行うために)
第四に、マイクロサービスの戦闘
さて、ここで私たちは、直接ラインとコードの下に、関連する何かの概念の詳細な概要を続けるマイクロサービスのアプリケーションに精通している誰もがそうではないん、マイクロサービスの一部を理解しています。ここで私が使用して莫堇蕈
githubの上のオープンソースのマイクロサービスフレームワーク、フレーム送信元アドレス:https://github.com/overtly/core-grpcを(私は強く、このフレームワークは、今より多くの生産環境のために会社を成熟されることをお勧めします)
1083147206オープンソース交換に参加するためにこれらの興味:優れたオープンソースプロジェクトと技術交流を維持するために、意図的に交換基、グループ番号を作成
4.1 core-grpc
マイクロサービスフレームワークの利点:
- 領事は、そのような登録や健康チェックなどの統合およびサービスディスカバリメカニズムを達成します
- リアルタイム監視サービスのステータス
- マルチノードのポーリングメカニズム
- フェイルオーバー、ブラックリストへのプル
- サポートFrameworkおよび.NETのコア2つのフレームワーク
- ベースGrpcマイクロサービス
- 展開のサポート環境変数
4.2戦闘
作成Jlion.NetCore.OrderService
注文をmicroService
私たちは、vs2019
ネットコア3.1は、名前付きのフレームを選択するためのコンソールアプリケーションの作成Jlion.NetCore.OrderService
後に呼ば订单服务
我々はを通じて作成した後、nuget
パッケージの導入core-grpc
は以下のように、マイクロサービスフレームワークを:
現在のcore-grpc
マイクロサービスフレームワークを、最新の公式リリースバージョンは1.0.3です
CITES core-grpc
我々はまた、ツールをインストールする必要がありVS RPC Menu
、次のように、このツールは大きな神はまた、無料で提供され、画像は次のとおりです。
次のようにMicrosoftの公式ダウンロードはもっとゆっくり、私は、共有ネットワークディスクのBaiduにここにいる、Baiduのネットワークディスクのダウンロードアドレスがあるので:
リンク:https://pan.baidu.com/s/1twpmA4_aErrsg-m0ICmOPw抽出コード:cshs
統合インストール対ダウンロードしてインストールされていない場合は、ダウンロードが完了し、ニーズは通常のインストールに関連する2019対閉鎖します。
VS RPCメニューツール次のように:
- Grpcと倹約のためのクライアントコード作成支援
で再び私たち订单服务
にプロジェクト作成OrderRequest.proto
のファイルを、これはGrpc
文法、構文は、学生を理解していない]をクリックすることができ、文書の_V1.0ののgRPC公式中国語版の学習を、アドレス:HTTP:// DOC .oschina.net / grpc?トン= 56831
OrderRequest.proto
コードは以下の通りであります:
syntax = "proto3";
package Jlion.NetCore.OrderService.Service.Grpc;
//定义订单查找参数实体
message OrderSearchRequest{
string OrderId = 1; //定义订单ID
string Name = 2;
}
//定义订单实体
message OrderRepsonse{
string OrderId = 1;
string Name = 2;
double Amount = 3;
int32 Count = 4;
string Time = 5;
}
//定义订单查找列表
message OrderSearchResponse{
bool Success = 1;
string ErrorMsg = 2;
repeated OrderRepsonse Data = 3;
}
上記の、いくつかのニュースエンティティの定義である
私たちは、その後作成しJlionOrderService.proto
、次のコードを:
syntax = "proto3";
package Jlion.NetCore.OrderService.Service.Grpc;
import "OrderRequest.proto";
service JlionOrderService{
rpc Order_Search(OrderSearchRequest) returns (OrderSearchResponse){}
}
上記のコードは、の上見ることができpackage Jlion.NetCore.OrderService.Service.Grpc
、パッケージ名の後のステートメントでコードを、コードネームスペースの後に生成され、これは非常に重要です。
同時に定義するJlionOrderService
サービスの入り口を、と注文を検索する方法を定義しOrder_Search
、ここで私たちはの小さな部分を完了しています、。
クライアントコードを生成します
そして、JlionOrderService.proto
右の「選択Grpcコード生成」Grpcコード内のファイルマイクロサービスのクライアントコードの自動生存。
サバイバルツールは、次の機能を備えています。
- サバイバルGrpcクライアントコード
- Grpcコンパイラ(未使用)
- Grpcパッケージ(一般nugetサーバーにクライアントDLLを公開するために使用されます)
- また、コードやパケット化スリフトを生成することができます
作成しJlion.NetCore.OrderService.Grpc
たクラスライブラリを
ただ、生成するツールによってGrpc
のクライアントコードの直接コピーJlion.NetCore.OrderService.Grpc
このライブラリを以下に言及(パッケージには、上記の文Grpcのコードと一致していなければならない)订单服务客户端
、とする必要があるNuget
パッケージの追加Overt.Core.Grpc
の依存関係を、コードの構造は、次のとおりです。
Jlion.NetCore.OrderService.Grpc
今、ライブラリが構築されており、聞かせてJlion.NetCore.OrderService
サービス参照Jlion.NetCore.OrderService.Grpc
ライブラリ
订单服务
彼らを達成IHostedService
作成HostService
継承するクラスをIHostedService
以下のようにコードは次のとおりです。
public class HostedService : IHostedService
{
readonly ILogger _logger;
readonly JlionOrderServiceBase _grpcServImpl;
public HostedService(
ILogger<HostedService> logger,
JlionOrderServiceBase grpcService)
{
_logger = logger;
_grpcServImpl = grpcService;
}
//服务的启动机相关配置
public Task StartAsync(CancellationToken cancellationToken)
{
return Task.Factory.StartNew(() =>
{
var channelOptions = new List<ChannelOption>()
{
new ChannelOption(ChannelOptions.MaxReceiveMessageLength, int.MaxValue),
new ChannelOption(ChannelOptions.MaxSendMessageLength, int.MaxValue),
};
GrpcServiceManager.Start(BindService(_grpcServImpl), channelOptions: channelOptions, whenException: (ex) =>
{
_logger.LogError(ex, $"{typeof(HostedService).Namespace.Replace(".", "")}开启失败");
throw ex;
});
System.Console.WriteLine("服务已经启动");
_logger.LogInformation($"{nameof(Jlion.NetCore.OrderService.Service).Replace(".", "")}开启成功");
}, cancellationToken);
}
//服务的停止
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.Factory.StartNew(() =>
{
GrpcServiceManager.Stop();
_logger.LogInformation($"{typeof(HostedService).Namespace.Replace(".", "")}停止成功");
}, cancellationToken);
}
}
上記のコードは、主に、ホストコンピュータを作成し、実現されStartAsync
たサービスを開始し、StopAsync
サービスの停止方法。
私たちは、作成したHostedServicce
事前に定義されて作成されたコードを再度Grpc
サービス実装クラスのメソッドをJlionOrderServiceImpl
次のように、:
public partial class JlionOrderServiceImpl : JlionOrderServiceBase
{
private readonly ILogger _logger;
private readonly IServiceProvider _serviceProvider;
public JlionOrderServiceImpl(ILogger<JlionOrderServiceImpl> logger, IServiceProvider provider)
{
_logger = logger;
_serviceProvider = provider;
}
public override async Task<OrderSearchResponse> Order_Search(OrderSearchRequest request, ServerCallContext context)
{
//TODO 从底层ES中查找订单数据,
//可以设计成DDD 方式来进行ES的操作,这里我就为了演示直接硬编码了
var response = new OrderSearchResponse();
try
{
response.Data.Add(new OrderRepsonse()
{
Amount = 100.00,
Count = 10,
Name = "订单名称测试",
OrderId = DateTime.Now.ToString("yyyyMMddHHmmss"),
Time = DateTime.Now.ToString()
});
response.Data.Add(new OrderRepsonse()
{
Amount = 200.00,
Count = 10,
Name = "订单名称测试2",
OrderId = DateTime.Now.ToString("yyyyMMddHHmmss"),
Time = DateTime.Now.ToString()
});
response.Data.Add(new OrderRepsonse()
{
Amount = 300.00,
Count = 10,
Name = "订单名称测试2",
OrderId = DateTime.Now.ToString("yyyyMMddHHmmss"),
Time = DateTime.Now.ToString()
});
response.Success = true;
}
catch (Exception ex)
{
response.ErrorMsg = ex.Message;
_logger.LogWarning("异常");
}
return response;
}
}
修正Program
コードを、そしてするHostedService
とJlionOrderServiceImpl
次のように、容器に注ぎ:
class Program
{
static void Main(string[] args)
{
var host = new HostBuilder()
.UseConsoleLifetime() //使用控制台生命周期
.ConfigureAppConfiguration((context, configuration) =>
{
configuration
.AddJsonFile("appsettings.json", optional: true)
.AddEnvironmentVariables();
})
.ConfigureLogging(logger =>
{
logger.AddFilter("Microsoft", LogLevel.Critical)
.AddFilter("System", LogLevel.Critical);
})
.ConfigureServices(ConfigureServices)
.Build();
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
var logFactory = host.Services.GetService<ILoggerFactory>();
var logger = logFactory.CreateLogger<Program>();
logger.LogError(e.ExceptionObject as Exception, $"UnhandledException");
};
host.Run();
}
/// <summary>
/// 通用DI注入
/// </summary>
/// <param name="context"></param>
/// <param name="services"></param>
private static void ConfigureServices(HostBuilderContext context, IServiceCollection services)
{
//HostedService 单例注入到DI 中
services.AddSingleton<IHostedService, HostedService>();
services.AddTransient<JlionOrderServiceBase, JlionOrderServiceImpl>();
}
}
ここでは、単に微服务
既に符号化されて、だけでなく、2つの構成ファイルの欠如は、我々は、作成したappsettings.json
プロファイルを、およびconsulsettings.json
サービスの登録は、設定ファイルで見つかった
consulsettings.json
、以下のように設定ファイル:
{
"ConsulServer": {
"Service": {
"Address": "127.0.0.1:8500"// 你的Consul 服务注册及发现配置地址
}
}
}
上記のアドレス構成は単なる一例であり、ここで私は私の想定するConsul
サービスアドレスは127.0.0.1:8500のサービスがこのアドレスに登録されますから開始です。
appsettings.json
次のようにコンフィギュレーションファイルは、次のとおりです。
{
"GrpcServer": {
"Service": {
"Name": "JlionOrderService",
"Port": 10001,
"HostEnv": "serviceaddress",
"Consul": {
"Path": "dllconfigs/consulsettings.json"
}
}
}
}
私は、リスニングポート10001への登録戻って提供するためにここにいる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路径
}
}
}
}
まあ、订单服务
すべてが完了した、订单服务
次のようにサービスの全体的な構造は次のとおりです。
さて、ここでは、コマンドラインで、我々が開始するJlionOrderService
サービスを、本番環境で構築することができDocker
、容器内
私たちは私をよく見構築することができます前にConsul
:示すように、サービスを管理インターフェイスを開き、
画像だけでサービスをして行くように登録している始めたが、ヘルスチェックが失敗したがされている、サーバーへの主な原因見つけることができる私の地元にアクセスすることはできません订单服务
すべてのヘルスチェック渡すことはできません。あなたは、ローカル設定することができConsul
、サービスをテストするため。
私は10002にポート番号10001によってローカルサービス構成を開き、表示するために戻ってConsul
次のように、管理インターフェイスを:
2つのサービスを登録していることが見出され、ポート番号は10001と10002であり、カスタマイズすることができます自動的に棚のサービスを追加するためのツールとサービス、分散サービスは完了です。
ここで订单服务
開始し、完全に成功している、我々はアーキテクチャ図の上にあるクライアントで次の必要がある电商业务网关
か、支付网关
そう維持する上で订单服务
の通信をアップ。
(通信のための注文サービスとの)順序ゲートウェイを作成
あなたは私がゲートウェイ上に置くために作成する前に订单服务客户端
、私のnugetパッケージにライブラリを公開し、そこに示されたされていません。私は、公表されたパッケージ名テストJlionOrderServiceDemo
nuget公式検索を見つけることができます。また、直接、テストのためにあなたのデモに追加検索することができます。
私はVS 2019でAsp.Netコア3.1フレームワークを作成したWebApi
名前のJlion.NetCore.OrderApiService
呼び下に订单网关服务
、私は以前の投稿今微服务
のクライアントの依存関係JlionOrderServiceDemo
に追加し订单网关服务
、次のチャートを:
今すぐ订单网关服务
追加しOrderController
、次のように、APIコントローラを:
namespace Jlion.NetCore.OrderApiService.Controllers
{
[Route("[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
private readonly IGrpcClient<OrderService.Service.Grpc.JlionOrderService.JlionOrderServiceClient> _orderService;
public OrderController (IGrpcClient<OrderService.Service.Grpc.JlionOrderService.JlionOrderServiceClient> orderService)
{
_orderService = orderService;
}
[HttpGet("getlist")]
public async Task<List<OrderRepsonse>> GetList()
{
var respData =await _orderService.Client.Order_SearchAsync(new OrderService.Service.Grpc.OrderSearchRequest()
{
Name = "test",
OrderId = "",
});
if ((respData?.Data?.Count ?? 0) <= 0)
{
return new List<OrderRepsonse>();
}
return respData.Data.ToList();
}
}
}
コンストラクタコードを介して注入OrderService
し、提供GetList
インターフェース方法。次に、我々はまた、する必要がありOrderService.Service.Grpc.JlionOrderService
、次のように、容器に注入します:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
//注册Grpc 客户端,具体可以查看源代码
services.AddGrpcClient();
}
今全体订单网关服务
の下にあるプロジェクト構造:
2つのがあり、最も重要なプロジェクトの構成があるdllconfig//Jlion.NetCore.OrderService.Grpc.dll.json
とconsulsettings.json
、彼らはそれをやっていますか?我々は両方のローカル設定私を見て満足していました
Jlion.NetCore.OrderService.Grpc.dll.json
設定は以下の通りであります:
{
"GrpcClient": {
"Service": {
"Name": "JlionOrderService", // 服务名称与服务端保持一致
"MaxRetry": 0, // 最大可重试次数,默认不重试
"Discovery": {
"Consul": { // Consul集群,集群优先原则
"Path": "dllconfigs/consulsettings.json"
},
"EndPoints": [ // 单点模式
{
"Host": "127.0.0.1",
"Port": 10001
}]
}
}
}
}
Jlion.NetCore.OrderService.Grpc.dll.json
設定は伝えることです订单网关服务
し、订单服务
何を伝えるために、そしていくつかのパラメータ間の通信を。領事モードを使用せずに、私の地元の使用シングルモードをテストするには
consulsettings.json
、以下のように設定することです:
{
"ConsulServer": {
"Service": {
"Address": "127.0.0.1:8500"
}
}
}
それは言うことです、前に同じ構成およびサーバーの構成を発見していない订单网关服务
(クライアントの呼び出し側)と订单服务
、この設定は機能しません場合は、上記の構成は、シングルポイントモードであれば、サーバー側のサービス発見クラスタアドレスを。
ここで订单网关服务
(クライアント側の呼び出し)が完了するコーディング、我々はそれを開始しました:
私はここに、今完璧なスタートを5003ポートを固定しています、我々は成功に見えるインタフェースの受注を訪問しました。下に示すように、アクセス結果:
マイクロサービス完璧では正常に実行します。
マイクロサービスの上記構成は、公式にはテンプレートを通して、あなたのマイクロサービスを構築するために、これらのコードのすべてを上記のようなコードを書く必要はありません、必要なマイクロサービスを構築するためのより迅速な方法を提供し、まだ比較的面倒である、ことを学ぶ必要がありますクリックして
ミクロのサービスがビルドにプロジェクトテンプレートのチュートリアル
チュートリアル住所:https://www.cnblogs.com/jlion/p/12494525.html
記事のデモコードはgithubのに出願された、コードアドレス:https://github.com/a312586670/IdentityServerDemo
マイクロサービスフレームワークのオープンソースプロジェクト住所:https://github.com/overtly/core-grpc