SpringCloud——consul

SpringCloud——consul

  • 一、consul安装与运行
  • 二、consul 实现服务注册与发现
    • 1.引入
    • 2.服务注册
    • 3.服务发现
  • 三、consul 分布式配置
    • 1.基础配置
    • 2.动态刷新
    • 3.配置持久化
  • 四、参考

  • Eureka已经停止更新了,consul是独立且和微服务功能解耦的注册中心,而不是单独作为一个独立微服务嵌入到系统中。

一、consul安装与运行

  • 下载路径,下载完成后只有一个consul.exe文件,在对应路径下输入cmd进入终端,输入命令consul --version,如果能够正常的显示出版本信息,说明consul下载的版本正确并且安装完成。
  • 输入命令consul agent -dev,使用开发模式启动consul
    在这里插入图片描述
  • 通过地址http://localhost:8500访问到onsul的首页。
    在这里插入图片描述

二、consul 实现服务注册与发现

1.引入

  • 通过下面的方式将一个微服务的IP地址和端口号硬编码另一个微服务中(例如订单微服务调用支付微服务),会存在这许多的问题:
    /*** 这里采用的是硬编码的地址,可扩展性低下*/
    public static final String PAYMENT_SERVICE_URL = "http://localhost:8001";
    
    • ① 如果订单微服务和支付微服务的IP地址或者端口号发生了变化,则支付微服务将变得不可用,需要同步修改订单微服务中调用支付微服务的IP地址或端口。
    • ② 如果系统中提供了多个订单微服务和支付微服务,则无法实现微服务的负载均衡
    • ③ 如果系统需要支持高并发,需要部署更多的订单微服务和支付微服务,硬编码订单服务则后续的维护会变得异常复杂。
  • 所以,在微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。

2.服务注册

  • 第一步,修改pom.xml文件添加相关的依赖:

    <!--引入consul-discovery-->
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>	
    
    • 控制台出现如下信息:Standard Commons Logging discovery in action with spring-jcl: please remove commons-logging.jar from classpath in order to avoid potential conflicts。这个信息对代码没有任何的影响,但是如果你有强迫症可以使用下面的方式解决掉:
      <!--引入consul-discovery-->
      <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>	
      
  • 第二步,在application.yml文件中添加相关的配置项:

    spring:application:# 设置服务名称name: cloud-payment-servicecloud:# 配置consulconsul:# consul所在的IP地址host: localhost# consul所在的端口号port: 8500discovery:# 服务以什么名字注册到 consul 中service-name: ${spring.application.name}# 开启心跳模式,如果不开启服务注册后一直是红×heartbeat:enabled: true
    
  • 第三步,启动微服务,并且访问http://localhost:8500查看服务是否注册成功:
    在这里插入图片描述

3.服务发现

  • 这个时候所有的微服务都注册到了consul注册中心中了,我们可以将上面的硬编码的代码修改为下面的代码了:
    //注意这里的 cloud-payment-service 必须和上面你注册到 consul 中微服务名字保存一直。
    public static final String PAYMENT_SERVICE_URL = "http://cloud-payment-service";
    
  • 注意,consul默认就是支持负载均衡的,所以如果你不做负载均衡的话会报错
  • 在你的RestTemplateConfig配置类中添加,@LoadBalanced注解:
    @Configuration
    public class RestTemplateConfig {/*** 使用 @LoadBalanced 注解赋予 RestTemplate 负载均衡的能力* 默认使用的轮询负载均衡策略*/@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
    }
    
  • 通过上面的两步,也就可以实现微服务之间的通信了。

三、consul 分布式配置

1.基础配置

  • 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。比如某些配置文件中的内容大部分都是相同的,只有个别的配置项不同。就拿数据库配置来说吧,如果每个微服务使用的技术栈都相同,则每个微服务中关于数据库的配置几乎都是相同的,有时候主机迁移了,我希望一次修改,处处生效。
  • consul提供了通用全局配置信息的功能,直接注册进consul服务器,从consul获取。
  • 第一步,修改pom.xml文件添加相关的依赖:
    <!--引入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>
    
  • 第二步,新增配置文件bootstrap.yml,将application.yml文件中的通用的配置信息放到文件中:
    • applicaiton.yml是用户级的资源配置项
    • bootstrap.yml是系统级的,优先级更加高
    • Spring Cloud会创建一个"Bootstrap Context",作为Spring应用的Application Context的父上下文。初始化的时候,Bootstrap Context负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的Environment
    • Bootstrap属性有高优先级,默认情况下,它们不会被本地配置覆盖。 Bootstrap contextApplication Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证Bootstrap ContextApplication Context配置的分离。
    • application.yml文件改为bootstrap.yml这是很关键的或者两者共存
    • 因为bootstrap.yml是比application.yml先加载的。bootstrap.yml优先级高于application.yml
      • bootstrap.yml
      spring:application:# 设置服务名称name: cloud-payment-servicecloud:# 配置consulconsul:# consul 所在的IP地址host: localhost# consul 所在的端口号port: 8500discovery:# 服务以什么名字注册到 consul 中service-name: ${spring.application.name}# 开启心跳模式,如果不开启服务注册后一直是红×heartbeat:enabled: true# 分布式配置config:# default value is ",",we update '-'profile-separator: '-'# setting config document style;format: yaml
      
  • 第三步,consul服务器key/value配置填写:
    • consul上创建全局配置文件,需要按照固定的规则创建
      在这里插入图片描述
      • 这里的cloud-payment-service是你注册的服务名字,后面的-dev、-prod是在表示在不同的环境中使用不同的配置,需要在application.yml文件中配置spring.profiles.active: 环境名dev、prod
        在这里插入图片描述
        在这里插入图片描述
  • 第四步,编写测试代码测试:
    @GetMapping(value = "/pay/get/info")
    private String getInfoByConsul(@Value("${gdb.info}") String info) {return "consul info: " + info + ",port: " + port;
    }
    
    在这里插入图片描述

2.动态刷新

  • 在上面我们完成了consul的全局配置,但是如果我们现在修改配置信息,后续访问配置信息没有生效。
    在这里插入图片描述
  • 第一步:在配置类上添加注解@RefreshScope,启用consul的动态刷新:
    @SpringBootApplication
    @MapperScan("com.gdb.cloud.mapper")
    @RefreshScope //启动 consul 全局配置的动态刷新功能
    public class Main8001 {public static void main(String[] args) {SpringApplication.run(Main8001.class, args);}
    }
    

3.配置持久化

  • 上面我们配置了key/value值,但是我们启动的方式是开发模式dev,每次我们重新启动consul的时候,数据就会消失,我们可以通过服务模式server启动,这样我们就可以保存配置了。

    consul agent -server -ui -bootstrap-expect 1 -data-dir 自己本地保存的数据地址 -node=n1 -bind=127.0.0.1


四、参考

[1]. 使用 consul 实现服务注册与发现
[2]. Consul注册中心注册的服务总是红叉 (All service checks failing)
[3]. Consul心跳机制
[4]. consul入门案例及配置热更新的实现及Feign的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/671500.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成结构—高速缓冲存储器(Cache)

目录 一、Cache的基本工作原理 1.Cache工作原理 2.命中率 3.Cache的基本结构 4.Cache的改进 二、Cache和主存之间的映射方式 1.直接映射 2.全相联映射 3.组相联映射 三、Cache中主存块的替换算法 四、Cache的写策略 概为了解决 CPU 和主存之间速度不匹配的问题&#x…

复写零(双指针)

下面的解法需要手动画图&#xff0c;举例去体会&#xff0c;只有自己手动去做了&#xff0c;才会有所收获。 class Solution {public void duplicateZeros(int[] arr) {int n arr.length;//先找到最后一个元素的位置;//至于为什么要直接先设dest 为-1&#xff0c;这是经过研究…

Celery(分布式任务队列)入门学习笔记

Celery 的简单介绍 用 Celery 官方的介绍&#xff1a;它是一个分布式任务队列; 简单&#xff0c;灵活&#xff0c;可靠的处理大量消息的分布式系统; 它专注于实时处理&#xff0c;并支持任务调度。 Celery 如果使用 RabbitMQ 作为消息系统的话&#xff0c;整个应用体系就是下…

代码本地化

目的 代码本地化&#xff08;Localization&#xff09;是指将软件应用程序中的文本、图形、声音和其他内容翻译成特定语言的过程&#xff0c;同时确保这些内容在目标文化中适当地呈现。本地化不仅仅是对文本进行翻译&#xff0c;还包括对日期、时间、数字、货币、排序顺序、文本…

​《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制德国每日风能和太阳能产量3D线图

在MATLAB中&#xff0c;要绘制3D线图&#xff0c;可以使用 plot3 函数。 在《MATLAB科研绘图与学术图表绘制从入门到精通》书中通过绘制德国每日风能和太阳能产量3D线图解释了如何在MATLAB中绘制3D线图。 购书地址&#xff1a;https://item.jd.com/14102657.html

自动驾驶融合定位系列教程四:惯性导航解算

自动驾驶融合定位系列教程四&#xff1a;惯性导航解算 一、概述 惯性导航的解算是一个实现起来非常简单&#xff0c;但是理解起来要费一番功夫的东西&#xff0c;所谓“实现”就是把公式变成代码&#xff0c;所谓“理解”&#xff0c;就是要弄明白几个公式是怎么推导出来的。…

滑动窗口 | 1652. 拆炸弹 |LeetCode

文章目录 题目介绍暴力(可以过力扣竟然。不愧是简单题)&#xff1a;滑动窗口 祝你天天开心 题目介绍 你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每…

【数据结构】C++语言实现栈(详细解读)

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

multipass和multipassd命令的区别

multipassd通常是multipass服务的后台守护进程&#xff0c;它负责管理和控制虚拟机实例。 命令区别 例&#xff1a; multipass restart my-vm 这个命令用于重启Multipass中的虚拟机实例。例如有一个名为my-vm的虚拟机实例。 multipassd restart 这会重新启动Multipass后台…

达梦主从数据库实例恢复

测试环境&#xff1a;实时主备数据库 1、在节点1向测试表aaa插入数据 如图可见&#xff0c;会话139695153554808向aaa表插入了10000行数据。事务id460520。 2、提交前在另一个窗口kill掉dmserver进程。 3、查看节点2的数据库日志 上图可见&#xff0c;系统执行alter database…

Android虚拟机机制

目录 一、Android 虚拟机 dalvik/art&#xff08;6版本后&#xff09;二、Android dex、odex、oat、vdex、art区别 一、Android 虚拟机 dalvik/art&#xff08;6版本后&#xff09; 每个应用都在其自己的进程中运行&#xff0c;都有自己的虚拟机实例。ART通过执行DEX文件可在设…

4.任务创建和删除的API函数

一、简介 二、动态创建任务函数:xTaskCreate() 此函数用于使用动态的方式创建任务&#xff0c;任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由 FreeRTOS 从 FreeRTOS 管理的堆中分配&#xff0c;若使用此函数&#xff0c;需要在 FreeRTOSConfig.h 文件 中将宏 c…