Если вы работали с микросервисной архитектурой, вы могли изучить различные способы взаимодействия между микросервисами. Удаленные вызовы процедур — это один из способов, с помощью которого мы можем вызывать микросервисы.
gRPC также является одной из таких платформ для удаленных вызовов процедур. gRPC — это кроссплатформенная платформа удаленных вызовов процедур с открытым исходным кодом. изначально он был разработан Google.
Недавно я работал над проектом микросервиса, в котором мы использовали gRPC для извлечения данных из сервисного приложения. Я собираюсь показать на примере кода, как вы можете написать свои первые вызовы gRPC, используя .Net 6.
Я собираюсь создать службу для возврата названия столицы страны путем чтения необработанных данных из файла Json, а затем я создам клиентское приложение для использования этой службы через вызовы gRPC. Давайте начнем..
Вы можете получить полный код по этому адресу — https://github.com/hrdk99/GrpcDotNet6Demo.git
Создайте сервисное приложение
Я использую Visual Studio 2022 и .Net 6. для этой демонстрации. однако тот же код будет работать и с .Net 7. Если на вашем компьютере не установлена Visual Studio 2022, вы можете скачать ее отсюда. https://visualstudio.microsoft.com/downloads/
- Давайте откроем Visual Studio и создадим новый проект. Я использую встроенный шаблон проекта gRPC для создания сервисного приложения. Найдите gRPC в строке поиска. Выберите шаблон с именем — ASP.NET Core gRPC Service.
2. Затем дайте вашему проекту имя. Выберите местоположение. Поскольку это сервисный проект, я назову его GrpcService. Я выберу фреймворк как .Net 6
Выполнив описанные выше шаги, вы увидите проект GrpcService и образец прото-файла с именем welcome.proto в папке Protos. Этот прото-файл создается как часть проекта шаблона. Мы не собираемся использовать это.
В структуре gRPC важны файлы Proto. Это определяет, какие методы доступны для использования вызовом gRPC. Давайте добавим новый файл Proto с именем country.proto.
3. Щелкните правой кнопкой мыши папку Protos › Добавить › Новый элемент › Файл буфера протокола. Назовите этот файл country.proto. На этом этапе вы увидите файл country.proto в папке protos.
4. Теперь щелкните правой кнопкой мыши файл country.proto и посмотрите свойства. Вы увидите свойства gRPC. Измените значение классов-заглушек gRPC на Только сервер.
если вы не видите это свойство в Visual Studio, вы также можете обновить его непосредственно в файле проекта.
5. Давайте откроем наш файл country.proto и обновим его. Я представлю метод под названием GetCountryCapital, который будет принимать CountryCapitalRequest и возвращать CountryCapitalResponse.
syntax = "proto3"; option csharp_namespace = "GrpcService"; package greet; service CountryInfo { rpc GetCountryCapital (CountryCapitalRequest) returns (CountryCapitalResponse); } message CountryCapitalRequest { string country = 1; } message CountryCapitalResponse { string country = 1; string city = 2; }
6. Как только мы добавим прото-файл, пересоберите проект. Теперь давайте добавим сервисный код. Создайте папку с именем Services и файл класса с именем CountryInfoService.cs.
using Grpc.Core; using Newtonsoft.Json; namespace GrpcService.Services { public class CountryInfoService : CountryInfo.CountryInfoBase { public override Task<CountryCapitalResponse> GetCountryCapital(CountryCapitalRequest request, ServerCallContext context) { List<CapitalCity> cities = new(); using (StreamReader r = new StreamReader(@"Assets\\CapitalCities.json")) { string json = r.ReadToEnd(); cities = JsonConvert.DeserializeObject<List<CapitalCity>>(json); } var response = cities?.FirstOrDefault(c => c.Country.ToLower() == request.Country.ToLower()); if(response is null) { return Task.FromResult(new CountryCapitalResponse() { City = "Capital info not found", Country = request.Country }); } return Task.FromResult(new CountryCapitalResponse() { City = response.City, Country = response.Country }); } } public class CapitalCity { public string Country { get; set; } public string City { get; set; } } }
Я использую необработанные данные из файла CapitalCities.json. Я поместил этот файл в папку github. В качестве альтернативы вы можете создать файл самостоятельно и поместить в него эти образцы данных.
[ { "country": "India", "city": "New Delhi" }, { "country": "Indonesia", "city": "Jakarta" } { "country": "Ireland", "city": "Dublin" }, { "country": "United Arab Emirates", "city": "Abu Dhabi" }, { "country": "United Kingdom", "city": "London" }, { "country": "United States", "city": "Washington" } ]
7. После добавления сервисного кода. Давайте разоблачим его, зарегистрировав это в program.cs.
Добавьте строку ниже в вашу программу.cs
app.MapGrpcService<CountryInfoService>();
с этим наш сервисный код должен быть успешно собран. Теперь давайте создадим клиентское приложение.
Создать клиентское приложение —
Мы создадим консольное приложение, которое будет использовать службу через вызов gRPC. Давайте добавим новый консольный проект в наше решение.
- Щелкните правой кнопкой мыши решение › Добавить › Новый проект. Выберите консольное приложение из шаблонов. Дайте название этому проекту. Я назвал его GrpcClient.
2. Нам нужно добавить ниже 3 необходимых пакета nuget в наш проект GrpcClient. (Эти пакеты были автоматически установлены в нашем проекте GrpcServer, потому что мы выбрали там шаблон проекта gRPC)
Щелкните проект правой кнопкой мыши и выберите Управление пакетами Nuget. Теперь найдите указанные ниже пакеты и установите их. Grpc.Net.Client, Google.Protobuf, Grpc.Tools
В качестве альтернативы вы можете установить их, выполнив следующую команду в консоли диспетчера пакетов.
PM > Install-Package Grpc.Net.Client PM > Install-Package Google.Protobuf PM > Install-Package Grpc.Tools
3. Давайте также добавим прото-файл в наш проект GrpcClient. Добавьте в этот проект новую папку с именем Proto. Скопируйте файл country.proto из проекта GrpcServer в этот проект, а затем обновите пространство имен до GrpcClient.
syntax = "proto3"; option csharp_namespace = "GrpcClient"; package greet; service CountryInfo { rpc GetCountryCapital (CountryCapitalRequest) returns (CountryCapitalResponse); } message CountryCapitalRequest { string country = 1; } message CountryCapitalResponse { string country = 1; string city = 2; }
также обновите свойство Классы-заглушки gRPC на Только клиент.
Кроме того, вы также можете обновить его непосредственно в файле проекта. (как мы делали в проекте GrpcService).
После обновления перестройте проект.
4. Теперь перейдите в program.cs и напишите код для вызова службы через канал GRPC.
using Grpc.Net.Client; using GrpcClient; internal class Program { private static async Task Main(string[] args) { var client = new CountryInfoClient(); Console.Write("Enter Country:"); string inputCountry = Console.ReadLine().Trim(); while (inputCountry.ToLower().Trim() != "exit") { await client.CallGrpcClient(inputCountry); Console.Write("\nEnter Exit to stop. \nEnter Country:"); inputCountry = Console.ReadLine().Trim(); } } } public class CountryInfoClient { public async Task CallGrpcClient(string reqCountry) { var grpcChannel = GrpcChannel.ForAddress("https://localhost:7125"); var client = new CountryInfo.CountryInfoClient(grpcChannel); var request = new CountryCapitalRequest(); request.Country = reqCountry; var response = await client.GetCountryCapitalAsync(request); Console.WriteLine($"Country: {response.Country}, Capital: {response.City}"); } }
Убедитесь, что вы указали правильный URL-адрес при настройке канала GRPC. Он содержит номер порта, на котором запущено приложение-служба. Вы можете проверить это в LaunchSettings.json в проекте GRPCService.
Теперь давайте запустим оба приложения.
Чтобы запустить оба проекта вместе, настройте, щелкните правой кнопкой мыши файл решения и выберите свойства. Измените стартовый проект на множественный стартовый проект. Измените действие для запуска, также убедитесь, что проект GrpcService находится над проектом GrpcClient.
Теперь давайте запустим проект.
Вы увидите два всплывающих окна консоли. По одному для приложений GrpcService и GrpcClient.
Давайте попробуем с несколькими входными данными и посмотрим на результат.
Вы можете получить полный рабочий код здесь — https://github.com/hrdk99/GrpcDotNet6Demo.git
Заключение. Вы узнали, как создать клиент gRPC и приложение-службу с помощью .Net 6.
gRPC быстрее, чем REST, поскольку использует плотную упаковку буфера протокола и HTTP/2.
Это полезно при создании микросервисной архитектуры в проекте и более актуально в сценарии, когда коммуникация сервисов происходит в сети с низкой пропускной способностью.