SpringCloudConsul(注册中心)学习笔记(2020.09.21)

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 阿里云主机开放端口

我这里是开放了所有端口, 正常是按需开放。

whKZYF.jpg

1.1.4 进行测试访问

consul容器启动成功后, 进行访问: http://xxx公网地址:8500

看到以下页面,说明正常启动了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7HS4mFV4-1600759542351)(https://s1.ax1x.com/2020/09/18/whcBkV.jpg)]

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 管理界面, 看看服务是否成功注册入!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ygmpms38-1600759542354)(https://s1.ax1x.com/2020/09/20/wTqyLj.png)]

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: trueIP方式注册, 重新部署上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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懵懵懂懂程序员

如果节省了你的时间, 请鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值