启动命令:consul agent -dev -client=0.0.0.0 (以开发者模式快速启动)
访问localhost:8500可以看web界面控制台
整合微服务:
<!--springcloud 提供的对基于consul的服务发现-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--actuator的健康检查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
yml配置
server:
port: 9001 #端口
spring:
application:
name: service-product #服务名称
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
jpa:
database: MySQL
show-sql: true
open-in-view: true
###开始配置consul的服务注册
cloud:
consul:
host: localhost #consul服务器的主机地址
port: 8500 #consul服务器的ip地址
discovery:
#是否需要注册
register: true
#注册的实例ID (唯一标志)
instance-id: ${spring.application.name}-1
#服务的名称
service-name: ${spring.application.name}
#服务的请求端口
port: ${server.port}
#指定开启ip地址注册
prefer-ip-address: true
#当前服务的请求ip
ip-address: ${spring.cloud.client.ip-address}

通过order调用product
/**
* springcloud对consul进行了进一步的处理,向其中集成了ribbon的支持
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
Product product = restTemplate.getForObject("http://service-product/product/1", Product.class);
return product;
}
}
集群高可用:
Gossip流言协议:所有的consul都会参与到gossip协议中(多结点数据赋值)

Raft协议:保证server集群的数据一致。
Raft协议是怎样把单节点数据传送给多结点的server中?
Leader:是server集群中唯一处理可以端请求的
Follower:选民,被动接受数据。
候选人:可以被选举为Leader。
1、候选人准备选举为leader,给follower发送数据请求
2、follower同意则该候选人成为leader。
3、客户端结点发数据给集群中的leader,leader询问follower,follower反馈给leader是否存在同样的数据。不存在则发给follower并反馈。
4、数据都有了,leader再反馈给客户端,才算完成。
