tnblog
首页
精品
资源
登录
本来什么都没有,终将什么都失去。不应贪心没得到的,而该珍惜和感恩拥有的
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2020TNBLOG.NET
技术交流:群号677373950
欢迎加群交流技术

consul实现简单的服务集群,负载均衡调用

987人阅读 2020/6/2 8:42 总访问:423421 评论:0 手机 收藏
分类: 微服务

接上一篇,consul要实现简单的服务集群,其实也很简单,只需要把多个服务使用统一个名字注入即可,然后调用的时候通过服务名获取服务的时候就可以获取到多个,然后通过一种负载均衡算法或者是按一定比例算法调用即可。


在另外一个项目在注入一下consul服务

  "Consul": {
    "ServiceName": "axj",
    "ServiceIP": "localhost",
    "ServicePort": 19341,
    "ServiceHealthCheck": "http://localhost:19341/Health/HealthCheck",
    "ConsulAddress": "http://127.0.0.1:8500"
  }

注意名字保持一致才会注入到同一个服务中,然后ip,端口这些写成当前项目的即可


写一个测试接口

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
    // GET: api/Test
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET: api/Test/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "9341:value";
    }
}

其他的什么健康检查和服务注入扩展方法这些和上篇的一样就不说了,做完这些我们去consul看看我们的服务

点击进去可以看到这个下面有两个服务了,注意看地址是两个不同的地址

然后调用即可,代码和前面测试调用的一样

我们用随机数简单的模拟一下负载均衡

public IActionResult Index()
{

    var url = _configuration.GetSection("Consul")["ConsulAddress"].ToString();

    using (var consulClient = new ConsulClient(a => a.Address = new Uri(url)))
    {
        var services = consulClient.Catalog.Service("axj").Result.Response;
        if (services != null && services.Any())
        {
            // 模拟随机一台进行请求,这里只是测试,可以选择合适的负载均衡框架
            Random r = new Random();
            int index = r.Next(services.Count());
            var service = services.ElementAt(index);

            using (HttpClient client = new HttpClient())
            {
                var response = client.GetAsync($"http://{service.ServiceAddress}:{service.ServicePort}/api/Test/520").Result;
                string result = response.Content.ReadAsStringAsync().Result;
                ViewBag.msg = result;
            }
        }
        else
        {
            ViewBag.msg = "未找到服务";
        }
    }
    return View();
}

效果如下:

两个接口都会被随机的调用


当然服务可以注入很多个:




评价