{"id":16428542,"url":"https://github.com/buraksenyurt/tye_sample_v2","last_synced_at":"2025-10-14T08:33:16.610Z","repository":{"id":94515723,"uuid":"348811517","full_name":"buraksenyurt/tye_sample_v2","owner":"buraksenyurt","description":"Basit ölçekli bir project tye uygulamasıdır. ","archived":false,"fork":false,"pushed_at":"2021-03-21T20:37:10.000Z","size":1630,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-10-07T15:58:36.301Z","etag":null,"topics":["dotnet-core","dotnet-core5","grpc","rabbitmq","self-le","self-learning","tye"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/buraksenyurt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-03-17T18:25:34.000Z","updated_at":"2024-01-30T19:32:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"fce142d2-f308-4c0f-942d-8bbaa08db10e","html_url":"https://github.com/buraksenyurt/tye_sample_v2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/buraksenyurt/tye_sample_v2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftye_sample_v2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftye_sample_v2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftye_sample_v2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftye_sample_v2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/buraksenyurt","download_url":"https://codeload.github.com/buraksenyurt/tye_sample_v2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Ftye_sample_v2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279018310,"owners_count":26086342,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dotnet-core","dotnet-core5","grpc","rabbitmq","self-le","self-learning","tye"],"created_at":"2024-10-11T08:17:28.620Z","updated_at":"2025-10-14T08:33:16.605Z","avatar_url":"https://github.com/buraksenyurt.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# Örnek Tye Uygulaması V2 (SchoolOfMath)\n\nBu seferki Tye senaryosunda aşağıdaki senaryoyu icra edeceğiz. [Kaynak](https://www.packtpub.com/product/adopting-net-5/9781800560567) : Pact Publishing'den Adopting .NET 5: Understand Modern Architectures, migration best practices, and the new features in .NET 5.\n\n![Project_Tye_Senaryo.png](./assets/Project_Tye_Senaryo.png)\n\n- Einstein, gRPC tabanlı bir servis sağlayıcı. İçinde Palindrom sayıları hesap eden bir fonksiyon desteği sunuyor. Servis cache stratejisi için Redis'i kullanacak. \nCache'te ne mi tutacağız? Daha önceden Palindrome olarak işaretleniş bir sayı varsa bunu kendi adıyla Cache'e alacağız ve 1 saat boyunca orada tutacağız. Aynı sayı tekrar istenirse hesaplanmadan doğrudan cache'den gelecek. Sırf Redis'i senaryoya katalım diye...\nAyrıca bir mesaj kuyruğu sistemini de destekleyecek ki bu noktada RabbitMQ'dan yararlanacağız.\n\n- Evelyne, Bruce ve Madeleine Worker tipinden istemci servisler. _(Onları, başladıktan sonra sürekli talep gönderen servisler olarak düşünelim)_ Belli bir sayıdan başlayarak Eintesein'a talep gönderiyorlar ve gönderikleri sayının Palindrom olup olmadığı bilgisini alıyorlar.\n\n- Robert ise RabbitMQ kuyruğunu dinleyen diğer bir Worker servisimiz.\n\nAmacımız bu senaryoyu Tye destekli olarak inşa edip kolay bir şekilde Kubernetes'e alabilmek. Daha ilkel bir sürüm için [StarCups isimli örneğe](https://github.com/buraksenyurt/tye_sample) de bakabilirsiniz.\n\n_Platform : Windows 10(Sistemde .Net 5, Docker Desktop, kubectl, wsl2 ve tye mevcut)_\n\n## Proje İskeletinin Oluşturulması\n\nBunun için aşağıdaki adımları icra edelim.\n\n```bash\nmkdir SchoolOfMath\ncd SchoolOfMath\n\ndotnet new sln\n\n# Einstein isimli gRPC servisinin geliştirilmesi\ndotnet new grpc -n Einstein\ndotnet sln add Einstein\n\n# Protos klasöründeki greet.proto değiştirilir\n# Akabinde servis sınıfı da\n\n# İlk İstemci tarafı oluşturulur\ndotnet new worker -n Evelyne\ndotnet sln add Evelyne\n# Evelyne'nin gRPC servisini kullanabilmesi için gerekli Nuget paketleri eklenir.\ncd Evelyne\ndotnet add package Grpc.Net.Client\ndotnet add package Grpc.Net.ClientFactory\ndotnet add package Google.Protobuf\ndotnet add package Grpc.Tools\n# Ayrıca Tye konfigurasyonu için gerekli extension paketi de yüklenir\ndotnet add package --prerelease Microsoft.Tye.Extensions.Configuration\ncd ..\n\n# Visual Studio 2019 kullanıyorsak Add new gRPC Service Reference(Connected Services kısmından) ile Einstein'daki proto dosyasının fiziki adresi gösterilerek gerekli proxy tipinin üretilmesi kolayca sağlanabilir.\n\n# İkinci Worker servisi ekliyoruz (Bruce)\n# Tek fark 1den değil de 10000den başlamasıdır (Burada da Add new gRPC servis yapmayı unutmayalım)\ndotnet new worker -n Bruce\ndotnet sln add Bruce\ncd Bruce\ndotnet add package Grpc.Net.Client\ndotnet add package Grpc.Net.ClientFactory\ndotnet add package Google.Protobuf\ndotnet add package Grpc.Tools\ndotnet add package --prerelease Microsoft.Tye.Extensions.Configuration\ncd ..\n\n# Üçüncü Worker servis Madeleine de benzer şekilde eklenir\ndotnet new worker -n Madeleine\ndotnet sln add Madeleine\ncd Madeleine\ndotnet add package Grpc.Net.Client\ndotnet add package Grpc.Net.ClientFactory\ndotnet add package Google.Protobuf\ndotnet add package Grpc.Tools\ndotnet add package --prerelease Microsoft.Tye.Extensions.Configuration\ncd ..\n\n# Yukradaki işlemler tamamlandıktan sonra en azından aşağıdaki terminal komutu ile \n# servisleri ayağa kaldırıp loglara bakmakta yarar var\ntye run\n```\n\n![screenshot_1.png](./assets/screenshot_1.png)\n\n![screenshot_2.png](./assets/screenshot_2.png)\n\n![screenshot_3.png](./assets/screenshot_3.png)\n\n## Redis Desteğinin Eklenmesi\n\nHem redis hem rabbitmq hizmetlerinin ilave edilmesi hem de kubernetes geçiş hazırlıkları için tye.yaml dosyasını oluşturmalıyız.\n\n```bash\ntye init\n\n# tye.yaml dosyasın redis için gerekli ekleri yaptıktan sonra\n# einstein (gRPC API servisimiz) cache desteği için gerekli nuget paketleri eklenir\ncd einstein\ndotnet add package Microsoft.Extensions.Configuration\ndotnet add package Microsoft.Extensions.Caching.StackExchangeRedis\ncd ..\n```\n\nŞu noktada tye run ile çalıştırdığımızda en azından aşığıdaki gibi Redis kullanıldığını görmek lazım.\n\n![screenshot_4.png](./assets/screenshot_4.png)\n\n![screenshot_5.png](./assets/screenshot_5.png)\n\n## RabbitMQ Hizmetinin Eklenmesi\n\nPalindrome sayılar buldukça bunları RabbitMQ'ya mesaj olarak yollayacak bir düzenek ekleyeceğiz. RabbitMQ'da, Redis gibi çalışma zamanında ayakta olması beklenen bir servis. Bu nedenle tye.yaml dosyasında gerekli eklemeler yapılmalı.\n\nSonrasında Einstein isimli servis uygulamasına rabbitmq paketini ekliyoruz.\n\n```bash\ncd Einstein\ndotnet add package RabbitMQ.Client\ncd ..\n```\n\nKod tarafında RabbitMQ kullanımı için gerekli tipler, GoldenHammer isimli sınıfta yer alıyor. [Kaynak](https://github.com/PacktPublishing/Adopting-.NET-5--Architecture-Migration-Best-Practices-and-New-Features/tree/master/Chapter04/microservicesapp) \n_(God Object tadındaki bir sınıf ama senaryoda kullanmak basit olduğundan işime geldi. Daha iyi bir şekilde düzenlemek lazım)_\n\nBu noktada yine tye run diye ilerleyip http://localhost:15672 adresine ulaşarak RabbitMQ tarafının işler olduğunu görmekte yarar var.\n\n![screenshot_6.png](./assets/screenshot_6.png)\n\n## AMQP İstemcisinin Eklenmesi (Robert)\n\nRobert isimli Worker tipinden olan son istemci uygulama, RabbitMQ'ya atılan palindrome sayıları içeren mesajları yakalamakla görevli. RabbitMQ dinleyicisi olduğunu söyleyebiliriz. Einstein isimli servis Palindrome sayısı hesapladıkça RabbitMQ'ya bunu mesaj olarak yolluyordu. Consumer'dan bunları yakalamayı bekliyoruz.\n\n```bash\ndotnet new worker -n Robert\ndotnet sln add Robert\ncd Robert\n# RabbitMQ istemcisi olacağı için eklenecek paket\ndotnet add package RabbitMQ.Client\n# ve pek tabii Tye özelliklerini kullanabilmesi için de gerekli konfigurasyon paketi\ndotnet add package --prerelease Microsoft.Tye.Extensions.Configuration\n```\n\nRobert kodları tamamlandıktan sonra _tye run_ ile sistemi çalıştırıp dashboard üzerinden ulaşabileceğimiz logları kontrol etmekte yarar var. Bakalım Robert loglarında RabbitMQ daki _palindromes_ isimli kuyruğa düşüen mesajlar var mı?\n\n![screenshot_7.png](./assets/screenshot_7.png)\n\n### Sadece Belli Uygulamaları Çalıştırmak\n\ntye.yaml dosyasında tag bildirimlerini kullanarak _tye run_ sonrası sadece belli servislerin ayağa kaldırılması sağlanabilir. Debug işlemleri için idealdir. N tane servisin olduğu senaryolarda her şeyi ayağa kaldırmak yerine gerekenleri kurcalama noktasında çok faydalıdır.\n\n```bash\ntye run --tags middleware #sadece middleware tag'ine sahip servisleri çalıştırır.\n```\n\n![screenshot_8.png](./assets/screenshot_8.png)\n\n```bash\n# Mesela aşağıdaki kullanım ile backend ve middleware tag'ine sahip servisler ayağa kaldırılır\ntye run --tags backend middleware\n```\n\n## Debug Etmek ve Breakpoint Noktalarına Geçmek\n\ntye ile çalışırken ayağa kaldırılan uygulamaları debug etmek için _şimdilik_ biraz daha meşakkatli bir yol izlemek gerekiyor.\n\nİlk olarak gerekli yerlere breakpoint konulur. Örneğin;\n\n![screenshot_9.png](./assets/screenshot_9.png)\n\n```bash\n# Aşağıdaki komut ile sistem çalıştırlır\ntye run --debug\n```\n\nTerminalde loglarına düşen process id bulunur.\n\n![screenshot_10.png](./assets/screenshot_10.png)\n\n__Visual Studio -\u003e Debug -\u003e Attach to Process__ adımları kullanılarak ilgili process çalışma zamanına alınır.\n\n![screenshot_11.png](./assets/screenshot_11.png)\n\n__Breakpoint__ noktasına gelinmesi beklenir.\n\n![screenshot_12.png](./assets/screenshot_12.png)\n\n## Kubernetes Deploy İşlemleri\n\nWindows 10 üstündeki Docker Desktop'ın K8s Enabled özelliği açık. Buna göre sistemde tye.yaml tarafındaki servislerin alınabileceği bir K8s Cluster mevcut.\nİkinci olarak bir container registry'ye ihtiyaç var.\n\n```bash\n# container registry için aşağıdaki komut kullanılabilir.\ndocker run -d -p 5000:5000 --restart=always --name registry registry:2\n\n# Örnek iki harici servis kullanmakta\n# Redis ve RabbitMQ. Bunları şu an için K8s ortamına elle deploy etmeliyiz.\n# Bunun için redis.yaml ve rabbitmq.yaml tanım dosyalarını hazırlayıp,\n# aşağıdaki terminal komutları ile K8s'e deploy ediyoruz.\n\nkubectl apply -f .\\rabbitmq.yaml\nkubectl apply -f .\\redis.yaml\n```\n\n![screenshot_13.png](./assets/screenshot_13.png)\n\n```bash\n# K8s'e uygulamaları deploy etmek için\ntye deploy --interactive\n\n# redis için adres sorduğunda       -\u003e  redis:6379\n# rabbitmq için adres sorduğunda    -\u003e  rabbitmq:5672 (Mui sebebiyle iki kez sorabilir)\n```\n\n![screenshot_14.png](./assets/screenshot_14.png)\n\nEğer localhost:30072 adresine gidilirse RabbitMQ tarafındaki hareketlilik de izlenebilir.\n\n![screenshot_15.png](./assets/screenshot_15.png)\n\nYapılan Deployment işlemini geri almak ve K8s dağıtımlarını kaldırmak içi aşağıdaki terminal komutu kullanılır.\n\n```bash\ntye undeploy\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fburaksenyurt%2Ftye_sample_v2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fburaksenyurt%2Ftye_sample_v2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fburaksenyurt%2Ftye_sample_v2/lists"}