xmtrock
发布于 2021-07-15 / 272 阅读
0

Eureka -> Consul

启动命令: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}

20210715190515560
通过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协议中(多结点数据赋值)
20210715191432206
Raft协议:保证server集群的数据一致。

Raft协议是怎样把单节点数据传送给多结点的server中?
Leader:是server集群中唯一处理可以端请求的
Follower:选民,被动接受数据。
候选人:可以被选举为Leader。

1、候选人准备选举为leader,给follower发送数据请求
2、follower同意则该候选人成为leader。
3、客户端结点发数据给集群中的leader,leader询问follower,follower反馈给leader是否存在同样的数据。不存在则发给follower并反馈。
4、数据都有了,leader再反馈给客户端,才算完成。

20210715193339813