本文介绍如何使用Nacos来搭建基于Spring Cloud Gateway或Spring Cloud Netflix Zuul的服务网关。
准备工作
下载Maven并设置环境变量。(已经操作的可略过)
下载最新版本下载地址Nacos Server。(已经操作的可以略过)
解压下载的Nacos Server压缩包。
进入
nacos/bin
目录,启动Nacos Server。Linux/Unix/Mac系统:执行命令
sh startup.sh -m standalone
。Windows系统:双击执行
startup.cmd
文件。
Demo应用
本地开发中主要描述开发中涉及的关键信息,如果您想了解完整的Spring Cloud程序,可下载spring-cloud-gateway-nacos、spring-cloud-zuul-nacos和nacos-service-provider。
可选:
在本地开发应用时,可以使用Alibaba Cloud Toolkit插件实现本地应用和部署在EDAS中的应用的相互调用,即端云互联,而无需搭建VPN,帮助您提升开发效率。更多信息,请参见端云互联简介。
基于Spring Cloud Gateway搭建服务网关
介绍如何使用Nacos基于Spring Cloud Gateway从零搭建应用的服务网关。
创建服务网关。
创建命名为
spring-cloud-gateway-nacos
的Maven工程。在
pom.xml
文件中添加Spring Boot和Spring Cloud的依赖。以Spring Boot 2.1.4.RELEASE和Spring Cloud Greenwich.SR1版本为例。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
开发服务网关启动类
GatewayApplication
。@SpringBootApplication @EnableDiscoveryClient public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
在
application.yaml
中添加如下配置,将注册中心指定为Nacos Server的地址。其中
127.0.0.1:8848
为Nacos Server的地址。如果您的Nacos Server部署在另外一台机器,则需要修改成对应的地址。其中routes配置了Gateway的路由转发策略,这里我们配置将所有前缀为
/provider1/
的请求都路由到服务名为service-provider
的后端服务中。server: port: 18012 spring: application: name: spring-cloud-gateway-nacos cloud: gateway: # config the routes for gateway routes: - id: service-provider #将/provider1/开头的请求转发到provider1 uri: lb://service-provider predicates: - Path=/provider1/** filters: - StripPrefix=1 #表明前缀/provider1需要截取掉 nacos: discovery: server-addr: 127.0.0.1:8848
执行启动类
GatewayApplication
中的main函数,启动Gateway。登录本地启动的Nacos Server控制台http://127.0.0.1:8848/nacos(本地Nacos控制台的默认用户名和密码同为nacos),在左侧导航栏中选择 ,可以看到服务列表中已经包含了spring-cloud-gateway-nacos,且在详情中可以查询该服务的详情。表明网关已经启动并注册成功,接下来我们将通过创建一个下游服务来验证网关的请求转发功能。
创建服务提供者。
创建一个服务提供者的应用,请参见实现服务注册与发现。
服务提供者示例:
@SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication, args); } @RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } }
结果验证。
本地验证。
本地启动开发好的服务网关和服务提供者,通过访问Spring Cloud Gateway将请求转发给后端服务,可以看到调用成功的结果。
在EDAS中验证。
您可以将应用部署到EDAS,并验证。具体操作,请参见实现服务注册与发现。
EDAS服务注册中心提供了正式商用版本Nacos。当您将应用部署到EDAS的时候,EDAS会直接替换本地Nacos Server的地址和服务端口,以及namespace、access-key、secret-key、context-path信息。您无需进行任何额外的配置,原有的配置内容可以选择保留或删除。
基于Zuul搭建服务网关
介绍如何基于Zuul使用Nacos作为服务注册中心从零搭建应用的服务网关。
创建服务网关。
创建命名为
spring-cloud-zuul-nacos
的Maven工程。在
pom.xml
文件中添加Spring Boot、Spring Cloud和Spring Cloud Alibaba的依赖。请添加Spring Boot 2.1.4.RELEASE、Spring Cloud Greenwich.SR1和Spring Cloud Alibaba 0.9.0版本依赖。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
开发服务网关启动类
ZuulApplication
。@SpringBootApplication @EnableZuulProxy @EnableDiscoveryClient public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
在
application.properties
中添加如下配置,将注册中心指定为Nacos Server的地址。其中
127.0.0.1:8848
为Nacos Server的地址。如果您的Nacos Server部署在另外一台机器,则需要修改成对应的地址。其中routes配置了Zuul的路由转发策略,这里我们配置将所有前缀为
/provider1/
的请求都路由到服务名为service-provider
的后端服务中。spring.application.name=spring-cloud-zuul-nacos server.port=18022 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 zuul.routes.opensource-provider1.path=/provider1/** zuul.routes.opensource-provider1.serviceId=service-provider
执行spring-cloud-zuul-nacos中的main函数
ZuulApplication
,启动服务。登录本地启动的Nacos Server控制台http://127.0.0.1:8848/nacos (本地Nacos控制台的默认用户名和密码同为nacos),在左侧导航栏中选择服务管理 > 服务列表,可以看到服务列表中已经包含了spring-cloud-zuul-nacos,且在详情中可以查询该服务的详情。表明网关已经启动并注册成功,接下来我们将通过创建一个下游服务来验证网关的请求转发功能。
创建服务提供者。
如何快速创建一个服务提供者,请参见实现服务注册与发现。
服务提供者启动类示例:
@SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication, args); } @RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } }
结果验证。
本地验证。
本地启动开发好的服务网关Zuul和服务提供者,通过访问Spring Cloud Netflix Zuul将请求转发给后端服务,可以看到调用成功的结果。
在EDAS中验证。
您将应用部署到EDAS,并验证。具体操作,请参见实现服务注册与发现。
EDAS服务注册中心提供了正式商用版本Nacos。当您将应用部署到EDAS的时候,EDAS会直接替换本地Nacos Server的地址和服务端口,以及namespace、access-key、secret-key、context-path信息。您无需进行任何额外的配置,原有的配置内容可以选择保留或删除。
版本说明
示例中使用的Spring Cloud版本为Greenwich,对应的Spring Cloud Alibaba版本为2.1.1.RELEASE。
Spring Cloud Finchley对应的Spring Cloud Alibaba版本为2.0.1.RELEASE。
Spring Cloud Edgware对应的Spring Cloud Alibaba版本为1.5.1.RELEASE。
Spring Cloud Edgware版本的生命周期已结束,不推荐使用这个版本开发应用。