前提:

先安装好ZooKeeper的环境,搭建参考:http://www.cnblogs.com/EasonJim/p/7482961.html

说明:

可以再简单的理解为有两方协作,一个是服务提供这,另一个是服务消费者。

搭建实例:

说明:基于Maven的模块工程

父工程POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jsoft.testzookeeper</groupId>
<artifactId>zookeeperdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>ZooKeeperDemo</name>
<description>This is ZookKeeperDemo</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.5.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<!-- 健康监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 断路器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<!-- 负载均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- ZK依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!-- Web支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR7</version>
<type>pom</type>
<scope>import</scope>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement> <modules>
<module>zookeeperservice</module>
<module>zookeeperclient</module>
</modules>
</project>

服务提供者POM:

<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jsoft.testzookeeper</groupId>
<artifactId>zookeeperdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.jsoft.testzookeeper</groupId>
<artifactId>zookeeperservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zookeeperservice</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies> </dependencies>
</project>

application.properties:

server.port=8800
spring.application.name=/service-zookeeper
spring.cloud.zookeeper.discovery.root=/spring-cloud-service
spring.cloud.zookeeper.connect-string=localhost:2181

说明:定义端口,应用的名称,服务在ZK的路径,ZK的服务器地址,其中ZK的服务器地址可以有多个,用逗号隔开。

HelloController:

服务接口

package com.jsoft.testzookeeper.service.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; @RestController
public class HelloController { private static final Logger log = LoggerFactory.getLogger(HelloController.class); @RequestMapping(value = "/hello", method = RequestMethod.GET)
public String sayHello(@RequestParam(name = "name") String name) {
log.info("param:name->{}", name);
return "hello: " + name;
}
}

App:

程序入口

package com.jsoft.testzookeeper.service;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication
@EnableDiscoveryClient
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}

说明:其中要@EnableDiscoveryClient标注为服务发现注解。

服务消费者POM:

<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jsoft.testzookeeper</groupId>
<artifactId>zookeeperdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.jsoft.testzookeeper</groupId>
<artifactId>zookeeperclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zookeeperclient</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Feign客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
</project>

说明:由于使用了Feign客户端,所以引入Feign依赖。

application.properties:

server.port=8810
spring.application.name=/client-zookeeper
spring.cloud.zookeeper.discovery.register=false
spring.cloud.zookeeper.discovery.root=/spring-cloud-service
spring.cloud.zookeeper.connect-string=localhost:2181
spring.cloud.zookeeper.dependencies.service-zookeeper.required=true
spring.cloud.zookeeper.dependencies.service-zookeeper.path=/service-zookeeper
spring.cloud.zookeeper.dependencies.service-zookeeper.loadBalancerType=ROUND_ROBIN

说明:由于服务提供者的应用名使用了斜杠,所以必须采用依赖关系spring.cloud.zookeeper.dependencies进行别名的选择,注意,使用了这个之后要引入actuator健康监控组件,不然调用时会报错。

App:

程序入口

package com.jsoft.testzookeeper.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients; @SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@EnableFeignClients
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class,args);
}
}

说明:@EnableCircuitBreaker为断路器的支持,@EnableFeignClients为Feign客户端的支持。

Client的实现:

主要有两种,基于RestTemplate和Feign

RestTemplate

package com.jsoft.testzookeeper.client.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; @Service
public class HelloService { @Autowired
private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "sayHelloFallback")
public String sayHello(String name) {
return restTemplate.getForEntity("http://service-zookeeper/hello?name=" + name, String.class).getBody();
} private String sayHelloFallback(String name) {
return "service error";
}
}

说明:@HystrixCommand为断路器写法。

Feign

package com.jsoft.testzookeeper.client.service;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import com.jsoft.testzookeeper.client.service.fallback.FeignFallback; @FeignClient(value = "service-zookeeper", fallback = FeignFallback.class)
public interface ServiceFeign { @RequestMapping(value = "/hello")
String sayHello(@RequestParam(name = "name") String name);
}

说明:fallback为断路器回调。

消费服务:

package com.jsoft.testzookeeper.client.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import com.jsoft.testzookeeper.client.service.HelloService;
import com.jsoft.testzookeeper.client.service.ServiceFeign; @RestController
public class HelloController { @Autowired
private HelloService helloService; @Autowired
private ServiceFeign serviceFeign; @RequestMapping(value = "hello")
public String hello(@RequestParam String name) {
return helloService.sayHello(name);
} @RequestMapping(value = "hello2")
public String hello2(@RequestParam String name) {
return serviceFeign.sayHello(name);
}
}

总结:

Spring Cloud在服务发现和注册上其实很多坑,上面展示的只是核心代码,最全的还是参考例子代码进行调试。

Maven示例:

https://github.com/easonjim/spring-cloud-demo/tree/master/ZooKeeper

参考:

http://theseus.iteye.com/blog/2366237

http://www.cnblogs.com/skyblog/p/5133752.html

http://blog.csdn.net/mn960mn/article/details/51803703

http://www.jianshu.com/p/775c363d0fda

用ZooKeeper做为注册中心搭建基于Spring Cloud实现服务注册与发现的更多相关文章

  1. 如何优化Spring Cloud微服务注册中心架构?

    作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...

  2. spring cloud(服务注册中心及服务提供者——初学一)

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  3. Spring cloud实现服务注册及发现

    服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. 本文属于<7天学会spring cloud系列& ...

  4. Spring Cloud 之 服务注册与发现

    作为微服务框架,提供服务注册发现是最基本的功能.Spring Cloud 针对服务注册发现 提供了 Eureka版本的实现 .Zookeeper版本的实现.Consul版本的实现.由于历史原因 Eur ...

  5. spring cloud(二)服务(注册)中心Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  6. Spring Cloud 之服务注册中心高可用

    服务注册中心高可用 服务注册中心 eureka-server 高可用实施 版本 Spring Boot 版本 # Spring Boot 版本: <parent> <groupId& ...

  7. Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼

    Spring Cloud并不与Spring MVC类似是一个开源框架,而是一组解决问题的规范(个人理解).解决哪些问题呢?如下: 1)服务管理:⾃动注册与发现.状态监管 2)服务负载均衡 3)熔断 4 ...

  8. SpringCloud的服务注册中心(四)- 高可用服务注册中心的搭建

    一.双 服务注册注册中心 1.服务注册中心的服务端 - EurekaServer 1.1.EurekaServer1 String.application.name=eureka-server ser ...

  9. Spring Cloud Eureka 服务注册中心(二)

    序言 Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件 它主要包括两个组件:Eureka Server 和 Eureka Client Eureka Clie ...

随机推荐

  1. C语言小项目-基于TCP协议和SOCKET编程的网络通信系统

    1.1 功能结构图   网络通信系统一共由4个模块组成,分别是点对点客户端.点对点服务端.服务器中转服务端.服务器中转客户端.这4个模块是成对使用的,点对点客户端和点对点服务端一起使用,服务器中转服务 ...

  2. KMP POJ 2752 Seek the Name, Seek the Fame

    题目传送门 /* 题意:求出一个串的前缀与后缀相同的字串的长度 KMP:nex[]就有这样的性质,倒过来输出就行了 */ /************************************** ...

  3. 我要上google

    我要上google 一.下载google浏览器(百度下载) 二.获取和运行xx-net 1.https://github.com/XX-net/XX-Net 2.解压下载的xx-net,运行文件夹中的 ...

  4. plc学习笔记

    防抖编程代码备份 如果定时到了还未检测到下降沿,则认为信号有效.这一端程序主要是针对现场装料杯在输送过程中由于传送带原因,电眼时常产生无效停机信号,需要过滤,因此需要在电眼检测中添加防抖功能 2018 ...

  5. Mantis 配置与使用学习

    转载自:http://blog.csdn.net/xifeijian/article/category/1429687

  6. mac下iterm2 设置笔记

    1.利用brew install zsh 来安装oh my zsh 2.chsh -s /bin/zsh,修改~/.zshrc文件 alias cls='clear' alias ll='ls -l' ...

  7. 字符编码方式ASCII、Unicode、UTF-8

    一.ASCII 1.介绍 即American Standard Code for Information Interchange(美国信息交换标准代码),是基于拉丁字母的,主要用于显示现代英语和其他西 ...

  8. (转) 淘淘商城系列——redis-desktop-manager的使用

    http://blog.csdn.net/yerenyuan_pku/article/details/72849791 实际工作环境中,redis会安装在服务器上,我们想使用redis服务就要使用re ...

  9. dutacm.club_1087_Common Substrings_(KMP)_(结合此题通俗理解kmp的next数组)

    1087: Common Substrings Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/ ...

  10. 13Microsoft SQL Server SQL 高级事务,锁,游标,分区

    Microsoft SQL Server SQL高级事务,锁,游标,分区 通过采用事务和锁机制,解决了数据库系统的并发性问题. 9.1数据库事务 (1)BEGIN TRANSACTION语句定义事务的 ...