代码改变世界

consul .netcore

2022-05-17 21:12  qgbo  阅读(67)  评论(0编辑  收藏  举报

.netcore  读取配置文件。可以读 consul 的 key value.

 

Winton.Extensions.Configuration.Consul 这个库可以实现读取。

下载他的源码,测试部分是个项目。

这个lib 也可以热加载,改变值之后,。netcore 可以感到改变值。

源码上 看,这个只是用一个while 死循环实现的。

 

修改配置之后,如下代码可以接收到配置的更改。

  services.Configure<PositionOptions>(
                this.Configuration.GetSection(PositionOptions.Position),
                bo =>
                {
                    Console.WriteLine(this.Configuration["Position"]);
                });

            //services.Configure<PositionOptions>(
            //    bo =>
            //    {
            //        Console.WriteLine(bo);
            //    });

 

 

如果某个接口没有实现,  如下写法,将会触发OnWatchException 。

  cfgBuilder.AddConsul(
                    $"my.json",
                    options =>
                    {
                        options.Optional = true;
                        options.ReloadOnChange = true;
                        options.OnLoadException = e => OnLoadException(e);

                        options.OnWatchException = e => OnWatchException(e);
                        options.PollWaitTime = TimeSpan.FromSeconds(5);
                        options.ConsulConfigurationOptions = cco =>
                        {
                            cco.Address = consulConf.Address;
                            cco.Datacenter = consulConf.Datacenter;
                            cco.Token = consulConf.Token;
                        };
                    });

root cause:  这个bug 出现在后台进程程序。程序有主线程,和读取consul KV的线程。 如果某个接口没有实现,主进程将退出。而读取consul KV的线程还在读取。将导致IO错误。

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

 

sourcecode: https://github.com/wintoncode/Winton.Extensions.Configuration.Consul/blob/master/src/Winton.Extensions.Configuration.Consul/ConsulConfigurationProvider.cs

 

k8s 搭建consul

1.  helm 下载cosnul  安装上之后,有几个service.

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

2. kubctl  port-forward --address 0.0.0.0  services/consul-ui 8085:80   访问8085 即可打开UI

3. ingress 

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cosnul-ui
  namespace: consul
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: consul-ui
            port:
              number: 80
        path: /consul
        pathType: Prefix