Trong .NET Core, việc đọc và quản lý cấu hình có thể được thực hiện thông qua các nguồn外部 như Consul, một hệ thống quản lý cấu hình tập trung. Thư viện Winton.Extensions.Configuration.Consul cung cấp một cách hiệu quả để đọc các giá trị key-value từ Consul.
Đầu tiên, bạn cần thêm thư viện này vào dự án của mình để bắt đầu sử dụng. Thư viện này không chỉ cho phép đọc cấu hình từ Consul mà còn có khả năng tải lại cấu hình một cách động態 sau khi có thay đổi. Về cơ bản, thư viện này sử dụng một vòng lặp while để theo dõi các thay đổi liên tục.
Dưới đây là một ví dụ về cách配置 các tùy chọn để lắng nghe các thay đổi cấu hình:
services.Configure<PositionSettings>(
this.Configuration.GetSection("PositionSettings"),
configureSettings: settings =>
{
Console.WriteLine(settings["Position"]);
});
Nếu một interface nào đó không được implement đầy đủ, sẽ có một ngoại lệ được kích hoạt. Ví dụ:
cfgBuilder.AddConsul(
"my.config.json",
options =>
{
options.IsOptional = true;
options.EnableReload = true;
options.OnLoadError = e => HandleLoadError(e);
options.OnWatchError = e => HandleWatchError(e);
options.PollingInterval = TimeSpan.FromSeconds(10);
options.ConsulConfig = cco =>
{
cco.ServerAddress = consulConf.Server;
cco.DataCenter = consulConf.Region;
cco.AuthToken = consulConf.Token;
};
});
Một lỗi phổ biến có thể xảy ra trong các ứng dụng background process, nơi có một main thread và một thread phụ trách đọc các giá trị KV từ Consul. Nếu main thread bị đóng lại nhưng thread đọc cấu hình vẫn tiếp tục hoạt động, nó sẽ gây ra các lỗi IO.
Thông tin chi tiết về lỗi:
System.Threading.Tasks.TaskCanceledException: The operation was canceled.
System.IO.IOException: Unable to read data from the transport connection: Operation canceled.
System.Net.Sockets.SocketException (125): Operation canceled
Link nguồn code: ConsulConfigurationProvider.cs
Để triển khai Consul trong Kubernetes, bạn có thể thực hiện các bước sau:
- Install Consul sử dụng Helm:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
consul-connect-injector ClusterIP 10.103.51.243 <none> 443/TCP 38d
consul-dns ClusterIP 10.96.212.39 <none> 53/TCP,53/UDP 38d
consul-server ClusterIP None <none> 8500/TCP,8502/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP 38d
consul-ui ClusterIP 10.110.157.219 <none> 80/TCP
- Truy cập giao diện Consul thông qua port-forward:
kubctl port-forward --address 0.0.0.0 services/consul-ui 8085:80
- Deploy ingress để truy cập Consul UI:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: consul-ui-ingress
namespace: consul
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /consul
pathType: Prefix
backend:
service:
name: consul-ui
port:
number: 80