Consul大家不陌生,就是和Zookeeper、Nacos一伙的,能够作为微服务基础架构的注册中心,算是比较成熟的组件,和Springcloud集成顺滑,

考虑到Eureka已经停止更新,所以有必要了解下Consul,看看有啥不一样的风景。

准备:

Idea2019.03/Maven3.6.3/Gradle6.0.1/JDK11.0.4/SofaRPC5.6.5/SofaBoot3.3.1

难度: 新手--战士--老兵--大师

目标:

  1. SOFARPC模式下使用Consul做注册中心

步骤:

为了遇见各种问题,同时保持时效性,我尽量使用最新的软件版本。源码地址,其中的day27:https://github.com/xiexiaobiao/dubbo-project

1 特点

Consul的广告词:让服务发现配置更简单(service discovery & configuration make easy)!

特点:

  1. 低延时的服务注册和发现,支持HTTP API 模式访问
  2. 内建的DNS模式替代常规静态IP模式,方便动态扩展服务规模
  3. 支持多数据中心模式,自动故障转移
  4. 完善的健康检查以及坏点路由阻断,具备服务断路器功能
  5. K/V存储,可用于设置属性

2 linux安装

2.1 基础架构

每个运行consul的节点为一个agent,可以是client或server模式,每个数据中心必须拥有至少一台server来保存consul集群状态信息,建议在生产环境

下一个集群中有3或5个server,这在容错和性能上能较好平衡。

client模式是一个非常轻量级的进程,用于注册服务,运行健康检查和转发对server的查询。集群中每台主机上都必须运行client用以获取服务的健康信息。

2.2 单机模式

下载,略!

我使用consul_1.7.2_linux_amd64.zip,并使用 unzip 解压到提前建立的目录: /usr/consul,解压后只有一个 consul 文件:

将此consul文件放到PATH下的任意某个目录,我这里放到usr/local/bin下:

运行 consul 命令出现以下即为安装成功!

运行为单机dev模式:所有信息保存在内存中,无任何持久化

[root@server224 consul]# consul agent –dev

查看数据中心的节点信息:

[root@server224 consul]# consul members

HTTP API方式查询,请求会自动转发到server上:

 [root@server224 consul]# curl localhost:8500/v1/catalog/nodes

DNS 方式查询:

[root@server224 consul]# dig @127.0.0.1 -p 8600 server224.node.consul

命令行方式关闭agent:

[root@server224 consul]# consul leave

注意:执行 leave 命令后,Consul能感知到该节点的离开,上面运行的服务和相关的检查将从目录(catalog)中移除,Consul也不会再联系该节点。

若使用kill命令强制关闭agent进程,其他节点将认为此节点失效而不是离开,并将该节点健康状态标记为危险(critical),但不会从目录中删除,

Consul会自动尝试重连该节点,认为有可能是网络故障的原因。作为server的agent节点,优雅的关闭还是很重要的,可以避免可用性故障影响到一致性协议。

2.3 集群模式

在linux虚拟机 10.10.10.220(hostname: server224) 上启动server模式:

注意

1 启动agent时参数配置方式有两种,“命令行” 和 “配置文件”,两者等效;

2 命令行参数 config-dir,即按字母顺序加载目录下所有的".json" 或 ".hcl"文件,config-file 指定具体某个配置文件;

为了使用配置文件方式,我先建立一个配置文件(这是个基础配置文件,故我加了一个a前缀,能被优先加载):/etc/consul.d/a_consul_config.json

运行linux命令即可(运行时请去掉注释):

echo '{
"datacenter": "dc1",
"node_name": "hdp3", // 需唯一
//"server": true, 若不指定为服务端,则默认为客户端
// "bootstrap_expect": 3, 只在server模式有效,指该DC下的server数,要么不指定,要么必须是准确的数值
"data_dir": "/tmp/consul",
"log_level": "DEBUG",
"enable_syslog": true, // 记录为系统日志,仅linux下使用
"enable_script_checks": true, // 脚本检查
"bind_addr": "10.10.10.226", // 监听地址,
"client_addr": "10.10.10.226" // UI访问地址
}' > /etc/consul.d/a_consul_config.json

运行:

命令行启动:以下则和上面的配置文件中有部分重复的项 (仅为演示使用):

[root@server224 consul]# consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=hdp2 -bind=10.10.10.220 -config-dir /etc/consul.d -ui -client=10.10.10.220

运行命令行:-server指定为server端,-ui启动webUI,-config-dir指定配置文件目录

[root@server224 consul]# consul agent -server -ui -bootstrap-expect 1 -data-dir /tmp/consul -config-dir /etc/consul.d

在10.10.10.226(hostname: server226) 上启动client:

建立一样的配置文件,并修改node_name,ip等信息,注意去掉client_addr,否则本机上无法使用consul members命令,然后命令行启动:

[root@server226 consul]# consul agent -data-dir /tmp/consul -config-dir /etc/consul.d

因没有连接server会输出:

2020-03-22T02:40:28.343+0800 [ERROR] agent.anti_entropy: failed to sync remote state: error="No known Consul servers"

手动加入集群:

[root@server226 ~]# consul join 10.10.10.220

查询集群成员信息:

Web端访问server端:

http://10.10.10.220:8500/

可以看到两个成员,其中一个是星标的leader,

健康检查脚本,略!自动加入集群配置,略!

3 实战使用

Dubbo + consul做注册中心,dubbo官方没建议此组合,我自己尝试了半天,但各种报错,因此弃用!至于springcloud + consul组合,资料已经泛滥,

在此不表,我这里使用蚂蚁金服的SOFARPC+consul来做代码演示: 整体部署图:

新建一个maven项目,三个模块,provider(提供服务)/consumer(使用服务)/common(公共接口),核心代码部分:

com.biao.study.provider.AnnotationServiceImpl

@SofaService(interfaceType = CommonHelloService.class, bindings = { @SofaServiceBinding(bindingType = "bolt") })
@Component
public class CommonHelloServiceImpl implements CommonHelloService {
@Override
public String sayAnnotation(String string) {
return "hello -- " + string;
}
}
 

以上代码中,使用的SOFARPC的注解模式,@SofaService 标注该component为RPC服务,使用的是bolt协议,然后在 src/main/resources/application.properties 中通过指定consul为注册中心:

com.alipay.sofa.rpc.registry.address=consul://10.10.10.220:8500

核心代码部分: com.biao.study.consumer.AnnotationClientImpl

@Component(value = "helloSyncServiceReference")
public class AnnotationClientImpl implements AnnotationClient { @SofaReference(interfaceType = CommonHelloService.class, binding = @SofaReferenceBinding(bindingType = "bolt"))
private CommonHelloService commonHelloService; public String sayClientAnnotation(String str) {
String result = commonHelloService.sayAnnotation(str);
return result;
}
}
 

以上代码中,@SofaReference 标注引用公共服务,和dubbo模式十分相似,@SofaReferenceBinding标注协议类型。

先运行provider,再运行consumer,输出以下即大功告成!

再访问consul web,即可看到服务信息:

可以看出区别于Nacos的是这里只有服务提供方信息

服务的元数据信息:


问题

1 window端无法访问consul的web界面,先请检查linux防火墙,是否阻止了8500端口,可以先ping一下测试,然后看consul agent启动时命令行有没有漏掉参数 –ui,

这样才会启动web界面,最后是看consul agent启动后,client的Client Addr 是否为127.0.0.1,如这样只能在虚机内部打开web,因此命令行需通过-client=10.10.10.220,

或者配置文件client_addr 属性指定为虚机真实IP。

全文完!


我的其他文章:

只写原创,敬请关注

SOFARPC模式下的Consul注册中心的更多相关文章

  1. 微服务系列之 Consul 注册中心

    原文链接:https://mrhelloworld.com/posts/spring/spring-cloud/consul-service-registry/ Netflix Eureka 2.X ...

  2. Spring Cloud 系列之 Consul 注册中心(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Consul 注册中心(一) 本篇文章讲解 Consul 集群环境的搭建. Consul 集群 上图是一个简单的 Co ...

  3. Spring Cloud 系列之 Consul 注册中心(一)

    Netflix Eureka 2.X https://github.com/Netflix/eureka/wiki 官方宣告停止开发,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka ...

  4. 微服务架构 | 3.4 HashiCorp Consul 注册中心

    目录 前言 1. Consul 基础知识 1.1 Consul 是什么 1.2 Consul 的特点 2. 安装并运行 Consul 服务器 2.1 下载 Consul 2.2 运行 Consul 服 ...

  5. Spring Cloud 微服务一:Consul注册中心

    Consul介绍 Consul is a service mesh solution providing a full featured control plane with service disc ...

  6. Consul 注册中心介绍

    在 Spring Cloud 体系中,几乎每个角色都会有两个以上的产品提供选择,比如在注册中心有:Eureka.Consul.zookeeper.etcd 等:网关的产品有 Zuul.Spring C ...

  7. .Net Core with 微服务 - Consul 注册中心

    上一次我们介绍了 Ocelot 网关的基本用法.这次我们开始介绍服务注册发现组件 Consul 的简单使用方法. 服务注册发现 首先先让我们回顾下服务注册发现的概念. 在实施微服务之后,我们的调用都变 ...

  8. 【SpringCloud】consul注册中心注册的服务为内网(局域网)IP

    一.前因 最近在做公司的一个微服务项目,技术架构为spring cloud + consul + SSM. 当我写完一个功能要在本地测试时,发现服务运行成功,但是前后端联调报500错误. 当时的第一个 ...

  9. linux下配置zookeeper注册中心及运行dubbo服务

    dubbo和zookeeper的关系 简单来说打个比方:dubbo就是动物园的动物,zookeeper是动物园.如果游客想看动物的话那么就去动物园看.比如你要看老虎,那么动物园有你才能看到.换句话说我 ...

随机推荐

  1. IP地址0.0.0.0表示什么

    参考RFC文档: 0.0.0.0/8 - Addresses in this block refer to source hosts on "this"network. Addre ...

  2. Janet Wu price

    上次也是第一次参加百公里是2012的时候,那年的主题是一路有你,和一群同事从深圳湾走到福田,最后累了就回家了,那晚应该是睡得很好吧. 今年是提前报名了,虽然还不确定是否参加.因为说实话,我不喜欢拥堵的 ...

  3. JasperReport框架使用教程(附带常见空白页问题说明)

    概述与安装使用 1. PDF报表概述 概述 ​ 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表.其实除了Excel报表之 ...

  4. python 初学者

    明确学习目标,不急于求成 当下是一个喧嚣.浮躁的时代.我们总是被生活中大量涌现的热点所吸引,几乎没有深度阅读和思考的时间和机会.我始终认为,学习是需要沉下心来慢慢钻研的,是长 期的:同时,学习不应该被 ...

  5. 使用EventBus + Redis发布订阅模式提升业务执行性能

    前言 最近一直奔波于面试,面了几家公司的研发.有让我受益颇多的面试经验,也有让我感觉浪费时间的面试经历~因为疫情原因,最近宅在家里也没事,就想着使用Redis配合事件总线去实现下具体的业务. 需求 一 ...

  6. c语言之单向链表

    0x00 什么是链表 链表可以说是一种最为基础的数据结构了,而单向链表更是基础中的基础.链表是由一组元素以特定的顺序组合或链接在一起的,不同元素之间在逻辑上相邻,但是在物理上并不一定相邻.在维护一组数 ...

  7. 新大陆NB-IoT模块烧写详细过程

    NB-IOT 模块板设置 1. NB-IOT 模块板如下 2.将模块上红色开关 1. 2 向下拨, 3. 4 开关向上拨,如下 3.将黑色开关向左侧拨至 M3 芯片处,如下 4.将模块上启动/下载开关 ...

  8. py基础之模块与包

    '''模块:当代码越来越多时,将所有代码放入一个文件中便会无法维护,所以放到多个文件中去,这样每一个py文件就是一个模块 包:模块越来越多时容易重名,便将模块放入不同的包中,每个包中必须有一个__in ...

  9. sql05

    1.Ado.net Ado.net是一组由微软提供的使用C#操作数据库的类库 2.连接 首先引入: using System.Data.SqlClient; 需要使用连接字符串进行连接 using S ...

  10. Kali虚拟机的扩容经历

    Kali虚拟机的扩容经历 0x01 起因 更新了一下软件包,竟然提示我空间不足. 升级了 687 个软件包,新安装了 82 个软件包,要卸载 0 个软件包,有 8 个软件包未被升级. 需要下载 1,5 ...