首页 > 其他分享 >Spring Cloud Consul简介

Spring Cloud Consul简介

时间:2023-04-08 14:44:23浏览次数:29  
标签:status Spring Consul Cloud spring consul cloud

Spring Cloud Consul通过自动配置和绑定到Spring Environment和其他Spring编程模型习惯用法,为Spring Boot应用程序提供Consul集成。通过一些简单的注释,您可以快速启用和配置应用程序中的常见模式,并使用Hashicorp的Consul构建大型分布式系统。提供的模式包括服务发现、分布式配置和控制总线。服务发现是基于微服务的体系结构的关键原则之一。尝试手动配置每个客户端或某种形式的约定可能非常困难,而且可能非常脆弱。Consul通过HTTP API和DNS提供服务发现服务。Spring Cloud Consul利用HTTP API进行服务注册和发现。这并不能阻止非Spring Cloud应用程序利用DNS接口。Consul代理服务器在集群中运行,该集群通过gossip协议进行通信,并使用Raft共识协议。

特点

1、服务发现:可以向Consul代理注册实例,客户端可以使用Spring托管bean发现实例。
2、通过Spring Cloud Netflix支持Ribbon客户端负载均衡器。
3、支持Spring Cloud LoadBalancer-Spring Cloud项目提供的客户端负载平衡器
4、通过Spring Cloud Netflix支持Zuul,一个动态路由器和过滤器
5、分布式配置:使用Consul密钥/值存储
6、控制总线:使用Consul事件的分布式控制事件

使用Consul

将Consul作为服务注册和发现的服务器,微服务作为客户端。Consume(端口是8001)和Producer(两个服务,一个端口是8000,一个端口是8002)添加依赖:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

 
并在application.properties配置:

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

 
 

启动Consumer,Producer。访问http://127.0.0.1:8500/,结果如下:
 

看到consumer左边有个红叉,点进去看到:

HTTP GET http://192.168.31.148:8001/actuator/health: 404  Output: <html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p><div id='created'>Sat Apr 08 12:52:07 CST 2023</div><div>There was an unexpected error (type=Not Found, status=404).</div></body></html>

Consul通过spring-boot-actuator与客户端进行健康检查,只需在consumer中加入依赖:

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

并在application.properties配置:

management.endpoints.web.exposure.include=*

开启spring-boot-actuator端点重启即可。当客户端向Consul注册时,它会提供有关自身的元数据,如主机和端口、id、名称和标记。默认情况下,会创建一个HTTP检查,Consul每10秒命中一次/actuator/health端点。如果运行状况检查失败,则服务实例被标记为critical实例。
 
 

Consumer的application.properties:

server.port=8001

spring.application.name=consumer

#eureka.client.service-url.defaultZone=http://test1.com:8761/eureka/

#eureka.client.healthcheck.enabled=true

management.endpoints.web.exposure.include=*
#management.endpoint.health.show-details=always

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

 
 

Producer的application.properties:

server.port=8002

spring.application.name=producer

#eureka.client.service-url.defaultZone=http://user:123@localhost:8761/eureka/

spring.zipkin.base-url=http://localhost:9411/
spring.zipkin.sleuth.sampler.rate=1

management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
spring.boot.admin.client.url=http://localhost:7500

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

 
 

在Consumer的controller中:

@Autowired
private DiscoveryClient discoveryClient;

@RequestMapping("/serviceList")
public List<String> serviceList() {
    return discoveryClient.getServices();
}

访问http://localhost:8001/serviceList,看到

["consul","consumer","producer"]

健康检查

Consul实例的运行状况检查默认为“/actuator/health”,这是Spring Boot actuator应用程序中运行状况端点的默认位置。如果您使用非默认上下文路径或servlet路径(例如server.servletPath=/foo)或管理端点路径(例如management.server.servlet.context path=/admin),即使对于Actuator应用程序,也需要更改这一点。
 
Consul用于检查健康端点的间隔也可以进行配置。“10s”和“1m”分别表示10秒和1分钟。健康检查间隔默认是10s。通过以下的配置改变健康检查端点的路径和时间间隔:

spring.cloud.consul.discovery.healthCheckPath=/actuator/health
spring.cloud.consul.discovery.healthCheckInterval=15s

可以通过设置spring.cloud.consor.discovery.register health-check=false来完全禁用HTTP健康检查。

 

还可以在健康检查时添加请求头参数,例如:

spring.cloud.consul.discovery.health-check-headers.X-Config-Token=6442e58b-d1ea-182e-cfa5-cf9cddef0722
上报健康指标

可以实现HealthIndicator,ConsulHealthIndicator,DiscoveryClientHealthIndicator来上报服务的健康指标。

 
例子

@Service
public class HealthStatusService implements HealthIndicator {

    private Boolean status = true;

    public void setStatus(Boolean status) {
        this.status = status;
    }

    @Override
    public Health health() {
        if (status)
            return new Health.Builder().up().build();
        return new Health.Builder().down().build();
    }

    public String getStatus() {
        return this.status.toString();
    }

}

在Controller中:

@Autowired
private HealthStatusService healthStatusSrv;


@GetMapping("/health")
public String health(@RequestParam("status") Boolean status) {

    healthStatusSrv.setStatus(status);
    return healthStatusSrv.getStatus();
}

访问http://localhost:8001/health?status=false,等待10秒左右可以看到consumer的状态变为Critical,在访问http://localhost:8001/health?status=true,consumer的状态变为Passing。

将HealthStatusService改成下面可看到相同效果:

@Service
public class MyHealthStatus extends ConsulHealthIndicator {

    private Boolean status = true;

    public void setStatus(Boolean status) {
        this.status = status;
    }


    @Autowired
    public MyHealthStatus(ConsulClient consul, ConsulHealthIndicatorProperties properties) {
        super(consul, properties);
    }

    @Override
    public Health getHealth(boolean includeDetails) {
        if (status)
            return new Health.Builder().up().build();
        return new Health.Builder().down().build();
    }
}

元数据

配置以下参数添加元数据:

spring.cloud.consul.discovery.metadata.myfield=myvalue
spring.cloud.consul.discovery.metadata.anotherfield=anothervalue

访问http://127.0.0.1:8500/,进入具体服务,看到元数据:

&nbsp;
 

Consul自动生成了元数据:

key value
'group' 属性值spring.cloud.consul.discovery.instance-group ,不为空才展示
'secure' 如果属性spring.cloud.consol.discovery.scheme等于“https”,则为True,否则为false。
属性spring.cloud.consol.discovery.default-zone-metadata-name,默认为“zone” 属性spring.cloud.consol.discovery.instance-zone。只有实例区域不为空时才会生成此值。

Consul Instance ID唯一

默认情况下,consur实例注册的ID等于其Spring应用程序上下文ID。默认情况下的Spring应用程序语境ID为\({Spring.Application.name}:逗号,分隔,profiles:\){server.port}。在大多数情况下,这将允许一个服务的多个实例在一台计算机上运行。如果需要进一步的唯一性,则使用Spring Cloud可以通过在Spring.Cloud.consol.discovery.instanceId中提供唯一标识符来覆盖这一点。

 

访问http://127.0.0.1:8500/,看到服务的默认Instance id:

 

在Consumer的application.properties中加入配置:

spring.cloud.consul.discovery.instance-id=${spring.application.name}-${server.port}-${random.value}

访问http://127.0.0.1:8500/,看到consumer的Instance id:

标签:status,Spring,Consul,Cloud,spring,consul,cloud
From: https://www.cnblogs.com/shigongp/p/17298133.html

相关文章

  • SpringMVC
    1.MVCMVC:是模型(Model)视图(View)控制器(Controller)的简写,是一种软件设计规范将业务逻辑,数据和显示分离MVC是一种架构模式模型(dao,service):数据模型,提供要展示的数据,包含数据和行为视图(jsp):负责进行数据的展示控制器(servlet):接收用户的请求,委托给模型进行处理1.1SpringMVC框......
  • spring——bean初始化过程解析
         ......
  • springCloud之Consul简介
    Consul是什么Consul是HashiCorp公司推出的开源工具。HashiCorpConsul是一种服务网络解决方案,使团队能够管理服务之间以及跨预处理和多云环境和运行时的安全网络连接。Consul为网络基础设施设备提供服务发现、服务网格、流量管理和自动更新。您可以单独使用这些功能,也可以在单个C......
  • Spring源码系列一:入门——Hello World
    前言讲解Spring之前,我们首先梳理下Spring有哪些知识点可以进行入手源码分析,比如:SpringIOC依赖注入SpringAOP切面编程SpringBean的声明周期底层原理Spring初始化底层原理SpringTransaction事务底层原理HelloWorld通过这些知识点,后续我们慢慢在深入Spring的使用及原......
  • SpringBoot项目学习总结
    1.项目包结构一共有6个包,common包下的主要是常量和返回结果的结构。2.创建实体类将sql语句复制过来,按住ALT+鼠标左键竖直选中删除,按HOME和END到所有行的头和尾同时编辑。3.三层开发规范分别是Controller/Service/Dao,顺序:前端浏览器->Controller->Service(接口、实现类......
  • day05-SpringCloud Eureka-服务注册与发现02
    SpringCloudEureka-服务注册与发现023.搭建EurekaServer集群-实现负载均衡&故障容错3.1为什么需要集群EurekaServer?微服务RPC远程服务调用最核心的是高可用如果注册中心只有1个,如果出现故障,会导致整个服务环境不可用解决办法就是搭建Eureka注册中心集群,实现负载均衡和故障......
  • .Net6注入Consul服务
    .Net6注入Consul服务直接上代码了(参考了一下其他博客进行总结一下),我这边项目工程是模拟微服务模式,新建类库把服务打包成了nuget方便调用现在先大致介绍一下,结尾放demo案例代码consul心跳心跳的地址要于下面配置文件的地址一样这里先定义一会配置文件也要相同///<summary>......
  • spring 使用聚合Aggregation substr mongo 查询
    importcom.xxx.repository.kpi.entity.ChannelCheckBase;importcom.xxx.repository.kpi.entity.DataJson;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.m......
  • 使用Docker发布普通web项目(非springboot项目)
    公司的项目比较旧,还是普通的web格式,只能打个war包放在tomcat中运行,现在要上docker发布,在此做下记录DockerDesktop开发机是win10,想要打包镜像需要安装DockerDesktop,安装前需要在bios里面开启虚拟化支持。然后按照官方安装教程一步一步安装。Dockerfile然后在项目根目录编写doc......
  • Springfox与SpringDoc——swagger如何选择(SpringDoc入门)
     本文分享自天翼云开发者社区@《Springfox与SpringDoc——swagger如何选择(SpringDoc入门)》,作者:才开始学技术的小白  0.引言之前写过一篇关于swagger(实际上是springfox)的使用指南(https://www.ctyun.cn/developer/article/371704742199365),涵盖了本人在开发与学习的时候碰......