consul集群安装以及服务的注册和发现

consul集群安装

用springboot写了几个项目,leader说服务可以试着向consul上边迁移,于是搭建了consul的测试集群,至于为什么不用eureka,可以看下边这个表

FeatureConsulzookeeperetcdeuerka
服务健康检查服务状态,内存,硬盘等(弱)长连接,keepalive连接心跳可配支持
多数据中心支持
kv存储服务支持支持支持
一致性raftpaxosraft
capcacpcpap
使用接口(多语言能力)支持http和dns客户端http/grpchttp(sidecar)
watch支持全量/支持long polling支持支持 long polling支持 long polling/大部分增量
自身监控metricsmetricsmetrics
安全acl /httpsaclhttps支持(弱)
spring cloud集成已支持已支持已支持已支持

具体解释参见点击这个连接http://blog.csdn.net/u010963948/article/details/71730165

首先要下载consul的安装包,这是官网的地址https://www.consul.io/,选择一个合适的版本下载安装;安装包中只有一个consul文件,将consul文件拷贝到PATH路径中mv consul /usr/local/bin/consul即可,执行source /etc/profile后就可以利用consul version 查看是否安装成功,如果现实版本号则表明安装成功。同一个集群内的其他的consul也是同样的步骤。在合适的路径下建立data文件夹,用来存放注册的服务的信息,比如我创建的目录是/tmp/consul/data。进入目录后就可以执行创建集群的命令,这里创建了3个consul的server,满足稳定集群的最小需要

consul agent -server -bootstrap -bind=0.0.0.0 -client=IP1 -data-dir=data -ui -node=s1
consul agent -server -bind=0.0.0.0 -client=IP2 -data-dir=data -ui -node=s2  -join IP1
consul agent -server -bind=0.0.0.0 -client=IP3 -data-dir=data -ui -node=s3  -join IP1

注意一个集群中的server只能有一个-bootstrap启动,多个的时候会报错,如果安装客户端需要执行下边的命令:
consul agent -bind=0.0.0.0  -client=IP4 -data-dir=data -node=c1  -join IP1
所有集群的成员安装完成后可以使用consul members -http-addr=IP1:8500查看成员的情况,成员退出使用consul leave -http-addr=IP1:8500命令,相关参数的解释可以看这个链接:http://www.liangxiansen.cn/2017/04/06/consul/
 

consul服务注册与发现

注册的服务使用的是springboot搭建的,发现使用的是springboot+Feign的方式。

服务端需要引入的jar包如下:

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-actuator</artifactId>
			<version>1.4.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-context</artifactId>
			<version>1.1.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-consul-discovery</artifactId>
			<version>1.2.1.RELEASE</version>
		</dependency>

发现服务的一些关键项需要在配置文件中进行配置:

#默认情况下,consul服务的ID在多台服务器的情形spring.application.name是相同的,
#为注册统一服务不同的服务器需要修改不同的服务器名称不一样
spring.application.name=servicehst + ${random.uuid}
#连接的consul server ip
spring.cloud.consul.host=IP1
#连接的consul server 的端口号
spring.cloud.consul.port=8500
spring.cloud.consul.enabled=true
spring.cloud.
spring.cloud.consul.discovery.enabled=true
#服务的名字
spring.cloud.consul.discovery.serviceName=serviceName
#服务的ID,在配置的时候不需要配置这一项,在多台服务器,多次部署的情况下会导致服务注册只有一个
#spring.cloud.consul.discovery.instanceId=serviceId
spring.cloud.consul.discovery.prefer-ip-address=true

在Springboot的主类上添加@EnableDiscoveryClient后,你在controller类中写所有的方法都可以作为API对外提供服务器,这是测试的controller:

@RestController
public class ConsulController {

    @RequestMapping(path = "/name",method = RequestMethod.GET)
    public String  test(){
        return "服务端-测试consul可用性";
    }
    @RequestMapping(path = "/diffname",method = RequestMethod.GET)
    public String  diff(){
        return "服务端-不同名服务名称的测试!";
    }

    @RequestMapping(path = "/param",method = RequestMethod.GET)
    public String  param(@RequestParam(value = "param") Integer param){
        return "服务端-测试参数"+param;
    }
}


客户端调用的使用的是Feign,需要添加的jar如下:

		<!-- Feign实现声明式HTTP客户端 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-consul-discovery</artifactId>
		</dependency>

配置文件如下:

#服务的IP和服务的端口号,剩下的自己发现
spring.cloud.consul.host=IP1
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.register=false
#注册服务的有多台服务器,当其中一台挂掉之后,会自动做负载到服务正常的IP上


需要写一个接口

//注明服务端服务的名称,这种调用就是注册的服务,感觉上更像是httpclient通过接口,通过URL的方式进行注册的
@FeignClient("serviceName")
public interface FeinClient {

    /**
     * value的值就是服务端定义的接口的名字
     * method也是服务端定义的方法请求的类型
     * String test1()这个方法名称的名字无所谓
     * @return
     */
    @RequestMapping(method = RequestMethod.GET, value = "/name")
    String test1();


    @RequestMapping(method = RequestMethod.GET, value = "/diffname")
    String diffname();


    @RequestMapping(method = RequestMethod.GET,value="/param")
    String paramname(@RequestParam(value = "param") Integer param);
}

客户端中业务方法调用这里边的接口即可

说明在测试的过程中,主动挂掉consul集群中的某台server服务依旧如常,挂掉某一个注册在consul的服务,服务也可以正常进行

2PC,Raft和Paxos笔记

分布式事务与一致性算法Paxos & raft & zab

关注我,获取400个的赚钱金点子,轻松开启副业生涯

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值