前期准备:可参考上一篇,spring cloud nacos 服务提供、服务消费(Feign、RestTemplate)及Hystrix熔断设置
1、下载安装 Nacos 服务中心(下载地址 https://github.com/alibaba/nacos/releases)并启动 Nacos server(以Windows为例),下载后启动bin文件夹下“startup.cmd”,待出现“Nacos started successfully......”启动成功。
2、编写服务提供者(provider)
POM
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
配置文件(application.yml)
server:
port: 8083
spring:
application:
name: testprovider
cloud:
nacos:
discovery:
server-addr: localhost:8848
Controller
@RestController
@RequestMapping("provider/")
public class Test {
//测试服务提供者接口
@RequestMapping("user/{fid}")
public String getUser(@PathVariable long fid)
{
return "showFuser:"+fid;
}
}
网关开始:
相关术语:
-
Route(路由):网关的基本构建块。由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
-
Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
-
Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。
1、创建Gateway 网关 Module,添加POM
<!-- Spring cloud gateway网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- nacos服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
同时需要向nacos服务中心注册
2、配置文件
server:
port: 8088
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true #是否与服务注册于发现组件结合,通过 serviceId 转发到具体的服务
lower-case-service-id: true
routes:
- id: gateway-service-provider
uri: lb://testprovider
predicates:
- Path=/provider/**
# - id: gateway-service-consumer
# uri: lb://testconsumer
# predicates:
# - Path=/co/**
各字段含义:
- id:路由 ID(不是网关ID),保持唯一
- uri:目标服务地址 (加 lb 根据注册中心服务名匹配)
- predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
上面这段配置的意思是,配置了一个 id 为 api-gateway 的路由规则,当访问地址 http://网关地址:端口/provider/** 时会自动转发到地址:http://testprovider/provider/** 上。
Spring Cloud Gateway 网关路由有两种配置方式:
-
在配置文件 yml 中配置
-
通过@Bean自定义 RouteLocator,在启动主类 Application 中配置
两种方式是效果是一样的,这里使用 yml 方式进配置。
3、开启服务中心注册
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
4、测试
4.1、启动gateway(http://localhost:8088),启动服务提供者(http://localhost:8083)
直接访问服务提供者 http://localhost:8083/provider/user/2
通过网关访问 http://localhost:8088/provider/user/2,结果一样,证明网关设置成功!
4.2、在复制一个provider,测试网关分发,修改Controller返回值区分不同服务,修改application.yml端口8073。
//测试服务提供者接口
@RequestMapping("user/{fid}")
public String getUser(@PathVariable long fid)
{
return "showFuser-T2:"+fid; //区分第2个provider服务
}
启动第二个provider,在nacos中心确认
访问“http://localhost:8088/provider/user/2”,刷新页面,轮询输出,成功!
showFuser-T2:2
showFuser:2