目录
1、Zookeeper服务注册与发现
1.1、注册中心Zookeeper
1.2、服务提供者
1.3、服务消费者
2、Consul服务注册与发现
2.1、简介
2.2、主要特点
2.3、在docker上安装启动consul
3、服务提供者
4、服务消费者
5、三者的异同点
1、Zookeeper服务注册与发现
1.1、注册中心Zookeeper
关闭linux的防火墙:
systemctl stop firewalld systemctl status firewalld
使用docker启动Zookeeper:(docker的操作可以看这篇:Docker基础入门学习笔记)
#拉取Zookeeper镜像 docker pull zookeeper #启动Zookeeper docker run --name zk01 -p 2181:2181 --restart always -d zookeeper
服务节点是临时节点还是持久节点?
zookeeper也是有心跳机制,在一定时间能如果一直没心跳返回,Zookeeper就会把服务节点剔除掉。所以在Zookeeper上的服务节点是临时节点。
1.2、服务提供者
为了区分,中间空个8003。
- 新建工程cloud-provider-payment8004
- pom
org.springframework.cloud
spring-cloud-starter-zookeeper-discovery
3. yml
#端口号
server:
port: 8004
spring:
application:
#服务别名——注册到zookeeper注册中心的名称
name: cloud-provider-payment
cloud:
zookeeper:
connect-string: 10.211.55.17:2181 #linux的ip加暴露的端口号
4. 主启动类
@EnableDiscoveryClient //该注解用于向使用consul或者Zookeeper作为注册中心时注册服务
@SpringBootApplication
public class PaymentMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8004.class, args);
}
}
5. controller
新建controller.PaymentController
@Slf4j
@RestController
public class PaymentController {
@Value("${server.port}") //获取端口号
private String serverPort;
@RequestMapping("/payment/zk")
public String paymentzk(){
return "springcloud with zookeeper:" + serverPort + "t" + UUID.randomUUID().toString();
}
}
6. Zookeeper容器
默认已经帮我们启动了服务端和客户端,如果想进去容器的话,使用下面的命令。
#查看正在运行的容器(查看Zookeeper容器的id) docker ps #进入zookeeper容器 docker exec -it 容器ID /bin/bash #退出容器(或者按快捷键ctrl+P+Q退出) exit #启动容器 docker start 容器ID #关闭容器 docker stop 容器ID
7. 启动8004项目,浏览器输入http://localhost:8004/payment/zk
8. 进入Zookeeper容器(成功注册进注册中心)
json工具 - 在线工具
1.3、服务消费者
- 新建消费者模块cloud-consumerzk-order80。
- pom和yml直接复制8004。(yml中端口号改为80,应用名改为cloud-consumer-order,其他都相同)
- 主启动类。(与8004相同)
- 在springcloud包下新建config.ApplicationContextConfig
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
5. 新建controller.OrderZKController
@RestController
@Slf4j
public class OrderZKController {
public static final String INVOKE_URL = "http://cloud-provider-payment";
@Resource
private RestTemplate restTemplate;
@RequestMapping("/consumer/payment/zk")
public String paymentInfo(){
String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);
return result;
}
}
6. 启动项目
http://localhost/consumer/payment/zk
2、Consul服务注册与发现
Consul官网:https://www.consul.io/
Consul中文文档:https://www.springcloud.cc/spring-cloud-consul.html
2.1、简介
Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。Consul需要一个数据平面,并支持代理和本机集成模型。Consul附带了一个简单的内置代理,因此一切都可以直接使用,还支持Envoy等第三方代理集成。
2.2、主要特点
- 服务发现:Consul的客户端可以注册服务,例如 api或mysql,其他客户端可以使用Consul来发现给定服务的提供者。使用DNS或HTTP,应用程序可以轻松找到它们依赖的服务。
- 健康检测:领事客户端可以提供任意数量的运行状况检查,这些检查可以与给定服务(“ Web服务器是否返回200 OK”)或本地节点(“内存利用率低于90%”)相关。操作员可以使用此信息来监视群集的运行状况,服务发现组件可以使用此信息将流量从不正常的主机发送出去。
- KV存储:应用程序可以将Consul的分层键/值存储用于多种目的,包括动态配置,功能标记,协调,领导者选举等。简单的HTTP API使其易于使用。
- 安全的服务通信:领事可以为服务生成并分发TLS证书,以建立相互TLS连接。 意图 可用于定义允许哪些服务进行通信。可以使用可以实时更改的意图轻松管理服务分段,而不必使用复杂的网络拓扑和静态防火墙规则。
- 多数据中心:Consul开箱即用地支持多个数据中心。这意味着Consul的用户不必担心会构建其他抽象层以扩展到多个区域。
Consul旨在对DevOps社区和应用程序开发人员友好,使其非常适合现代,灵活的基础架构。
2.3、在docker上安装启动consul
#拉取consul镜像
docker pull consul
#启动consul
docker run -d -p 8500:8500/tcp --name myConsul consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
然后在浏览器输入http://http://10.211.55.17/:8500(linux的IP地址加上冒号8500)
3、服务提供者
-
新建服务提供者cloud-provider-consul-payment8006。
-
pom复制8004。(用下面的依赖替换Zookeeper的依赖)
org.springframework.cloud
spring-cloud-starter-consul-discovery
新建服务提供者cloud-provider-consul-payment8006。
pom复制8004。(用下面的依赖替换Zookeeper的依赖)
3. yml
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: 10.211.55.17 #用linux的ip地址(consul在本机就填localhost)
port: 8500
discovery:
service-name: ${spring.application.name}
4. 主启动类(与8004相同)
5. controller
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}") //获取端口号
private String serverPort;
@RequestMapping("/payment/consul")
public String paymentConsul(){
return "springcloud with zookeeper:" + serverPort + "t" + UUID.randomUUID().toString();
}
}
6.启动项目
http://localhost:8006/payment/consul
4、服务消费者
- 新建模块cloud-consumer-consul-order80
- pom(与8006相同)
- yml(端口号为80,应用名为consul-consumer-order,其他和8006相同)
- 主启动类(与8006相同)
- config(和zk的消费者相同)
- controller.OrderConsulController
@RestController
@Slf4j
public class OrderConsulController {
public static final String INVOKE_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@RequestMapping("/consumer/payment/consul")
public String paymentInfo(){
String result = restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
return result;
}
}
7. 启动项目
http://localhost/consumer/payment/consul
5、三者的异同点
CAP:(只能二选一)
A:可用性
C:一致性
P:分区容错性(微服务架构必须保证有P)



