服务注册表、图像/图库服务和网关
🙌 应用的Github仓库:https://github.com/OmarElGabry/microservices-spring-boot
回想一下我们的应用程序架构,我们有一个服务注册表、图像服务、图库服务和一个网关。
图库服务在图像服务下面使用,并检索要显示的所有图像的列表。
我们要创建的Spring Boot应用程序版本是:2.0.0.RELEASE。
Eureka Server
它是命名服务器或称为服务注册表。它的职责是给每个微服务命名。为什么呢?
- 不需要硬编码微服务的IP地址。
- 如果服务使用动态IP地址,则在自动缩放时怎么办。
因此,每个服务都向Eureka注册自己,并向Eureka服务器发出通知以通知其自己还活着。
如果Eureka服务器没有收到任何来自服务的通知,那么该服务将自动从Eureka服务器中注销。
步骤非常简单。1、2、3,我们完成了!。
好了。像往常一样,创建一个Maven项目,或使用spring initializr。在pom.xml
文件中,确保包括这些依赖项:Web、Eureka Server和DevTools(可选)。
接下来,在application.properties
文件中,我们需要设置一些配置。
最后,在你的Spring Boot主应用程序类中,使用@EnableEurekaServer
注释启用Eureka服务器。
到目前为止还好吗?下一步,我们创建我们的服务;图像和图库。
图像服务
Eureka客户端服务是微服务架构中的一个独立服务。它可以用于支付、帐户、通知、身份验证、配置等。
图像服务作为图像的数据源,每个图像都有一个id、标题和url。很简单吧?。
好的。所以,对于pom.xml
文件,使用Eureka Client而不是Eureka Server。
在application.properties
文件中,我们定义配置(如前所述)
然后,使用@EnableEurekaClient
注释启用Eureka客户端。
现在,我们的图像服务将通过端点公开一些数据,对吧?所以,我们需要创建一个控制器,并定义操作方法。
不要忘记创建Image实体类,其中包含三个字段:id、title和url。
图库服务
Eureka客户端服务也可以是调用(消耗)我们微服务应用程序中的其他服务(REST API服务)的REST客户端。
因此,例如,图库服务调用图像服务以获取所有图像的列表,或者仅在特定年份创建的图像。
这个REST客户端对其他服务的调用可以使用:
- RestTemplate。一个能够向REST API服务发送请求的对象。
- FeignClient(像代理一样),提供了另一种RestTemplate方法。 两者都可以在服务之间平衡负载。
—什么是负载均衡?
如果一个服务的多个实例在不同的端口上运行,那怎么办?所以,我们需要在所有服务实例之间平衡请求。
使用“Ribbon”方法(默认情况下),请求将平均分配在它们之间。
所以,像往常一样,我们从pom.xml
开始。它与图像服务的相同。接下来是application.properties
文件。
在Spring Boot主应用程序类中,除了启用Eureka客户端之外,我们还需要为RestTemplate
创建一个bean,以调用图像服务。
在控制器中,使用RestTemplate
调用图像服务并返回结果。
好了,这里有一件事要注意。由于我们使用了restTemplate
——它反过来使用Eureka服务器来命名服务,并使用Ribbon来平衡负载。所以,我们可以使用服务名称(例如image-service
)而不是localhost:port
。
网关-Zuul
当从浏览器调用任何服务时,我们无法像从图库服务中那样使用名称调用它——这在服务之间内部使用。
而且,随着我们旋转更多的服务实例,每个实例都有不同的端口号,所以现在的问题是:我们如何从浏览器调用服务并将请求分发到在不同端口上运行的它们的实例中?
嗯,一个常见的解决方案是使用网关。
网关是系统的单个入口点,用于通过将请求路由到相应的服务来处理请求。它还可用于身份验证、监视等。
什么是Zuul?
它是代理、网关、用户和你的服务之间的中间层。
Eureka服务器解决了为服务提供名称而不是硬编码其IP地址的问题。
但是,我们仍然可能有更多运行在不同端口上的服务(实例)。因此,Zuul...
- 在前缀路径(例如
/gallery/**
)和服务gallery-service
之间进行映射。它使用Eureka服务器来路由所请求的服务。 - 它在不同端口上运行的服务实例之间进行负载平衡(使用Ribbon)。
- 还有什么? 我们可以过滤请求、添加身份验证等。
在
pom.xml
中添加依赖项:Web、Eureka Client和Zuul。
值得一提的是,Zuul 作为 Eureka 客户端。因此,我们给它命名、端口和链接到 Eureka 服务器(与 image 服务一样)。
最后,启用 Zuul 和 Eureka 客户端。
测试我们的微服务
好了。所以,我们有了服务发现;Eureka 服务器。两个服务;image 和 gallery。还有一个网关;Zuul。
要测试我们的应用程序,请运行 Eureka 服务器、Zuul,然后再运行这两个服务。然后,转到运行在 localhost:8761
的 Eureka 服务器,你应该看到正在运行的服务。
要运行多个实例。在 Eclipse 中,转到 Run → Configurations/Arguments → VM options 并添加 -Dserver.port=8300
要 ping gallery 服务,请发送请求到网关,添加 galley 服务的路径 localhost:8762/gallery
。
你应该看到下面的消息,如果你再次点击该 URL,则请求将路由到 gallery 服务的第二个实例;多亏了负载均衡器。
“Hello from Gallery Service running at port: 8100” “Hello from Gallery Service running at port: 8300”
要在浏览器中获取所有图像,请在浏览器中输入 localhost:8762/gallery/1
但是,我们还没有完成!我们仍然需要对用户进行身份验证。接下来,我们将使用 JSON Web Tokens (JWT) 进行身份验证。
如果你喜欢这篇文章,请点赞 👏。谢谢!
评论(0)