aspnetcore 注册中心 consul

consul启动 . http://192.168.1.6:8500/ 

#以server方式启动,UI可以访问,boot引导自己选为leader,网段内PC可访问
consul agent -server -ui -bootstrap -data-dir=data -client=0.0.0.0

建两个项目coreApi、coreApiClient 。分别nuget添加 Steeltoe.Discovery.Consul 

 在StartUp 配置服务 

        public void ConfigureServices(IServiceCollection services) {
            services.AddDiscoveryClient(Configuration);//注册服务,可被其他调用

            //调用其他服务,用于服务名称和IP地址的交换
            services.AddHttpClient("hi").AddRoundRobinLoadBalancer().ConfigureHttpMessageHandlerBuilder((i) => {
                var discoveryOptions = Configuration.GetSection("consul:discovery").Get<ConsulDiscoveryOptions>();
                var consulClient = ConsulClientFactory.CreateClient(Configuration.GetSection("consul").Get<ConsulOptions>()); 
                IDiscoveryClient client = new ConsulDiscoveryClient(consulClient, discoveryOptions);
                i.PrimaryHandler = new Steeltoe.Common.Discovery.DiscoveryHttpClientHandler(client);

            });
            
            services.AddControllers();
        }

 

appsettings.json 配置 coreApi 项目

  "consul": {
    "host": "172.17.173.173",
    "port": 8500,
    "discovery": {
      "serviceName": "userSvc",
      "register": true,
      "port": 5000,
      "preferIpAddress": true,
      "healthCheckInterval": "5s",
      "healthCheckTimeout": "5s",
      "HealthCheckCriticalTimeout": "60s"
    }
  }

coreApiClient 项目

  "consul": {
    "host": "172.172.172.172",
    "port": 8500,
    "discovery": {
      "serviceName": "order",
      "register": true,
      "port": 5001,
      "preferIpAddress": true,
      "healthCheckInterval": "5s",
      "healthCheckTimeout": "5s",
      "HealthCheckCriticalTimeout": "60s"
    }
  }

coreApi项目提供服务

        [HttpGet]
        public UsrDto getUsrDto()
        {
            var header = contextAccess.HttpContext.Request.Headers;
            return new UsrDto()
            {
                Age = 34,
                CreTime = DateTime.Now,
                Id = $"BaseDirectory={AppContext.BaseDirectory},ApplicationName={env.ApplicationName},EnvironmentName={env.EnvironmentName}",
                LoginAccount = configuration.GetSection("Urls").Value,
                Score = 9823.123456m
            };
        }
         
        [HttpPost]
        public async Task< string> addUsr(UsrDto usr, string age)
        {
            var token = Request.Headers["Authorization"].ToString();
            await Task.Delay(3 * 1000);
            return token;
        }

coreApiClient项目调用服务

    public static class Ext {
        public static async Task<string> Get(this System.Net.Http.HttpClient httpClient, string uri, string token = "", string tokenKey = "Authorization") {

            using var request = new HttpRequestMessage(HttpMethod.Get, uri);
            request.Headers.TryAddWithoutValidation(tokenKey, token); 
            var resp = await httpClient.SendAsync(request);
            var content = await resp.Content.ReadAsStringAsync();
            return content;
        }

        public static async Task<string> Post(this System.Net.Http.HttpClient httpClient, string uri, object data, string token="", string tokenKey= "Authorization") {

            using var request = new HttpRequestMessage(HttpMethod.Post, uri);
            request.Headers.TryAddWithoutValidation(tokenKey, token);
            request.Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
            var resp = await httpClient.SendAsync(request);
            var content = await resp.Content.ReadAsStringAsync();
            return content;
        }
    }
    [ApiController]
    [Route("[controller]/[action]")]
    public class WeatherController : ControllerBase {
          
        System.Net.Http.HttpClient httpClient;  

        public WeatherController(IHttpClientFactory clientFactory) {
            httpClient = clientFactory.CreateClient("hi");
        }

        [HttpGet]
        public async Task< string> getUsrDtoProxy() {
            return await httpClient.Get("http://coreApi/usr/getUsrDto", "token"); 
        }

        [HttpGet]
        public async Task<string> addUsrProxy() { 
            return await httpClient.Post("http://coreApi/usr/addUsr?age=12"
                , new { Id = "hc", Age = 34, CreTime = DateTime.Now, Score = 23.34 }
                , "0987");
        }
    }

运行两个项目,consul已经注册了

 浏览器测试 coreApiClient 的两个接口 

http://localhost:20001/Weather/getUsrDtoProxy  正常返回:

 http://localhost:20001/Weather/addUsrProxy 浏览器等待3秒后 返回:0987

以上,只测试consul 服务注册与发现,get、post方式。

=======================================

下面,测试一下consul的配置管理 key/value

        [HttpGet]
        public async Task< string> getConsulConfig(string key) {
            using ConsulClient client = new ConsulClient((i) => {
                i.Address = new Uri($"http://{configuration["consul:host"]}:{configuration["consul:port"]}");
            });
            var byteV = await client.KV.Get(key);
            return Encoding.UTF8.GetString(byteV.Response.Value);
        }

在consul配置 user、product,测试后可正常取出value。

如果是新建项目,配置项目可通过命令导出和导入:

#导出kv配置,从192.168.1.6节点,具体仅导出user项目,导出到文件consul-kv.json
consul kv export -http-addr=http://192.168.1.6:8500 user > consul-kv.json

#导入kv配置,从文件consul-kv.json,只导入文件中内容,不覆盖
consul kv import -http-addr=http://192.168.1.6:8500 @consul-kv.json

 

posted on 2023-08-16 09:58  jonney_wang  阅读(102)  评论(0编辑  收藏  举报

导航