演示项目源码下载:(访问密码: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地址,并在这里使用它。 - 测试 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.EnableDiscoveryClient
在src
文件夹中存在的 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.EnableDiscoveryClient
在src
文件夹中存在的 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
@LoadBalanced
RestTemplate
一旦我们注册了多个服务和多个实例,领事服务器就会看起来像这样。
如果遇到任何错误要检查的事项
- 注解
@EnableDiscoveryClient
和 Consul 代理运行是应用程序生态系统的核心。没有这两件事就根本行不通。 - 确保在启动学校服务时,学生服务,领事服务器代理已经在运行,否则可能需要一些时间来注册,并且在测试时可能会混淆。
总结
我们看到了可以轻松高效地部署 consul 服务注册中心和发现服务器以及客户端。Spring 框架在内部维护了很多东西。在这里,我们只是使用几个注释和非常少的配置来快速完成整个事情。
演示项目源码下载:(访问密码:9987)
Spring-Cloud-Consoul.zip
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/243837.html