zookeeper是一个分布式协调工具,可以实现注册中心功能
关闭Linux服务器防火墙后启动zookeeper服务器
zookeeper服务器取代Eureka服务器,zk作为服务注册中心
提供者 8003
1.新建module:zk-provider-payment8003
2.pom
<dependencies>
<!-- zookeeper -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!--公共模块:通用工具包-->
<dependency>
<groupId>cn.chen.demo</groupId>
<artifactId>api-common</artifactId>
<version>${project.version}</version>
</dependency>
<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>
<!-- devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.yml
server:
port: 8003
spring:
application:
name: zk-provider-payment
cloud:
zookeeper:
connect-string: 192.168.221.129:2181 #zk注册中心地址
4.主启动
@SpringBootApplication
@EnableDiscoveryClient
public class ZkPayment8003 {
public static void main(String[] args) {
SpringApplication.run(ZkPayment8003.class, args);
}
}
5.业务类
@RestController
@RequestMapping("/payment")
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/zk/test")
public String test(){
return "zk port:" + serverPort + new Date();
}
}
6.测试:
1)版本冲突问题
at cn.chen.ZkPayment8003.main(ZkPayment8003.java:20) [classes/:na]
Caused by: org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /services/zk-provider-payment/35980513-f54c-4f89-922f-9a1a9400c868
at org.apache.zookeeper.KeeperException.create(KeeperException.java:103) ~[zookeeper-3.5.3-beta.jar:3.5.3-beta-8ce24f9e675cbefffb8f21a47e06b42864475a60]
at org.apache.zookeeper.KeeperException.create(KeeperException.java:51) ~[zookeeper-3.5.3-beta.jar:3.5.3-beta-8ce24f9e675cbefffb8f21a47e06b42864475a60]
pom修改
a.排除掉自带的zk
<!-- zookeeper -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--排除zk3.5.3-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
b.引入3.4.14依赖
<!-- zookeeper 3.4.14-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
重启:报错。依然是冲突啦 (加完报错,去掉又正常了,不知道原因)
SLF4J: Class path contains multiple SLF4J bindings.
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
curator与zookeeper版本不兼容
java.lang.NoClassDefFoundError: org/apache/curator/connection/ConnectionHandlingPolicy
根据官方提供的文档进行调整版本
Curator 2.x.x - compatible with both ZooKeeper 3.4.x and ZooKeeper 3.5.x
Curator 3.x.x - compatible only with ZooKeeper 3.5.x and includes support for new features such as dynamic reconfiguration, etc.
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
2)查看
[zk: localhost:2181(CONNECTED) 7] ls /
[services, zookeeper]
[zk: localhost:2181(CONNECTED) 8] ls /services
[zk-provider-payment]
[zk: localhost:2181(CONNECTED) 12] ls /services/zk-provider-payment
[aa144b19-4f21-4c85-9642-b20a17e37322]
[zk: localhost:2181(CONNECTED) 13] get /services/zk-provider-payment/aa144b19-4f21-4c85-9642-b20a17e37322
{"name":"zk-provider-payment","id":"aa144b19-4f21-4c85-9642-b20a17e37322","address":"LWRYBF2EX9O1518","port":8003,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"application-1","name":"zk-provider-payment","metadata":{}},"registrationTimeUTC":1590640957643,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}
cZxid = 0xa
ctime = Thu Aug 08 06:46:39 EDT 2019
mZxid = 0xa
mtime = Thu Aug 08 06:46:39 EDT 2019
pZxid = 0xa
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x100067973630002
dataLength = 530
numChildren = 0
3)zk的服务节点是临时节点。
消费者 80
1.新建module:zk-consumer-order80
2.pom引入依赖
<dependencies>
<!-- zookeeper -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!--公共模块-->
<dependency>
<groupId>cn.chen.demo</groupId>
<artifactId>api-common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.yml
server:
port: 80
spring:
application:
name: zk-consumer-order
cloud:
zookeeper:
connect-string: 192.168.221.129:2181 #zk注册中心地址
zk:
server:
url: http://zk-provider-payment
4.config
package cn.chen.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @version demo2020-1.0
* @Title: ApplicationContextConfig
* @Description:
* @Company:
* @package: cn.chen.config
* @author: chenlf
* @date: 2020/6/2
*/
@Configuration
public class ApplicationContextConfig {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
5.主启动
package cn.chen;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @version demo2020-1.0
* @Title: ZkOrderApplication
* @Description:
* @Company:
* @package: cn.chen
* @author: chenlf
* @date: 2020/6/2
*/
@SpringBootApplication
@EnableDiscoveryClient //服务发现
public class ZkOrderApplication {
public static void main(String[] args) {
SpringApplication.run(ZkOrderApplication.class,args);
}
}
6.业务类
package cn.chen.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* @version demo2020-1.0
* @Title: ZkOrderController
* @Description:
* @Company:
* @package: cn.chen.web
* @author: chenlf
* @date: 2020/6/2
*/
@RestController
public class ZkOrderController {
@Value("${zk.server.url}")
private String zkUrl;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/zk")
public String payment (){
String result = restTemplate.getForObject(zkUrl+"/payment/zk/test",String.class);
return result;
}
}