zoukankan      html  css  js  c++  java
  • SOFARPC模式下的Consul注册中心

     

    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。

    全文完!


    我的其他文章:

    只写原创,敬请关注 

  • 相关阅读:
    yum下载安装mysql服务
    windows编写sh脚本在linux上不能执行
    ectouch第二讲之 文件结构
    ecshop第一讲之安装
    class id 区别
    thinkphp模板中截取中文字符串的方法分享
    CI 配置验证规则
    CodeIgniter配置之config
    codeigniter中base_url和site_url
    使用phpmyadmin导入SQL数据报错:#1062
  • 原文地址:https://www.cnblogs.com/xxbiao/p/12557835.html
Copyright © 2011-2022 走看看