SpringCloudConsul
(注册中心)学习笔记(2020.09.21)
前言: (官网 、中文文档)
Consul
是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。Consul需要一个数据平面,并支持代理和本机集成模型。Consul附带了一个简单的内置代理,因此开箱即用,但也支持Envoy等第三方代理集成。重点:
Consul
提供了服务发现、运行状况检查、配置中心、控制总线等等, 你安装了Consul
这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。
1.0 Docker
下安装Consul
(官方)
前提自行安装好
Docker
(非docker方式安装看官方)
1.1.1 下载Consul
镜像
# 下载
[root@zhihao /]# docker pull consul
# 查看是否下载成功
[root@zhihao /]# docker images
1.1.2 配置并运行Consul
服务器(容器)
启动分为开发模式启动
agent -dev
与 服务器方式启动agent -server
[root@zhihao /]# docker run -d -p 8300:8300 -p 8500:8500 -p 8600:8600 --name=myConsul consul agent -dev -ui -client=0.0.0.0
- 参数说明:
- 暴露了端口,分别是:HTTP端口:
8500
、 DNS端口:8600
agent
: 表示启动 Agent 进程。-dev
: 表示启动开发模式服务, 也可以-server
服务模式启动。-ui
:表示启动 Web UI 管理器,默认开放端口 8500,所以上面使用 Docker 命令把 8500 端口对外开放。-node=
:节点的名称,集群中必须是唯一的,默认是该节点的主机名 (非集群可以不用)。-bootstrap-expect=
: 用于server节点选举leader的参数,表示达到几个server节点时开始选举 (非集群可以不用)-bind=
: 用于表示绑定的一个地址,用于节点之间通信的地址,可以是内外网,必须是可以访问到的地址。(非集群可以不用)-join=
: 用于表示启动的时候,要加入到哪个集群内输入其中一个节点的绑定地址。(非集群可以不用)-client
: consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
其他详细
1.1.3 阿里云主机开放端口
我这里是开放了所有端口, 正常是按需开放。
1.1.4 进行测试访问
consul
容器启动成功后, 进行访问:http://xxx公网地址:8500
看到以下页面,说明正常启动了。
2.0 将提供者服务注册进consul
(官网)
下面使用的是Spring-Boot_Cloud工程
2.1.1 引入依赖
<!--SpringCloud consul-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--consul中健康检查需要用到actuator,不添加会check failing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.1.2 启动类(引导类)加上服务发现注解
@SpringBootApplication
@EnableDiscoveryClient //启用服务发现
public class MySpringApplication
{
public static void main(String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
}
2.1.3 修改配置文件application.yml
# consul服务端口号
server:
port: 8008
spring:
application:
name: mySpringApplication
# consul注册中心地址
cloud:
consul:
host: http://xxx访问docker_consul的公网地址
port: 8500
discovery:
#hostname: localhost
service-name: ${spring.application.name}
# 健康检测url
health-check-url: http://项目公网IP:8008/actuator/health
#表示注册时使用IP而不是hostname
prefer-ip-address: true
2.1.4 将项目打包部署上Docker
容器
然后启动项目, 之后查看
consul
管理界面, 看看服务是否成功注册入!
3.0 将消费者注册进consul
3.1.1 引入的依赖与提供者一样
3.1.2 启动类(引导类)加上服务发现注解
3.1.3 修改配置文件application.yml
###consul服务端口号
server:
port: 8007
spring:
application:
name: mySpringApplicationConsumer
####consul注册中心地址
cloud:
consul:
host: http://项目公网IP
port: 8500
discovery:
#hostname: localhost
service-name: ${spring.application.name}
# 健康检测url
health-check-url: http://项目公网IP:8007/actuator/health
#表示注册时使用IP而不是hostname
prefer-ip-address: true
3.1.4 将项目打包部署上Docker
容器
3.1.5 进行消费测试 (我这里使用的是Fegin
)
自己操作时候遇到的问题总结:
刚刚开始在本地IDEA跑起来的提供者与消费者都是注册上去docker部署的consul上面, 管理界面显示是有了, 但是健康检查没通过, 无法进行调用, 调用提示没有这个实例。 后来发现注册上去的服务, consul注册中心会向项目发送请求
HTTP GET http://127.0.0.1:8008/actuator/health
, 然后发现项目与consul不在同一个主机上。然后将项目打包部署上
Docker
, 之前的application.yml
我是注册时是默认方式以hostname: localhost
主机名方式注册, 然后调用的时候发现又提示报错java.net.UnknownHostException: afc5589a7a68
, 后来查询资料得知, 调用时候默认是通过主机名加端口进行调用提供者, 而提供者运行容器与消费者运行容器的主机名与IP地址各不相同, 通过主机名方式调用不通。最终改为
prefer-ip-address: true
以IP
方式注册, 重新部署上docker
才调用正常。
如果真的想要默认方式使用主机名方式进行注册服务与调用服务的话可以使用宿主机网络方式启动容器,
详情看下面方式操作。 但是会丢失每个容器网络的不一样的特点。
# --network=host,使用宿主机网络无需暴露端口,因为本身就是使用宿主机网络。
docker run -d --network=host --name=myConsul consul agent -dev -ui -client=0.0.0.0
docker run -d --network=host --name=myspringappliprovider 镜像ID
docker run -d --network=host --name=myspringappliconsumer 镜像ID
在或者将启动容器加入自定义docker网络组也可以实现效果!
# 创建自定义docker网络组myconsul
docker network create -d bridge myconsul
# 启动consul容器加入自定义网络组
docker run -d --network=myconsul -p 8300:8300 -p 8500:8500 -p 8600:8600 --name=myConsul consul agent -dev -ui -client=0.0.0.0
# 启动项目加入自定义网络组
docker run -d --network=myconsul -p 8008:8008 --name=myspringappliconsumer
docker run -d --network=myconsul -p 8007:8007 --name=myspringappliprovider
扩展:
通过接口查看Consul
所有服务 (官网说明)
通过访问http://xxxxxx:8500/v1/agent/services 接口, 返回所有注册的服务信息。
通过API
接口注销(维护)服务
由于错误操作,导致关闭的服务还存活在
Consul
上, 或者其他原因想要注销服务。调用PUT方法的接口
--request PUT \
http://127.0.0.1:8500/v1/agent/service/deregister/服务ID(通过上面接口查看)
该端点将给定的服务置于“维护模式”。在维护模式下,该服务将被标记为不可用,并且不会出现在DNS或API查询中。此API调用是幂等的。维护模式是永久性的,在代理重新启动时将自动恢复。
--request PUT \
http://127.0.0.1:8500/v1/agent/service/maintenance/服务ID(通过上面接口查看)?enable=true&reason=For+the+docs
1
,该服务将被标记为不可用,并且不会出现在DNS或API查询中。此API调用是幂等的。维护模式是永久性的,在代理重新启动时将自动恢复。
--request PUT \
http://127.0.0.1:8500/v1/agent/service/maintenance/服务ID(通过上面接口查看)?enable=true&reason=For+the+docs
1