consul集群安装
用springboot写了几个项目,leader说服务可以试着向consul上边迁移,于是搭建了consul的测试集群,至于为什么不用eureka,可以看下边这个表
Feature | Consul | zookeeper | etcd | euerka |
服务健康检查 | 服务状态,内存,硬盘等 | (弱)长连接,keepalive | 连接心跳 | 可配支持 |
多数据中心 | 支持 | — | — | — |
kv存储服务 | 支持 | 支持 | 支持 | — |
一致性 | raft | paxos | raft | — |
cap | ca | cp | cp | ap |
使用接口(多语言能力) | 支持http和dns | 客户端 | http/grpc | http(sidecar) |
watch支持 | 全量/支持long polling | 支持 | 支持 long polling | 支持 long polling/大部分增量 |
自身监控 | metrics | — | metrics | metrics |
安全 | acl /https | acl | https支持(弱) | — |
spring cloud集成 | 已支持 | 已支持 | 已支持 | 已支持 |
首先要下载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的服务,服务也可以正常进行