在本文中,我们将探讨服务注册和发现的概念,这种机制使微服务能够在不知道确切位置(通常是URL)的情况下使用其他微服务。
我们为什么需要这个?
如果没有这一点,服务的地点将相互耦合,造成难以维护的系统。基本问题是显而易见的:服务如何知道他们需要使用的服务的IP和端口?在一个简单的架构中,静态配置工作得很好。每项服务都部署在同一地点,并且很少发生变化。但微服务体系结构并非如此。
微服务的目标之一是使开发团队能够独立部署和扩展应用程序。随着更多的服务和实例被添加到系统中,服务位置开始频繁变化:部分原因是手动或自动缩放,部分原因是由于持续交付流程。随着缩放和部署的发生,实例将开始频繁地升降。显然,服务位置的静态配置不是一个可行的解决方案。需要动态配置。
它是如何工作的?
包含可用服务位置的动态配置保存在发现服务中。每个微服务只需要知道发现服务的位置,并将用它来获取其他微服务的位置。在演示应用程序中,发现服务在发现服务器应用程序中实现。
我们以演示应用程序中的两个微服务为例:(admin-application
一个Web Vaadin应用程序)和 biz-application
(一个Spring Data REST Web服务)。在 admin-application
需要 biz-application
读取和写入数据。下图显示了通信流程:
1. biz-application
启动并告诉了discovery-server
它是可用的。
2. admin-application
启动并询问discovery-server
该地点的位置biz-application
。
3. discovery-server
查找其内部数据库并返回该数据库的位置biz-application
。
这个admin-application
罐子现在可以直接向这个罐子发出请求biz-application
。
biz-application
添加更多实例时会发生什么?该过程如下图所示:
请注意每个biz-application
实例如何注册自己(1和2)以及如何discovery-server
将所有可用位置返回到admin-application
(4),然后再选择其中一个位置发出请求(5)。通过具有容错功能的客户端负载均衡器来选择哪个实例。本文重点介绍服务注册和发现。
使用Eureka实现发现服务器
有许多适用于服务发现的实现。SmartStack,Zookeeper,Etcd,Consul,NSQ,Serf和Doozer都是很好的例子。演示应用程序使用Netflix 经过战场验证的Eureka。
Spring Cloud通过Spring Cloud Netflix提供与Eureka(通常与Netflix OSS)的完美集成。由于Spring Boot的自动配置功能,使用Eureka实施发现服务非常简单。
使用Spring Initializr创建一个名为discovery-server的新Spring Boot应用程序,并包含Eureka Server和Actuator(可选)依赖项:
确保使用Spring Boot的2.0.0版本(撰写本文时的里程碑版本)。点击生成项目,提取生成的文件,并将Maven项目导入到您最喜欢的IDE中。
打开 DiscoveryServerApplication
课程并用以下注释@EnableEurekaServer
:
公共 类 DiscoveryServerApplication {
...
}
删除application.properties文件并application.yml
使用以下内容创建一个 文件:
server.port 7001
spring.application.name 发现服务器
尤里卡
实例
主机名 localhost
leaseRenewalIntervalInSeconds 2
leaseExpirationDurationInSeconds 2
服务器
evictionIntervalTimerInMs 1000
response-cache-update-interval-ms 1000
客户
registerWithEureka false
fetchRegistry false
该文件将应用程序配置为使用端口7001和名称discovery-server
。它还包含Eureka的配置。注意最后两行。他们需要避免discovery-server
注册自己。
其余配置不适用于生产系统。它经过调整仅处理每个微服务的几个实例,并允许您在尝试应用程序时快速查看更改。在生产部署中,您应该根据您的特定要求对其进行调整。有关这方面的更多信息,请参阅Eureka的文档。
使用Maven编译和打包应用程序,并使用命令行(或IDE)将其作为标准Java程序运行:
cd发现服务器
mvn包
java -jar target / discovery-server-0.0.1-SNAPSHOT.jar
在此我向大家推荐一个架构学习交流群。交流学习群号: 744642380, 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源