Spring Cloud Consul 服务注册和发现演示

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(753)   2023-03-28 11:29:14

演示项目源码下载:(访问密码:9987)
Spring-Cloud-Consoul.zip

了解如何创建微服务的基础上Spring cloud,对登记HashiCorp Consul注册服务器,以及如何等微服务(客户发现的),用它来注册和发现服务来调用其API。

我们将使用基于 Spring Boot 的 Spring Cloud API。我们将使用 Consul 注册服务器来构建服务注册服务器和通用发现客户端,这些客户端将注册自己并发现其他服务以调用 REST API。
 

概述

Consul 提供了服务发现、配置管理、健康检查和键值存储等多种功能,今天我们将专注于服务注册和发现部分。我们将开发以下组件来构建一个分布式生态系统,其中每个组件都以某种方式相互依赖,但它们非常松散耦合,当然还有容错性。
  • Consul Agent – 在 localhost 上运行,充当发现/注册服务器功能。
  • 学生微服务——它将提供一些基于学生实体的功能。它将是一个基于休息的服务,最重要的是它将是一个发现服务客户端,它将与 Consul 服务器/代理通信以在服务注册表中注册自己。
  • 学校微服务 - 与学生服务类型相同 - 唯一增加的功能是它将通过服务查找机制调用学生服务。我们不会使用学生服务的绝对 URL 与该服务进行交互。我们将使用 Consul 发现功能并在调用它之前使用它来查找学生服务实例。
这是相同的整体组件交互图。
组件图
 

技术栈和运行时

  • Java 1.8
  • Eclipse IDE
  • Consul as Service Registry Server
  • Spring cloud
  • Spring boot
  • Spring Rest
  • Maven

在本地工作站配置 Consul

在开始练习之前,我们需要先在 localhost 下载、配置和运行 consul 代理。
  • 领事门户下载。根据操作系统选择特定的包。下载 zip 后,我们需要将其解压缩到所需位置。
  • 在本地工作站启动 Consul Agent - 我们解压的 Zip 文件只有一个名为consul.exe. 我们将在此处启动命令提示符并使用以下命令启动代理。
    consul agent -server -bootstrap-expect=1 -data-dir=consul-data -ui -bind=192.168.6.1
  • 确保输入正确的绑定地址,它会因 LAN 设置而异。做一个ipconfig在命令提示符知道你的IPv4地址,并在这里使用它。ipconfig启动命令
  • 测试 Consul Server 是否正在运行– Consul 在默认端口上运行,一旦代理成功启动,浏览http://localhost:8500/ui,您应该会看到一个控制台屏幕,例如 –控制台没有服务注册进来所以我们已经在我们的本地机器上配置了 consul 并且 consul 代理运行成功。现在我们需要创建客户端并测试服务注册和发现部分。
 

学生服务

按照以下步骤创建和运行学生服务。它将是一个发现客户端,将自己注册到现在已经在我们机器上运行的 consul 服务。

创建学生项目

从具有四个依赖项的初始化程序门户创建一个 Spring 启动项目,即
  • Actuator
  • Web
  • Rest Repositories
  • Consul Discovery
给出其他maven GAV坐标并下载项目。
项目构建下载

解压缩该项目并将其作为现有的 maven 项目导入 Eclipse。

现在@org.springframework.cloud.client.discovery.EnableDiscoveryClientsrc文件夹中存在的 Spring boot 应用程序类上添加注释。有了这个注解,这个工件将像一个 spring 发现客户端,并将在附加到这个服务的领事服务器中注册自己。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudConsulStudentApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConsulStudentApplication.class, args);
    }
}

服务配置

打开application.properties并添加以下属性
server.port=9098
spring.application.name: student-service
management.security.enabled=false
这是每个属性的详细信息 –
  • server.port=9098– 将在默认9098端口启动服务。
  • spring.application.name: student-service– 将使用student-service标签在领事服务器中注册自己,其他服务也将使用此名称自行查找此服务。
  • management.security.enabled=false – 本练习实际上并不需要,但它将禁用执行器模块提供的管理端点中的弹簧安全性。

添加 REST API

现在添加一个RestController并公开一个 rest 端点,用于获取特定学校的所有学生详细信息。在这里,我们公开/getStudentDetailsForSchool/{schoolname}端点以服务于业务目的。为简单起见,我们对学生的详细信息进行了硬编码。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import com.example.howtodoinjava.springcloudconsulstudent.domain.Student;
 
@RestController
public class StudentServiceController {
 
    private static Map<String, List<Student>> schooDB = new HashMap<String, List<Student>>();
 
    static {
        schooDB = new HashMap<String, List<Student>>();
 
        List<Student> lst = new ArrayList<Student>();
        Student std = new Student("Sajal", "Class IV");
        lst.add(std);
        std = new Student("Lokesh", "Class V");
        lst.add(std);
 
        schooDB.put("abcschool", lst);
 
        lst = new ArrayList<Student>();
        std = new Student("Kajal", "Class III");
        lst.add(std);
        std = new Student("Sukesh", "Class VI");
        lst.add(std);
 
        schooDB.put("xyzschool", lst);
 
    }
 
    @RequestMapping(value = "/getStudentDetailsForSchool/{schoolname}", method = RequestMethod.GET)
    public List<Student> getStudents(@PathVariable String schoolname) {
        System.out.println("Getting Student details for " + schoolname);
 
        List<Student> studentList = schooDB.get(schoolname);
        if (studentList == null) {
            studentList = new ArrayList<Student>();
            Student std = new Student("Not Found", "N/A");
            studentList.add(std);
        }
        return studentList;
    }
}
Student.java 模型
public class Student {
    private String name;
    private String className;
 
     
    public Student(String name, String className) {
        super();
        this.name = name;
        this.className = className;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getClassName() {
        return className;
    }
 
    public void setClassName(String className) {
        this.className = className;
    }
}
 

验证学生服务

将此项目作为 Spring Boot 应用程序启动。现在验证该服务是否已自动注册到 Consul 服务器中。转到 Consul Agent 控制台并刷新页面。现在,如果一切顺利,我们将student-service在 Consul Agent 控制台中看到一个条目。
学生服务注册
这表明领事服务器和客户端都知道彼此,这是领事服务器和学生服务之间发生的一种自动注册和发现。

我们现在将验证/getStudentDetailsForSchool/{schoolname}端点是否已启动并正在运行。转到浏览器并转到http://localhost:9098/getStudentDetailsForSchool/abcschool,它将提供特定学校abcschool的学生详细信息。
学生服务响应内容

学校服务 - 发现客户端

现在我们将创建学校服务,它将自己注册到 consul 服务器——它将发现和调用学生服务,而无需硬编码的 URL 路径。
按照相同的步骤创建和运行学校服务。它将是一个发现客户端,将自己注册到现在已经在我们机器上运行的 consul 服务。
它将在内部调用已经开发的学生服务,并使用 consul 服务发现功能来发现学生实例。

创建学校项目

从具有四个依赖项的初始化程序门户创建一个 Spring 启动项目,即
  • 执行器
  • 网络
  • 休息存储库
  • 领事发现
给出其他maven GAV坐标并下载项目。
学校项目创建
解压缩该项目并将其作为现有的 maven 项目导入 Eclipse。
现在@org.springframework.cloud.client.discovery.EnableDiscoveryClientsrc文件夹中存在的 Spring boot 应用程序类上添加注释。有了这个注解,这个工件将像一个 spring 发现客户端,并将在附加到这个服务的领事服务器中注册自己。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudConsulSchoolApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConsulSchoolApplication.class, args);
    }
}
看上面的代码。在 中StudentServiceDelegate,我们曾经RestTemplate调用过学生服务并将学生服务的 URL 用作.http://student-service/getStudentDetailsForSchool/{schoolname}
这样我们就可以摆脱特定的服务配置,我们可以将服务查找责任交给consul这里提供的服务器和休息模板。@LoadBalanced如果多个实例正在为同一服务运行,我们也可以在此处应用负载平衡(请参阅注释)。
 

演示

一步一步做以下步骤来了解整个事情——
  • 检查 Consul Agent 是否仍在运行- 打开浏览器并浏览http://localhost:8500/ui。它应该显示如上所述的 consul 控制台。
  • 检查学生服务是否已在运行– 从 consul 管理页面和浏览器检查学生服务是否已启动并正在运行。如果没有启动该服务并验证它是否已在领事服务器中注册。
  • 启动并检查学校服务- 从命令提示符启动学校服务并检查它是否已在领事服务器中注册。
  • 打开浏览器并使用 URL http://localhost:8098//getSchoolDetails/abcschool测试学校 REST 服务。它将给出以下响应,并将使用 consul 服务在内部调用学生服务。学生服务响应
  • 也尝试通过更改端口来启动多个实例学生服务。这些也将在 consul 中注册,因为我们在 中使用注解,负载平衡也将在内部完成。检查相应的学生服务控制台以验证在多实例场景中调用了哪个实例。java -jar "-Dserver.port=9099 target\spring-cloud-consul-student-0.0.1-SNAPSHOT.jar@LoadBalancedRestTemplate一旦我们注册了多个服务和多个实例,领事服务器就会看起来像这样。
    所有服务都在
    所有服务都在

如果遇到任何错误要检查的事项

  • 注解@EnableDiscoveryClient和 Consul 代理运行是应用程序生态系统的核心。没有这两件事就根本行不通。
  • 确保在启动学校服务时,学生服务,领事服务器代理已经在运行,否则可能需要一些时间来注册,并且在测试时可能会混淆。
 

总结

我们看到了可以轻松高效地部署 consul 服务注册中心和发现服务器以及客户端。Spring 框架在内部维护了很多东西。在这里,我们只是使用几个注释和非常少的配置来快速完成整个事情。
 

演示项目源码下载:(访问密码:9987)
Spring-Cloud-Consoul.zip

地址:https://www.leftso.com/article/859.html

相关阅读

演示项目源码下载:(访问密码:9987)Spring-Cloud-Consoul.zip了解如何创建微服务的基础上Spring cloud,对登记HashiCorp Consul注册服务器,以及...
随着Spring Cloud 的越来越流行,国内很多公司也在开始使用该框架了
演示项目源码下载:(访问密码:9987)Spring-Cloud-discovery-server.zip 了解如何创建微服务的基础上,Spring Cloud,对Netflix的Eureka注...
在spring cloud项目中配置配置服务的地址spring.cloud.config.uri不生效的解决办法,spring cloud
演示项目源码下载:(访问密码:9987)spring-cloud-zipkin.zipZipkin是非常有效的工具分布追踪在微服务生态系统
在这个 Spring cloud 教程中,学习在 spring boot/cloud 项目中使用 Netflix Ribbon 使用客户端负载平衡
项目源码下载:(访问密码:9987)Spring-Cloud-Circuit-Breaker.zip学习在调用底层微服务的同时利用调用的Spring Cloud Netflix堆栈组件之一Hys...
项目源码下载:(访问密码:9987)spring-cloud-dashboards.zip在交付基于微服务的应用程序时,广泛使用 Spring Boot 和 Spring Cloud
演示项目源码下载:(访问密码:9987)spring-cloud-config-server-git.zip微服务方法现在已经成为任何新 API 开发的行业标准,几乎所有组织都在推广它
项目源码下载:(访问密码:9987)spring-cloud-apigateway_zuul.zip学习使用Netflix Zuul及其与Spring Cloud 的牢固结合来创建负载均衡器