Consul服务注册与发现
-- --
Consul官网:https://www.consul.io/
Consul中文文档:https://www.springcloud.cc/spring-cloud-consul.html
简介
Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。Consul需要一个数据平面,并支持代理和本机集成模型。Consul附带了一个简单的内置代理,因此一切都可以直接使用,还支持Envoy等第三方代理集成。
Consul 是一套开源的分布式中的服务治理、配置中心、控制总线功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之 Consul 提供了一种完整的服务网格解决方案
它具有很多有点。包括:基于 raft 协议,比较简洁;支持健康检查,同时支持HTTP 和 DNS 协议,支持跨数据中心的WAN集群 提供图形界面,跨平台,支持 linux mac windows
主要特点
- 服务发现:Consul 的客户端可以注册服务,例如 api 或者 mysql ,其他客户端可以使用 Consul 来发现给定服务的提供者。使用DNS 或者 HTTP ,应用程序可以轻松找到他们依赖的服务
- 健康检查:领事客户端可以提供任意数量的运行状况检查,这些检查可以与给定服务(“ Web服务器是否返回200 OK”)或本地节点(“内存利用率低于90%”)相关。操作员可以使用此信息来监视群集的运行状况,服务发现组件可以使用此信息将流量从不正常的主机发送出去。
- KV存储:应用程序可以将Consul的分层键/值存储用于多种目的,包括动态配置,功能标记,协调,领导者选举等。简单的HTTP API使其易于使用。
- 安全的服务通信:领事可以为服务生成并分发TLS证书,以简历相互TLS连接。意图 可用于定义允许那些服务进行通信,可以使用可以实时更改的意图轻松管理服务分段,而不必使用复杂的网络拓扑和静态防火墙规则。
- 多数据中心:Consul开箱即用地支持多个数据中心。这意味着Consul的用户不必担心会构建其他抽象层以扩展到多个区域。
在docker上安装启动consul
#拉取consul镜像
docker pull consul
#启动consul
docker run -d -p 8500:8500/tcp --name myConsul consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
访问 : http://http:// xx.xx.xx.xx/:8500 (linux的IP地址加上冒号8500, xx代表服务器ip地址)
服务提供者
- pom文件
<!--SpringCloud consul-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
- yml文件
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: 10.211.55.17 #用linux的ip地址(consul在本机就填localhost)
port: 8500
discovery:
service-name: ${spring.application.name}
- springboot 启动类增加注解
@EnableDiscoveryClient //该注解用于向使用consul或者Zookeeper作为注册中心时注册服务
- 编写测试Controller
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}") //获取端口号
private String serverPort;
@RequestMapping("/payment/consul")
public String paymentConsul(){
return "springcloud with zookeeper:" + serverPort + "\t" + UUID.randomUUID().toString();
}
}
- 启动项目
服务消费者
和消费者相同除了端口
- 控制层 RestTemplate 远程调用
@RestController
@Slf4j
public class OrderConsulController {
public static final String INVOKE_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@RequestMapping("/consumer/payment/consul")
public String paymentInfo(){
String result = restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
return result;
}
}
启动