我這裏直接使用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則會觸發保護機制,保留此時的全部節點,以實現服務間依然能夠進行互相調用的場景。網絡