赞
踩
我们使用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后的操作一致
新建服务提供者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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
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多个地址用逗号隔开即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。