【Spring Cloud】微服务工程中的服务注册与发现配置中心-Consul

本文主要是介绍【Spring Cloud】微服务工程中的服务注册与发现配置中心-Consul,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Catalog

  • Spring Cloud Consul
    • 一、需求
    • 二、是什么
    • 三、优点
    • 四、缺点
    • 五、怎么用
    • 六、细节

Spring Cloud Consul

一、需求

多个微服务之间通过RestTemplate中的api相互调用,一般要写死微服务的IP地址和端口号,相当于硬编码,非常不灵活,而且对于某中微服务可能会做负载均衡,这样通过编码的方式写IP地址和端口号,对于一个微服务需要去调用另外一个微服务的时候就非常繁琐和麻烦,Consul就帮我们解决了这个问题,项目中的每一个微服务都在Consul进行注册(入驻),微服务之间调用的时候,就通过Consul来需要需要调用的微服务。

除此之外,当一个项目是由多个微服务组成的时候,往往会存在很多通用的配置,比如多个微服务可能使用的都是同一个数据库的IP地址和端口号,如果在每一个微服务都单独配置这些通用的配置,当数据库的IP或者端口改变的时候,就需要去到每一个微服务单独修改配置文件,当微服务的数量非常多的时候,修改这些配置文件就非常耗时,且意义不大,本着有问题就加一层的原则,我们可以将这些通用的配置信息抽取出来统一管理(全局配置信息),当全局配置信息发生改变的时候,就通知到每一个微服务进行修改,而Consul就可以帮我们做这件事情。

二、是什么

Consul属于第三方软件(类似tomcat),是独立于微服务项目之外的(较于Eureka的优势所在之一),可以为我们提供服务注册与发现、代理配置中心等等功能,满足CP(CAP理论),即保证数据一致性和分区容错性,但不保证高可用。(Consul官网、Spring官网)

tips:CAP理论

CAP理论,即下面三个词组的首字母Consistency、 Availability 、 Partition tolerance, 任何分布式系统理论上只能满足其中任意两个特性。

  • C:代表数据的强一致性,其实也就是多个节点之间同步数据的时候,如果某个节点同步数据失败,会直接拒绝后续的请求;
  • A:代表高可用性,是相对于用户来说,也就是这个分布式系统什么时候都能做出非错误响应(数据可能是过期的);
  • P:代表分区容错性,在分布式系统中,有多个节点,比如有三个节点A、B、C,A和B之间出现网络故障无法通信,但A和C、B和C仍然可以通信,相当于形成了两个分区,只有分区内的节点能够相互通信,这就是网络分区故障,而分区容忍性代表着系统即使发生网络分区,也可以继续运行。

三、优点

  1. 实现了和多微服务项目的解耦(早期的Eureka是耦合在项目中的);
  2. 阳哥笔记:
    Alt

四、缺点

  1. 需要额外维护第三方服务器(Consul服务器)

五、怎么用

下载Consul服务

  1. 官网下载
    Alt

  2. 安装好后,点击Exe文件,可能会一闪而过,但不影响使用
    Alt

  3. 在D:\Final-plan\SpringCloud\dev-soft\consul_1.17.1_windows_386目录下(输入cmd,进入命令提示符界面),输入"consul agent -dev"以开发模式启动:
    Alt

微服务的注册与发现

  1. 导入Maven坐标;

    		<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency>
    
  2. 修改微服务配置文件,主要配置微服务在Consul的名字,然后启动项目;

    spring:application:name: cloud-payment-service# 配置spring cloud consul for discovery servicecloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}
    
  3. 打开Consul的图形化界面(本机),查看是否有该微服务;

    Alt

  4. 基于Consul,通过RestTemplate实现微服务之间的调用,将原来被调用的微服务的IP地址和端口一并删掉,换成在Consul中配置的名字;

      //public static final String PaymentSrv_URL = "http://localhost:8001/pay";public static final String PaymentSrv_URL = "http://cloud-payment-service"; //IP地址和端口号修改为在Consul配置的名字,这里是在微服务中的调用方配置的需要调用的微服务地址
    

微服务从Consul拉取配置信息

  1. 导入Maven坐标;

     <!--SpringCloud consul config--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>
    
  2. 建立bootstrap.yml文件(resource目录下),该文件是比application.yml优先级更高的配置文件,会在项目初始化化的时候拉去外部源(这里指的是在Consul中的配置信息)的配置信息;

    spring:application:name: cloud-payment-service####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-' # default value is ",",we update '-',这里配置的是Consul的文件夹命名的分隔符,主要是要识别最后一个分隔符后面的单词作为环境标识符format: YAML # 规定Spring Cloud程序用什么解析器解析从consul拉取过来的数据watch:wait-time: 1 # 当Consul配置信息发生改变的时候,通知微服务来拉取# config/cloud-payment-service/data
    #       /cloud-payment-service-dev/data
    #       /cloud-payment-service-prod/data
    
  3. 在Consul中配置全局配置中心的信息,注意要创建文件夹输入的名字的结尾要加’/', 第一个目录需要指定为config,最后的数据的名字需要指定为data
    Alt

    Alt

    Alt

    Alt

  4. 在application.yml文件中配置使用哪个环境的配置文件(对应到在Consul配置的配置信息文件夹中,最后一个分隔符的名字);
    Alt

    spring:profiles:active: dev# 多环境配置加载内容dev/prod,不写就是默认default配置
    
  5. 测试从Consul拉取配置信息是否成功,在Controller层测试;

     @Value("${server.port}")private String port;@GetMapping("/get/info")public String getInfoByConsul(@Value("${test.info}") String info){return "test.info: " + info + " " + port;}
    

    Alt

六、细节

  1. 重启Consul服务器之后,上面设置的全局配置中心就全部清空了,后续需要对这些配置做持久化。

这篇关于【Spring Cloud】微服务工程中的服务注册与发现配置中心-Consul的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005040

相关文章

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Java实现MD5加密的四种方式

《Java实现MD5加密的四种方式》MD5是一种广泛使用的哈希算法,其输出结果是一个128位的二进制数,通常以32位十六进制数的形式表示,MD5的底层实现涉及多个复杂的步骤和算法,本文给大家介绍了Ja... 目录MD5介绍Java 中实现 MD5 加密方式方法一:使用 MessageDigest方法二:使用

Nginx配置location+rewrite实现隐性域名配置

《Nginx配置location+rewrite实现隐性域名配置》本文主要介绍了Nginx配置location+rewrite实现隐性域名配置,包括基于根目录、条件和反向代理+rewrite配置的隐性... 目录1、配置基于根目录的隐性域名(就是nginx反向代理)2、配置基于条件的隐性域名2.1、基于条件

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.