SlideShare a Scribd company logo
Платформа .NET Core
Глазами PHP-разработчика
Георгий Драк, Sitko.ru
@sonicbw
Цели
• Язык со статической типизацией
• Больше производительности
• Асинхронность
• Развитые инструменты
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
Язык 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
Пример: Система типов – 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();
}
Инструменты
Пример: 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"]
Тестирование
• Фреймворки – 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

What's hot

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

What's hot (20)

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

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

Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаAlexei Smolyanov
 
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukWeb and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukInterSystems
 
Разработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéРазработка мобильного и веб интерфейса для Caché
Разработка мобильного и веб интерфейса для CachéInterSystems CEE
 
Что нового в ASP.NET 5
Что нового в ASP.NET 5Что нового в ASP.NET 5
Что нового в ASP.NET 5Microsoft
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Гетерогенные сервисы для highload-проектов на примере Imhonet.ru и 4talk.im, ...
Гетерогенные сервисы для highload-проектов на примере Imhonet.ru и 4talk.im, ...Гетерогенные сервисы для highload-проектов на примере Imhonet.ru и 4talk.im, ...
Гетерогенные сервисы для highload-проектов на примере Imhonet.ru и 4talk.im, ...Ontico
 
Стажировка-2013, разработчики, занятие 7. Web, HTTP
Стажировка-2013, разработчики, занятие 7. Web, HTTPСтажировка-2013, разработчики, занятие 7. Web, HTTP
Стажировка-2013, разработчики, занятие 7. Web, HTTP7bits
 
Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Fwdays
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформуVadim Kruchkov
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeGetDev.NET
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Group
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru GroupЭволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Group
Эволюция разработки (Ермаков Игорь), Форум технологий Mail.Ru Grouptfmailru
 
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Sergey Xek
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkOleksandr Torosh
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Ontico
 
всё что вы хотели знать о Zend certified
всё что вы хотели знать о Zend certifiedвсё что вы хотели знать о Zend certified
всё что вы хотели знать о Zend certifiedYuri Afanasiev
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 

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

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

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

  • 1. Платформа .NET Core Глазами PHP-разработчика Георгий Драк, Sitko.ru @sonicbw
  • 2.
  • 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
  • 9.
  • 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
  • 16.
  • 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(); }
  • 29.
  • 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"]
  • 31.
  • 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

  1. PCNTL – не самый красивый код, не работает на Windows