微服务架构中,大型简单的零碎按性能或者业务需要垂直切分成更小的子系统,这些子系统以独立部署的子过程存在,它们之间通过网络调用进行通信。这些独立部署的服务如何发现对方成为了首先要解决的问题,所以在微服务架构中往往都会存在一个中心化的注册核心。
Spring 作为 Java 生态中最外围的开发框架,从 Spring MVC 到 Spring Boot 继续一直解放着 Java 开发者的生产力,而 Spring Cloud 是 Spring 面向云原生时代微服务架构给出的答案。
在 Spring Cloud 中,Eureka 就表演了注册核心的角色。Eureka 是一款由 Netflix 开源,应用 Java 语言编写的注册核心服务,其在 Netflix 的基础设施中扮演着重要角色。
APISIX 作为云原生微服务 API 网关,在设计之初就曾经反对了 etcd 作为服务发现,同时也反对 consul 、nacos 、eureka
而 Apache APISIX 作为业界当先的微服务网关,对 Eureka 提供了原生反对。本文将会应用 Spring Cloud 演示我的项目作为案例,为大家展现 Apache APISIX 对接 Eureka 服务发现的次要性能及个性。
筹备阶段
本次演示应用 Spring 官网提供的 spring-cloud-netflix 教程作为示例,该教程中提供了应用 SpringBoot 启动的 Eureka Server 作为 Spring Cloud 的注册核心,咱们也应用雷同的形式来启动用于演示的 Eureka 服务端。该我的项目地址请拜访 spring-cloud-samples/eureka。
接下来将为您介绍相干代码和启动形式。
Eureka Server
Spring Cloud 为 Eureka 提供了一个 EnableEurekaServer
的注解,能够间接以 Spring Boot 的形式启动一个 Eureka Server。
代码示例如下:
@SpringBootApplication@EnableEurekaServerpublic class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); }}
启动形式可间接参考下方代码:
git clone git@github.com:spring-cloud-samples/eureka.git# 在我的项目根目录执行./gradlew bootRun
resources
目录中的 application.yml
文件定义了 Eureka Server 监听在 8761
端口。
server: port: 8761
接入 Eureka Client 的 HTTP 服务
与 EnableEurekaServer
对应的客户端注解是 EnableEurekaClient
,应用 EnableEurekaClient
能够非常简单得将一个应用 Spring Boot 启动的 HTTP 利用注册到 Eureka 上。
以下为示例代码:
@SpringBootApplication@EnableEurekaClient@RestControllerpublic class Application { @Value("${server.port}") int serverPort; @RequestMapping("/") public String home() { return String.format("server-%s",serverPort); } public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(WebApplicationType.SERVLET).run(args); } }
这里咱们在 /
门路上裸露一个 HTTP 服务,返回以后 Spring Boot 应用的端口,这样咱们能够应用不同的配置文件,启动多个实例,来演示 APISIX 对注册到 Eureka 的服务端实例列表进行负载平衡的成果。
配置文件如下:
spring.application.name=a-bootiful-client #将会作为注册到 Eureka 中的 application nameserver.port=8080 # 批改监听端口以启动多个实例
设置监听端口为 8080
,8081
,8082
,并启动三个 Spring Boot 实例,实现后,应用浏览器拜访 Eureka Server 的 8761
端口,能够查看服务注册的后果。
您能够看到利用 A-BOOTIFUL-CLIENT
(留神:spring.application.name
被全副转为大写字符)下注册了三个实例,别离裸露了 8080
,8081
,8082
端口,并且均处于 UP
状态。
应用 APISIX 代理 SpringCloud 利用
接下来,咱们将会实现如下图所示的申请链路:
启动 Apache APISIX
首先,须要在 Apache APISIX 的配置文件 config.yaml
中找到 apisix.discovery
,批改 Eureka Server 连贯信息的相干配置,最初启动 APISIX。
discovery: # service discovery center eureka: host: # it's possible to define multiple eureka hosts addresses of the same eureka cluster. - "http://172.23.79.129:8761" # 通过 Spring Boot 形式启动的 Eureka Server 的拜访地址 prefix: /eureka/ fetch_interval: 30 # default 30s weight: 100 # default weight for node timeout: connect: 2000 # default 2000ms send: 2000 # default 2000ms read: 5000 # default 5000ms
创立路由
创立一个 Route,并在 Upstream 中配置启用 Eureka Service Discovery 插件。
curl http://172.30.45.72:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d ' "uri": "/*", "host": "eureka-demo", "upstream": { "service_name": "A-BOOTIFUL-CLIENT", "type": "roundrobin", "discovery_type": "eureka" }}'
其中:
upstream.discovery_type
为eureka
。upstream.service_name
是利用在 Eureka 中注册的利用名A-BOOTIFUL-CLIENT
。
申请路由
应用 curl
命令进行屡次申请,验证负载平衡成果。
$ curl http://172.30.45.72:9080/ -H "Host: eureka-demo"server-8081%$ curl http://172.30.45.72:9080/ -H "Host: eureka-demo"server-8080%$ curl http://172.30.45.72:9080/ -H "Host: eureka-demo"server-8082%$ curl http://172.30.45.72:9080/ -H "Host: eureka-demo"server-8081%$ curl http://172.30.45.72:9080/ -H "Host: eureka-demo"server-8080%$ curl http://172.30.45.72:9080/ -H "Host: eureka-demo"server-8082%
从上述返回后果能够看到,申请被顺次调配到 Eureka 中注册的三个实例上,这是因为咱们应用的负载平衡算法是 roundrobin
,所有的后端实例会被轮流调配申请。
模仿实例宕机
敞开其中 8081
实例,模仿实例宕机场景,察看申请成果。
while true; do curl http://172.30.45.72:9080/ -H "Host: eureka-demo"; echo; sleep 1; doneserver-8080server-8082server-8081server-8080server-8082server-8081server-8080server-8082server-8080server-8082server-8080
由上述后果能够看出,敞开 8081
实例后,Apache APISIX 会及时同步到 Eureka 的最新实例列表,而后将申请转发给正确的后端。
诊断工具
在微服务零碎中,常常会遇到非预期转发的问题,这些问题的起因可能来自服务发现中的各个链路,例如: 客户端注册异样,注册核心自身数据异样,网关读取注册数据异样等等,产生异样时链路中能够应用的诊断工具将会尤为重要。
所以 APISIX 在 Service Discovery 插件中提供了一个诊断接口,能够不便的查问出以后网关正在应用的服务列表,联合注册核心的控制台,咱们就对网关到注册核心这一链路做出疾速诊断。
诊断接口默认裸露在回环接口的9090端口,拜访形式为 GET /v1/discovery/{discovery_type}/dump
,例:
curl http://localhost:9090/v1/discovery/eureka/dump{ "services": { "A-BOOTIFUL-CLIENT": [ { "weight": 100, "metadata": { "management.port": "8081" }, "host": "192.168.50.164", "port": 8081 }, { "weight": 100, "metadata": { "management.port": "8080" }, "host": "192.168.50.164", "port": 8080 }, { "weight": 100, "metadata": { "management.port": "8082" }, "host": "192.168.50.164", "port": 8082 } ] }, "config": { "prefix": "\/eureka\/", "timeout": { "connect": 2000, "send": 2000, "read": 5000 }, "fetch_interval": 30, "host": [ "http:\/\/172.23.79.129:8761" ], "weight": 100 }}
这样就查问到了 APISIX 正在应用的 Eureka 数据。
总结
Spring Cloud 是一个广受用户欢送的微服务框架,而 Apache APISIX 通过反对 Eureka Service Discovery 提供了解决 Spring Cloud 利用流量的能力,咱们能够看到这两个生态的紧密结合,让微服务架构的落地变得更加简略高效,从而让业务开发能够更加的专一于业务价值。
对于 eureka
插件的更多阐明和残缺配置信息,可参考Eureka 官网文档:eureka。
Apache APISIX 我的项目目前正在开发其余插件以反对集成更多服务,如果您对此有趣味,您能够通过GitHub Discussions 发动探讨,或通过邮件列表进行交换。