1.安裝ZooKeeper
我這裏直接使用docker安裝zookeeper,docker是個好東西,推薦大家使用,安裝docker和常用命令的使用可以去找找資料學習下
2. 服務註冊和發現
1.1 Maven依賴
<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>
1.2 SpringBoot主程序
/** * * @author lpf */ @SpringBootApplication @EnableDiscoveryClient public class LemonZkApplication { public static void main(String[] args) { SpringApplication.run(LemonZkApplication.class, args); } }
1.3 配置文件
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集羣主機,多個用逗號隔開
1.4 測試controller
這裏注意getInstances方法參數是你配置的應用名稱,區分大小寫(因爲Eureka的習慣我一直用大寫,導致查找不到服務)
@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地址呢,這裏顯示的是服務的主機名,找了好久資料沒發現,知道的大佬們告知一聲
zookeeper下的節點信息
在這裏介紹下Zookeeper與Eureka這兩種服務治理框架的區別。Spring Cloud Eureka實現的服務治理機制強調了CAP原理中的AP,即可用性與可靠性,而Zookeeper這類強調CP(一致性、可靠性)。Eureka爲了實現更高的服務可用性,犧牲了一定的一致性,在極端情況下它寧願接受故障實例也不要丟掉“健康”實例,比如,當服務註冊中心的網絡發生故障斷開時,由於所有的服務實例無法維持續約心跳,在強調CP的服務治理中將會把所有服務實例都剔除掉,而Eureka則會觸發保護機制,保留此時的所有節點,以實現服務間依然可以進行互相調用的場景。