在前一篇中,提到服务注册中心Eureka,Eureka1.0版本,在当时大受欢迎,很快便发布了2.0版本,但是2.0版本将近三年,依然没有面世,背后的原因有很多,神仙相互不服,所以导致Eureka停更,后继版本也无望,所以,他的替代品,或者说比他更厉害的组件一个个跳出来。比如Zookeeper、Consul、Nacos,接下来就介绍一下Zookeeper。
Zookeeper
它是一个分布式协调工具,可以实现注册中心功能,需要下载相应的软件,下载链接放在文末。
关闭Linux的防火墙后启动zookeeper服务器,作为服务注册中心。
进入bin目录后先后执行 ./zkServer.sh start 和./zkCli.sh
分别启动服务端和客户端
cloud-provider-payment8004
- POM文件
<dependencies>
<!-- zookeeper-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!-- 先排除自带的zookeeper3.5.3-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加3.5.8版本-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.8</version>
<!-- 在排除zookeeper自带的3.5.3之后,运行还会报错,经查发现是slf4j的版本冲突-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入自己定义的api通用包,可以使用payment支付的Entity-->
<dependency>
<groupId>com.wyh.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- application.yml
#8004表示注册到zookeeper服务器的支付服务端口号
server:
port: 8004
#服务别名-----注册zookeeper到注册中心名称
spring:
application:
name: cloud-provider-payment
cloud:
zookeeper:
connect-string: 192.168.211.136:2181
- 主启动类
@SpringBootApplication
@EnableDiscoveryClient//该注解用于向使用cousul或者zookeeper作为注册中心时注册服务
public class PaymentMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8004.class,args);
}
//zookeeper的服务节点是临时的,当某个客户端宕机时,zookeeper会剔除,
// 当重启客户端时,zookeeper监测到心跳,又会重新加载到服务列表
}
- controller
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@RequestMapping(value = "/payment/zk")
public String paymentzk(){
return "springcloud with zookeeper:"+serverPort+"\t"+ UUID.randomUUID().toString();
}
}
- 启动
启动以后会出现报错,原因是jar包冲突,相关依赖我已剔除,上述依赖为最终依赖
在浏览器输入http://localhost:8004/payment/zk进行测试
并且再次访问linux下的zookeeper,会出现
将流水号输进linux控制台中
得到目标json串。
Zookeeper和Eureka
两者相比,Zookeeper属于临时节点,而Eureka属于持久节点,当某一进程关闭后,Eureka并不会立即剔除你,而是会经过很长一段时间的心跳确认,若发现程序已死,再去剔除,Zookeeper则是短时间内剔除。
cloud-consumerzk-order80
- POM文件
<dependencies>
<!-- springboot整合zookeeper客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!-- 先排除自带的zookeeper3.5.3-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加3.5.8版本-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.8</version>
<!-- 在排除zookeeper自带的3.5.3之后,运行还会报错,经查发现是slf4j的版本冲突-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入自己定义的api通用包,可以使用payment支付的Entity-->
<dependency>
<groupId>com.wyh.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!-- springboot整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- application.yml
server:
port: 80
spring:
application:
name: cloud-consumer-order
cloud:
#注册到zookeeper地址
zookeeper:
connect-string: 192.168.211.136:2181
- 主启动类
@SpringBootApplication
@EnableDiscoveryClient//该注解用于向使用cousul或者zookeeper作为注册中心时注册服务
public class OrderZKMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderZKMain80.class,args);
}
}
- 业务类(配置Bean)
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
- 业务类(Controller)
@RestController
@Slf4j
public class OrderZKController {
public static final String INVOKE_URL="http://cloud-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "/consumer/payment/zk")
public String paymentInfo(){
String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk",String.class);
return result;
}
}
-
测试(http://localhost/consumer/payment/zk)
-
linux下
软件
链接:https://pan.baidu.com/s/1aZ4KN1hd08QXZb89BGx9dA
提取码:6yc0