SpringCloud服務的注冊發現--------zookeeper實現服務與發現 + Ribbon實現客戶端負載均衡


1,Eureka 閉源了,但是我們可以通過zookeeper實現注冊中心的功能。

      zookeeper 是一個分布式協調工具,可以實現服務的注冊和發現,配置中心,注冊中心,消息中間件的功能

2,工具准備

     windows 版本的zookeeper-3.3.6,以及客戶端查看工具ZooInspector

3,打開zookeeper 服務

4,配置需要注冊到zookeeper 上的服務,maven 依賴

member 服務:

###訂單服務的端口號
server:
  port: 8000
###服務別名----服務注冊到注冊中心名稱 
spring:
  application:
    name: zk-member
  cloud:
    zookeeper:
      connect-string: 127.0.0.1:2181

order服務:

###訂單服務的端口號
server:
  port: 8001
###服務別名----服務注冊到注冊中心名稱 
spring:
  application:
    name: zk-order
  cloud:
    zookeeper:
      connect-string: 127.0.0.1:2181

啟動類上加上注解:@SpringBootApplication 代表如果注冊中心不是Eureka 的,比如consul,zookeepr 或者其他,可以用這個去注冊,(springboot2.0 發現不加這個也可以)

member的啟動類:

@SpringBootApplication
@EnableDiscoveryClient
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    // 注冊到spring容器中
    @Bean
    // 開啟負載均衡
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

order的啟動類:

@SpringBootApplication
@EnableDiscoveryClient
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

正常啟動,就會發現,zookeeper 上就會有這幾個節點了,zookeeper 實現注冊中心創建的是臨時節點

可以看到service 服務下面有zk-member 和 zk-order 節點,zk-order 節點實現了集群

 

 

5,zookeeper_member 服務去訪問zookeeper_order 服務還是通過RestTemplate 的方式去訪問,RestTemplate 是依賴Ribbon的,所以是具有客戶端負載均衡功能的,zk_order 有集群,所以會通過輪詢的方式去訪問。

 

zookeep_member: 訪問者

@RestController
public class IndexMemberController {

    // 封裝了http方法,顯得更加的優雅
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/getOrder")
    public String getOrder() {
        // url會在eureka注冊中心上通過別名進行查找,restTemplate通過別名來找服務,是依賴ribbon,所以RestTemplate初始化要加上@LoadBalanced
        String orderUrl = "http://zk-order/getOrder";
        String res = restTemplate.getForObject(orderUrl, String.class);
        System.out.println("rpc遠程調用服務成功");
        return res;
    }
}

zookeep_order: 被訪問者

@RestController
public class IndexOrderController {

    @Value("${server.port}")
    private String port;

    @RequestMapping("/getOrder")
    public String getOrder() {
        return "獲得訂單成功,正在訪問的端口號是: " + port;
    }

}

結果:達到輪詢效果

獲得訂單成功,正在訪問的端口號是: 8002
獲得訂單成功,正在訪問的端口號是: 8001

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM