本节我们讲解了一些经常用到的配置信息及 Eureka 的 REST API,通过 API 可以做一些扩展。
Eureka 作为注册中心,其本质是存储了每个客户端的注册信息,Ribbon 在转发的时候会获取注册中心的服务列表,然后根据对应的路由规则来选择一个服务给 Feign 来进行调用。如果我们不是 Spring Cloud 技术选型,也想用 Eureka,可以吗?完全可以。
如果不是 Spring Cloud 技术栈,笔者推荐用 Zookeeper,这样会方便些,当然用 Eureka 也是可以的,这样的话就会涉及如何注册信息、如何获取注册信息等操作。其实 Eureka 也考虑到了这点,提供了很多 REST 接口来给我们调用。
我们举一个比较有用的案例来说明,比如对 Nginx 动态进行 upstream 的配置。
在架构变成微服务之后,微服务是没有依赖的,可以独立部署,端口也可以随机分配,反正会注册到注册中心里面,调用方也无须关心提供方的 IP 和 Port,这些都可以从注册中心拿到。
但是有一个问题:API 网关的部署能这样吗?API 网关大部分会用 Nginx 作为负载,那么 Nginx 就必须知道 API 网关有哪几个节点,这样网关服务就不能随便启动了,需要固定。
当然网关是不会经常变动的,也不会经常发布,这样其实也没什么大问题,唯一不好的就是不能自动扩容了。
其实利用 Eureka 提供的 API 我们可以获取某个服务的实例信息,也就是说我们可以根据 Eureka 中的数据来动态配置 Nginx 的 upstream。
这样就可以做到网关的自动部署和扩容了。网上也有很多的方案,结合 Lua 脚本来做,或者自己写 Sheel 脚本都可以。
下面举例说明如何获取 Eureka 中注册的信息。具体的接口信息请查看官方文档“https://github.com/Netflix/eureka/wiki/Eureka-REST-operations“。
获取某个服务的注册信息,可以直接 GET 请求:http://localhost:8761/eureka/apps/eureka-client-user-service。其中,eureka-client-user-service 是应用名称,也就是 spring.application.name。
在浏览器中,数据的显示格式默认是 XML 格式的,如图 1 所示。