在前一篇中呢,咱们已经简单的了解了什么是注册中心,以及注册中心的作用。
而且呢,还搭建了Eureka 注册中心 服务端客户端,毋庸置疑,其是微服务老牌注册中心,但是呢,近几年了,随着2.x版本停更,导致很多企业不得不选择其余一些活跃的注册中心进行微服务模块的开发。
今天呢,咱们学习第二个注册中心 Consul
# consul 简介
- consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。
- Consul用Golang实现,因此具有天然可移植性(支持Linux、Windows和Mac OS X);安装包仅包含一个可执行文件,方便部署。
- 官网地址: https://www.consul.io
- 其作为注册中心,不需要我们再像eureka 那般,额外再开发模块作为注册中心服务端,consul注册中心以额外程序行使启动
# 1.下载consul
- https://www.consul.io/downloads
首先呢,开发嘛,咱们先下载个w10的瞅一瞅!
下载完成后,发现其就是一个exe执行文件罢了
# 1.检测下载是否正确
- 在下载文件解压目录下 执行CMD命令 在cmd命令行中 输入 consul -v
如果出现版本号,则说明下载文件完成,那么可以直接启动了
# 2.执行启动命令
- consul agent -dev
# 3.访问consul的web服务,默认服务端口是8500
- http://localhost:8500
# 1. 下载
- wget https://releases.hashicorp.com/consul/1.8.2/consul_1.8.2_linux_amd64.zip
# 也可直接在页面下载 下载好了上传到linux服务器上
- 我因为开始在页面下载了,所以直接传上去即可
# 2. 解压
- 在linux 目录中将文件进行解压 unzip consul_1.8.2_linux_amd64.zip
# 3. copy 到 /usr/local/bin目录下
- 解压完成后 就只是一个 consul 执行文件
- 将执行文件 consul copy到 /usr/local/bin目录下
# 4. 查看版本
- consul -v
# 4. 后端运行启动
- nohup consul agent -dev -client 0.0.0.0 -ui &
一说起docker… 最近刚出的,Docker更新协议,禁止被列入美国实体清单的组织和个人使用,Docker Hub服务受限。
准确说,企业版 对于国内某些公司已经受限了,例如 华为、360 、科大讯飞等
但是,关于 Docker 开源软件是否受影响---------未来?谁知道呢,目前仍是可以
正式安装 so easy…
docker run -d -p 8500:8500/tcp -v /data/consul/conf/:/consul/conf/ -v /data/consul/data/:/consul/data/ --name consul consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
我们在官网下载并启动的呢,是consul注册中心服务端
所以呢,如果微服务架构选择使用consul 作为注册中心的话,无需像eureka 那般,针对注册中心服务端额外搭建一个项目,consul已经是自己搭建好了,我们只要启动服务端,然后将我们的微服务注册到注册中心即可
server:
port: 9001 #端口
spring:
application:
#服务名称
name: service-product
###开始配置consul的服务注册
cloud:
consul:
#consul服务器的主机地址 默认:localhost
host: localhost
#consul服务器的ip地址 默认:8500
port: 8500
discovery:
#是否需要注册
register: true
#注册的实例ID (唯一标志)
instance-id: ${
spring.application.name}-1
#服务的名称
service-name: ${
spring.application.name}
#当前服务的请求端口
port: ${
server.port}
#指定开启ip地址注册
prefer-ip-address: true
#当前服务所在 ip ${spring.cloud.client.ip-address}
ip-address: 192.168.124.17
#consu服务健康检查 true 为启动 false 为关闭 默认为 true,建议启用
spring.cloud.consul.discovery.register-health-check=false
启动类上添加注解
# 这一步,非必须,引入依赖即可,这一步实质可省略
启动Springboot项目
springboot 默认使用 tomcat ,因此呢,启动项目需要依赖 springboot-start-web 依赖
org.springframework.boot
spring-boot-starter-web
consul web 控制台查看
这是什么意思呢?
这个其实是consul的健康检查
- 默认情况下,consul监控健康是开启的,但是必须依赖健康监控依赖才能正确监控健康状态所以直接启动会显示错误,引入健康监控依赖之后服务正常
微服务项目引入健康检查依赖
org.springframework.boot
spring-boot-starter-actuator
consul 服务端所需核心依赖
引入后,重启查看
额,还是检测不到,这是为什么呢?
因为啊,我consul 注册中心服务端,我是部署在了自己阿里云服务器的,项目中 是通过公网访问的, 而我自己搭建的demo (consul客户端呢,却是在本地,公网与本地通信,自然是找不到的了!)
所以呀,以后微服务,多个服务之间,还是微服务与注册中心之间,最好是保持在同一网段,或者彼此可以互通的情况下! 当然为了安全,向暴露个网关就好了
改成本地localhost试试!
修改后,发现监控正常! consul 服务端 与 客户端在同一ip 下,且可相互访问
本次仅仅简单演示微服务通信,为了证明 consul 注册中心可用,其余微服务注册到注册中心会获取到注册表服务信息,服务间调用根据注册表上信息,无需写死端口Ip
改造之前 consul 客户端
(1)引入Openfeign依赖并启用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
创建 库存微服务
server:
port: 9002 #端口
spring:
application:
#服务名称 库存服务
name: service-stock
###开始配置consul的服务注册
cloud:
consul:
#consul服务器的主机地址 默认:localhost
host: localhost
#consul服务器的ip地址 默认:8500
port: 8500
discovery:
#是否需要注册
register: true
#注册的实例ID (唯一标志)
instance-id: ${
spring.application.name}-1
#服务的名称
service-name: ${
spring.application.name}
#当前服务的请求端口
port: ${
server.port}
#指定开启ip地址注册
prefer-ip-address: true
#当前服务所在 ip ${spring.cloud.client.ip-address}
ip-address: 192.168.124.17
服务通信调用
流程解释:前端调用 商品服务service-product
|http://localhost:9001/product/buy/ping/pong
接口传入相应参数
看是否调到了 service-stock
服务
能否拿到返回值"出库:" + pingPongType + "类型乒乓球" + num + "件,目前库存剩余:" + 66;
服务间成功调用,证明 咱们的consul 服务发现注册功能是Ok的了
我们其余微服务呢,只要注册到了consul ,就会拿到 consul services 列表表,微服务间相互调用的时候,即会从services 列表中进行查找
由于eureka 有自我保护,当某服务挂掉(无论真假)在心跳发送接收前仍会在注册表中,并且 当相同服务做了集群后,如果集群的服务数据出现不一致时,例如订单微服务 A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提 供服务, 最后达到一致,,,实质就是最终一致性
但是呢 consul 讲究的是强一致性,当Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。
综上,便是consul 的简单使用
demo 地址:springcloud-consul-demo