SpringBoot + Spring Cloud Consul 服务注册和发现详细解析

什么是Consul

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。使用起来也较为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。

Consul安装

官网(consul.io)最新版本1.8.0 提供了MacOS,Windows, Linux, 如果你不知道怎么安装,官方还提供了视频。

我这里使用docker安装,安装过程总结起来为三句话:

docker search consul
docker pull consul
docker run --name consul -d -p 8600:8500 consul

没问题的话,本机访问http://localhost:8600则可以打开consul自带的管理系统,默认情况下没有服务注册进来

  • 准备工作新建父工程, 主要约定SpringCloud, SpringBoot版本号,我使用的是Hoxton.SR1, SpringBoot2.2
  • 新建3个子Module,这里两个service,一个consumer, 两个service我用8001和8002端口来区分,主要是想在服务消费时反应客户端负载均衡。

项目结构如下图

父工程pom.xml

<dependencyManagement>
 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-dependencies</artifactId>
 <version>2.2.2.RELEASE</version>
 <type>pom</type>
 <scope>import</scope>
 </dependency>
 <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-dependencies</artifactId>
 <version>Hoxton.SR1</version>
 <type>pom</type>
 <scope>import</scope>
 </dependency>
 </dependencies>
 </dependencyManagement>

服务提供者

服务注册中心有了,那么我们来开发两个服务提供者,这里新建了两个Module,端口8001和8002。两个Module代码相同,主要为了演示负载使用。

新建Module,添加spring-cloud-starter-consul-disconvery依赖

pom.xml

 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-consul-discovery</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 </dependency>
 </dependencies>

添加配置(application.yml)

server:
 port: 8001
spring:
 application:
 name: consul-student-service
 cloud:
 consul:
 port: 8600
 host: 127.0.0.1
 discovery:
 service-name: ${spring.application.name}

修改启动类,添加服务

这里我直接写了一个测试接口放在启动类里。这里我只贴了端口8001的代码,8002代码结构相同,只是端口不同。

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulStudentService8001 {

 public static void main(String[] args) {
 SpringApplication.run(ConsulStudentService8001.class,args);
 }

 @GetMapping("/student/version")
 public String version(){
 return "8001,202007222300";
 }
}

OK,到这一步,启动两个服务,不出异常的情况下,可在注册中心查看当前的服务实例。



Consul消费者

服务注册中心有了,服务提供者也有了,我们再来开发一个服务消费者。

新建Module,同样添加spring-cloud-starter-consul-disconvery依赖

pom.xml

<dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-consul-discovery</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 </dependency>
 </dependencies>

添加配置(application.yml)

server:
 port: 8080

spring:
 application:
 name: consul-student-consumer
 cloud:
 consul:
 host: 127.0.0.1
 port: 8600
 discovery:
 service-name: ${spring.application.name}
 # 不需要注册到consul中
 register: false

修改启动类,调用服务

开发RestTemplate配置类,调用REST接口时使用。

@Configuration
public class ApplicationContextConfig {

 @Bean
 @LoadBalanced
 public RestTemplate restTemplate(){
 return new RestTemplate();
 }
}

修改启动类

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulStudentConsumer {

 public static void main(String[] args) {
 SpringApplication.run(ConsulStudentConsumer.class,args);
 }

 @Autowired
 RestTemplate restTemplate;

 @GetMapping("/consul/student/version")
 public String version(){
 //这里使用服务实例名调用REST接口
 return restTemplate.getForObject("http://consul-student-service/student/version",String.class);
 }
}

OK, 这一步完成之后,可以启动消费者接口,刷新几次,从返回结果上能看出来是轮训调用服务提供者接口实例。

到此这篇关于SpringBoot + Spring Cloud Consul 服务注册和发现详细解析的文章就介绍到这了,更多相关SpringBoot Spring Cloud Consul 服务注册内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-07-22

spring cloud consul注册的服务报错critical的解决

测试spring cloud 使用consul注册服务的时候,出现critical,如下: 怎么解决这个问题,现在只能看到health check检查失败了. 受限调用这个请求Get http://consulIp:8500/v1/agent/checks,调完请求,就会拿到返回数据: { ...... "service:test-service-xx-xx-xx-xx": { "Node": "zookeeper-server1", "

详解Spring Cloud Consul 实现服务注册和发现

Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式.通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. Spring Cloud 包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Sprin

详解使用Spring Cloud Consul实现服务的注册和发现

首先安装consul环境,参照之前的文章:https://www.jb51.net/article/141789.htm 项目规划,2个服务端,1个客户端 首先来看服务端, 一:服务端1: 项目依赖 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clou

spring cloud consul使用ip注册服务的方法示例

我测试spring cliud使用consul作为注册中心的时候,发现服务注册的时候,注册的都是hostname,比如: 注册了一个commonservice,在consul中是这样的: { "ID":"commonservice123", "address":"testcommonserver" ........ } 这肯定是不对的. 加入我有一个服务payservice需要调用commonservice,payservic

springcloud使用consul作为配置中心

Spring Cloud 中文手册: https://springcloud.cc/spring-cloud-consul.html 也就是说在我们使用consul config时最好在consul 建立相应的目录结构 适用于某一个服务的目录结构以及适用于所有的服务的目录结构 本列consul web UI :springboot为我们提供了三种环境dev:默认开发环境  test:测试环境  prod:生产环境 PS: 1.每次当我们修改consul上面的配置信息的时候,会向我们的代码发送一个

springboot 注册服务注册中心(zk)的两种方式详解

在使用springboot进行开发的过程中,我们经常需要处理这样的场景:在服务启动的时候,需要向服务注册中心(例如zk)注册服务状态,以便当服务状态改变的时候,可以故障摘除和负载均衡. 我遇到过两种注册的途径: 1.在Spring的webapplication启动完成后,直接进行注册: 2.在servlet容器启动完成后,通过listener进行注册. 本文通过一个demo讲述一下这两种注册方式,使用的是传统的向zk注册的方案. 1.Spring webapplication启动完成后注册 先上

IOS 指纹识别两种方式详解及实例

IOS 指纹识别两种方式详解及实例 首先引入类名: #import <LocalAuthentication/LocalAuthentication.h> 然后在实现指纹识别的地方放入如下代码: 方式一: LAContext *lacontext = [[LAContext alloc]init]; // 判断设备是否支持指纹识别 BOOL isSupport = [lacontext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWit

对Python使用mfcc的两种方式详解

1.Librosa import librosa filepath = "/Users/birenjianmo/Desktop/learn/librosa/mp3/in.wav" y,sr = librosa.load(filepath) mfcc = librosa.feature.mfcc( y,sr,n_mfcc=13 ) 返回结构为(13,None)的np.Array,None表示任意数量 2.python_speech_features from python_speech_

mapper接口注入两种方式详解

这篇文章主要介绍了mapper接口注入两种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.使用模板方式: <!--使用模板类实现mybatis --> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFacto

Oracle创建Database Link的两种方式详解

创建一个dblink,命名为dblink_name,从A数据库连到B数据库,B数据库的IP为192.168.1.73,端口为1521,实例名为oracle,登录名为tast,密码为test. 一菜单方式: 打开plsql,点击[File]-[New]-[Database link],打开如下图所示窗口 填好各项信息后,点击[Apply]即可完成Database Link的创建. 二SQL方式 -- Drop existing database link drop public database

Spring boot实现热部署的两种方式详解

热部署是什么 大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的 Class 文件,这个文件里记录着和代码等对应的各种信息,然后 Class 文件将被虚拟机的 ClassLoader 加载. 而热部署正是利用了这个特点,它监听到如果有 Class 文件改动了,就会创建一个新的 ClaassLoader 进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前. 类加载机制 Java 中的类经过编译器可以把代

linux服务中开启防火墙的两种方式

存在以下两种方式: 一.service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptables:未运行防火墙. 开启防火墙: [root@centos6 ~]# service iptables start 关闭防火墙: [root@centos6 ~]# service iptables stop 二.iptables方式 先进入init.d目录,命令如下: [root@centos6 ~]# cd /etc/init.d/

基于ScheduledExecutorService的两种方法(详解)

开发中,往往遇到另起线程执行其他代码的情况,用java定时任务接口ScheduledExecutorService来实现. ScheduledExecutorService是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响. 注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是处于轮询任务的状态. 1.scheduleAtFix

使用Java构造和解析Json数据的两种方法(详解二)

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Json数据的方法

使用Java构造和解析Json数据的两种方法(详解一)

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Json数据的方法