Consul 是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。 Consul 是 分布式 的、 高可用 的、 可横向扩展 的用于实现分布式系统的服务发现与配置。
中文网:Consul 中文文档 - Consul 中文文档 (gitbook.io)
1. Consul具有哪些特点
服务发现(Service Discovery): Consul 提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
健康检查(Health Checking):Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于
90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心: Consul支持开箱即用的多数据中心。这意味着Consul的用户不必担心建立额外的抽象层来发展到多个区域。
2.安装Consul 下载地址:Install | Consul | HashiCorp Developer windows 安装 1. 选择windows x64 版本(64bit) 2. 进入下载好的文件夹中,打开powershell ,执行命令,启动服务端代理
consul.exe agent -dev4. 浏览器输入:http://IP:8500/出现ConsulWeb界面就表示成功了 -dev 表示开发模式,生产环境下不建议使用,因为它不会保存任何状态 -server 生产环境下可使用
linux 安装 1. yum 安装 consul 环境
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install consul2. 安装完事后,执行命令查询是否成功:
[root@yushangxue ~]# consul version Consul v1.10.3 Revision c976ffd2d Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)3. 执行命令,启动服务端
consul agent -dev4. 浏览器输入:http://IP:8500/出现ConsulWeb界面就表示成功了
Docker 安装 1.拉取Consul镜像
$ docker pull consul # 默认拉取latest $ docker pull consul:1.15.4 # 拉取指定版本2.安装并运行
docker run -d -p 8500:8500 --restart=always --name=consul consul agent -server - bootstrap -ui -node=1 -client='0.0.0.0'agent: 表示启动 Agent 进程。 server:表示启动 Consul Server 模式 client:表示启动 Consul Cilent 模式。 bootstrap:表示这个节点是 Server-Leader ,每个数据中心只能运行一台服务器。技术角度上讲 Leader 是通过 Raft 算法选举的,但是集群第一次启动时需要一个引导 Leader,在引导群集后, 建议不要使用此标志。 ui:表示启动 Web UI 管理器,默认开放端口 8500,所以上面使用 Docker 命令把 8500 端口对外 开放。 node:节点的名称,集群中必须是唯一的,默认是该节点的主机名。 client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对 外提供服务,如果你要对外提供服务改成0.0.0.0 join:表示加入到某一个集群中去。 如:-json=192.168.0.11。
Net 6 中如何使用 添加3个API项目,2个服务端一个客户端,配置如下 1. 安装包:
Consul.AspNetCore 1.6.10.82. application.json 客户端ServiceName:Consul.Client。两个服务端ServiceName:Consul.Service 客户端ServiceIP:192.168.1.1。两个服务端ServiceIP:192.168.1.2
"Consul": { "ConsulHost": "http://localhost:8500", "ServiceName": "ServiceName", "ServiceIP": "x.x.x.x", "ServicePort" : 5009 }3. 添加Consul服务
public class ConsulOption { public string ConsulHost { get; set; } public string ServiceName { get; set; } public string ServiceIP { get; set; } public int ServicePort { get; set; } } public static class ConsulServiceExtension { public static IServiceCollection AddConsulService(this IServiceCollection services, IConfiguration configuration ) { var consulSection = configuration.GetSection("Consul"); services.Configure<ConsulOption>(consulSection); var consulOption = consulSection.Get<ConsulOption>(); services.AddConsul(p => { p.Address = new Uri(consulOption.HostAddress); }); services.AddConsulServiceRegistration(p => { p.ID = Guid.NewGuid().ToString(); p.Name = consulOption.ServerName; p.Address = consulOption.ServiceAddress; p.Port = consulOption.Port; // 健康检查 p.Check = new() { // 1. 如果服务不可用(健康检查失败)的情况下,多久将当前服务移除 DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5), // 2. 健康检查间隔时间 Interval = TimeSpan.FromSeconds(10), // 3. 健康检查地址(心跳地址) HTTP = $"http://{p.Address}:{p.Port}/health" // 4. 超时时间 ,Timeout = TimeSpan.FromSeconds(5) }; }); return services; } }4. Program.cs 代码
builder.Services.AddConsulService(builder.Configuration);5. 创建健康检查控制器:
[Route("[controller]")] [ApiController] public class HealthCheckController : ControllerBase { [HttpGet] public ActionResult GetHealthCheck() { Console.WriteLine($"进行心跳检测:{DateTime.Now}"); return Ok("连接正常"); } }
6.两个服务端控制器写一个方法
服务端1:
[Route("[controller]/[action]")] [ApiController] public class ProductController:ControllerBase { [HttpGet] public IActionResult GetProduct() { List<ProductInfo> list = new() { new() {Id = 1, Name = "商品1"}, new() {Id = 2, Name = "商品2"} }; return Ok(list); } }
服务端2:
[Route("[controller]/[action]")] [ApiController] public class ProductController:ControllerBase { [HttpGet] public IActionResult GetProduct() { List<ProductInfo> list = new() { new() {Id = 3, Name = "商品3"}, new() {Id = 4, Name = "商品4"} }; return Ok(list); } }
7客户端调用
[Route("[controller]/[action]")] [ApiController] public class ClientController:ControllerBase { private readonly IConsulClient _consulClient; public ClientController(IConsulClient consulClient) { _consulClient = consulClient; } [HttpGet] public async Task<IActionResult> GetProductByClient() { var instanceList = (await _consulClient.Catalog. Service("Consul.Service")).Response;
//如果要轮询调用可以自己写一个方法,这里是随机调用。 var instance = instanceList[new Random().Next(instanceList.Length)]; using HttpClient client = new(); var json = await client.GetStringAsync($"http://{instance.ServiceAddress}:{instance.ServicePort}/Product/GetProduct"); var result = JsonConvert.DeserializeObject<List<ProductInfo>>(json); return Ok(result); } }
标签:服务,Consul,consul,注册,new,public,服务端 From: https://www.cnblogs.com/MingQiu/p/18013762