ZooKeeper
- zookeeper是一个分布式协调工具,可以实现注册中心功能
- 关闭Linux服务器防火墙后动zookeeper服务器
- zookeeper服务器取代Eureka服务器,zk作为服务注册中心
docker安装Zookeeper
我们使用docker启动zookeeper镜像,因为使用比较方便
拉取镜像:docker pull zookeeper
查看本地镜像:docker images
启动镜像:docker run –network host –name zookeeper -d zookeeper3.4.9
zookeeper:3.4.9使用host网络模式启动
查看正在运行的容器:docker ps
启动完容器后进入交互模式:docker exec -it 容器ID bash
cd到bin目录下执行zkCli.sh脚本开启客户端
接下来的操作与常规安装zookeeper后的操作一致
SpringCloud整合zookeeper
新建服务提供者cloud-provider-payment8004
1、pom文件
<artifactId>cloud-provider-payment8004</artifactId>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>com.mzr.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!-- SpringBoot整合zookeeper客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</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>
2、yml文件
#8004表示注册到zookeeper服务器的支付服务提供者端口号
server:
port: 8004
#服务别名----注册zookeeper到注册中心名称
spring:
application:
name: cloud-provider-payment
cloud:
zookeeper:
#ip根据自己虚拟机ip调整
connect-string: 192.168.254.130:2181
3、主启动类
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为服务注册中心时注册服务,不再使用@EnableEurekaClient
public class PaymentMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8004.class, args);
}
}
4、controller层
@Slf4j
@RestController
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();
}
}
5、启动微服务
发现有报错,微服务启动失败
原因:因为引入spring-cloud-starter-zookeeper-discovery依赖,自带的zookeeper版本与我们启动的zookeeper版本不一致(我们启动的版本:3.4.9)
如何解决版本jar包冲突问题?
修改pom文件,排除自带的zookeeper3.5.3,添加zookeeper3.4.9版本<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> <!--添加zookeeper3.4.9版本--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version> <!-- 排除和 slf4j 冲突的 jar包 --> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
6、启动应用,测试
访问到最后一层返回了一个json字符串
在zookeeper服务器上存在着znode节点
每一个注册的微服务都作为一个节点放在zookeeper服务器上,那么服务节点是临时节点还是持久节点?
答案:临时节点
当微服务在一定时间内没有向zookeeper发送心跳,那么zookeeper会将该znode踢掉,重新连接zookeeper服务器后,微服务id流水号会重新生成(没有自我保护机制)
新建服务消费者cloud-consumerzk-order80
pom文件、yml文件、主启动类与cloud-provider-payment8004相似,便不再展示
config文件
@SpringBootConfiguration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getTemplate(){
return new RestTemplate();
}
}
controller层
@RestController
@Slf4j
public class OrderController {
public static final String INVOKE_URL = "http://cloud-provider-payment";
@Resource
private RestTemplate restTemplate;
@RequestMapping("/customer/payment/zk")
public String paymentInfo(){
String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk",String.class);
return result;
}
}
启动测试
可以看到服务消费者已经注册到zookeeper里
如果使用zookeeper集群版,那么yml文件zookeeper多个地址用逗号隔开即可
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/194582.html