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

 

posted @ 2019-08-20 16:41  Chris,Cai  阅读(1034)  评论(0编辑  收藏  举报