springcloud-2.0(7.服务注册发现-consul)(代码片段)

ABin-阿斌 ABin-阿斌     2023-03-09     442

关键词:

上一篇 :6. 服务注册发现 - ZooKeeper

下一篇 :8. 负载均衡 - Ribbon

文章目录

1. 简介

1.1 什么是 Consul

  • Consul 官网 :https://www.consul.io/intro/index.html

  • Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发

  • 提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位发服务网络,总之 Consul 提供了一种完整的服务网格解决方案。

1.2 作用

  1. 服务发现

    提供HTTP和DNS两种发现方式

  2. 健康检测

    支持多种协议,HTTP、TCP、Docker、Shell脚本定制化

  3. Key-Value 存储

    key , Value的存储方式

  4. 多数据中心

    Consul支持多数据中心

  5. 可视化 Web 界面

1.3 下载地址

1.4 中文文档

1.5 启动 Consul

  1. 进入 CMD

  2. 进到 Consul 的目录

  3. 运行 Consul

    consul agent -dev
    
    

  4. 访问 localhost:8500

2. 服务提供者 Provider

  1. 新建模块 :cloud-provider-payment-consul-8006

  2. 修改 POM

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.demo.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>$project.version</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
  3. 编写 YML

    server:
      port: 8006
    
    spring:
      application:
        name: consul-provider-payment
      # Consul 注册中心地址
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery:
            service-name: $spring.application.name
    
    
  4. 编写主启动类

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ConsulMain8006 
        public static void main(String[] args) 
            SpringApplication.run(ConsulMain8006.class, args);
        
    
    
    
  5. 业务类

  • Controller

    @RestController
    @Slf4j
    public class PaymentController 
    
        @Value("$server.port")
        private String serverPort;
    
        @GetMapping(value = "/payment/consul")
        public String paymentConsul()
            return "springcloud with consul: "+serverPort+"\\t"+ UUID.randomUUID().toString();
        
    
    
    
  1. 启动测试

    访问 http://localhost:8006/payment/consul

3. 服务消费者 Consumer

  1. 新建模块 :cloud-consumer-order-Consul-80

  2. 修改 POM

     <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-consul-discovery -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.demo.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>$project.version</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
  3. 编写 YML

    server:
      port: 80
    
    spring:
      application:
        name: consul-consumer-order
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery:
            service-name: $spring.application.name
    
    
  4. 编写主启动类

    @SpringBootApplication
    @EnableDiscoveryClient
    public class OrderConsulMain80 
        public static void main(String[] args) 
            SpringApplication.run(OrderConsulMain80.class, args);
        
    
    
    
  5. 业务类

  • 配置 RestTemplate Bean

    @Configuration
    public class ApplicationContextConfig 
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate()
            return new RestTemplate();
        
    
    
    
  • Controller

    @Slf4j
    @RestController
    public class OrderConroller 
        public static final String INVOME_URL = "http://consul-provider-payment";
    
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping("/consumer/payment/consul")
        public String payment ()
            String result = restTemplate.getForObject(INVOME_URL+"/payment/consul",String.class);
            return result;
        
    
    
    
  1. 启动测试

    访问 http://localhost/consumer/payment/consul

4. 三个注册中心异同点

  • 对比的是 Eureka、Zookeeper、Consul

4.1 背景

  • NoSQL 的 CAP 原则

C:Consistency(强一致性)
A:Availability(可用性)
P:Partition tolerance(分区容错)

  • 分布式系统中,以上三个原则最多只能满足其中的两个。
  • 因为是分布式系统,分区容错性 P 是一定要满足的,所以就在 A、C 中取舍

4.2 对比

  • Eureka 选择的是 AP(可用性、分区容错性)
  • Eureka选择了保证可用性,Eureka 的各个节点都是平等的,某些节点挂掉不会对正常工作产生很大的影响,剩余的节点依旧可以提供注册和查询服务。在客户端向注册中心注册服务时发现连接失败,会自动切换其他节点,只要还有一台注册中心在,就能保证服务的可用性,只不过查询到的信息可能不是最新的
  • Eureka 还有一种自我保护机制:如果在 15分钟 内超过 85% 的节点都没有正常的心跳,就认为客户端与注册中心出现了网络故障,此时会出现以下情况:
    1. Eureka 不再从注册列表中移除因为长时间没收到心跳而过期的服务
    2. Eureka 仍然能够接收新服务的注册和查询请求,但是不会被同步到其他节点上,即保证当前节点依然可用
    3. 当网络稳定时,当前实例新的注册信息会被同步到其他节点中
  • Zookeeper / Consul 选择的是 CP(强一致性、分区容错性)
  • 当注册中心查询服务列表时,可以容忍注册中心返回的是几分钟以前的注册信息,但不能接收服务直接挂掉。
  • 当主节点(master)因为某些原因与其他节点失去连接时,剩余节点会重新进行领导者(leader)的选举。问题在于选举的时间太长——30s~120s,且选举期间整个ZookKeeper 集群不可用,就导致了服务的瘫痪。在云部署的环境下,因为网络是的ZK集群失去master是较大概率的事情,也就会导致服务短暂瘫痪是较大概率的,是不可取的。

4.2 图表

springcloud-2.0:(10.服务降级-hystrix-引出问题)

上一篇:9.负载均衡-OpenFeign下一篇:11.服务降级-Hystrix-解决问题声明:原作者:csdn:yuan_404文章目录1.概述1.1雪崩效应1.2.什么是Hystrix1.3.Hystrix的作用2.Hystrix重要概念2.1服务降级2.2服务熔断2.3服务限流3.Hystrix环境搭建... 查看详情

springcloud-2.0:(11.服务降级-hystrix-解决问题)

上一篇:10.服务降级-Hystrix-引出问题下一篇:12.服务网关-Gateway声明:原文作者:csdn:yuan_404文章目录1.上一篇的问题与解决办法1.1问题1.2解决2.1配置Provider提供端2.2配置Consumer消费端2.3解决办法-代码膨胀2.4解... 查看详情

springcloud-2.0-周阳:(12.服务网关-gateway)

...服务降级-Hystrix-解决问题下一篇:13.分布式配置中心-SpringCloudConfig文章目录1.概述1.1是什么1.2能干嘛1.3有Zuul了为什么还需要Gateway2.三大核心概念3.Gateway工作流程4.环境搭建4.1路由网关配置方式一:YML4.2路由网关配置方式二... 查看详情

springcloud学习笔记总结(代码片段)

文章目录1.SpringCloudAlibaba简介2.SpringCloudAlibaba之Nacos介绍和安装3.Nacos服务注册与发现之服务提供者注册4.Nacos服务注册与发现之服务消费者注册和负载5.Nacos服务注册与发现之服务注册中心对比提升6.Nacos作为服务配置中心7.Nacos服务... 查看详情

dockerconsul的容器服务更新和服务发现(代码片段)

服务更新和服务发现一、consul服务更新和服务发现1.1什么是服务注册与发现1.2什么是consul二、consul部署1.建立consul服务2.设置代理,后台启动consul服务器3.查看集群信息4.容器服务自动加入Nginx集群5.安装Nginx、httpd测试镜像6.在c... 查看详情

小白也能看懂的dubbo3应用级服务发现详解

...umer)、注册中心(registry)提供者启动时向注册中心注册服务地址,消费者启动时订阅服务,并通过获取到的提供者地址发起调用,当提供者地址变更时,通过注册中心向消费者推送变更。这就是dubbo主要的工作流程。在2.7.5之... 查看详情

有赞服务注册与发现架构演进

有赞服务注册与发现架构演进一、概述二、接口级服务注册与发现2.1架构2.2问题三、接口级服务注册与应用级服务发现3.1架构3.2应用级服务发现解析3.3优化3.3.1服务发现延迟聚合推送3.3.2服务发现预加载3.3.3客户端接口与应用映射... 查看详情

微服务注册与发现——eureka

微服务  在微服务系统中,服务的注册和发现是第一步,常用的有:    Eureka:https://github.com/Netflix/eureka    Zookeeper:https://zookeeper.apache.org/    Consul:https://www.consul.io/  等服务注册与发现中间件,本文以Eureka... 查看详情

springcloudeureka服务注册与发现

1EurekaServer提供服务注册和发现2ServiceProvider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到3ServiceConsumer服务消费方从Eureka获取注册服务列表,从而能够消费服务介绍我们的服务发现一般分为两种模式一种为客户端... 查看详情

有赞服务注册与发现架构演进(代码片段)

有赞服务注册与发现架构演进一、概述二、接口级服务注册与发现2.1架构2.2问题三、接口级服务注册与应用级服务发现3.1架构3.2应用级服务发现解析3.3优化3.3.1服务发现延迟聚合推送3.3.2服务发现预加载3.3.3客户端接口与应用映射... 查看详情

springcloudalibaba实战之nacos服务注册和发现

...务实例的自动化注册与发现,是微服务治理的核心,学习SpringCloudAlibaba,首先要了解框架中的服务注册和发现组件——Nacos。一、SpringCloud服务注册和发现组件1.SpringCloudEureka闭源风波在SpringCloud的子项目中,SpringCloudNetflix提... 查看详情

springcloud服务注册和发现

微服务架构中,服务发现组件是一个非常关键的组件,服务消费者、服务提供者、服务发现组件的关系大致如下:各个微服务启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息服务消费者可... 查看详情

服务注册与发现-consul

 服务注册与发现-Consul  参考资料Consul服务发现安装(单机)Consul的介绍、安装与使用Consul初探-从安装到运行 查看详情

springcloudeureka-服务注册与发现

SpringCloudEurekaSpringCloud是目前用于开发微服务的主流框架之一,我们都知道在微服务架构中最为基础、核心的模块,就是服务注册与发现。在SpringCloud里我们可以使用它的Eureka模块来实现服务注册与发现,SpringCloudEureka是基于Netflix... 查看详情

微服务服务注册中心注册和发现

】微服务服务注册中心注册和发现【英文标题】:Microservicesserviceregistryregistrationanddiscovery【发布时间】:2015-09-0819:58:40【问题描述】:小域介绍我实际上有两个微服务:用户-管理用户的CRUD帐单-管理帐单上的CRUD,并带有与帐单... 查看详情

使用nacos作为分布式注册中心,实现服务注册与发现

...置中心的集合体。这篇博文我们介绍Nacos的第一个特性,服务的注册与发现,也就是分布式注册中心的核心功能。什么是服务注册与发现服务注册与发现是来自于微服务架构的产物。在传统的架构系统中,服务的数量较少,一般... 查看详情

微服务注册与发现(代码片段)

目录简介实现服务注册组件设计服务注册表数据结构搭建应用程序框架定义服务注册表接口使用ZooKeeper实现服务注册服务注册模式实现服务发现组件搭建应用程序框架实现服务发现服务发现优化方案服务发现模式参考简介先来回... 查看详情

6.go语言高并发与微服务实战---服务注册与发现

第6章服务注册与发现6.1服务注册与发现的基本原理 6.1.1服务注册与发现中心的职责 6.1.2服务实例注册服务信息 6.1.3CAP原理6.2常用的服务注册与发现框架 6.2.1基于Raft算法的开箱即用服务发现组件Consul 6.2.2基于HTTP协议的分布式key/Va... 查看详情