Azure Http Triggers Function ile Redis Cache’in Güncellenmesi
Selamlar,
Bu makalede, Azure Function bir url’in tetiklenmesi ile hali hazırda kullanılan Redis Cache üzerindeki bir data, güncellenecektir. Azure üzerinde Redis Cache makalesine buradan erişebilirsiniz. Örneğin bu iş için, Localde yapılacak bir windows servisin oluşturulması, Continuous Integration, güvenlik ve sertifika gibi, daha birçok maliyetleri beraberinde getirecektir. Azure Http Trigger function ile bu iş, tamamen cloud’a yıkılmış ve biz developerların üzerinden büyük bir yük kaldırılmıştır :) Bu makalede :
- Visual Studio 2017 15.9.6’ı
- Azure Http Function
- Service Stack Redis kullanılacaktır.
New Project / Cloud / Azure Functions seçilerek, yeni bir proje aşağıdaki gibi oluşturulur:
Açılan menüden, Azure Functions templatelerinden Http trigger aşağıdaki gibi seçilir: Yani kısacası, bir url’e “Get” ya da “Post” işlemi yapıldığı zaman, yazılan bu function tetiklenecektir. Uzun lafın kısası “Microserviceslerin Serverless” halidir.
ServiceStack Redis kütüphanesi aşağıdaki komut ile indirilir: Amaç, hali hazırda çalışan Redis Cache’e erişim ve ilgili key’e ait haberin güncellenmesidir.
1 |
Install-Package ServiceStack.Redis |
local.settings.json: Redis sunucuya bağlanmak için gerekli tüm config ayarlar, bu dosya üzerinde tutulmaktadır.
1 2 3 4 5 6 7 8 9 10 |
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "AzureWebJobsDashboard": "UseDevelopmentStorage=true", "Host": "customerRedis.redis.cache.windows.net", "Port": 6379, "Password": "********************************" } } |
NewsModel: Redis üzerinde güncellenecek haber model, aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 |
using System; public class NewsModel { public int Id { get; set; } public string title { get; set; } public string description { get; set; } public DateTime createdDate { get; set; } public string imageUrl { get; set; } } |
Function1.cs: Url çağrıldığı zaman tetiklenecek bu function’ı, gelin adım adım inceleyelim:
1-) “public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,[HttpTrigger(AuthorizationLevel.Function, “get”, “post”, Route = null)] NewsModel news, TraceWriter log)”:
-
- “HttpRequestMessage req” : Url’e gelen RequestMessage’ın, “CreateResponse()” methodu kullanılarak işlem sonucu ekrana yazdırılmıştır.
-
1return title == null ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body") : req.CreateResponse(HttpStatusCode.OK, "Updated " + title);<span style="font-family: 'Roboto Condensed', Arial, sans-serif; font-size: 16px; background-color: #fafafa;"> </span>
-
- “[HttpTrigger(AuthorizationLevel.Function, “get”, “post”, Route = null)] NewsModel news” : Url’den parametre olarak “NewsModel” alınmıştır. Böylece gelen Haber’in IDsine göre eskisi bulunup, yenisi ile değiştirilebilecektir :)
- “HttpRequestMessage req” : Url’e gelen RequestMessage’ın, “CreateResponse()” methodu kullanılarak işlem sonucu ekrana yazdırılmıştır.
2-) “RedisEndpoint conf“ ile ServiceStack kütüphanesinin, Azure üzerinde çalışan Redis’e erişimi için gerekli olan config dosyalar “local.settings.json” üzerinden okunarak oluşturulur.
1 2 3 4 5 6 7 |
RedisEndpoint conf; var host = Environment.GetEnvironmentVariable("Host"); var password = Environment.GetEnvironmentVariable("Password"); var port = Environment.GetEnvironmentVariable("Port"); conf = new RedisEndpoint() { Host = host, Password = password, Port = int.Parse(port) }; |
3-) “string title = news.title;” : Bu örnekte, haberin sedece başlığı değiştirilecektir. Bu nedenle gelen haber içinden sadece title alınmıştır.
- “IRedisClient client = new RedisClient(conf)”: Azure üzerindeki redis’e bağlanılmıştır.
- “var data = client.Get<NewsModel>($”flag{news.Id}”);” : Başlığı değiştirilecek haber Id’sinden getirilmiştir.
- “data.title = news.title;” : Başlık bilgisi, yeni gönderilen haber’deki başlık bilgisi ile değiştirilmiştir.
- “client.Set<NewsModel>($”flag{news.Id}”, data);” Güncellenen haber, redis’e kaydedilir.
1 2 3 4 5 6 7 |
using (IRedisClient client = new RedisClient(conf)) { var data = client.Get<NewsModel>($"flag{news.Id}"); data = data == null ? new NewsModel() : data; data.title = news.title; client.Set<NewsModel>($"flag{news.Id}", data); } |
Function1.cs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Azure.WebJobs.Host; using ServiceStack.Redis; using System; namespace UpdateRedis { public static class Function1 { [FunctionName("Function1")] public static async Task<HttpResponseMessage> Run(HttpRequestMessage req,[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] NewsModel news, TraceWriter log) { RedisEndpoint conf; var host = Environment.GetEnvironmentVariable("Host"); var password = Environment.GetEnvironmentVariable("Password"); var port = Environment.GetEnvironmentVariable("Port"); conf = new RedisEndpoint() { Host = host, Password = password, Port = int.Parse(port) }; log.Info("C# HTTP trigger function processed a request."); string title = news.title; using (IRedisClient client = new RedisClient(conf)) { var data = client.Get<NewsModel>($"flag{news.Id}"); data = data == null ? new NewsModel() : data; data.title = news.title; client.Set<NewsModel>($"flag{news.Id}", data); } return title == null ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass NewsModel on the query string or in the request body") : req.CreateResponse(HttpStatusCode.OK, "Updated " + title); } } } |
Url Get: Örnek amaçlı tetiklenecek Url.
1 |
http://localhost:7071/api/Function1?title=UpdateRedisTitle&Id=2 |
Yazılan bu function’ın Azure’a nasıl publish edildiğini, bu makaleden öğrenebilirsiniz.
Geldik bir makalenin daha sonuna. Bu makalede Windows Service ya da Queue (RabbitMq,Kafka gibi) ve Microservicesler ile yapılabilecek bir işi, Azure Html Trigger Functions ile suya sabuna dokunmadan hallettik :)
Yeni bir makalede görüşmek üzere hepinize hoşçakalın.
Source : https://docs.microsoft.com/tr-tr/azure/azure-functions/functions-bindings-http-webhook
Son Yorumlar