SpringCloud_01_Discovery_02_Consul入门示例

前言

consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:

  • 服务发现(service discovery):consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
  • 健康检查(health checking):健康检测使consul可以快速的告警在集群中的操作;和服务发现的集成,可以防止服务转发到故障的服务上面。
  • Key/Value存储(key/value storage):一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
  • 多数据中心(multi-datacenter):无需复杂的配置,即可支持任意数量的区域。

由于 Spring Cloud 对微服务基本组件做了一层抽象,因此对于对各组件的具体实现来说,我们可以无缝切换的,这也是面向抽象编程带来的好处。

所以我们要将 Eureka 换成 Consul 也是非常容易:

  • 启动 consul
  • 切换服务提供者的依赖为 spring cloud consul,并修改其配置

一、启动 consul 服务端

1.下载 consul

官网下载地址:https://www.consul.io/downloads.html

去官网下载相应版本,然后解压缩

在这里插入图片描述

2.启动consul

进入 consul.exe 所在目录,然后执行如下命令即可:

consul agent -dev

在这里插入图片描述

启动成功后,访问 consul 可视化页面,如下图所示

http://localhost:8500/

在这里插入图片描述

二、创建服务提供者

1.创建子模块

这里我们创建一个子模块,创建步骤同 SpringCloud_01_Discovery_01_Eureka入门示例

子模块信息如下:

group = 'com.ray.study'
artifact ='spring-cloud-01-discovery-02-consul-client'

2.引入依赖

2.1 继承父工程依赖

在父工程spring-cloud-seedssettings.gradle加入子工程

rootProject.name = 'spring-cloud-seeds'
include 'spring-cloud-01-discovery-01-eureka-server'
include 'spring-cloud-01-discovery-01-eureka-client'
include 'spring-cloud-01-discovery-02-consul-client'

这样,子工程spring-cloud-01-discovery-02-consul-client就会自动继承父工程中subprojects 函数里声明的项目信息

2.2 引入 consul-client 依赖

将子模块spring-cloud-01-discovery-02-consul-clientbuild.gradle修改为如下内容:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    // consul client
    implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery'

    // actuator client
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

3. 修改配置

按照需要修改 consul-client 相关配置

3.1 修改application.yml

server:
  port: 8763

spring:
  application:
    name: consul-client   #指定服务名

  # consul 环境
  cloud:
    consul:
      host: localhost
      port: 8500
      enabled: true
      discovery:
        enabled: true
        prefer-ip-address: true

可选配置项可查看 consul 的配置类:ConsulProperties、ConsulDiscoveryProperties

或者查看 spring-cloud-consul-discoveryjar包中的META-INF\spring-configuration-metadata.json文件

部分默认配置如下:

spring:  
  cloud:
    consul:
      host: localhost          # Consul agent hostname ,即consul服务端host
      port: 8500               # Consul agent port
      enabled: true            # Is spring cloud consul enabled :是否启用spring cloud consul
      discovery:
        enabled: true          # 是否启用服务发现 
        health-check-path: /actuator/health  # 健康检查地址
        health-check-interval: 10s   # 健康检查间隔
        prefer-ip-address: false     # 注册时使用ip而不是hostname

3.2 启用服务发现

在启动类上添加@EnableDiscoveryClient注解即可启用服务发现

package com.ray.study.springcloud01discovery02consulclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloud01Discovery02ConsulClientApplication {

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

}

4.业务实现

这里我们写一个简单的controller,获取一下可用的服务列表

package com.ray.study.springcloud01discovery02consulclient.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * description
 *
 * @author shira 2019/05/20 19:57
 */
@RestController
public class HelloController {

	@Autowired
	private DiscoveryClient discoveryClient;

	@Value("${server.port}")
	private String port;


	@GetMapping("/")
	public List<String>  listServices(){
		List<String> services = discoveryClient.getServices();
		return services;
	}

	@GetMapping("/hello")
	public String sayHello(){
		return "the service on prot:"+port+" says hello!";
	}
}


5.效果演示

按照 SpringBoot 工程启动方式启动本工程,然后访问 consul 的图形化界面:

http://localhost:8500/

如下图所示,在注册中心的服务列表已经可以看到本服务了

在这里插入图片描述

访问 HelloController :

http://localhost:8763/

在这里插入图片描述

参考资料

  1. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】
  2. 一起来学SpringCloud之-注册中心(Eureka/Consul)
<think>好的,我现在需要处理用户关于Spring Cloud入门教程的请求。首先,用户已经提供了一些引用内容,我需要仔细阅读这些引用,理解它们之间的关系,并从中提取有用的信息来构建回答。 用户给出的引用1提到Nacos作为Spring Cloud Alibaba的组件,遵循Spring Cloud的服务注册和发现规范,与Eureka类似。引用2讨论了服务发现的重要性,并列举了Eureka、Consul和Zookeeper,指出Spring Cloud对它们的支持程度。引用3介绍了Ribbon作为负载均衡器,与Eureka集成,以及OpenFeign。引用4给出了Nacos的配置示例。 用户的问题是想了解Spring Cloud的入门知识,因此需要整理一个结构化的教程,涵盖核心组件和基本概念。根据引用内容,可以确定需要包括服务注册与发现(Eureka/Nacos)、负载均衡(Ribbon)、声明式HTTP客户端(OpenFeign)以及配置中心等内容。此外,需要对比Nacos和Eureka,说明它们的作用和配置方法。 接下来,我需要确保回答符合用户给出的格式要求:使用中文,行内数学表达式用$...$,独立公式用$$...$$,虽然目前可能用不上数学公式,但需要注意。同时,生成相关问题,并在回答中适当添加引用标记。 可能需要分步骤讲解,从环境搭建、核心组件介绍到示例代码,每个部分引用相关的引用内容。例如,在讲解服务注册时,提到Nacos和Eureka的区别,引用1和引用4的信息。在负载均衡部分,引用3关于Ribbon的内容。 还要注意生成的相关问题需要基于回答内容,可能涉及组件对比、配置步骤、原理等。例如,Nacos与Eureka的区别,Ribbon的负载均衡策略,OpenFeign的使用方法等。 现在需要组织这些信息,确保结构清晰,逐步引导用户入门,同时引用正确的内容来源,避免遗漏关键点。需要检查是否有其他Spring Cloud组件需要提及,比如Hystrix断路器、Zuul网关等,但根据引用内容,用户可能更关注基础部分,所以先集中在服务发现、负载均衡和Feign上。 最后,验证所有引用是否正确对应,回答是否自然流畅,符合用户的要求。</think>### Spring Cloud 入门教程 #### 1. Spring Cloud 简介 Spring Cloud 是一套基于 Spring Boot 的微服务架构工具集,提供了服务注册与发现、负载均衡、配置中心、熔断器等组件,简化了分布式系统开发。其核心目标是帮助开发者快速构建云原生应用。 #### 2. 核心组件与功能 ##### 2.1 服务注册与发现 - **服务注册中心**:微服务将自身信息注册到中心(如 Nacos、Eureka),其他服务通过中心发现可用实例[^2]。 - **示例组件**: - **Eureka**:Spring Cloud 官方早期推荐,支持服务注册与健康监测。 - **Nacos**:Spring Cloud Alibaba 组件,兼容 Spring Cloud 规范,功能更丰富(如动态配置管理)[^1]。 **Nacos 配置示例**: ```yaml cloud: nacos: discovery: server-addr: 192.168.88.132:8848 # Nacos 服务器地址[^4] ``` ##### 2.2 负载均衡(Ribbon) - **功能**:根据规则(如轮询、随机)将请求分发到多个服务实例[^3]。 - **集成方式**:与 Eureka/Nacos 结合,自动获取服务实例列表。 ##### 2.3 声明式 HTTP 客户端(OpenFeign) - **作用**:通过注解定义接口,自动生成 HTTP 请求代码,简化服务间调用。 - **示例**: ```java @FeignClient("user-service") // 指定服务名称 public interface UserClient { @GetMapping("/users/{id}") User getUser(@PathVariable Long id); } ``` ##### 2.4 配置中心 - **功能**:集中管理微服务配置,支持动态更新。 - **工具**:Nacos Config、Spring Cloud Config。 #### 3. 快速入门步骤 1. **环境搭建**: - 安装 JDK 8+、Maven、IDE(如 IntelliJ)。 - 创建 Spring Boot 项目(使用 [start.spring.io](https://start.spring.io/))。 2. **添加依赖**: ```xml <!-- Spring Cloud 版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR12</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- Nacos 服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> ``` 3. **编写服务提供者与消费者**: - 服务提供者:使用 `@RestController` 暴露 API,并通过 `@EnableDiscoveryClient` 注册到 Nacos。 - 服务消费者:通过 `@FeignClient` 调用提供者接口,结合 Ribbon 实现负载均衡。 #### 4. 对比 Nacos 与 Eureka | 特性 | Nacos | Eureka | |--------------------|--------------------------------|----------------------| | 配置管理 | 支持 | 不支持 | | 健康检查 | TCP/HTTP/MySQL 等多模式 | HTTP 心跳检测 | | 社区生态 | 阿里巴巴开源,活跃 | Netflix 维护,已停更 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值