SpringCloud——consul

embedded/2024/10/18 14:16:01/

SpringCloud——consul

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

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

consul_3">一、consul安装与运行

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

consul__10">二、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:# 服务以什么名字注册到 consulservice-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__93">三、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:# 服务以什么名字注册到 consulservice-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.ppmy.cn/embedded/26452.html

相关文章

python序列化、反序列化函数的参数,用于问题复现

python序列化、反序列化函数的参数,用于问题复现 一.代码二.输出 一.背景 1.想dump出pytorch模型所调用基础算子的参数 2.对于Tensor,ndarray。只保存type,shape,不存值 3.之后可通过以上保存的信息,生成算子的参数,运行单算子 二.目前支持以下类型及嵌套 Tensor,ndarray,int,f…

【分享】如何将word格式文档转化为PDF格式

在日常的办公和学习中&#xff0c;我们经常需要将Word文档转换为PDF格式。PDF作为一种通用的文件格式&#xff0c;具有跨平台、易读性高等优点&#xff0c;因此在许多场合下都更为适用。那么&#xff0c;如何实现Word转PDF呢&#xff1f;本文将介绍几种常用的方法&#xff0c;帮…

Ubuntu Linux完全入门视频教程

Ubuntu Linux完全入门视频教程 UbuntuLinux完全入门视频教程1.rar UbuntuLinux亮全入门视频教程10.ra UbuntuLinux亮全入门视频教程11.ra UbuntuLinux完全入门视频教程12.ra UbuntuLinux亮全入门视频教程13.ra UbuntuLinux完全入门视频教程14.rar UbuntuLinux完全入门视频教程…

04 Docker练习赛从0开始到 docker 镜像提交

1.1 本地安装 docker 工具 这里以ubutun下安装docker为例,其他操作系统安装命令略有不同,可自行百度。(建议使用阿里源安装速度快) sudo apt install docker.io如果你本地有gpu,请继续执行如下命令以支持gpu调用: 注意: 英伟达对 docker 支持的 linux 发行版:https:/…

测试工程师面试准备(软硬件)

您好&#xff0c;我叫XXX。学历XX&#xff0c;XXX专业毕业。X年X月份毕业&#xff0c;但是去年二月份已经找到工作开始实习了&#xff0c;目前工作一年了&#xff0c;这一年的过程中我主要负责软件的开发和测试和软硬件联调测试工作。具体来说就是&#xff0c;在软件开发完成后…

nacos(docker部署)+springboot集成

文章目录 说明零nacos容器部署初始化配置高级配置部分访问权限控制命名空间设置新建配置文件 springboot配置nacos添加依赖编写测试controller 说明 nacos容器部署采用1Panel运维面板&#xff0c;进行部署操作&#xff0c;简化操作注意提前安装好1Panel和配置完成docker镜像加…

为什么 Facebook 不使用 Git?

在编程的世界里&#xff0c;Git 就像水一样常见&#xff0c;以至于我们认为它是创建和管理代码更改的唯一可行的工具。 前 Facebook 员工&#xff0c;2024 年 首先&#xff0c;我为什么关心&#xff1f; 我致力于构建 Graphite&#xff0c;它从根本上受到 Facebook 内部工具的…

头歌:Spark Streaming

第1关&#xff1a;套接字流实现黑名单过滤 简介 套接字流是通过监听Socket端口接收的数据&#xff0c;相当于Socket之间的通信&#xff0c;任何用户在用Socket&#xff08;套接字&#xff09;通信之前&#xff0c;首先要先申请一个Socket号&#xff0c;Socket号相当于该用户…