我这里直接使用docker安装zookeeper,docker是个好东西,推荐你们使用,安装docker和经常使用命令的使用能够去找找资料学习下git
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- ZK依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> </dependency> <!--修改后当即生效,热部署--> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
/** * * @author lpf */ @SpringBootApplication @EnableDiscoveryClient public class LemonZkApplication { public static void main(String[] args) { SpringApplication.run(LemonZkApplication.class, args); } }
server: port: 5001 endpoints: restart: enabled: true spring: application: name: lemon-zk cloud: zookeeper: discovery: root: /lemon-service #服务注册的跟节点 enabled: true register: true #是否须要进行服务注册 connect-string: 192.168.199.156:2181 #zk集群主机,多个用逗号隔开
这里注意getInstances方法参数是你配置的应用名称,区分大小写(由于Eureka的习惯我一直用大写,致使查找不到服务)web
@RestController public class TestController { @Autowired DiscoveryClient discoveryClient; @GetMapping("/test") public String test() { //获取实例化的注册节点 List<ServiceInstance> list = discoveryClient.getInstances("lemon-zk"); //获取实例化的服务 StringBuffer sb = new StringBuffer(); if (list != null && list.size() > 0 ) { sb.append(list.get(0).getUri()+","); } return "hello world "+sb.toString(); } }
测试结果,这里有一个问题,怎么让注册的是服务的ip地址呢,这里显示的是服务的主机名,找了很久资料没发现,知道的大佬们告知一声spring
zookeeper下的节点信息docker
在这里介绍下Zookeeper与Eureka这两种服务治理框架的区别。Spring Cloud Eureka实现的服务治理机制强调了CAP原理中的AP,便可用性与可靠性,而Zookeeper这类强调CP(一致性、可靠性)。Eureka为了实现更高的服务可用性,牺牲了必定的一致性,在极端状况下它宁愿接受故障实例也不要丢掉“健康”实例,好比,当服务注册中心的网络发生故障断开时,因为全部的服务实例没法维持续约心跳,在强调CP的服务治理中将会把全部服务实例都剔除掉,而Eureka则会触发保护机制,保留此时的全部节点,以实现服务间依然能够进行互相调用的场景。网络