성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] How can I tell whether two programs...
[정성태] The case of the fail-fast crashes c...
[정성태] Creating Docker multi-arch images f...
[정성태] BinaryFormatter removed from .NET 9...
[정성태] Extending the Windows Shell Progres...
[우광현] 와..... 범위를 잡았으니 클라이언트가 해당 범위를 확인해본다...
[정성태] 딱히, 그것 이상으로 더 설명할 내용이 없습니다. 동적 포...
[정성태] If Windows 3.11 required a 32-bit p...
[정성태] What is a hard error, and what make...
[괴물신인] 질문작성자인데 이 글을 이제봤네요 ㄷㄷ 이 글처럼 타입별로 인...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Microsoft.Tye 기본 사용법 소개</h1> <p> 오호... 재미있는 도구가 있었군요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [.NET Conf 2021 x Seoul] 닷넷 개발자를 위한 클라우드 네이티브, Tye ; <a target='tab' href='https://www.youtube.com/watch?v=CZzZ0RWAp2M'>https://www.youtube.com/watch?v=CZzZ0RWAp2M</a> Introducing Project Tye ; <a target='tab' href='https://devblogs.microsoft.com/aspnet/introducing-project-tye/'>https://devblogs.microsoft.com/aspnet/introducing-project-tye/</a> Getting Started ; <a target='tab' href='https://github.com/dotnet/tye/blob/master/docs/getting_started.md'>https://github.com/dotnet/tye/blob/master/docs/getting_started.md</a> </pre> <br /> 위의 실습을 위해 Nuget에서 해당 도구를,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Microsoft.Tye ; <a target='tab' href='https://www.nuget.org/packages/Microsoft.Tye'>https://www.nuget.org/packages/Microsoft.Tye</a> </pre> <br /> 이렇게 설치할 수 있습니다. (그렇습니다. 아직 beta도 아니고 alpha 버전입니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp> <span style='color: blue; font-weight: bold'>dotnet tool install --global Microsoft.Tye --version 0.6.0-alpha.21070.5</span> You can invoke the tool using the following command: tye Tool 'microsoft.tye' (version '0.6.0-alpha.21070.5') was successfully installed. </pre> <br /> 비록 Tye가 컨테이너 환경과의 연동을 용이하게 하는 것이 최종 목표일 수 있겠지만, 그런 환경이 아니어도 local orchestrator를 통해 단순히 로컬 상에서 다중 프로젝트를 실행하는 용도로도 쓸 수 있습니다. 즉, 기존 "Multiple startup projects"로 했던 기능의,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > VS.NET 2003/2005의 다중 프로젝트 디버깅 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/334'>https://www.sysnet.pe.kr/2/0/334</a> </pre> <br /> 명령행 버전으로 생각해도 무방합니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 예를 들어, 비주얼 스튜디오에서 2개의 EXE 프로젝트를 담고 있는 솔루션으로 작업하고 있을 때 다음과 같은 명령어로 간단하게 이들을 모두 구동할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp\ConsoleApp1\WebApp> <span style='color: blue; font-weight: bold'>tye run</span> Loading Application Details... Launching Tye Host... [10:43:46 INF] Executing application from C:\temp\ConsoleApp1\WebApp\WebApp.sln [10:43:47 INF] Dashboard running on http://127.0.0.1:8000 [10:43:47 INF] Building projects [10:43:48 INF] Launching service webapp_a7173a1a-3: C:\temp\ConsoleApp1\WebApp\WebApp\bin\Debug\netcoreapp3.1\WebApp.exe [10:43:48 INF] Launching service reverseproxy_24e2247d-8: C:\temp\ConsoleApp1\WebApp\ReverseProxy\bin\Debug\netcoreapp3.1\ReverseProxy.exe [10:43:48 INF] <span style='color: blue; font-weight: bold'>webapp_a7173a1a-3 running on process id 15572</span> [10:43:48 INF] <span style='color: blue; font-weight: bold'>reverseproxy_24e2247d-8 running on process id 17520</span> [10:43:48 INF] Replica webapp_a7173a1a-3 is moving to a ready state [10:43:48 INF] Replica reverseproxy_24e2247d-8 is moving to a ready state [10:43:48 INF] Selected process 17520. [10:43:48 INF] Listening for event pipe events for reverseproxy_24e2247d-8 on process id 17520 [10:43:49 INF] Selected process 15572. [10:43:49 INF] Listening for event pipe events for webapp_a7173a1a-3 on process id 15572 ...[생략]... </pre> <br /> 보다시피 명령행에도 정보가 나오지만 더욱 자세한 정보는 Tye가 제공하는 웹 대시보드 (위의 화면에서는 <a target='tab' href='http://127.0.0.1:8000'>http://127.0.0.1:8000</a> 주소로 접근할 수 있는) 화면을 통해 살펴볼 수 있습니다.<br /> <br /> 물론, 비주얼 스튜디오의 "Multiple startup projects"와 비교해 차이점은 있습니다. Tye는 마이크로서비스와 분산 응용 프로그램의 개발/테스트/배포를 용이하게 하는 목적의 프로그램이므로 개별 EXE 인스턴스의 User-interactive 한 동작은 (향후에는 알 수 없으나) 지원하지 않습니다. 즉, 사용자 입력을 할 수 있는 방법이 없고, 대신 출력은 Tye가 제공하는 대시보드를 통해 확인할 수는 있습니다. 또한 서비스 성격의 응용 프로그램이 대상이므로 일반적인 콘솔 응용 프로그램처럼 실행 후 종료하는 것들은 (replicas의 기본값인 1을 유지하기 위해) 지속적으로 재실행을 시도합니다.<br /> <br /> 별다른 요구 사항이 없다면 비주얼 스튜디오의 sln, project 파일로 tye를 실행하는 것이 가능하지만, 그래도 부가적인 옵션을 쉽게 관리하기 위해서는 yaml 파일을 생성하는 것이 좋습니다. (yaml의 전체 스키마: <a target='tab' href='https://github.com/dotnet/tye/blob/master/src/schema/README.md'>https://github.com/dotnet/tye/blob/master/src/schema/README.md</a>)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp\ConsoleApp1\WebApp> <span style='color: blue; font-weight: bold'>tye init</span> C:\temp\ConsoleApp1\WebApp> <span style='color: blue; font-weight: bold'>type tye.yaml</span> # tye application configuration file # read all about it at <a target='tab' href='https://github.com/dotnet/tye'>https://github.com/dotnet/tye</a> # # when you've given us a try, we'd love to know what you think: # <a target='tab' href='https://aka.ms/AA7q20u'>https://aka.ms/AA7q20u</a> # name: webapp services: - name: webapp project: WebApp/WebApp.csproj - name: reverseproxy project: ReverseProxy/ReverseProxy.csproj - name: webapplication1 project: WebApplication1/WebApplication1.csproj C:\temp\ConsoleApp1\WebApp> </pre> <br /> <hr style='width: 50%' /><br /> <br /> yaml에서 지원하는 포맷은 문서에도 나오지만,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > tye/docs/reference/schema.md ; <a target='tab' href='https://github.com/dotnet/tye/blob/master/docs/reference/schema.md'>https://github.com/dotnet/tye/blob/master/docs/reference/schema.md</a> </pre> <br /> 가령, WebApp.csproj의 인스턴스를 2개 실행하고 싶다면 다음과 같이 repliacs를 추가/설정하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > name: webapp services: - name: webapp project: WebApp/WebApp.csproj <span style='color: blue; font-weight: bold'>replicas: 2</span> - name: reverseproxy project: ReverseProxy/ReverseProxy.csproj - name: webapplication1 project: WebApplication1/WebApplication1.csproj </pre> <br /> 이후 tye run을 하면 WebApp 인스턴스 2개, ReverseProxy와 WebApplication1 인스턴스는 각각 1개씩 구동이 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 재미있는 것은 tye 측에서 대상 프로젝트가 웹 애플리케이션 유형이라면 이를 인식해 포트를 자동으로 (충돌하지 않는) 번호를 할당해 주는 기능이 있습니다. 실제로 이 글에서 예를 든 "WebApplication1.csproj"는 ASP.NET Core 프로젝트인데 tye는 이 프로젝트의 실행 환경에 한해 다음의 환경 변수를 설정해 주었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SET ASPNETCORE_URLS=http://localhost:1226;https://localhost:1227 /* 포트는 실행할 때마다 바뀝니다. */ </pre> <br /> 이와 함께, tye가 실행하는 모든 EXE에는 위의 포트 사용을 알리는 환경 변수가 설정이 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > /* 왜 같은 설정이 2개씩 있는지는 이유를 알 수 없지만! */ SET SERVICE__WEBAPPLICATION1__HTTPS__HOST=localhost SET SERVICE__WEBAPPLICATION1__HTTPS__PORT=13284 SET SERVICE__WEBAPPLICATION1__HTTPS__PROTOCOL=https SET SERVICE__WEBAPPLICATION1__HOST=localhost SET SERVICE__WEBAPPLICATION1__PORT=13283 SET SERVICE__WEBAPPLICATION1__PROTOCOL=https SET WEBAPPLICATION1__HTTPS__SERVICE__HOST=localhost SET WEBAPPLICATION1__HTTPS__SERVICE__PORT=13284 SET WEBAPPLICATION1__HTTPS__SERVICE__PROTOCOL=https SET WEBAPPLICATION1__SERVICE__HOST=localhost SET WEBAPPLICATION1__SERVICE__PORT=13283 SET WEBAPPLICATION1__SERVICE__PROTOCOL=https [이름 구성 규칙] "SERVICE", "[yaml service name]", "Key" /* 또는 */ "SERVICE", "[yaml service name]", "[yaml binding protocol]", "Key" /* 또는 */ "SERVICE", "[yaml service name]", "[yaml binding name]", "[yaml binding protocol]", "Key" </pre> <br /> 따라서, 솔루션에서 또 다른 응용 프로그램이 열고 있는 endpoint 정보를 환경 변수를 통해 알 수 있습니다. 즉, WebApplication1 프로젝트와 함께 묶어서 실행되는 ReverseProxy.csproj, WebApp.csproj 프로젝트에서도 WebApplication1로의 각종 바인딩 정보를 (실행할 때마다 항상 바뀌지만) 환경 변수 정보를 통해 구할 수 있습니다.<br /> <br /> 하지만, 실제로는 이런 정보를 환경 변수를 통해 직접 구하지는 않고 이런 작업을 대신해 주는 "Microsoft.Tye.Extensions.Configuration" 패키지 라이브러리를 참조해,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // 의존성이 싫다면 환경 변수를 직접 이용하는 것도 방법이지만, 이 규칙은 향후 바뀔 수도 있고 배포 환경에 따라 설정 방법이 바뀔 수도 있음에 유의해야 합니다. Microsoft.Tye.Extensions.Configuration ; <a target='tab' href='https://www.nuget.org/packages/Microsoft.Tye.Extensions.Configuration/'>https://www.nuget.org/packages/Microsoft.Tye.Extensions.Configuration/</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > // alpha 버전 Install-Package Microsoft.Tye.Extensions.Configuration -Version 0.6.0-alpha.21070.5 </pre> <br /> 다음과 같이 yaml에 명시한 "name"을 기준으로,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > name: webapp services: - name: webapp project: WebApp/WebApp.csproj replicas: 2 - name: reverseproxy project: ReverseProxy/ReverseProxy.csproj - <span style='color: blue; font-weight: bold'>name: webapplication1</span> project: WebApplication1/WebApplication1.csproj </pre> <br /> 바인딩 정보를 가져올 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.EnvironmentVariables; using System; using System.Collections.Generic; namespace WebApp { class Program { static void Main(string[] args) { EnvironmentVariablesConfigurationProvider evcp = new EnvironmentVariablesConfigurationProvider(); Microsoft.Extensions.Configuration.ConfigurationRoot cr = new ConfigurationRoot(new List<IConfigurationProvider>() { evcp }); Uri result = TyeConfigurationExtensions.<span style='color: blue; font-weight: bold'>GetServiceUri(cr, "webapplication1");</span> Console.WriteLine(result.ToString()); // 출력 결과: http://localhost:2395/ Console.ReadLine(); // tye가 무한 재실행하는 것을 방지하기 위해 임시 처리 } } } </pre> <br /> 위의 경우에는 Console Application 환경이라서 좀 우아하지 않은 방법을 사용했는데, 만약 ASP.NET 웹 애플리케이션이라면 ConfigureServices에서 간단하게 처리할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { <span style='color: blue; font-weight: bold'>Uri uri = Configuration.GetServiceUri("webapplication1");</span> // ...[생략]... } // ...[생략]... } </pre> <br /> <hr style='width: 50%' /><br /> <br /> 물론, binding 정보를 고정하는 것도 가능합니다. 즉, 실행 시마다 포트 정보가 바뀌지 않게 만들고 싶다면 yaml에 포트 정보를 기록하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > name: webapp services: - name: webapp project: WebApp/WebApp.csproj replicas: 2 - name: reverseproxy project: ReverseProxy/ReverseProxy.csproj - name: <span style='color: blue; font-weight: bold'>webapplication1</span> project: WebApplication1/WebApplication1.csproj <span style='color: blue; font-weight: bold'>bindings: - name: httpsBinding port: 19001 - name: httpBinding port: 19000</span> # autoAssignPort </pre> <br /> 이렇게 명시적으로 포트를 기록했다면 "name" 정보를 함께 전달해야만 다른 프로젝트에서 이를 구할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Uri result = TyeConfigurationExtensions.GetServiceUri(cr, <span style='color: blue; font-weight: bold'>"webapplication1", "httpBinding"</span>); /* 또는 */ Uri result = Configuration.GetServiceUri(<span style='color: blue; font-weight: bold'>"webapplication1", "httpBinding"</span>); </pre> <br /> 그런데, 웹 프로젝트가 아닌 경우 tye의 이러한 동적 포트 할당 서비스를 받고 싶다면 어떻게 해야 할까요? 이런 경우에는 그냥 포트 정보 없이 프로토콜 정보만 yaml에 추가하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > name: webapp services: - name: webapp project: WebApp/WebApp.csproj replicas: 2 - name: reverseproxy project: ReverseProxy/ReverseProxy.csproj <span style='color: blue; font-weight: bold'>bindings: - name: httpsBinding protocol: https - name: httpBinding protocol: http</span> - name: webapplication1 project: WebApplication1/WebApplication1.csproj bindings: - name: httpsBinding port: 19001 - name: httpBinding port: 19000 </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Uri result = TyeConfigurationExtensions.GetServiceUri(cr, "reverseproxy", "httpBinding"); /* 또는 */ Uri result = Configuration.GetServiceUri("reverseproxy", "httpBinding"); </pre> <br /> 지금까지의 결과만 봐도, tye가 왜 마이크로서비스의 개발 과정에 도움이 되는지 대강 윤곽은 잡히셨을 것입니다. 아울러, 이러한 작업들이 k8s 환경에서도 이어지므로 (아직 alpha 버전에 불과하지만) 편이성을 위해 (적어도 개발자 PC 내에서는 자유롭게) 사용할만한 가치가 충분히 있을 듯합니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그나저나, 이번에 열렸었던 ".NET Conf 2021 x Seoul" 행사는 볼 만한 세션들이 제법 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET Conf 2021 x Seoul 다시 보기 ; <a target='tab' href='https://www.notion.so/1dc78a175d8e46b6b9cec9ef19cbfa72?v=413c2a20f0b042c490305e0fe899036c'>https://www.notion.so/1dc78a175d8e46b6b9cec9ef19cbfa72?v=413c2a20f0b042c490305e0fe899036c</a> </pre> <br /> 아직도 안 보신 분들이 있다면 이참에 쭈욱 한 번 눈길 가는 데로 시청하시면 도움되는 부분이 있을 거라 확신합니다. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
8190
(왼쪽의 숫자를 입력해야 합니다.)