목차
소스 코드 분석
运行部署
困惑
写在最后
백엔드 개발 C#.Net 튜토리얼 카탈로그 서비스 - Microsoft 마이크로서비스 아키텍처 예제 코드 분석

카탈로그 서비스 - Microsoft 마이크로서비스 아키텍처 예제 코드 분석

May 29, 2018 pm 03:31 PM
service 마이크로소프트 제공하다 분석하다

지난 글에서는 Identity Server4를 기반으로 개발되었기 때문에 알아둘 내용이 많지 않습니다. 오늘은 Catalog Service에 대해 알아보겠습니다. .모두가 이해하길 바랍니다.

소스 코드 분석

먼저 매우 표준적인 webapi 디렉터리인 디렉터리 구조를 살펴보겠습니다.

카탈로그 서비스 - Microsoft 마이크로서비스 아키텍처 예제 코드 분석

추가 UseWebRoot("Pics")가 포함된 IdentityService와 유사한 프로그램을 먼저 살펴보겠습니다. 사진 디렉토리를 설정하세요. 웹루트가 되었고, 다른 모든 것은 동일합니다.

Startup의 구성 방법에서는 비밀 관리자 도구의 사용도 보았지만 여기에는 어셈블리 유형이 하나 더 있습니다. 실제로 비밀에는 userSecretsId만 필요합니다.

ConfigureServices에서 다음 코드를 볼 수 있습니다.

services.AddMvc(options =>
{
	options.Filters.Add(typeof(HttpGlobalExceptionFilter));
}).AddControllersAsServices();

필터를 추가했습니다. 이 HTtpGlobalExceptionFilter는 프로젝트에서 찾을 수 있습니다. 이는 아마도 CatalogDomainException 유형의 오류가 발생하면 특정 오류 코드가 반환된다는 의미일 것입니다.

AddControllersAsServices는 프로젝트의 모든 Controller를 Services에 등록하는 확장 메서드입니다. 소스 코드를 살펴보겠습니다.

        public static IMvcCoreBuilder AddControllersAsServices(this IMvcCoreBuilder builder)
        {
            var feature = new ControllerFeature();
            builder.PartManager.PopulateFeature(feature);foreach (var controller in feature.Controllers.Select(c => c.AsType()))
            {
                builder.Services.TryAddTransient(controller, controller);
            }

            builder.Services.Replace(ServiceDescriptor.Transient<icontrolleractivator>());return builder;
        }</icontrolleractivator>

가운데에 있는 foreach 섹션은 프로젝트에서 종속성 주입을 통해 각 컨트롤러에 쉽게 액세스할 수 있도록 하기 위한 것입니다. .

내려가기:

            services.AddDbContext<catalogcontext>(options =>
            {
                options.UseSqlServer(Configuration["ConnectionString"],
                                     sqlServerOptionsAction: sqlOptions =>
                                     {
                                         sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name);                                         //Configuring Connection Resiliency:   sqlOptions.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
                                     });// Changing default behavior when client evaluation occurs to throw. // Default in EF Core would be to log a warning when client evaluation is performed.options.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));//Check Client vs. Server evaluation: });</catalogcontext>

DBContext를 구성할 때 Connection Resiliency(바운스 연결) 방식이 사용됩니다. 마이그레이션을 사용할 때 이 방식은 앞서 이야기한 FluentNhibernate와 유사합니다. , EnableRetryOnFailure는 이 작업의 실패한 시도 메커니즘을 설정합니다. 마이그레이션 중에 오류가 발생하면 자동으로 다시 시도합니다. 이 방법은 앱과 데이터베이스의 분리로 인해 발생하는 연결 오류의 영향을 방지합니다. 왜 이런 메커니즘이 있는 걸까요? 왜냐하면 우리의 데이터베이스가 Azure SQL과 같은 클라우드에 있을 때 필연적으로 네트워크 연결 문제가 발생하기 때문입니다. 앱과 데이터베이스를 데이터 센터에 두더라도 가끔 이런 문제가 발생할 것이라고 생각하므로 이제 구성할 수 있습니다. 오류가 발생하면 작업을 다시 시작하여 네트워크로 인해 가끔 발생하는 문제를 어느 정도 방지합니다. 명령을 실행할 때 재시도를 활성화하도록 일부 정책을 설정할 수도 있습니다. 기본적으로 EF는 클라이언트 평가 시 경고만 기록하도록 할 수 있으며, 이를 무시하도록 구성할 수도 있습니다.

다음으로 다음 코드를 볼 수 있습니다.

services.Configure<catalogsettings>(Configuration);</catalogsettings>

각 eShop 프로젝트에서 유사한 명령문을 찾을 수 있습니다. 이는 일부 프로젝트 관련 설정을 서비스에 등록하고 이를 환경 변수로 구성할 수 있습니다. settings.json을 통한 구성 외에도 Docker run –e를 통해 유연한 구성을 수행할 수도 있습니다.

여기에서 CatalogSetting에는 외부CatalogBaseUrl 속성이 포함되어 있습니다. docker 실행 시 다음 명령을 입력할 수 있습니다.

docke run -e "ExternalCatalogBaseUrl=http://localhost:5011/" ....

이렇게 하면 docker 명령을 통해 유연하게 구성할 수 있으며, 이는 매우 편리합니다. ConnectionString과 같은 .json의 변수에 대한 값을 클릭하면 자세히 알아볼 수 있습니다.

            // Add framework services.services.AddSwaggerGen();
            services.ConfigureSwaggerGen(options =>
            {
                options.DescribeAllEnumsAsStrings();
                options.SingleApiVersion(new Swashbuckle.Swagger.Model.Info()
                {
                    Title = "eShopOnContainers - Catalog HTTP API",
                    Version = "v1",
                    Description = "The Catalog Microservice HTTP API. This is a Data-Driven/CRUD microservice sample",
                    TermsOfService = "Terms Of Service"
                });
            });

            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                    builder => builder.AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
            });

위의 두 코드는 각각 SwaggerGen 및 Cors(교차 도메인) 전략으로 구성되어 있으며, SwaggenGen은 자동으로 API를 웹 모드로 변환하여 우리 앞에 표시할 수도 있습니다. 디버깅이 가능합니다. 사용하기가 매우 쉽습니다. Cors의 구성은 여기서는 잘 사용되지 않습니다. 모든 요청을 허용하므로 실제 요구 사항을 따르는 것이 좋습니다. 그렇지 않으면 도메인 간 설정에 의미가 없습니다.

다음으로 EventBus와 관련된 일련의 서비스 추가 작업을 살펴보았는데, 지금까지 로그 작업만 수행되었음을 확인했습니다.

if (raiseProductPriceChangedEvent) // Save and publish integration event if price has changed{//Create Integration Event to be published through the Event Busvar priceChangedEvent = new ProductPriceChangedIntegrationEvent(catalogItem.Id, productToUpdate.Price, oldPrice);// Achieving atomicity between original Catalog database operation and the IntegrationEventLog thanks to a local transactionawait _catalogIntegrationEventService.SaveEventAndCatalogContextChangesAsync(priceChangedEvent);// Publish through the Event Bus and mark the saved event as publishedawait _catalogIntegrationEventService.PublishThroughEventBusAsync(priceChangedEvent);
}

위 내용을 살펴보겠습니다. 코드는 가격에 변경 사항이 있을 때 EventService를 호출하여 작업을 저장하고 기록한다는 것을 의미합니다. PublishThroughEventBusAsync 메서드는 이 레코드의 상태를 게시됨으로 변경합니다. 현재로서는 왜 이 방법을 사용하는지, 왜 EventBus라는 이름을 붙였는지는 알 수 없습니다. 하지만 프로젝트 이슈에 이런 질문을 올렸으니, 해당 프로젝트의 개발자들이 저에게 답변을 주실 수 있기를 바랍니다. 답변. Basket.Api를 확인했습니다. 이 프로젝트에는 구독 동작이 있으므로 다음 장에서 자세히 살펴보겠습니다.

좋아요, 다음 코드 부분을 다시 살펴보겠습니다.

var context = (CatalogContext)app
            .ApplicationServices.GetService(typeof(CatalogContext));

WaitForSqlAvailability(context, loggerFactory);

여기에서는 이전에 등록된 CatalogContext가 new를 통해 인스턴스화되지 않고 GetService를 통해 인스턴스화되는 것을 볼 수 있습니다. 이전 등록을 통해 컨텍스트가 의존하는 다른 인스턴스도 가져올 수 있으므로 매우 편리하고 사용하기 쉽습니다.

WaitForSqlAvailability 방법은 나중에 데이터 마이그레이션이 필요하기 때문에 데이터베이스를 사용 가능하게 만드는 것입니다.

CatalogService에는 2개의 컨트롤러가 포함되어 있습니다. 하나는 PicController이고 다른 하나는 CatalogController입니다. PicController는 ID를 기반으로 사진만 가져옵니다. CatalogController는 webapi를 사용하여 CURD를 수행하는 방법을 보여줍니다.

运行部署

如果你要运行Catalog.Api,你必须安装MSSQL和RabbitMQ,这次我把我的系统换成了Win10 Pro,并在电脑上使用Docker安装了MSSQL-Server-Linux和RabbitMQ。安装这2个非常简单,仅仅需要输入几条命令即可:

docker run --name mssql -e &#39;ACCEPT_EULA=Y&#39; -e &#39;SA_PASSWORD=Pass@word&#39; -p 5433:1433 -d microsoft/mssql-server-linux

docker run -d --hostname my-rabbit --name rabbitmq -p 8080:15672 -p 5672:5672 rabbitmq:3-management

ok,我们使用docker创建了mssql和rabbitmq,这里注意一下,我把mssql的端口映射到了本机的5433上,还有rabbitmq的管理页面,我映射到了本机的8080端口,你可以通过http://localhost:8080 进行访问。

上一篇我们说过我们可以通过iisexpress/Kestrel或者docker的形式运行因为牵涉到配置,所以这两种方式的运行有些不同。

一、iisExpress或Kestrel方式下,因为刚刚我们把mssql和rabbitmq的端口都映射到了本机,所以我们只需要在setting.json中把数据库连接和rabbitmq的地址指向本机即可,如下:

{  "ConnectionString": "Server=tcp:127.0.0.1,5433;Initial Catalog=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word",  "ExternalCatalogBaseUrl": "http://localhost:5101",  "EventBusConnection": "localhost",  "Logging": {"IncludeScopes": false,"LogLevel": {      "Default": "Debug",      "System": "Information",      "Microsoft": "Information"}
  }
}

ok,Ctrl+F5,运行一下看看:

카탈로그 서비스 - Microsoft 마이크로서비스 아키텍처 예제 코드 분석

当看到上面这个页面,说明你的运行正常了,你还得测试下api是否运行正常,比如Pic,比如Items。

二、docker中运行,参照上一篇的方式,先publish再build 카탈로그 서비스 - Microsoft 마이크로서비스 아키텍처 예제 코드 분석, 不过这里要注意一点,因为你之前的ConnectionString和EventBusConnection都是指向本机(127.0.0.1)的,所以这里必须改一下,改成主机的ip地址或者是对应容器的ip也可以,如果您不想更改的话,也可以通过docker -e进行设置,比如:

docker run -p 8899:80 --name catalog -e "EventBusConnection=172.17.0.2" -d catalog:01

我这里的172.17.0.2是我rabbitmq容器的ip地址,你可以通过docker inspect containerId 进行查看容器的ip。

如果一切配置都正确的话,你就可以通过浏览器http://localhost:8899 进行浏览了。

当然,除了正常浏览外,你还需测试下api是否正常。

카탈로그 서비스 - Microsoft 마이크로서비스 아키텍처 예제 코드 분석

困惑

在这个项目中有一些疑惑,希望大家能够给我答案。

Connection Resiliency,我看了很久,字面意思是弹性连接,但我觉得用弹性好像不太适合,一般来讲我们说的弹性都是指架构或者系统的伸缩性,我一开始也是从这个角度去了解,但看了很多文章,觉得它只是让我们在启动的时候,设置一些重试策略,在后面调用中可使用此策略,策略会根据你设置的重试次数、延迟时间等去自动重试,避免因为偶尔的错误造成的影响,所以觉得用弹回比较恰当。

EventBus,我感觉很奇怪,为什么一定要取这个名字呢?在Android中,很明确的,它是进行订阅发布,消息传递,可以解耦发布者和订阅者,但在Catalog.Api里,变成了记录操作,没有看到解耦,也没有看到订阅。在我的理解中,应该在Startup进行订阅操作,发布者CatalogController在进行update操作的时候,订阅者进行add log动作,但在这个实例中,我看到的是同步进行了这些操作,所以很不解。

Mssql-server-linux,当你用Docker安装了以后,你却不能使用visual studio 2017的sql server data tools进行查询(只能进行连接),为了查看效果,还需要安装Microsoft Sql Server Management Studio(必须17版本以后)进行查看数据。

写在最后

这次的文章来的比较晚,一方面有点忙,另一方面就是上面提到的困惑,面对困惑我试着去解答,但有时候真的无法解答,所以提出来集思广益。

后面可能会比较慢,需要学习的东西真多,一边写一边学习成为这次系列的乐趣,现在每天坚持6公里快走,夜走能够是我保持头脑清晰,思考项目中的疑问,现在发觉生活越发有趣。

或许有很多人觉得只看了Startup就够了吗?其实真不够,我目前先把框架的源码过一遍,后面会分篇讲述,比如Connection Resiliency。

위 내용은 카탈로그 서비스 - Microsoft 마이크로서비스 아키텍처 예제 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT

Stock Market GPT

더 현명한 결정을 위한 AI 기반 투자 연구

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제

마이크로소프트, 보안 강화, 잠금 화면 최적화 등 Win11 8월 누적 업데이트 출시 마이크로소프트, 보안 강화, 잠금 화면 최적화 등 Win11 8월 누적 업데이트 출시 Aug 14, 2024 am 10:39 AM

8월 14일 이 사이트의 소식에 따르면 오늘 8월 패치 화요일 이벤트 당일 마이크로소프트는 22H2와 23H2용 KB5041585 업데이트, 21H2용 KB5041592 업데이트를 포함해 윈도우 11 시스템용 누적 업데이트를 출시했다. 위 장비가 8월 누적 업데이트로 설치된 후, 본 사이트에 첨부된 버전번호 변경 사항은 다음과 같습니다. 21H2 장비 설치 후, 장비 설치 후 버전번호가 Build22000.314722H2로 증가되었습니다. Windows 1121H2용 KB5041585 업데이트의 주요 내용은 다음과 같습니다.

삼성은 마이크로소프트의 MR 헤드셋에 디스플레이를 제공할 예정이며, 해당 장치는 더 가볍고 선명한 디스플레이를 가질 것으로 예상됩니다. 삼성은 마이크로소프트의 MR 헤드셋에 디스플레이를 제공할 예정이며, 해당 장치는 더 가볍고 선명한 디스플레이를 가질 것으로 예상됩니다. Aug 10, 2024 pm 09:45 PM

최근 삼성디스플레이와 마이크로소프트(MS)가 중요한 협력 협약을 체결했다. 이번 협약에 따라 삼성디스플레이는 수십만 개의 혼합현실(MR) 헤드마운트 기기용 OLEDoS 패널을 개발해 마이크로소프트에 공급하게 된다. 마이크로소프트는 게임, 영화 등 멀티미디어 콘텐츠용 MR 기기를 개발할 예정이다. OLEDoS 사양이 확정된 후 출시될 예정이며, 주로 상업용 분야에 서비스를 제공할 예정이며, 이르면 2026년에 출시될 것으로 예상됩니다. OLEDoS(OLED on Silicon) 기술 OLEDoS는 실리콘 기판에 OLED를 증착하는 새로운 디스플레이 기술로, 기존 유리 기판에 비해 더 얇고 픽셀이 높습니다. OLEDoS 디스플레이와 일반 디스플레이

Microsoft, Microsoft Designer의 Android 베타 버전 출시: AI 기술로 개인화된 디자인 지원 Microsoft, Microsoft Designer의 Android 베타 버전 출시: AI 기술로 개인화된 디자인 지원 Jun 28, 2024 pm 10:09 PM

12일 뉴스에 따르면 마이크로소프트는 최근 구글 플레이 스토어에 마이크로소프트 디자이너(Microsoft Designer)의 안드로이드 베타 버전을 출시했다. 이는 이 새로운 디자인 도구가 적용 가능한 플랫폼을 점차 확대하고 있음을 의미한다. 마이크로소프트 디자이너(Microsoft Designer)는 이르면 2022년 10월 공개될 예정이다. 핵심 기능은 생성 AI 기술을 통합해 사용자가 쉽게 다양한 그림을 생성하고 텍스트 설명을 기반으로 개인화된 디자인을 수행할 수 있도록 하는 것이다. Microsoft Designer의 중요한 기능은 OpenAI가 개발한 AI 페인팅 도구 DALL-E2입니다. 이 도구는 사용자가 입력한 텍스트 명령을 기반으로 이미지를 빠르게 생성합니다. 예를 들어, 사용자는 단순히 "크리스마스 의상을 입은 소녀"라고 입력하고, D

마이크로소프트, 블리자드 IP 기반 소규모 'AA' 게임 개발을 위해 새로운 팀 구성 마이크로소프트, 블리자드 IP 기반 소규모 'AA' 게임 개발을 위해 새로운 팀 구성 Aug 05, 2024 pm 02:25 PM

8월 2일 이 사이트의 소식에 따르면, 올해 1월 마이크로소프트 게임부는 마이크 이바라 사장을 비롯한 블리자드 직원 다수가 사임했다고 발표했다. 그러나 회사는 이후 발표되지 않은 또 다른 게임을 작업할 새로운 인력을 모집하기 시작했습니다. WindowsCentral은 오늘 Microsoft가 소규모 "AA" 게임을 개발하기 위해 Blizzard와 새로운 팀을 구성했다고 보고했습니다. 새 팀은 주로 킹 팀원들로 구성됐으며, 이번 소규모 게임은 '오버워치', '워크래프트', '스타크래프트' 등 블리자드의 기존 게임 IP를 주로 기반으로 한다고 한다. 이 새로운 팀은 대부분 이전 King 개발자들로 구성되어 있기 때문에 Windows

문서 업로드 시 충돌 문제를 해결하기 위해 Microsoft Edge 브라우저가 버전 127.0.2651.105로 업데이트되었습니다. 문서 업로드 시 충돌 문제를 해결하기 위해 Microsoft Edge 브라우저가 버전 127.0.2651.105로 업데이트되었습니다. Aug 16, 2024 pm 08:03 PM

8월 16일 이 사이트의 소식에 따르면 Microsoft는 Microsoft Edge 브라우저의 127.0.2651.105 버전 업데이트를 안정 채널에 출시했습니다. 이 업데이트에는 주로 두 가지 중요한 변경 사항이 포함되어 있습니다. 첫 번째는 일부 웹사이트에 문서를 업로드할 때 브라우저가 충돌하는 문제(브라우저에 오류 코드 STATUS_BREAKPOINT가 표시됨)를 수정하는 것이고, 두 번째는 CVE-2024-43472의 Microsoft Edge 관련 취약점을 수정하는 것입니다. Microsoft 보안 대응 센터 웹 사이트는 현재 오류 404 상태이므로 이 사이트에서는 아직 CVE-2024-43472에 대한 자세한 정보를 찾을 수 없습니다. Statcounter의 최신 데이터에 따르면 Microsoft Edge가 데스크톱에 있는 것으로 나타났습니다.

Microsoft Azure는 10월부터 필수 다단계 인증을 출시할 예정입니다. Microsoft Azure는 10월부터 필수 다단계 인증을 출시할 예정입니다. Aug 17, 2024 am 07:40 AM

16일 해당 사이트 소식에 따르면 마이크로소프트는 어제 공지를 통해 계정 해킹 가능성을 줄이기 위해 10월부터 다중 인증(MFA) 기능을 시행하겠다고 밝혔다. Microsoft는 MFA가 이러한 계정 손상 공격의 99.2% 이상을 예방할 수 있으므로 해당 조치가 필수라고 말합니다. 보고서에 따르면 이 프로세스는 두 단계에 걸쳐 점진적으로 구현될 예정입니다. 이 사이트에서는 다음과 같이 요약합니다. 1단계: 10월부터 MFA는 Azure Portal, Microsoft Entra Management Center 및 Intune Management Center에 로그인해야 합니다. 다른 Azure 클라이언트에는 영향을 미치지 않습니다. 2단계: 2025년 초부터 MFA 요구 사항이 점차적으로 Azure와 같은 다른 Azure 클라이언트로 확장됩니다.

Microsoft Outlook은 사용자가 여러 캘린더를 효율적으로 관리할 수 있도록 분할 화면 보기 기능을 출시합니다. Microsoft Outlook은 사용자가 여러 캘린더를 효율적으로 관리할 수 있도록 분할 화면 보기 기능을 출시합니다. Jun 11, 2024 pm 12:51 PM

18일 뉴스에 따르면 마이크로소프트는 최근 마이크로소프트 365 로드맵을 업데이트해 올해 6월 아웃룩 캘린더에 '스플릿뷰(SplitView)'라는 새로운 기능을 도입할 계획이다. 이러한 혁신적인 움직임은 사용자가 동시에 여러 캘린더를 관리할 수 있도록 하여 업무 효율성을 크게 향상시키도록 설계되었습니다. 분할 화면 보기를 통해 사용자는 단일 화면에 여러 달력을 동시에 표시할 수 있어 사용자가 다양한 일정을 보다 쉽게 ​​보고 비교할 수 있습니다. 사용자는 여러 창을 자주 전환하거나 열 필요 없이 개인 일정, 팀 일정 및 기타 공유 일정을 하나의 보기에서 동시에 볼 수 있습니다. 또한 분할 화면 보기는 더 많은 사용자 정의 옵션을 제공하므로 사용자는 필요에 따라 달력 표시를 유연하게 조정할 수 있습니다. 사용자는 다음을 수행할 수 있습니다.

Windows 11 업데이트에서는 Galaxy 장치 파일의 직접 연결을 지원하여 전송이 더욱 편리해졌습니다. Windows 11 업데이트에서는 Galaxy 장치 파일의 직접 연결을 지원하여 전송이 더욱 편리해졌습니다. Jul 29, 2024 pm 06:22 PM

현재 Samsung Galaxy 휴대폰 및 태블릿에서 Windows 11 기반 Galaxy Book으로 파일을 무선으로 전송하는 방법에는 여러 가지가 있습니다. 일반적인 방법 중 하나는 Android 장치에서는 "LinkToWindows" 앱을 사용하고 PC에서는 "PhoneLink" 앱을 사용하는 것입니다. 이러한 애플리케이션을 통해 PC의 "PhoneLink" 애플리케이션을 통해 휴대폰에 설치된 "내 파일"을 열기만 하면 두 플랫폼 간에 파일을 쉽게 전송할 수 있습니다. 업데이트 내용: Microsoft는 모든 WindowsInsider 채널에 업데이트를 푸시할 것이라고 발표했습니다. 이 시간

See all articles