SlideShare a Scribd company logo
Платформа .NET Core
Глазами PHP-разработчика
Георгий Драк, Sitko.ru
@sonicbw
Платформа .NET Core глазами PHP-разработчика
Цели
• Язык со статической типизацией
• Больше производительности
• Асинхронность
• Развитые инструменты
public static void Main(string[] args)
• .NET, .NET Core, ASP.NET Core?
• .NET vs PHP
• Наш опыт
Что такое .NET?
.NET Platform
• 13 февраля 2002г.
• Десктоп, веб, консольные утилиты
• C#, VB.NET, F#, IronPython, IronRuby, Peachpie
• Mono, Xamarin
• Unity
.NET Core
https://github.com/dotnet/core
• Open source, MIT
• Содержит не все API из .NET Framework
• Server-side, UWP
ASP.NET Core
• Web-фреймворк
• MVC и REST API
• Много фишек из коробки
• Razor – шаблонизатор в MVC
Платформа .NET Core глазами PHP-разработчика
Язык C#
C#
• Microsoft, Андерс Хейлсберг
• .NET 1.0, 2002г
• ООП, ФП
• Во многом похож на Java
Пример: Hello, World
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, UWDC!");
}
}
}
C# – не скрипт
PHP
• Скриптовый язык
• Артефакт – исходники
• Интерпретируется
при выполнении
• JIT отсутствует (пока)
C#
• Компилируется в IL
• Артефакт – бинарник
• Исполняется в
виртуальной машине CLR
• Оптимизируется
JIT-компилятором
Система типов
PHP
• Динамическая
• Слабая
• Неявная
• Generics – нет
(есть RFC)
C#
• Статическая
• Сильная
• Явная
• Generics
(C# 2.0, 2005г)
Пример: Система типов – PHP
$foo = 1 + "100";
echo $foo . PHP_EOL; //101
$foo = 1 * "123foo";
echo $foo . PHP_EOL; //123
$foo = 1 + "foo";
echo $foo . PHP_EOL; //1
$foo = 1 * "foo";
echo $foo . PHP_EOL; //0
Платформа .NET Core глазами PHP-разработчика
Пример: Система типов – C#
var j = 1 + "100";
Console.WriteLine(j); //1100
var k = 1 + "100foo";
Console.WriteLine(k); //1100foo
var l = 1 + "foo";
Console.WriteLine(l); //1foo
var n = 1 * "foo"; //syntax error
Console.WriteLine(n);
Асинхронность
PHP
• Из коробки – нет
• PCNTL
• Pthreads (CLI)
• Curl
C#
• Доступно из коробки
• Основа ASP.NET Core
• Широкий набор API
• Async/Await
Пример: Async/Await
public async Task<int> GetProjectsCount()
{
var projects = await
_dbContext.Projects
.ToListAsync();
var count = projects.Count;
return count;
}
LINQ
• Встроенный язык запросов
• Удобный синтаксис работы с коллекциями
• Можно строить строгие запросы к БД
• «Портирован» на PHP, JS, TS
var sessions = await _dbContext
.Sessions
.Where(s =>
s.ProjectId == projectId
&& s.DateEnd == 0)
.OrderByDescending(s => s.DateStart)
.Take(count)
.ToListAsync();
return sessions;
Пример: LINQ
ASP.NET Core
PHP is meant to die
PHP
• «Запустился – обработал
запрос – умер»
• PHP-FPM
• Opcode-кэш
• phpDaemon, PHP-PM
ASP.NET Core
• Долгоживущее приложение
• Асинхронная обработка
запросов
• Общая память
• Общие статические свойства
и классы
Запуск
PHP
• PHP-FPM + Nginx/Apache
• Apache + modphp
• Встроенный сервер
ASP.NET Core
• Kestrel
• C#, libuv, Nuget
• HTTP(S). Скоро – HTTP/2,
WebSockets, TCP
• Желателен Nginx
Производительность
• 1,713,171 RPS
• MVC – 831,987 RPS
• 2.0 – на 25% быстрее
• PHP – 44,881 RPS
https://www.techempower.com/benchmarks/
Entity Framework Core
• Строго типизированные запросы
• Автоматические миграции
• Асинхронный доступ к БД
Пример: REST API
[HttpGet("{id}")]
public async Task<Project> Get(int id)
{
return await _dbContext.Projects.FindAsync(id);
}
[HttpPost]
public async void Post([FromBody] Project project)
{
_dbContext.Projects.Add(project);
await _dbContext.SaveChangesAsync();
}
Инструменты
Платформа .NET Core глазами PHP-разработчика
Пример: Docker
FROM microsoft/aspnetcore:1.1.1
ENV ASPNETCORE_ENVIRONMENT Production
WORKDIR /app
COPY ./bin/Release/netcoreapp1.1/publish /app
EXPOSE 80
CMD ["dotnet", "MyApp.dll"]
Платформа .NET Core глазами PHP-разработчика
Тестирование
• Фреймворки – xUnit, nUnit
• Оценка покрытия – VS, dotCover
• Live Unit Testing в VS 2017
(в .NET Core 2.0/VS 2017.3)
CI/CD-сервисы
Наш опыт
Где используем
• 6 проектов
• В основном – микросервисы
• Причины для выноса:
– Latency. Внешние API
– Асинхронность. Обработка потоков данных
– Стабильность. Финансовые транзакции
Процесс разработки
Минусы
• Уровень входа
• Молодость .NET Core
• Сложности в работе
с внешними данными
Плюсы
• С#
• Инструменты
• Статический анализ
• Рефакторинг
• Асинхронность
Производительность
Было
• 50-100мс, 200-300мс
под нагрузкой
• 96 процессов PHP-FPM
• 100MB/процесс
• Redis
• Воркеры
Стало
• 99% – 13мс, 90% – 7мс,
50% – 1мс
• 1 процесс
• 100-150MB всего
• In-memory кэш
• Фоновые потоки
Деплой и мониторинг
Минусы
• Обновление только
перезапуском
• Дебаг на линуксе
пока не очень
• Есть «детские болезни»
Плюсы
• Сборка в 3 команды
• Образы для докера – ОК
• Размер – ~20MB,
быстрые push и pull
• Gitlab, Graylog, Prometheus
Заключение
~Startup
• С# – крутой
• Код – качественный и стабильный
• Приложения – быстрые
• Асинхронность – просто и эффективно
• Инструменты – отличные
• .NET Core – наш выбор
Попробуйте!
• https://tiny.cc/learncsharp – Обучение C#
• https://tiny.cc/learnaspnet – Обучение ASP.NET Core
• https://dot.net
• https://github.com/dotnet
• https://github.com/aspnet
Спасибо за внимание!
• @sonicbw
• https://github.com/SonicGD
• https://sitko.ru
Вопросы?

More Related Content

PPT
PHP: SAPI
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
PDF
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
PPTX
Денис Иванов
PDF
PHP: SAPI
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Денис Иванов

What's hot (20)

PDF
Доклад Виталия Котова на конференции LoveQA. "Selenium тесты. От RC и одного ...
PPTX
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
PPTX
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
PPT
Highload2009 Rybak Badoo Os
PDF
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
PPTX
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
PDF
Макс Волошин: Php + shell = ♥
PDF
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
PDF
Компиляция скриптов PHP. Алексей Романенко
PDF
Мой маленький уютный PaaS / Илья Беда (bro.agency)
PDF
2020.10.13 HA Redis is simple. FWDays Highload
PDF
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
PDF
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
PDF
Путь к Go на конкретном примере
PPTX
Антон Турецкий
PPTX
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
PPTX
Как собирать gps треки раз в секунду, экономя траффик
PDF
Андрей Ситник
PDF
Javascript-фреймворки:
 должен остаться только один
Доклад Виталия Котова на конференции LoveQA. "Selenium тесты. От RC и одного ...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Highload2009 Rybak Badoo Os
Как и зачем создавать NginX-модуль - теория, практика, профит / Василий Сошни...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Макс Волошин: Php + shell = ♥
2021.09.04 PHP FWDays. Our experience of transferring Laravel microservices t...
Компиляция скриптов PHP. Алексей Романенко
Мой маленький уютный PaaS / Илья Беда (bro.agency)
2020.10.13 HA Redis is simple. FWDays Highload
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
Путь к Go на конкретном примере
Антон Турецкий
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Как собирать gps треки раз в секунду, экономя траффик
Андрей Ситник
Javascript-фреймворки:
 должен остаться только один
Ad

Similar to Платформа .NET Core глазами PHP-разработчика (20)

PPT
Node.JS: возможности для РНР-разработчика
PDF
Web and mobile development for intersystems caché, Eduard Lebedyuk
PDF
Разработка мобильного и веб интерфейса для Caché
PPT
PDF
Что нового в ASP.NET 5
PPT
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
PPTX
Node.js введение в технологию, КПИ #ITmeetingKPI
PDF
Компиляция скриптов PHP (Алексей Романенко)
PPTX
Гетерогенные сервисы для highload-проектов на примере Imhonet.ru и 4talk.im, ...
PPTX
Стажировка-2013, разработчики, занятие 7. Web, HTTP
PPT
Владимир Никонов "Вызовы при разработке enterprise продукта"
PDF
Как превратить приложение в платформу
PPTX
Dynamic Language Runtime
PDF
Денис Иванов
PPTX
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Group
PDF
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
PDF
Phalcon - самый быстрый PHP Framework
PPTX
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
PPT
всё что вы хотели знать о Zend certified
PDF
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
Node.JS: возможности для РНР-разработчика
Web and mobile development for intersystems caché, Eduard Lebedyuk
Разработка мобильного и веб интерфейса для Caché
Что нового в ASP.NET 5
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
Node.js введение в технологию, КПИ #ITmeetingKPI
Компиляция скриптов PHP (Алексей Романенко)
Гетерогенные сервисы для highload-проектов на примере Imhonet.ru и 4talk.im, ...
Стажировка-2013, разработчики, занятие 7. Web, HTTP
Владимир Никонов "Вызовы при разработке enterprise продукта"
Как превратить приложение в платформу
Dynamic Language Runtime
Денис Иванов
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Group
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Phalcon - самый быстрый PHP Framework
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
всё что вы хотели знать о Zend certified
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
Ad

Платформа .NET Core глазами PHP-разработчика

  • 1. Платформа .NET Core Глазами PHP-разработчика Георгий Драк, Sitko.ru @sonicbw
  • 3. Цели • Язык со статической типизацией • Больше производительности • Асинхронность • Развитые инструменты
  • 4. public static void Main(string[] args) • .NET, .NET Core, ASP.NET Core? • .NET vs PHP • Наш опыт
  • 6. .NET Platform • 13 февраля 2002г. • Десктоп, веб, консольные утилиты • C#, VB.NET, F#, IronPython, IronRuby, Peachpie • Mono, Xamarin • Unity
  • 7. .NET Core https://github.com/dotnet/core • Open source, MIT • Содержит не все API из .NET Framework • Server-side, UWP
  • 8. ASP.NET Core • Web-фреймворк • MVC и REST API • Много фишек из коробки • Razor – шаблонизатор в MVC
  • 11. C# • Microsoft, Андерс Хейлсберг • .NET 1.0, 2002г • ООП, ФП • Во многом похож на Java
  • 12. Пример: Hello, World using System; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Hello, UWDC!"); } } }
  • 13. C# – не скрипт PHP • Скриптовый язык • Артефакт – исходники • Интерпретируется при выполнении • JIT отсутствует (пока) C# • Компилируется в IL • Артефакт – бинарник • Исполняется в виртуальной машине CLR • Оптимизируется JIT-компилятором
  • 14. Система типов PHP • Динамическая • Слабая • Неявная • Generics – нет (есть RFC) C# • Статическая • Сильная • Явная • Generics (C# 2.0, 2005г)
  • 15. Пример: Система типов – PHP $foo = 1 + "100"; echo $foo . PHP_EOL; //101 $foo = 1 * "123foo"; echo $foo . PHP_EOL; //123 $foo = 1 + "foo"; echo $foo . PHP_EOL; //1 $foo = 1 * "foo"; echo $foo . PHP_EOL; //0
  • 17. Пример: Система типов – C# var j = 1 + "100"; Console.WriteLine(j); //1100 var k = 1 + "100foo"; Console.WriteLine(k); //1100foo var l = 1 + "foo"; Console.WriteLine(l); //1foo var n = 1 * "foo"; //syntax error Console.WriteLine(n);
  • 18. Асинхронность PHP • Из коробки – нет • PCNTL • Pthreads (CLI) • Curl C# • Доступно из коробки • Основа ASP.NET Core • Широкий набор API • Async/Await
  • 19. Пример: Async/Await public async Task<int> GetProjectsCount() { var projects = await _dbContext.Projects .ToListAsync(); var count = projects.Count; return count; }
  • 20. LINQ • Встроенный язык запросов • Удобный синтаксис работы с коллекциями • Можно строить строгие запросы к БД • «Портирован» на PHP, JS, TS
  • 21. var sessions = await _dbContext .Sessions .Where(s => s.ProjectId == projectId && s.DateEnd == 0) .OrderByDescending(s => s.DateStart) .Take(count) .ToListAsync(); return sessions; Пример: LINQ
  • 23. PHP is meant to die PHP • «Запустился – обработал запрос – умер» • PHP-FPM • Opcode-кэш • phpDaemon, PHP-PM ASP.NET Core • Долгоживущее приложение • Асинхронная обработка запросов • Общая память • Общие статические свойства и классы
  • 24. Запуск PHP • PHP-FPM + Nginx/Apache • Apache + modphp • Встроенный сервер ASP.NET Core • Kestrel • C#, libuv, Nuget • HTTP(S). Скоро – HTTP/2, WebSockets, TCP • Желателен Nginx
  • 25. Производительность • 1,713,171 RPS • MVC – 831,987 RPS • 2.0 – на 25% быстрее • PHP – 44,881 RPS https://www.techempower.com/benchmarks/
  • 26. Entity Framework Core • Строго типизированные запросы • Автоматические миграции • Асинхронный доступ к БД
  • 27. Пример: REST API [HttpGet("{id}")] public async Task<Project> Get(int id) { return await _dbContext.Projects.FindAsync(id); } [HttpPost] public async void Post([FromBody] Project project) { _dbContext.Projects.Add(project); await _dbContext.SaveChangesAsync(); }
  • 30. Пример: Docker FROM microsoft/aspnetcore:1.1.1 ENV ASPNETCORE_ENVIRONMENT Production WORKDIR /app COPY ./bin/Release/netcoreapp1.1/publish /app EXPOSE 80 CMD ["dotnet", "MyApp.dll"]
  • 32. Тестирование • Фреймворки – xUnit, nUnit • Оценка покрытия – VS, dotCover • Live Unit Testing в VS 2017 (в .NET Core 2.0/VS 2017.3)
  • 35. Где используем • 6 проектов • В основном – микросервисы • Причины для выноса: – Latency. Внешние API – Асинхронность. Обработка потоков данных – Стабильность. Финансовые транзакции
  • 36. Процесс разработки Минусы • Уровень входа • Молодость .NET Core • Сложности в работе с внешними данными Плюсы • С# • Инструменты • Статический анализ • Рефакторинг • Асинхронность
  • 37. Производительность Было • 50-100мс, 200-300мс под нагрузкой • 96 процессов PHP-FPM • 100MB/процесс • Redis • Воркеры Стало • 99% – 13мс, 90% – 7мс, 50% – 1мс • 1 процесс • 100-150MB всего • In-memory кэш • Фоновые потоки
  • 38. Деплой и мониторинг Минусы • Обновление только перезапуском • Дебаг на линуксе пока не очень • Есть «детские болезни» Плюсы • Сборка в 3 команды • Образы для докера – ОК • Размер – ~20MB, быстрые push и pull • Gitlab, Graylog, Prometheus
  • 40. ~Startup • С# – крутой • Код – качественный и стабильный • Приложения – быстрые • Асинхронность – просто и эффективно • Инструменты – отличные • .NET Core – наш выбор
  • 41. Попробуйте! • https://tiny.cc/learncsharp – Обучение C# • https://tiny.cc/learnaspnet – Обучение ASP.NET Core • https://dot.net • https://github.com/dotnet • https://github.com/aspnet
  • 42. Спасибо за внимание! • @sonicbw • https://github.com/SonicGD • https://sitko.ru Вопросы?

Editor's Notes

  • #19: PCNTL – не самый красивый код, не работает на Windows