首页
Preview

如何使用Netflix的Eureka和Spring Cloud进行服务注册

microservice architecture pattern 的主要原则之一是,一组松耦合、协作的服务共同形成一个完整的应用程序。因此,重点不在于单个服务,而在于确保服务之间的交互可靠且容错。

在实践中,这意味着需要删除硬编码信息,并将其替换为动态更新的环境变量,为每个服务使用单独的数据库,尽可能减少服务之间的依赖(这样,如果需要,需要更多实例的服务可以轻松扩展而不会影响其对应服务),并通过增加每个单独服务的复杂性来降低管理整个应用程序的复杂性。

这听起来是一个不错的策略,但是跟踪整个应用程序的所有小部分会使客户端管理这些内容成为负担。

这就带我来到了今天博客的主题:Netflix Eureka 服务注册表,以及如何使用 Spring Cloud 更有效地管理这种复杂性。

正如 Netflix 的 Eureka 注册表的 Github 仓库所说:

“Eureka 是一种基于 REST(Representational State Transfer)的服务,主要用于在 AWS 云中查找服务,以实现中间层服务器的负载平衡和故障转移。” —— Netflix:Eureka 简介,Github

听起来不错?好。那么,不再拖延,让我们开始设置这个 Eureka 服务注册表和一些服务,看看它在实践中是如何工作的。

设置 Eureka 服务器

设置基于 Spring 的 Eureka 服务器实际上非常简单。Spring.io 本身就有一个很好的教程 here,可以帮助你快速启动 Eureka 服务器和一个样例 Spring Boot 项目。

我不会一步一步地讲解,因为你可以使用我链接到的教程进行操作,或者你可以在 这里 下载我的工作示例。但是,我会强调一下服务器设置中需要包含的重要内容。

Build.gradle** 文件**

用于 Eureka 服务器设置的依赖项片段。

在你的 build.gradle 文件中,你必须包含上述依赖项:spring-cloud-starter-netflix-eureka-serverspring-cloud-dependencies。完成后,下一步是位于 resources 文件夹中的 application.yml 文件。

Application.yml** 文件**

需要在 application.yml 文件中指定的配置

这个文件也不需要太多的配置。它需要指定一个服务器端口,以便服务不会自动在端口 8080 上启动,否则在本地运行时会与其他 Spring Boot 客户端服务发生冲突。

还需要指定一些其他配置,以提高方便性。Eureka 客户端在启动时被指示不要在自身注册(eureka.client.register-with-eureka: false),并且它被告知不要搜索其他注册表节点进行连接,因为没有其他节点(至少在本地运行时没有)(eureka.client.fetch-registry: false)。列出了默认 URL,关闭了 Eureka 和任何后续服务发现的详细日志记录。

好的,现在只剩下主类路径上的最后一步了。

EurekaServerApp.java** 文件**

添加到你的 Eureka 服务器的 Spring 注释。

主文件唯一额外的需要是 @EnableEurekaServer 注释,它告诉 Spring Boot 服务启用服务器。非常简单。

好的,现在我们可以继续处理服务了——这是事情开始变得更加有趣的地方。

设置用于注册的 Java 服务

同样,Spring.io 的教程 here 很好地设置了第一个 Spring Boot 服务器和客户端项目,因此我将再次强调必须包含的要点。

Build.gradle** 文件**

客户端服务所需的依赖项

对于客户端服务的 build.gradle 文件,只需确保包含 spring-cloud-starter-netflix-eureka-clientspring-cloud-dependenciesspring-boot-starter-web 依赖项已经包含,以便在服务中创建 Web 端点,以显示与 Eureka 服务器相关的服务信息。

Bootstrap.yml** 和 Application.yml 文件**

在此设置客户端服务的名称,以便 Eureka 服务器发现。

再次强调,必须对 boostrap.ymlapplication.yml 文件进行一些轻微的配置。上面是 bootstrap.yml,它会在 Spring 之前被捕捉到,因此这是我们设置服务名称的位置。我选择了非常原始的 spring.application.name: a-java-service,这就是 Eureka 服务器将来会引用它的方式。

这里有一个端口号和服务器的默认URL

然后application.yml文件的配置与Eureka服务器设置类似。端口号和Eureka服务器的默认URL。

EurekaClientApplication.java文件

最后,在主类路径文件中使用@EnableDiscoveryClient对服务进行注释,这告诉Spring Boot服务激活Netflix Eureka DiscoveryClient实现,并将其自己的主机和端口注册到Eureka服务器。

下面REST Controller中定义的REST端点可用于查看在<a class="af ok" href="http://localhost:8091/service-instances/a-java-service" rel="noopener ugc nofollow" target="_blank">http://localhost:8091/service-instances/a-java-service</a> URL注册在Eureka注册表中的所有服务实例。

JSON如下所示:

设置节点服务以注册

现在,这是一个很好的开端,但是为了更贴近实际情况,我决定还要将一个Node.js服务注册到Eureka服务器上,这证明有点棘手。

幸运的是,有一个非常方便的NPM包可以满足这种需求,叫做 eureka-js-client ,被称为

Eureka(https://github.com/Netflix/eureka)的JavaScript客户端实现,Netflix OSS服务注册表。

必须仔细阅读文档,因为在使用Spring实现与Eureka时有一些特殊的陷阱,但是我通过一些试错成功地将其运行起来。以下是让样本Node.js项目运行所需的内容。

Package.json文件

对于我的简单Node.js应用程序,几乎没有依赖关系。

对于这个Node.js服务,我们只需要安装eureka-js-client,我添加了expressnodemon,这样我就可以轻松地对应用程序进行一些REST调用,并且可以在对系统进行调整时自动重新加载Node服务器。

Server.js文件

唯一的server.js文件,包含所有Eureka客户端配置。

我只使用了一个server.js文件,因为这个项目本来就很小,而且非常方便。

重要的是设置new Eureka()。对于Spring Boot项目,我们在bootstrap.ymlapplication.yml中设置应用程序配置,对于JavaScript项目,此配置在server.js文件中设置或通过配置文件注入(对于具有多个不同配置的大型项目或基于生产生命周期的多个项目)。

在这里定义了应用程序名称:app: &#39;a-node-service&#39;,定义了主机名、IP地址、端口、数据中心信息等。必须填写registerWithEurekafetchRegistry选项之前的每个参数,否则服务器将崩溃,但是vipAddressdataCenterInfo字段可以与eureka-client-js文档中编写的完全相同。只需填写它们。

最后但并非最不重要的是,一旦设置了客户端服务,就可以使用client.start()命令启动它,在连接到Eureka注册表成功时,我会在控制台记录error消息或'Node.js Eureka Started'消息。

运行Eureka服务注册表

现在让我们将此服务注册表运行起来。我在示例项目的README.md中提供了运行所有服务的详细信息here,但是在此也提供。

我们将进入包含在一个主项目文件夹中的每个服务,如果你的文件结构类似于Sping.io starter教程中所述的结构。这是我的参考:

root/
├── eureka-client-java/ 
| ├── build.gradle 
| ├── src/ 
| | | ├── main/ 
| | | | ├── java/ 
| | | | ├── resources/ 
| | | | | ├── application.yml 
| | | | | ├── bootstrap.yml
├── eureka-client-node/ 
| ├── server.js
| ├── package.json
| ├── node-modules/
├── eureka-service/
| ├── build.gradle 
| ├── src/ 
| | | ├── main/ 
| | | | ├── java/ 
| | | | ├── resources/ 
| | | | | ├── application.yml

就像我说的那样,cd进入每个repo eureka-client-javaeureka-client-nodeeureka-service,对于两个Spring Boot项目,运行gradle clean build,然后运行gradle bootRun。对于Node.js项目,运行npm start。等待一分钟,直到所有项目都启动并被注册表服务找到,然后转到http://localhost:8761,你应该看到以下内容。

如果你仔细查看“当前在Eureka中注册的实例”部分,你将看到我们的应用程序。

这是Eureka服务器主页,如果你查看页面下方的第二个部分,则会看到“当前在Eureka中注册的实例”,以及我们构建的两个服务。``` 成功了!为了验证这些服务确实在运行,请访问http://localhost:8091/service-instances/a-java/servicehttp://localhost:3000/以查看每个服务的信息。

现在,让我们更进一步,因为注册中心的整个意义在于让注册在其中的客户端更容易地向其他可用服务询问如何连接和通信:

“每个服务都向服务注册表注册自己,并告诉注册表它在哪里(主机、端口、节点名称)以及可能是其他服务特定的元数据——其他服务可以使用这些元数据来做出明智的决策。客户端可以询问服务拓扑(“是否有任何可用的‘fulfillment-services’,如果有,它们在哪里?”)和服务能力(“你可以处理X、Y和Z吗?”)。——Spring,使用Spring Cloud和Netflix的Eureka进行微服务注册和发现

设置服务之间通信的额外端点

我接下来想要的一步是使得我可以通过从Node.js服务与Eureka服务注册表通信获取的Java服务提供的服务实例JSON数据,在一个端点上从Node.js服务中获取这些数据。

这是需要做的。

Server.js文件

server.js文件中的client.start()命令之前,我定义了一个名为javaInstance的变量,并使用了eureka-client-js插件提供的方法getInstancesByAppId(),调用注册为a-java-service的Spring Boot服务以获取其服务信息。

通过这个,我可以重构从Spring Boot REST端点提供的URL信息,以获取该服务的信息。简而言之,我能够从Eureka服务器提供的Java实例中解析出所有必要的信息,以通过Node.js端点到达它。

一旦获取了主机名、端口号和应用程序名称,URL就会变成这样:http://localhost:3000/serviceInfo/192.168.1.18:8091/service-instances/A-JAVA-SERVICE

如果Node.js和Java服务都在运行并在Eureka服务器上注册,你将看到以下内容:

由Node.js服务端点提供的Spring Boot服务数据

很好。上面的JSON(未格式化)是针对a-java-service的,通过Node.js服务的端点访问。只需确保在client.start()命令中调用Spring Boot服务的URL调用,否则你将无法访问从getInstancesByAppId()调用Eureka服务器获得的所有实例信息。

此时,Eureka正在执行它设计的功能:注册服务并从一个服务中提供信息到另一个服务中,减少了开发人员需要记住和手动实现的硬编码复杂性。

结论

正如我在开头所说,按照微服务架构模式构建应用程序意味着管理单个服务的复杂性更大,但整个应用程序的容错性和可靠性更高。

像Netflix的Eureka服务器这样的服务注册表有助于管理这种额外的复杂性,并且与Spring的Cloud技术相结合使用时,使用起来变得非常容易。此后的下一步是使用类似Zuul的东西来协助动态路由、实例之间的负载平衡、处理安全性等等。但这是另一篇博客文章。

感谢你的阅读,希望这篇文章对你有所帮助,并让你更好地了解如何使用Netflix的Eureka服务器,并通过Spring Cloud发现Java和Node.js服务。感谢你的掌声和分享!

参考资料和更多资源:

译自:https://itnext.io/how-to-use-netflixs-eureka-and-spring-cloud-for-service-registry-8b43c8acdf4e

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论